webpack 4.9.1 → 4.10.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/README.md +755 -755
- package/SECURITY.md +9 -9
- package/buildin/global.js +20 -20
- package/buildin/harmony-module.js +24 -24
- package/buildin/module.js +22 -22
- package/hot/dev-server.js +61 -61
- 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 +37 -37
- package/hot/signal.js +62 -62
- package/lib/APIPlugin.js +84 -84
- package/lib/AmdMainTemplatePlugin.js +87 -75
- package/lib/AsyncDependenciesBlock.js +66 -66
- package/lib/AsyncDependencyToInitialChunkError.js +31 -21
- package/lib/AutomaticPrefetchPlugin.js +50 -50
- package/lib/BannerPlugin.js +3 -1
- package/lib/BasicEvaluatedExpression.js +211 -208
- package/lib/CachePlugin.js +102 -95
- package/lib/CaseSensitiveModulesWarning.js +71 -53
- package/lib/Chunk.js +750 -722
- package/lib/ChunkGroup.js +13 -5
- package/lib/ChunkRenderError.js +32 -32
- package/lib/CompatibilityPlugin.js +63 -63
- package/lib/Compilation.js +1947 -1905
- package/lib/Compiler.js +508 -496
- package/lib/ConcurrentCompilationError.js +19 -19
- package/lib/ConstPlugin.js +258 -242
- package/lib/ContextExclusionPlugin.js +17 -17
- package/lib/ContextModule.js +749 -710
- package/lib/ContextModuleFactory.js +256 -245
- package/lib/ContextReplacementPlugin.js +133 -126
- package/lib/DefinePlugin.js +206 -197
- package/lib/DelegatedModule.js +101 -101
- package/lib/DelegatedModuleFactoryPlugin.js +89 -89
- package/lib/DelegatedPlugin.js +39 -39
- package/lib/DependenciesBlock.js +89 -87
- package/lib/DependenciesBlockVariable.js +52 -51
- package/lib/Dependency.js +51 -51
- package/lib/DllEntryPlugin.js +51 -51
- package/lib/DllModule.js +54 -54
- package/lib/DllModuleFactory.js +29 -29
- package/lib/DllPlugin.js +44 -42
- package/lib/DllReferencePlugin.js +84 -84
- package/lib/DynamicEntryPlugin.js +73 -71
- package/lib/EntryOptionPlugin.js +33 -33
- package/lib/EnvironmentPlugin.js +65 -65
- package/lib/ErrorHelpers.js +60 -57
- package/lib/EvalDevToolModulePlugin.js +27 -27
- package/lib/EvalDevToolModuleTemplatePlugin.js +61 -61
- package/lib/EvalSourceMapDevToolPlugin.js +41 -40
- package/lib/ExportPropertyMainTemplatePlugin.js +53 -40
- package/lib/ExtendedAPIPlugin.js +84 -84
- package/lib/ExternalModule.js +159 -159
- package/lib/ExternalModuleFactoryPlugin.js +110 -110
- package/lib/ExternalsPlugin.js +23 -23
- package/lib/FlagDependencyExportsPlugin.js +146 -146
- package/lib/FlagDependencyUsagePlugin.js +110 -104
- package/lib/FlagInitialModulesAsUsedPlugin.js +36 -36
- package/lib/FunctionModulePlugin.js +19 -19
- package/lib/FunctionModuleTemplatePlugin.js +100 -98
- package/lib/GraphHelpers.js +64 -64
- package/lib/HarmonyLinkingError.js +18 -18
- package/lib/HashedModuleIdsPlugin.js +53 -53
- package/lib/HotModuleReplacement.runtime.js +7 -3
- package/lib/HotModuleReplacementPlugin.js +413 -406
- package/lib/HotUpdateChunk.js +16 -16
- package/lib/HotUpdateChunkTemplate.js +78 -78
- package/lib/IgnorePlugin.js +71 -71
- package/lib/JavascriptGenerator.js +229 -228
- package/lib/JavascriptModulesPlugin.js +179 -184
- package/lib/JsonGenerator.js +42 -42
- package/lib/JsonModulesPlugin.js +30 -30
- package/lib/JsonParser.js +27 -26
- package/lib/LibManifestPlugin.js +86 -86
- package/lib/LibraryTemplatePlugin.js +153 -119
- package/lib/LoaderOptionsPlugin.js +53 -52
- package/lib/LoaderTargetPlugin.js +24 -24
- package/lib/MainTemplate.js +34 -9
- package/lib/Module.js +381 -377
- package/lib/ModuleBuildError.js +42 -42
- package/lib/ModuleDependencyError.js +35 -25
- package/lib/ModuleDependencyWarning.js +25 -25
- package/lib/ModuleError.js +28 -28
- package/lib/ModuleFilenameHelpers.js +178 -166
- package/lib/ModuleParseError.js +44 -44
- package/lib/ModuleReason.js +40 -40
- package/lib/ModuleTemplate.js +84 -84
- package/lib/ModuleWarning.js +30 -30
- package/lib/MultiCompiler.js +283 -271
- package/lib/MultiEntryPlugin.js +58 -58
- package/lib/MultiModule.js +81 -78
- 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 +179 -178
- package/lib/NormalModule.js +497 -490
- package/lib/NormalModuleFactory.js +501 -483
- package/lib/NormalModuleReplacementPlugin.js +51 -51
- package/lib/OptionsDefaulter.js +84 -80
- package/lib/Parser.js +2164 -2086
- package/lib/ParserHelpers.js +103 -100
- package/lib/PrefetchPlugin.js +37 -37
- package/lib/ProgressPlugin.js +231 -231
- package/lib/ProvidePlugin.js +86 -86
- package/lib/RawModule.js +56 -54
- package/lib/RecordIdsPlugin.js +166 -162
- package/lib/RemovedPluginError.js +13 -13
- package/lib/RequestShortener.js +81 -74
- package/lib/RequireJsStuffPlugin.js +69 -69
- package/lib/ResolverFactory.js +64 -64
- package/lib/RuleSet.js +555 -534
- package/lib/RuntimeTemplate.js +320 -277
- package/lib/SetVarMainTemplatePlugin.js +69 -57
- package/lib/SingleEntryPlugin.js +44 -44
- package/lib/SizeFormatHelpers.js +24 -24
- package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -49
- package/lib/SourceMapDevToolPlugin.js +301 -300
- package/lib/Stats.js +1408 -1367
- package/lib/Template.js +4 -2
- package/lib/TemplatedPathPlugin.js +173 -170
- package/lib/UmdMainTemplatePlugin.js +304 -264
- package/lib/UseStrictPlugin.js +48 -48
- package/lib/WarnCaseSensitiveModulesPlugin.js +37 -36
- package/lib/WarnNoModeSetPlugin.js +17 -17
- package/lib/WatchIgnorePlugin.js +100 -100
- package/lib/Watching.js +194 -193
- package/lib/WebpackError.js +25 -19
- package/lib/WebpackOptionsApply.js +421 -405
- package/lib/WebpackOptionsDefaulter.js +347 -344
- package/lib/WebpackOptionsValidationError.js +345 -316
- package/lib/compareLocations.js +56 -56
- package/lib/dependencies/AMDDefineDependency.js +137 -137
- package/lib/dependencies/AMDDefineDependencyParserPlugin.js +336 -327
- package/lib/dependencies/AMDPlugin.js +250 -250
- package/lib/dependencies/AMDRequireArrayDependency.js +49 -49
- package/lib/dependencies/AMDRequireContextDependency.js +20 -20
- package/lib/dependencies/AMDRequireDependenciesBlock.js +43 -43
- package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +273 -270
- package/lib/dependencies/AMDRequireDependency.js +135 -135
- package/lib/dependencies/CommonJsPlugin.js +161 -161
- package/lib/dependencies/CommonJsRequireContextDependency.js +23 -23
- package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +130 -130
- package/lib/dependencies/ConstDependency.js +33 -33
- package/lib/dependencies/ContextDependency.js +68 -68
- package/lib/dependencies/ContextDependencyTemplateAsId.js +42 -42
- package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +38 -38
- package/lib/dependencies/ContextElementDependency.js +21 -21
- package/lib/dependencies/DelegatedExportsDependency.js +33 -33
- package/lib/dependencies/DependencyReference.js +18 -18
- package/lib/dependencies/HarmonyAcceptDependency.js +45 -45
- package/lib/dependencies/HarmonyAcceptImportDependency.js +23 -23
- package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -31
- package/lib/dependencies/HarmonyDetectionParserPlugin.js +92 -90
- package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +139 -139
- package/lib/dependencies/HarmonyExportExpressionDependency.js +53 -53
- package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -30
- package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +620 -603
- package/lib/dependencies/HarmonyExportSpecifierDependency.js +54 -54
- package/lib/dependencies/HarmonyImportDependency.js +104 -94
- package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +217 -214
- package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -31
- package/lib/dependencies/HarmonyImportSpecifierDependency.js +166 -156
- 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 +233 -232
- package/lib/dependencies/ImportPlugin.js +82 -82
- package/lib/dependencies/ImportWeakDependency.js +34 -34
- package/lib/dependencies/JsonExportsDependency.js +26 -26
- package/lib/dependencies/LoaderPlugin.js +98 -93
- package/lib/dependencies/LocalModuleDependency.js +28 -28
- package/lib/dependencies/LocalModulesHelpers.js +52 -45
- package/lib/dependencies/ModuleDependency.js +20 -20
- package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -17
- package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -17
- package/lib/dependencies/MultiEntryDependency.js +20 -20
- package/lib/dependencies/NullDependency.js +20 -20
- package/lib/dependencies/RequireContextDependency.js +22 -22
- package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -56
- package/lib/dependencies/RequireContextPlugin.js +143 -141
- package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -33
- package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -112
- package/lib/dependencies/RequireEnsureDependency.js +58 -58
- package/lib/dependencies/RequireEnsurePlugin.js +74 -74
- package/lib/dependencies/RequireHeaderDependency.js +26 -26
- package/lib/dependencies/RequireIncludeDependency.js +39 -39
- package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -23
- package/lib/dependencies/RequireIncludePlugin.js +61 -61
- package/lib/dependencies/RequireResolveContextDependency.js +23 -23
- package/lib/dependencies/RequireResolveDependencyParserPlugin.js +85 -85
- package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
- package/lib/dependencies/SingleEntryDependency.js +18 -18
- package/lib/dependencies/SystemPlugin.js +125 -125
- package/lib/dependencies/UnsupportedDependency.js +27 -27
- package/lib/dependencies/WebAssemblyImportDependency.js +48 -44
- package/lib/dependencies/WebpackMissingModule.js +20 -20
- package/lib/dependencies/getFunctionExpression.js +52 -52
- package/lib/formatLocation.js +61 -53
- 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/NodeMainTemplateAsync.runtime.js +44 -44
- package/lib/node/NodeMainTemplatePlugin.js +323 -320
- package/lib/node/NodeSourcePlugin.js +144 -140
- package/lib/node/NodeTargetPlugin.js +18 -18
- package/lib/node/NodeTemplatePlugin.js +31 -31
- package/lib/node/NodeWatchFileSystem.js +99 -82
- package/lib/node/ReadFileCompileWasmTemplatePlugin.js +52 -52
- package/lib/optimize/AggressiveMergingPlugin.js +87 -87
- package/lib/optimize/AggressiveSplittingPlugin.js +287 -281
- package/lib/optimize/ChunkModuleIdRangePlugin.js +68 -68
- package/lib/optimize/ConcatenatedModule.js +1420 -1413
- 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 -75
- package/lib/optimize/MinChunkSizePlugin.js +77 -77
- package/lib/optimize/ModuleConcatenationPlugin.js +470 -457
- package/lib/optimize/OccurrenceOrderPlugin.js +133 -126
- package/lib/optimize/RemoveParentModulesPlugin.js +127 -117
- package/lib/optimize/RuntimeChunkPlugin.js +41 -41
- package/lib/optimize/SideEffectsFlagPlugin.js +158 -156
- package/lib/optimize/SplitChunksPlugin.js +709 -696
- package/lib/performance/AssetsOverSizeLimitWarning.js +30 -30
- package/lib/performance/EntrypointsOverSizeLimitWarning.js +31 -31
- package/lib/performance/NoAsyncChunksWarning.js +21 -21
- package/lib/performance/SizeLimitsPlugin.js +105 -105
- package/lib/util/Semaphore.js +41 -41
- package/lib/util/SortableSet.js +5 -2
- package/lib/util/StackedSetMap.js +12 -5
- package/lib/util/TrackingSet.js +35 -35
- package/lib/util/cachedMerge.js +35 -35
- package/lib/util/createHash.js +77 -77
- package/lib/util/identifier.js +76 -76
- package/lib/validateSchema.js +67 -67
- package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +18 -18
- package/lib/wasm/WasmMainTemplatePlugin.js +310 -304
- package/lib/wasm/WebAssemblyGenerator.js +143 -19
- package/lib/wasm/WebAssemblyJavascriptGenerator.js +90 -107
- package/lib/wasm/WebAssemblyModulesPlugin.js +80 -80
- package/lib/wasm/WebAssemblyParser.js +28 -5
- package/lib/wasm/WebAssemblyUtils.js +48 -0
- package/lib/web/FetchCompileWasmTemplatePlugin.js +25 -25
- package/lib/web/JsonpChunkTemplatePlugin.js +47 -47
- package/lib/web/JsonpExportMainTemplatePlugin.js +47 -47
- package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -39
- package/lib/web/JsonpMainTemplate.runtime.js +65 -64
- package/lib/web/JsonpMainTemplatePlugin.js +576 -574
- package/lib/web/JsonpTemplatePlugin.js +23 -23
- package/lib/webpack.js +183 -182
- package/lib/webpack.web.js +31 -31
- package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -35
- package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -40
- package/lib/webworker/WebWorkerMainTemplate.runtime.js +65 -64
- package/lib/webworker/WebWorkerMainTemplatePlugin.js +179 -179
- package/lib/webworker/WebWorkerTemplatePlugin.js +25 -25
- package/package.json +9 -8
- package/schemas/WebpackOptions.json +1988 -1988
- package/schemas/ajv.absolutePath.js +55 -55
- 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/lib/MultiCompiler.js
CHANGED
@@ -1,271 +1,283 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Tobias Koppers @sokra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const { Tapable, SyncHook, MultiHook } = require("tapable");
|
8
|
-
const asyncLib = require("neo-async");
|
9
|
-
const MultiWatching = require("./MultiWatching");
|
10
|
-
const MultiStats = require("./MultiStats");
|
11
|
-
const ConcurrentCompilationError = require("./ConcurrentCompilationError");
|
12
|
-
|
13
|
-
module.exports = class MultiCompiler extends Tapable {
|
14
|
-
constructor(compilers) {
|
15
|
-
super();
|
16
|
-
this.hooks = {
|
17
|
-
done: new SyncHook(["stats"]),
|
18
|
-
invalid: new MultiHook(compilers.map(c => c.hooks.invalid)),
|
19
|
-
run: new MultiHook(compilers.map(c => c.hooks.run)),
|
20
|
-
watchClose: new SyncHook([]),
|
21
|
-
watchRun: new MultiHook(compilers.map(c => c.hooks.watchRun))
|
22
|
-
};
|
23
|
-
if (!Array.isArray(compilers)) {
|
24
|
-
compilers = Object.keys(compilers).map(name => {
|
25
|
-
compilers[name].name = name;
|
26
|
-
return compilers[name];
|
27
|
-
});
|
28
|
-
}
|
29
|
-
this.compilers = compilers;
|
30
|
-
let doneCompilers = 0;
|
31
|
-
let compilerStats = [];
|
32
|
-
let index = 0;
|
33
|
-
for (const compiler of this.compilers) {
|
34
|
-
let compilerDone = false;
|
35
|
-
const compilerIndex = index++;
|
36
|
-
// eslint-disable-next-line no-loop-func
|
37
|
-
compiler.hooks.done.tap("MultiCompiler", stats => {
|
38
|
-
if (!compilerDone) {
|
39
|
-
compilerDone = true;
|
40
|
-
doneCompilers++;
|
41
|
-
}
|
42
|
-
compilerStats[compilerIndex] = stats;
|
43
|
-
if (doneCompilers === this.compilers.length) {
|
44
|
-
this.hooks.done.call(new MultiStats(compilerStats));
|
45
|
-
}
|
46
|
-
});
|
47
|
-
// eslint-disable-next-line no-loop-func
|
48
|
-
compiler.hooks.invalid.tap("MultiCompiler", () => {
|
49
|
-
if (compilerDone) {
|
50
|
-
compilerDone = false;
|
51
|
-
doneCompilers--;
|
52
|
-
}
|
53
|
-
});
|
54
|
-
}
|
55
|
-
this.running = false;
|
56
|
-
}
|
57
|
-
|
58
|
-
get outputPath() {
|
59
|
-
let commonPath = this.compilers[0].outputPath;
|
60
|
-
for (const compiler of this.compilers) {
|
61
|
-
while (
|
62
|
-
compiler.outputPath.indexOf(commonPath) !== 0 &&
|
63
|
-
/[/\\]/.test(commonPath)
|
64
|
-
) {
|
65
|
-
commonPath = commonPath.replace(/[/\\][^/\\]*$/, "");
|
66
|
-
}
|
67
|
-
}
|
68
|
-
|
69
|
-
if (!commonPath && this.compilers[0].outputPath[0] === "/") return "/";
|
70
|
-
return commonPath;
|
71
|
-
}
|
72
|
-
|
73
|
-
get inputFileSystem() {
|
74
|
-
throw new Error("Cannot read inputFileSystem of a MultiCompiler");
|
75
|
-
}
|
76
|
-
|
77
|
-
get outputFileSystem() {
|
78
|
-
throw new Error("Cannot read outputFileSystem of a MultiCompiler");
|
79
|
-
}
|
80
|
-
|
81
|
-
set inputFileSystem(value) {
|
82
|
-
for (const compiler of this.compilers) {
|
83
|
-
compiler.inputFileSystem = value;
|
84
|
-
}
|
85
|
-
}
|
86
|
-
|
87
|
-
set outputFileSystem(value) {
|
88
|
-
for (const compiler of this.compilers) {
|
89
|
-
compiler.outputFileSystem = value;
|
90
|
-
}
|
91
|
-
}
|
92
|
-
|
93
|
-
validateDependencies(callback) {
|
94
|
-
const edges = new Set();
|
95
|
-
const missing = [];
|
96
|
-
const targetFound = compiler => {
|
97
|
-
for (const edge of edges) {
|
98
|
-
if (edge.target === compiler) {
|
99
|
-
return true;
|
100
|
-
}
|
101
|
-
}
|
102
|
-
return false;
|
103
|
-
};
|
104
|
-
const sortEdges = (e1, e2) => {
|
105
|
-
return (
|
106
|
-
e1.source.name.localeCompare(e2.source.name) ||
|
107
|
-
e1.target.name.localeCompare(e2.target.name)
|
108
|
-
);
|
109
|
-
};
|
110
|
-
for (const source of this.compilers) {
|
111
|
-
if (source.dependencies) {
|
112
|
-
for (const dep of source.dependencies) {
|
113
|
-
const target = this.compilers.find(c => c.name === dep);
|
114
|
-
if (!target) {
|
115
|
-
missing.push(dep);
|
116
|
-
} else {
|
117
|
-
edges.add({
|
118
|
-
source,
|
119
|
-
target
|
120
|
-
});
|
121
|
-
}
|
122
|
-
}
|
123
|
-
}
|
124
|
-
}
|
125
|
-
const errors = missing.map(m => `Compiler dependency \`${m}\` not found.`);
|
126
|
-
const stack = this.compilers.filter(c => !targetFound(c));
|
127
|
-
while (stack.length > 0) {
|
128
|
-
const current = stack.pop();
|
129
|
-
for (const edge of edges) {
|
130
|
-
if (edge.source === current) {
|
131
|
-
edges.delete(edge);
|
132
|
-
const target = edge.target;
|
133
|
-
if (!targetFound(target)) {
|
134
|
-
stack.push(target);
|
135
|
-
}
|
136
|
-
}
|
137
|
-
}
|
138
|
-
}
|
139
|
-
if (edges.size > 0) {
|
140
|
-
const lines = Array.from(edges)
|
141
|
-
.sort(sortEdges)
|
142
|
-
.map(edge => `${edge.source.name} -> ${edge.target.name}`);
|
143
|
-
lines.unshift("Circular dependency found in compiler dependencies.");
|
144
|
-
errors.unshift(lines.join("\n"));
|
145
|
-
}
|
146
|
-
if (errors.length > 0) {
|
147
|
-
const message = errors.join("\n");
|
148
|
-
callback(new Error(message));
|
149
|
-
return false;
|
150
|
-
}
|
151
|
-
return true;
|
152
|
-
}
|
153
|
-
|
154
|
-
runWithDependencies(compilers, fn, callback) {
|
155
|
-
const fulfilledNames = new Set();
|
156
|
-
let remainingCompilers = compilers;
|
157
|
-
const isDependencyFulfilled = d => fulfilledNames.has(d);
|
158
|
-
const getReadyCompilers = () => {
|
159
|
-
let readyCompilers = [];
|
160
|
-
let list = remainingCompilers;
|
161
|
-
remainingCompilers = [];
|
162
|
-
for (const c of list) {
|
163
|
-
const ready =
|
164
|
-
!c.dependencies || c.dependencies.every(isDependencyFulfilled);
|
165
|
-
if (ready)
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
(
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
}
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
}
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const { Tapable, SyncHook, MultiHook } = require("tapable");
|
8
|
+
const asyncLib = require("neo-async");
|
9
|
+
const MultiWatching = require("./MultiWatching");
|
10
|
+
const MultiStats = require("./MultiStats");
|
11
|
+
const ConcurrentCompilationError = require("./ConcurrentCompilationError");
|
12
|
+
|
13
|
+
module.exports = class MultiCompiler extends Tapable {
|
14
|
+
constructor(compilers) {
|
15
|
+
super();
|
16
|
+
this.hooks = {
|
17
|
+
done: new SyncHook(["stats"]),
|
18
|
+
invalid: new MultiHook(compilers.map(c => c.hooks.invalid)),
|
19
|
+
run: new MultiHook(compilers.map(c => c.hooks.run)),
|
20
|
+
watchClose: new SyncHook([]),
|
21
|
+
watchRun: new MultiHook(compilers.map(c => c.hooks.watchRun))
|
22
|
+
};
|
23
|
+
if (!Array.isArray(compilers)) {
|
24
|
+
compilers = Object.keys(compilers).map(name => {
|
25
|
+
compilers[name].name = name;
|
26
|
+
return compilers[name];
|
27
|
+
});
|
28
|
+
}
|
29
|
+
this.compilers = compilers;
|
30
|
+
let doneCompilers = 0;
|
31
|
+
let compilerStats = [];
|
32
|
+
let index = 0;
|
33
|
+
for (const compiler of this.compilers) {
|
34
|
+
let compilerDone = false;
|
35
|
+
const compilerIndex = index++;
|
36
|
+
// eslint-disable-next-line no-loop-func
|
37
|
+
compiler.hooks.done.tap("MultiCompiler", stats => {
|
38
|
+
if (!compilerDone) {
|
39
|
+
compilerDone = true;
|
40
|
+
doneCompilers++;
|
41
|
+
}
|
42
|
+
compilerStats[compilerIndex] = stats;
|
43
|
+
if (doneCompilers === this.compilers.length) {
|
44
|
+
this.hooks.done.call(new MultiStats(compilerStats));
|
45
|
+
}
|
46
|
+
});
|
47
|
+
// eslint-disable-next-line no-loop-func
|
48
|
+
compiler.hooks.invalid.tap("MultiCompiler", () => {
|
49
|
+
if (compilerDone) {
|
50
|
+
compilerDone = false;
|
51
|
+
doneCompilers--;
|
52
|
+
}
|
53
|
+
});
|
54
|
+
}
|
55
|
+
this.running = false;
|
56
|
+
}
|
57
|
+
|
58
|
+
get outputPath() {
|
59
|
+
let commonPath = this.compilers[0].outputPath;
|
60
|
+
for (const compiler of this.compilers) {
|
61
|
+
while (
|
62
|
+
compiler.outputPath.indexOf(commonPath) !== 0 &&
|
63
|
+
/[/\\]/.test(commonPath)
|
64
|
+
) {
|
65
|
+
commonPath = commonPath.replace(/[/\\][^/\\]*$/, "");
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
if (!commonPath && this.compilers[0].outputPath[0] === "/") return "/";
|
70
|
+
return commonPath;
|
71
|
+
}
|
72
|
+
|
73
|
+
get inputFileSystem() {
|
74
|
+
throw new Error("Cannot read inputFileSystem of a MultiCompiler");
|
75
|
+
}
|
76
|
+
|
77
|
+
get outputFileSystem() {
|
78
|
+
throw new Error("Cannot read outputFileSystem of a MultiCompiler");
|
79
|
+
}
|
80
|
+
|
81
|
+
set inputFileSystem(value) {
|
82
|
+
for (const compiler of this.compilers) {
|
83
|
+
compiler.inputFileSystem = value;
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
set outputFileSystem(value) {
|
88
|
+
for (const compiler of this.compilers) {
|
89
|
+
compiler.outputFileSystem = value;
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
validateDependencies(callback) {
|
94
|
+
const edges = new Set();
|
95
|
+
const missing = [];
|
96
|
+
const targetFound = compiler => {
|
97
|
+
for (const edge of edges) {
|
98
|
+
if (edge.target === compiler) {
|
99
|
+
return true;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
return false;
|
103
|
+
};
|
104
|
+
const sortEdges = (e1, e2) => {
|
105
|
+
return (
|
106
|
+
e1.source.name.localeCompare(e2.source.name) ||
|
107
|
+
e1.target.name.localeCompare(e2.target.name)
|
108
|
+
);
|
109
|
+
};
|
110
|
+
for (const source of this.compilers) {
|
111
|
+
if (source.dependencies) {
|
112
|
+
for (const dep of source.dependencies) {
|
113
|
+
const target = this.compilers.find(c => c.name === dep);
|
114
|
+
if (!target) {
|
115
|
+
missing.push(dep);
|
116
|
+
} else {
|
117
|
+
edges.add({
|
118
|
+
source,
|
119
|
+
target
|
120
|
+
});
|
121
|
+
}
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
const errors = missing.map(m => `Compiler dependency \`${m}\` not found.`);
|
126
|
+
const stack = this.compilers.filter(c => !targetFound(c));
|
127
|
+
while (stack.length > 0) {
|
128
|
+
const current = stack.pop();
|
129
|
+
for (const edge of edges) {
|
130
|
+
if (edge.source === current) {
|
131
|
+
edges.delete(edge);
|
132
|
+
const target = edge.target;
|
133
|
+
if (!targetFound(target)) {
|
134
|
+
stack.push(target);
|
135
|
+
}
|
136
|
+
}
|
137
|
+
}
|
138
|
+
}
|
139
|
+
if (edges.size > 0) {
|
140
|
+
const lines = Array.from(edges)
|
141
|
+
.sort(sortEdges)
|
142
|
+
.map(edge => `${edge.source.name} -> ${edge.target.name}`);
|
143
|
+
lines.unshift("Circular dependency found in compiler dependencies.");
|
144
|
+
errors.unshift(lines.join("\n"));
|
145
|
+
}
|
146
|
+
if (errors.length > 0) {
|
147
|
+
const message = errors.join("\n");
|
148
|
+
callback(new Error(message));
|
149
|
+
return false;
|
150
|
+
}
|
151
|
+
return true;
|
152
|
+
}
|
153
|
+
|
154
|
+
runWithDependencies(compilers, fn, callback) {
|
155
|
+
const fulfilledNames = new Set();
|
156
|
+
let remainingCompilers = compilers;
|
157
|
+
const isDependencyFulfilled = d => fulfilledNames.has(d);
|
158
|
+
const getReadyCompilers = () => {
|
159
|
+
let readyCompilers = [];
|
160
|
+
let list = remainingCompilers;
|
161
|
+
remainingCompilers = [];
|
162
|
+
for (const c of list) {
|
163
|
+
const ready =
|
164
|
+
!c.dependencies || c.dependencies.every(isDependencyFulfilled);
|
165
|
+
if (ready) {
|
166
|
+
readyCompilers.push(c);
|
167
|
+
} else {
|
168
|
+
remainingCompilers.push(c);
|
169
|
+
}
|
170
|
+
}
|
171
|
+
return readyCompilers;
|
172
|
+
};
|
173
|
+
const runCompilers = callback => {
|
174
|
+
if (remainingCompilers.length === 0) return callback();
|
175
|
+
asyncLib.map(
|
176
|
+
getReadyCompilers(),
|
177
|
+
(compiler, callback) => {
|
178
|
+
fn(compiler, err => {
|
179
|
+
if (err) return callback(err);
|
180
|
+
fulfilledNames.add(compiler.name);
|
181
|
+
runCompilers(callback);
|
182
|
+
});
|
183
|
+
},
|
184
|
+
callback
|
185
|
+
);
|
186
|
+
};
|
187
|
+
runCompilers(callback);
|
188
|
+
}
|
189
|
+
|
190
|
+
watch(watchOptions, handler) {
|
191
|
+
if (this.running) return handler(new ConcurrentCompilationError());
|
192
|
+
|
193
|
+
let watchings = [];
|
194
|
+
let allStats = this.compilers.map(() => null);
|
195
|
+
let compilerStatus = this.compilers.map(() => false);
|
196
|
+
if (this.validateDependencies(handler)) {
|
197
|
+
this.running = true;
|
198
|
+
this.runWithDependencies(
|
199
|
+
this.compilers,
|
200
|
+
(compiler, callback) => {
|
201
|
+
const compilerIdx = this.compilers.indexOf(compiler);
|
202
|
+
let firstRun = true;
|
203
|
+
let watching = compiler.watch(
|
204
|
+
Array.isArray(watchOptions)
|
205
|
+
? watchOptions[compilerIdx]
|
206
|
+
: watchOptions,
|
207
|
+
(err, stats) => {
|
208
|
+
if (err) handler(err);
|
209
|
+
if (stats) {
|
210
|
+
allStats[compilerIdx] = stats;
|
211
|
+
compilerStatus[compilerIdx] = "new";
|
212
|
+
if (compilerStatus.every(Boolean)) {
|
213
|
+
const freshStats = allStats.filter((s, idx) => {
|
214
|
+
return compilerStatus[idx] === "new";
|
215
|
+
});
|
216
|
+
compilerStatus.fill(true);
|
217
|
+
const multiStats = new MultiStats(freshStats);
|
218
|
+
handler(null, multiStats);
|
219
|
+
}
|
220
|
+
}
|
221
|
+
if (firstRun && !err) {
|
222
|
+
firstRun = false;
|
223
|
+
callback();
|
224
|
+
}
|
225
|
+
}
|
226
|
+
);
|
227
|
+
watchings.push(watching);
|
228
|
+
},
|
229
|
+
() => {
|
230
|
+
// ignore
|
231
|
+
}
|
232
|
+
);
|
233
|
+
}
|
234
|
+
|
235
|
+
return new MultiWatching(watchings, this);
|
236
|
+
}
|
237
|
+
|
238
|
+
run(callback) {
|
239
|
+
if (this.running) {
|
240
|
+
return callback(new ConcurrentCompilationError());
|
241
|
+
}
|
242
|
+
|
243
|
+
const finalCallback = (err, stats) => {
|
244
|
+
this.running = false;
|
245
|
+
|
246
|
+
if (callback !== undefined) {
|
247
|
+
return callback(err, stats);
|
248
|
+
}
|
249
|
+
};
|
250
|
+
|
251
|
+
const allStats = this.compilers.map(() => null);
|
252
|
+
if (this.validateDependencies(callback)) {
|
253
|
+
this.running = true;
|
254
|
+
this.runWithDependencies(
|
255
|
+
this.compilers,
|
256
|
+
(compiler, callback) => {
|
257
|
+
const compilerIdx = this.compilers.indexOf(compiler);
|
258
|
+
compiler.run((err, stats) => {
|
259
|
+
if (err) {
|
260
|
+
return callback(err);
|
261
|
+
}
|
262
|
+
allStats[compilerIdx] = stats;
|
263
|
+
callback();
|
264
|
+
});
|
265
|
+
},
|
266
|
+
err => {
|
267
|
+
if (err) {
|
268
|
+
return finalCallback(err);
|
269
|
+
}
|
270
|
+
finalCallback(null, new MultiStats(allStats));
|
271
|
+
}
|
272
|
+
);
|
273
|
+
}
|
274
|
+
}
|
275
|
+
|
276
|
+
purgeInputFileSystem() {
|
277
|
+
for (const compiler of this.compilers) {
|
278
|
+
if (compiler.inputFileSystem && compiler.inputFileSystem.purge) {
|
279
|
+
compiler.inputFileSystem.purge();
|
280
|
+
}
|
281
|
+
}
|
282
|
+
}
|
283
|
+
};
|
package/lib/MultiEntryPlugin.js
CHANGED
@@ -1,58 +1,58 @@
|
|
1
|
-
/*
|
2
|
-
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
-
Author Tobias Koppers @sokra
|
4
|
-
*/
|
5
|
-
"use strict";
|
6
|
-
|
7
|
-
const MultiEntryDependency = require("./dependencies/MultiEntryDependency");
|
8
|
-
const SingleEntryDependency = require("./dependencies/SingleEntryDependency");
|
9
|
-
const MultiModuleFactory = require("./MultiModuleFactory");
|
10
|
-
|
11
|
-
module.exports = class MultiEntryPlugin {
|
12
|
-
constructor(context, entries, name) {
|
13
|
-
this.context = context;
|
14
|
-
this.entries = entries;
|
15
|
-
this.name = name;
|
16
|
-
}
|
17
|
-
|
18
|
-
apply(compiler) {
|
19
|
-
compiler.hooks.compilation.tap(
|
20
|
-
"MultiEntryPlugin",
|
21
|
-
(compilation, { normalModuleFactory }) => {
|
22
|
-
const multiModuleFactory = new MultiModuleFactory();
|
23
|
-
|
24
|
-
compilation.dependencyFactories.set(
|
25
|
-
MultiEntryDependency,
|
26
|
-
multiModuleFactory
|
27
|
-
);
|
28
|
-
compilation.dependencyFactories.set(
|
29
|
-
SingleEntryDependency,
|
30
|
-
normalModuleFactory
|
31
|
-
);
|
32
|
-
}
|
33
|
-
);
|
34
|
-
|
35
|
-
compiler.hooks.make.tapAsync(
|
36
|
-
"MultiEntryPlugin",
|
37
|
-
(compilation, callback) => {
|
38
|
-
const { context, entries, name } = this;
|
39
|
-
|
40
|
-
const dep = MultiEntryPlugin.createDependency(entries, name);
|
41
|
-
compilation.addEntry(context, dep, name, callback);
|
42
|
-
}
|
43
|
-
);
|
44
|
-
}
|
45
|
-
|
46
|
-
static createDependency(entries, name) {
|
47
|
-
return new MultiEntryDependency(
|
48
|
-
entries.map((e, idx) => {
|
49
|
-
const dep = new SingleEntryDependency(e);
|
50
|
-
// Because entrypoints are not dependencies found in an
|
51
|
-
// existing module, we give it a synthetic id
|
52
|
-
dep.loc = `${name}:${100000 + idx}`;
|
53
|
-
return dep;
|
54
|
-
}),
|
55
|
-
name
|
56
|
-
);
|
57
|
-
}
|
58
|
-
};
|
1
|
+
/*
|
2
|
+
MIT License http://www.opensource.org/licenses/mit-license.php
|
3
|
+
Author Tobias Koppers @sokra
|
4
|
+
*/
|
5
|
+
"use strict";
|
6
|
+
|
7
|
+
const MultiEntryDependency = require("./dependencies/MultiEntryDependency");
|
8
|
+
const SingleEntryDependency = require("./dependencies/SingleEntryDependency");
|
9
|
+
const MultiModuleFactory = require("./MultiModuleFactory");
|
10
|
+
|
11
|
+
module.exports = class MultiEntryPlugin {
|
12
|
+
constructor(context, entries, name) {
|
13
|
+
this.context = context;
|
14
|
+
this.entries = entries;
|
15
|
+
this.name = name;
|
16
|
+
}
|
17
|
+
|
18
|
+
apply(compiler) {
|
19
|
+
compiler.hooks.compilation.tap(
|
20
|
+
"MultiEntryPlugin",
|
21
|
+
(compilation, { normalModuleFactory }) => {
|
22
|
+
const multiModuleFactory = new MultiModuleFactory();
|
23
|
+
|
24
|
+
compilation.dependencyFactories.set(
|
25
|
+
MultiEntryDependency,
|
26
|
+
multiModuleFactory
|
27
|
+
);
|
28
|
+
compilation.dependencyFactories.set(
|
29
|
+
SingleEntryDependency,
|
30
|
+
normalModuleFactory
|
31
|
+
);
|
32
|
+
}
|
33
|
+
);
|
34
|
+
|
35
|
+
compiler.hooks.make.tapAsync(
|
36
|
+
"MultiEntryPlugin",
|
37
|
+
(compilation, callback) => {
|
38
|
+
const { context, entries, name } = this;
|
39
|
+
|
40
|
+
const dep = MultiEntryPlugin.createDependency(entries, name);
|
41
|
+
compilation.addEntry(context, dep, name, callback);
|
42
|
+
}
|
43
|
+
);
|
44
|
+
}
|
45
|
+
|
46
|
+
static createDependency(entries, name) {
|
47
|
+
return new MultiEntryDependency(
|
48
|
+
entries.map((e, idx) => {
|
49
|
+
const dep = new SingleEntryDependency(e);
|
50
|
+
// Because entrypoints are not dependencies found in an
|
51
|
+
// existing module, we give it a synthetic id
|
52
|
+
dep.loc = `${name}:${100000 + idx}`;
|
53
|
+
return dep;
|
54
|
+
}),
|
55
|
+
name
|
56
|
+
);
|
57
|
+
}
|
58
|
+
};
|