webpack 3.6.0 → 3.8.1

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.
Files changed (229) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +716 -716
  3. package/bin/convert-argv.js +1 -1
  4. package/bin/webpack.js +6 -0
  5. package/buildin/.eslintrc +7 -7
  6. package/buildin/amd-define.js +3 -3
  7. package/buildin/amd-options.js +2 -2
  8. package/buildin/global.js +21 -21
  9. package/buildin/harmony-module.js +24 -24
  10. package/buildin/module.js +22 -22
  11. package/buildin/system.js +7 -7
  12. package/hot/.eslintrc +9 -9
  13. package/hot/dev-server.js +53 -53
  14. package/hot/emitter.js +2 -2
  15. package/hot/log-apply-result.js +38 -38
  16. package/hot/log.js +44 -44
  17. package/hot/only-dev-server.js +71 -71
  18. package/hot/poll.js +34 -34
  19. package/hot/signal.js +51 -51
  20. package/lib/APIPlugin.js +45 -45
  21. package/lib/AsyncDependenciesBlock.js +43 -43
  22. package/lib/AsyncDependencyToInitialChunkWarning.js +21 -0
  23. package/lib/AutomaticPrefetchPlugin.js +36 -36
  24. package/lib/BasicEvaluatedExpression.js +203 -203
  25. package/lib/CaseSensitiveModulesWarning.js +49 -49
  26. package/lib/Chunk.js +3 -0
  27. package/lib/ChunkRenderError.js +24 -24
  28. package/lib/ChunkTemplate.js +36 -36
  29. package/lib/CompatibilityPlugin.js +57 -57
  30. package/lib/Compilation.js +158 -51
  31. package/lib/Compiler.js +523 -523
  32. package/lib/ConstPlugin.js +60 -60
  33. package/lib/ContextExclusionPlugin.js +17 -0
  34. package/lib/ContextModule.js +431 -431
  35. package/lib/ContextModuleFactory.js +14 -5
  36. package/lib/ContextReplacementPlugin.js +111 -111
  37. package/lib/DefinePlugin.js +123 -123
  38. package/lib/DelegatedModule.js +98 -92
  39. package/lib/DelegatedModuleFactoryPlugin.js +59 -59
  40. package/lib/DelegatedPlugin.js +30 -30
  41. package/lib/DependenciesBlockVariable.js +51 -51
  42. package/lib/DllEntryPlugin.js +37 -37
  43. package/lib/DllModule.js +58 -58
  44. package/lib/DllModuleFactory.js +20 -20
  45. package/lib/DllPlugin.js +38 -38
  46. package/lib/DllReferencePlugin.js +62 -62
  47. package/lib/DynamicEntryPlugin.js +59 -59
  48. package/lib/EntryModuleNotFoundError.js +22 -22
  49. package/lib/EntryOptionPlugin.js +31 -31
  50. package/lib/EnvironmentPlugin.js +50 -50
  51. package/lib/ErrorHelpers.js +31 -31
  52. package/lib/EvalDevToolModulePlugin.js +22 -22
  53. package/lib/EvalDevToolModuleTemplatePlugin.js +33 -33
  54. package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +75 -75
  55. package/lib/EvalSourceMapDevToolPlugin.js +32 -32
  56. package/lib/ExportPropertyMainTemplatePlugin.js +31 -31
  57. package/lib/ExtendedAPIPlugin.js +47 -47
  58. package/lib/ExternalModule.js +7 -0
  59. package/lib/ExternalModuleFactoryPlugin.js +91 -91
  60. package/lib/ExternalsPlugin.js +21 -21
  61. package/lib/FlagDependencyExportsPlugin.js +101 -101
  62. package/lib/FunctionModulePlugin.js +24 -24
  63. package/lib/FunctionModuleTemplatePlugin.js +7 -3
  64. package/lib/HashedModuleIdsPlugin.js +42 -42
  65. package/lib/HotUpdateChunkTemplate.js +31 -31
  66. package/lib/IgnorePlugin.js +69 -69
  67. package/lib/JsonpExportMainTemplatePlugin.js +37 -37
  68. package/lib/JsonpHotUpdateChunkTemplatePlugin.js +27 -27
  69. package/lib/JsonpMainTemplate.runtime.js +2 -1
  70. package/lib/JsonpMainTemplatePlugin.js +2 -0
  71. package/lib/JsonpTemplatePlugin.js +21 -21
  72. package/lib/LibManifestPlugin.js +63 -63
  73. package/lib/LibraryTemplatePlugin.js +92 -92
  74. package/lib/LoaderOptionsPlugin.js +36 -36
  75. package/lib/LoaderTargetPlugin.js +19 -19
  76. package/lib/MemoryOutputFileSystem.js +5 -5
  77. package/lib/ModuleBuildError.js +42 -42
  78. package/lib/ModuleDependencyError.js +22 -22
  79. package/lib/ModuleDependencyWarning.js +22 -22
  80. package/lib/ModuleError.js +24 -24
  81. package/lib/ModuleFilenameHelpers.js +162 -162
  82. package/lib/ModuleNotFoundError.js +26 -26
  83. package/lib/ModuleParseError.js +1 -1
  84. package/lib/ModuleReason.js +50 -50
  85. package/lib/ModuleTemplate.js +23 -23
  86. package/lib/ModuleWarning.js +24 -24
  87. package/lib/MovedToPluginWarningPlugin.js +21 -21
  88. package/lib/MultiCompiler.js +164 -164
  89. package/lib/MultiEntryPlugin.js +39 -39
  90. package/lib/MultiModuleFactory.js +19 -19
  91. package/lib/MultiStats.js +79 -79
  92. package/lib/MultiWatching.js +32 -32
  93. package/lib/NamedChunksPlugin.js +30 -30
  94. package/lib/NamedModulesPlugin.js +27 -27
  95. package/lib/NewWatchingPlugin.js +15 -15
  96. package/lib/NoEmitOnErrorsPlugin.js +22 -22
  97. package/lib/NoErrorsPlugin.js +29 -29
  98. package/lib/NodeStuffPlugin.js +97 -97
  99. package/lib/NormalModuleReplacementPlugin.js +45 -45
  100. package/lib/NullFactory.js +12 -12
  101. package/lib/OptionsApply.js +10 -10
  102. package/lib/Parser.js +65 -34
  103. package/lib/ParserHelpers.js +85 -85
  104. package/lib/PrefetchPlugin.js +31 -31
  105. package/lib/ProgressPlugin.js +192 -192
  106. package/lib/ProvidePlugin.js +55 -55
  107. package/lib/RawModule.js +54 -54
  108. package/lib/RequestShortener.js +63 -63
  109. package/lib/RequireJsStuffPlugin.js +31 -31
  110. package/lib/RuleSet.js +444 -444
  111. package/lib/SetVarMainTemplatePlugin.js +41 -41
  112. package/lib/SingleEntryPlugin.js +35 -35
  113. package/lib/SizeFormatHelpers.js +18 -18
  114. package/lib/SourceMapDevToolModuleOptionsPlugin.js +37 -37
  115. package/lib/Stats.js +27 -8
  116. package/lib/UmdMainTemplatePlugin.js +1 -1
  117. package/lib/UnsupportedFeatureWarning.js +21 -21
  118. package/lib/UseStrictPlugin.js +34 -34
  119. package/lib/WarnCaseSensitiveModulesPlugin.js +31 -31
  120. package/lib/WatchIgnorePlugin.js +49 -49
  121. package/lib/WebpackError.js +11 -11
  122. package/lib/WebpackOptionsDefaulter.js +129 -129
  123. package/lib/WebpackOptionsValidationError.js +196 -196
  124. package/lib/compareLocations.js +36 -36
  125. package/lib/dependencies/AMDDefineDependency.js +142 -142
  126. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +5 -1
  127. package/lib/dependencies/AMDPlugin.js +119 -119
  128. package/lib/dependencies/AMDRequireArrayDependency.js +2 -0
  129. package/lib/dependencies/AMDRequireContextDependency.js +0 -9
  130. package/lib/dependencies/AMDRequireDependenciesBlock.js +33 -33
  131. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +177 -177
  132. package/lib/dependencies/AMDRequireDependency.js +67 -67
  133. package/lib/dependencies/AMDRequireItemDependency.js +22 -22
  134. package/lib/dependencies/CommonJsRequireContextDependency.js +0 -10
  135. package/lib/dependencies/CommonJsRequireDependency.js +22 -22
  136. package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +89 -89
  137. package/lib/dependencies/ConstDependency.js +32 -32
  138. package/lib/dependencies/ContextDependency.js +20 -0
  139. package/lib/dependencies/ContextDependencyHelpers.js +71 -71
  140. package/lib/dependencies/ContextElementDependency.js +21 -21
  141. package/lib/dependencies/CriticalDependencyWarning.js +20 -20
  142. package/lib/dependencies/DelegatedExportsDependency.js +33 -33
  143. package/lib/dependencies/DelegatedSourceDependency.js +18 -18
  144. package/lib/dependencies/DllEntryDependency.js +20 -20
  145. package/lib/dependencies/HarmonyCompatibilityDependency.js +30 -30
  146. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +14 -2
  147. package/lib/dependencies/HarmonyExportExpressionDependency.js +0 -7
  148. package/lib/dependencies/HarmonyExportHeaderDependency.js +28 -28
  149. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +45 -45
  150. package/lib/dependencies/HarmonyExportSpecifierDependency.js +0 -13
  151. package/lib/dependencies/HarmonyModulesHelpers.js +0 -53
  152. package/lib/dependencies/ImportContextDependency.js +0 -10
  153. package/lib/dependencies/ImportDependenciesBlock.js +17 -17
  154. package/lib/dependencies/ImportEagerContextDependency.js +22 -22
  155. package/lib/dependencies/ImportLazyContextDependency.js +22 -22
  156. package/lib/dependencies/ImportLazyOnceContextDependency.js +22 -22
  157. package/lib/dependencies/ImportParserPlugin.js +89 -89
  158. package/lib/dependencies/ImportPlugin.js +60 -60
  159. package/lib/dependencies/ImportWeakContextDependency.js +22 -22
  160. package/lib/dependencies/LoaderDependency.js +18 -18
  161. package/lib/dependencies/LoaderPlugin.js +60 -60
  162. package/lib/dependencies/LocalModule.js +23 -23
  163. package/lib/dependencies/LocalModuleDependency.js +24 -24
  164. package/lib/dependencies/LocalModulesHelpers.js +46 -46
  165. package/lib/dependencies/ModuleDependency.js +23 -23
  166. package/lib/dependencies/ModuleHotAcceptDependency.js +23 -23
  167. package/lib/dependencies/ModuleHotDeclineDependency.js +23 -23
  168. package/lib/dependencies/MultiEntryDependency.js +20 -20
  169. package/lib/dependencies/NullDependency.js +24 -24
  170. package/lib/dependencies/PrefetchDependency.js +18 -18
  171. package/lib/dependencies/RequireContextDependency.js +26 -26
  172. package/lib/dependencies/RequireContextDependencyParserPlugin.js +50 -50
  173. package/lib/dependencies/RequireContextPlugin.js +96 -96
  174. package/lib/dependencies/RequireEnsureDependenciesBlock.js +22 -22
  175. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +102 -102
  176. package/lib/dependencies/RequireEnsureDependency.js +38 -38
  177. package/lib/dependencies/RequireEnsureItemDependency.js +21 -21
  178. package/lib/dependencies/RequireEnsurePlugin.js +40 -40
  179. package/lib/dependencies/RequireHeaderDependency.js +26 -26
  180. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +21 -21
  181. package/lib/dependencies/RequireIncludePlugin.js +33 -33
  182. package/lib/dependencies/RequireResolveContextDependency.js +0 -10
  183. package/lib/dependencies/RequireResolveDependency.js +22 -22
  184. package/lib/dependencies/RequireResolveDependencyParserPlugin.js +71 -71
  185. package/lib/dependencies/RequireResolveHeaderDependency.js +26 -26
  186. package/lib/dependencies/SingleEntryDependency.js +18 -18
  187. package/lib/dependencies/SystemPlugin.js +44 -44
  188. package/lib/dependencies/UnsupportedDependency.js +23 -23
  189. package/lib/dependencies/WebpackMissingModule.js +18 -18
  190. package/lib/dependencies/getFunctionExpression.js +44 -44
  191. package/lib/formatLocation.js +54 -54
  192. package/lib/node/NodeChunkTemplatePlugin.js +27 -27
  193. package/lib/node/NodeEnvironmentPlugin.js +25 -25
  194. package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +27 -27
  195. package/lib/node/NodeMainTemplate.runtime.js +24 -24
  196. package/lib/node/NodeMainTemplateAsync.runtime.js +40 -40
  197. package/lib/node/NodeOutputFileSystem.js +22 -22
  198. package/lib/node/NodeSourcePlugin.js +88 -88
  199. package/lib/node/NodeTargetPlugin.js +15 -15
  200. package/lib/node/NodeTemplatePlugin.js +27 -27
  201. package/lib/node/NodeWatchFileSystem.js +72 -72
  202. package/lib/optimize/ChunkModuleIdRangePlugin.js +53 -53
  203. package/lib/optimize/CommonsChunkPlugin.js +40 -19
  204. package/lib/optimize/ConcatenatedModule.js +27 -24
  205. package/lib/optimize/DedupePlugin.js +15 -15
  206. package/lib/optimize/FlagIncludedChunksPlugin.js +35 -35
  207. package/lib/optimize/LimitChunkCountPlugin.js +59 -59
  208. package/lib/optimize/MinChunkSizePlugin.js +65 -65
  209. package/lib/optimize/RemoveEmptyChunksPlugin.js +21 -21
  210. package/lib/optimize/UglifyJsPlugin.js +9 -9
  211. package/lib/performance/AssetsOverSizeLimitWarning.js +23 -23
  212. package/lib/performance/EntrypointsOverSizeLimitWarning.js +28 -28
  213. package/lib/performance/NoAsyncChunksWarning.js +20 -20
  214. package/lib/performance/SizeLimitsPlugin.js +102 -102
  215. package/lib/prepareOptions.js +29 -29
  216. package/lib/removeAndDo.js +15 -15
  217. package/lib/util/Queue.js +42 -0
  218. package/lib/util/Semaphore.js +32 -32
  219. package/lib/util/identifier.js +38 -38
  220. package/lib/validateSchema.js +66 -66
  221. package/lib/web/WebEnvironmentPlugin.js +18 -18
  222. package/lib/webpack.js +1 -0
  223. package/lib/webworker/WebWorkerChunkTemplatePlugin.js +29 -29
  224. package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +28 -28
  225. package/lib/webworker/WebWorkerMainTemplate.runtime.js +58 -58
  226. package/lib/webworker/WebWorkerTemplatePlugin.js +20 -20
  227. package/package.json +1 -1
  228. package/schemas/ajv.absolutePath.js +29 -29
  229. package/schemas/webpackOptionsSchema.json +69 -0
package/lib/Compiler.js CHANGED
@@ -1,523 +1,523 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Tobias Koppers @sokra
4
- */
5
- "use strict";
6
-
7
- const path = require("path");
8
- const Tapable = require("tapable");
9
-
10
- const Compilation = require("./Compilation");
11
- const Stats = require("./Stats");
12
- const NormalModuleFactory = require("./NormalModuleFactory");
13
- const ContextModuleFactory = require("./ContextModuleFactory");
14
-
15
- const makePathsRelative = require("./util/identifier").makePathsRelative;
16
-
17
- class Watching {
18
- constructor(compiler, watchOptions, handler) {
19
- this.startTime = null;
20
- this.invalid = false;
21
- this.handler = handler;
22
- this.callbacks = [];
23
- this.closed = false;
24
- if(typeof watchOptions === "number") {
25
- this.watchOptions = {
26
- aggregateTimeout: watchOptions
27
- };
28
- } else if(watchOptions && typeof watchOptions === "object") {
29
- this.watchOptions = Object.assign({}, watchOptions);
30
- } else {
31
- this.watchOptions = {};
32
- }
33
- this.watchOptions.aggregateTimeout = this.watchOptions.aggregateTimeout || 200;
34
- this.compiler = compiler;
35
- this.running = true;
36
- this.compiler.readRecords(err => {
37
- if(err) return this._done(err);
38
-
39
- this._go();
40
- });
41
- }
42
-
43
- _go() {
44
- this.startTime = Date.now();
45
- this.running = true;
46
- this.invalid = false;
47
- this.compiler.applyPluginsAsync("watch-run", this, err => {
48
- if(err) return this._done(err);
49
- const onCompiled = (err, compilation) => {
50
- if(err) return this._done(err);
51
- if(this.invalid) return this._done();
52
-
53
- if(this.compiler.applyPluginsBailResult("should-emit", compilation) === false) {
54
- return this._done(null, compilation);
55
- }
56
-
57
- this.compiler.emitAssets(compilation, err => {
58
- if(err) return this._done(err);
59
- if(this.invalid) return this._done();
60
-
61
- this.compiler.emitRecords(err => {
62
- if(err) return this._done(err);
63
-
64
- if(compilation.applyPluginsBailResult("need-additional-pass")) {
65
- compilation.needAdditionalPass = true;
66
-
67
- const stats = new Stats(compilation);
68
- stats.startTime = this.startTime;
69
- stats.endTime = Date.now();
70
- this.compiler.applyPlugins("done", stats);
71
-
72
- this.compiler.applyPluginsAsync("additional-pass", err => {
73
- if(err) return this._done(err);
74
- this.compiler.compile(onCompiled);
75
- });
76
- return;
77
- }
78
- return this._done(null, compilation);
79
- });
80
- });
81
- };
82
- this.compiler.compile(onCompiled);
83
- });
84
- }
85
-
86
- _getStats(compilation) {
87
- const stats = new Stats(compilation);
88
- stats.startTime = this.startTime;
89
- stats.endTime = Date.now();
90
- return stats;
91
- }
92
-
93
- _done(err, compilation) {
94
- this.running = false;
95
- if(this.invalid) return this._go();
96
-
97
- const stats = compilation ? this._getStats(compilation) : null;
98
- if(err) {
99
- this.compiler.applyPlugins("failed", err);
100
- this.handler(err, stats);
101
- return;
102
- }
103
-
104
- this.compiler.applyPlugins("done", stats);
105
- this.handler(null, stats);
106
- if(!this.closed) {
107
- this.watch(compilation.fileDependencies, compilation.contextDependencies, compilation.missingDependencies);
108
- }
109
- this.callbacks.forEach(cb => cb());
110
- this.callbacks.length = 0;
111
- }
112
-
113
- watch(files, dirs, missing) {
114
- this.pausedWatcher = null;
115
- this.watcher = this.compiler.watchFileSystem.watch(files, dirs, missing, this.startTime, this.watchOptions, (err, filesModified, contextModified, missingModified, fileTimestamps, contextTimestamps) => {
116
- this.pausedWatcher = this.watcher;
117
- this.watcher = null;
118
- if(err) return this.handler(err);
119
-
120
- this.compiler.fileTimestamps = fileTimestamps;
121
- this.compiler.contextTimestamps = contextTimestamps;
122
- this.invalidate();
123
- }, (fileName, changeTime) => {
124
- this.compiler.applyPlugins("invalid", fileName, changeTime);
125
- });
126
- }
127
-
128
- invalidate(callback) {
129
- if(callback) {
130
- this.callbacks.push(callback);
131
- }
132
- if(this.watcher) {
133
- this.pausedWatcher = this.watcher;
134
- this.watcher.pause();
135
- this.watcher = null;
136
- }
137
- if(this.running) {
138
- this.invalid = true;
139
- return false;
140
- } else {
141
- this._go();
142
- }
143
- }
144
-
145
- close(callback) {
146
- if(callback === undefined) callback = function() {};
147
-
148
- this.closed = true;
149
- if(this.watcher) {
150
- this.watcher.close();
151
- this.watcher = null;
152
- }
153
- if(this.pausedWatcher) {
154
- this.pausedWatcher.close();
155
- this.pausedWatcher = null;
156
- }
157
- if(this.running) {
158
- this.invalid = true;
159
- this._done = () => {
160
- this.compiler.applyPlugins("watch-close");
161
- callback();
162
- };
163
- } else {
164
- this.compiler.applyPlugins("watch-close");
165
- callback();
166
- }
167
- }
168
- }
169
-
170
- class Compiler extends Tapable {
171
- constructor() {
172
- super();
173
- this.outputPath = "";
174
- this.outputFileSystem = null;
175
- this.inputFileSystem = null;
176
-
177
- this.recordsInputPath = null;
178
- this.recordsOutputPath = null;
179
- this.records = {};
180
-
181
- this.fileTimestamps = {};
182
- this.contextTimestamps = {};
183
-
184
- this.resolvers = {
185
- normal: null,
186
- loader: null,
187
- context: null
188
- };
189
- let deprecationReported = false;
190
- this.parser = {
191
- plugin: (hook, fn) => {
192
- if(!deprecationReported) {
193
- console.warn("webpack: Using compiler.parser is deprecated.\n" +
194
- "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.plugin(/* ... */); });\n}); instead. " +
195
- "It was called " + new Error().stack.split("\n")[2].trim() + ".");
196
- deprecationReported = true;
197
- }
198
- this.plugin("compilation", (compilation, data) => {
199
- data.normalModuleFactory.plugin("parser", parser => {
200
- parser.plugin(hook, fn);
201
- });
202
- });
203
- },
204
- apply: () => {
205
- const args = arguments;
206
- if(!deprecationReported) {
207
- console.warn("webpack: Using compiler.parser is deprecated.\n" +
208
- "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.apply(/* ... */); });\n}); instead. " +
209
- "It was called " + new Error().stack.split("\n")[2].trim() + ".");
210
- deprecationReported = true;
211
- }
212
- this.plugin("compilation", (compilation, data) => {
213
- data.normalModuleFactory.plugin("parser", parser => {
214
- parser.apply.apply(parser, args);
215
- });
216
- });
217
- }
218
- };
219
-
220
- this.options = {};
221
- }
222
-
223
- watch(watchOptions, handler) {
224
- this.fileTimestamps = {};
225
- this.contextTimestamps = {};
226
- const watching = new Watching(this, watchOptions, handler);
227
- return watching;
228
- }
229
-
230
- run(callback) {
231
- const startTime = Date.now();
232
-
233
- const onCompiled = (err, compilation) => {
234
- if(err) return callback(err);
235
-
236
- if(this.applyPluginsBailResult("should-emit", compilation) === false) {
237
- const stats = new Stats(compilation);
238
- stats.startTime = startTime;
239
- stats.endTime = Date.now();
240
- this.applyPlugins("done", stats);
241
- return callback(null, stats);
242
- }
243
-
244
- this.emitAssets(compilation, err => {
245
- if(err) return callback(err);
246
-
247
- if(compilation.applyPluginsBailResult("need-additional-pass")) {
248
- compilation.needAdditionalPass = true;
249
-
250
- const stats = new Stats(compilation);
251
- stats.startTime = startTime;
252
- stats.endTime = Date.now();
253
- this.applyPlugins("done", stats);
254
-
255
- this.applyPluginsAsync("additional-pass", err => {
256
- if(err) return callback(err);
257
- this.compile(onCompiled);
258
- });
259
- return;
260
- }
261
-
262
- this.emitRecords(err => {
263
- if(err) return callback(err);
264
-
265
- const stats = new Stats(compilation);
266
- stats.startTime = startTime;
267
- stats.endTime = Date.now();
268
- this.applyPlugins("done", stats);
269
- return callback(null, stats);
270
- });
271
- });
272
- };
273
-
274
- this.applyPluginsAsync("before-run", this, err => {
275
- if(err) return callback(err);
276
-
277
- this.applyPluginsAsync("run", this, err => {
278
- if(err) return callback(err);
279
-
280
- this.readRecords(err => {
281
- if(err) return callback(err);
282
-
283
- this.compile(onCompiled);
284
- });
285
- });
286
- });
287
- }
288
-
289
- runAsChild(callback) {
290
- this.compile((err, compilation) => {
291
- if(err) return callback(err);
292
-
293
- this.parentCompilation.children.push(compilation);
294
- Object.keys(compilation.assets).forEach(name => {
295
- this.parentCompilation.assets[name] = compilation.assets[name];
296
- });
297
-
298
- const entries = Object.keys(compilation.entrypoints).map(name => {
299
- return compilation.entrypoints[name].chunks;
300
- }).reduce((array, chunks) => {
301
- return array.concat(chunks);
302
- }, []);
303
-
304
- return callback(null, entries, compilation);
305
- });
306
- }
307
-
308
- purgeInputFileSystem() {
309
- if(this.inputFileSystem && this.inputFileSystem.purge)
310
- this.inputFileSystem.purge();
311
- }
312
-
313
- emitAssets(compilation, callback) {
314
- let outputPath;
315
-
316
- const emitFiles = (err) => {
317
- if(err) return callback(err);
318
-
319
- require("async").forEach(Object.keys(compilation.assets), (file, callback) => {
320
-
321
- let targetFile = file;
322
- const queryStringIdx = targetFile.indexOf("?");
323
- if(queryStringIdx >= 0) {
324
- targetFile = targetFile.substr(0, queryStringIdx);
325
- }
326
-
327
- const writeOut = (err) => {
328
- if(err) return callback(err);
329
- const targetPath = this.outputFileSystem.join(outputPath, targetFile);
330
- const source = compilation.assets[file];
331
- if(source.existsAt === targetPath) {
332
- source.emitted = false;
333
- return callback();
334
- }
335
- let content = source.source();
336
-
337
- if(!Buffer.isBuffer(content)) {
338
- content = new Buffer(content, "utf8"); // eslint-disable-line
339
- }
340
-
341
- source.existsAt = targetPath;
342
- source.emitted = true;
343
- this.outputFileSystem.writeFile(targetPath, content, callback);
344
- };
345
-
346
- if(targetFile.match(/\/|\\/)) {
347
- const dir = path.dirname(targetFile);
348
- this.outputFileSystem.mkdirp(this.outputFileSystem.join(outputPath, dir), writeOut);
349
- } else writeOut();
350
-
351
- }, err => {
352
- if(err) return callback(err);
353
-
354
- afterEmit.call(this);
355
- });
356
- };
357
-
358
- this.applyPluginsAsync("emit", compilation, err => {
359
- if(err) return callback(err);
360
- outputPath = compilation.getPath(this.outputPath);
361
- this.outputFileSystem.mkdirp(outputPath, emitFiles);
362
- });
363
-
364
- function afterEmit() {
365
- this.applyPluginsAsyncSeries1("after-emit", compilation, err => {
366
- if(err) return callback(err);
367
-
368
- return callback();
369
- });
370
- }
371
-
372
- }
373
-
374
- emitRecords(callback) {
375
- if(!this.recordsOutputPath) return callback();
376
- const idx1 = this.recordsOutputPath.lastIndexOf("/");
377
- const idx2 = this.recordsOutputPath.lastIndexOf("\\");
378
- let recordsOutputPathDirectory = null;
379
- if(idx1 > idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx1);
380
- if(idx1 < idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx2);
381
- if(!recordsOutputPathDirectory) return writeFile.call(this);
382
- this.outputFileSystem.mkdirp(recordsOutputPathDirectory, err => {
383
- if(err) return callback(err);
384
- writeFile.call(this);
385
- });
386
-
387
- function writeFile() {
388
- this.outputFileSystem.writeFile(this.recordsOutputPath, JSON.stringify(this.records, undefined, 2), callback);
389
- }
390
- }
391
-
392
- readRecords(callback) {
393
- if(!this.recordsInputPath) {
394
- this.records = {};
395
- return callback();
396
- }
397
- this.inputFileSystem.stat(this.recordsInputPath, err => {
398
- // It doesn't exist
399
- // We can ignore this.
400
- if(err) return callback();
401
-
402
- this.inputFileSystem.readFile(this.recordsInputPath, (err, content) => {
403
- if(err) return callback(err);
404
-
405
- try {
406
- this.records = JSON.parse(content.toString("utf-8"));
407
- } catch(e) {
408
- e.message = "Cannot parse records: " + e.message;
409
- return callback(e);
410
- }
411
-
412
- return callback();
413
- });
414
- });
415
- }
416
-
417
- createChildCompiler(compilation, compilerName, compilerIndex, outputOptions, plugins) {
418
- const childCompiler = new Compiler();
419
- if(Array.isArray(plugins)) {
420
- plugins.forEach(plugin => childCompiler.apply(plugin));
421
- }
422
- for(const name in this._plugins) {
423
- if(["make", "compile", "emit", "after-emit", "invalid", "done", "this-compilation"].indexOf(name) < 0)
424
- childCompiler._plugins[name] = this._plugins[name].slice();
425
- }
426
- childCompiler.name = compilerName;
427
- childCompiler.outputPath = this.outputPath;
428
- childCompiler.inputFileSystem = this.inputFileSystem;
429
- childCompiler.outputFileSystem = null;
430
- childCompiler.resolvers = this.resolvers;
431
- childCompiler.fileTimestamps = this.fileTimestamps;
432
- childCompiler.contextTimestamps = this.contextTimestamps;
433
-
434
- const relativeCompilerName = makePathsRelative(this.context, compilerName);
435
- if(!this.records[relativeCompilerName]) this.records[relativeCompilerName] = [];
436
- if(this.records[relativeCompilerName][compilerIndex])
437
- childCompiler.records = this.records[relativeCompilerName][compilerIndex];
438
- else
439
- this.records[relativeCompilerName].push(childCompiler.records = {});
440
-
441
- childCompiler.options = Object.create(this.options);
442
- childCompiler.options.output = Object.create(childCompiler.options.output);
443
- for(const name in outputOptions) {
444
- childCompiler.options.output[name] = outputOptions[name];
445
- }
446
- childCompiler.parentCompilation = compilation;
447
-
448
- compilation.applyPlugins("child-compiler", childCompiler, compilerName, compilerIndex);
449
-
450
- return childCompiler;
451
- }
452
-
453
- isChild() {
454
- return !!this.parentCompilation;
455
- }
456
-
457
- createCompilation() {
458
- return new Compilation(this);
459
- }
460
-
461
- newCompilation(params) {
462
- const compilation = this.createCompilation();
463
- compilation.fileTimestamps = this.fileTimestamps;
464
- compilation.contextTimestamps = this.contextTimestamps;
465
- compilation.name = this.name;
466
- compilation.records = this.records;
467
- compilation.compilationDependencies = params.compilationDependencies;
468
- this.applyPlugins("this-compilation", compilation, params);
469
- this.applyPlugins("compilation", compilation, params);
470
- return compilation;
471
- }
472
-
473
- createNormalModuleFactory() {
474
- const normalModuleFactory = new NormalModuleFactory(this.options.context, this.resolvers, this.options.module || {});
475
- this.applyPlugins("normal-module-factory", normalModuleFactory);
476
- return normalModuleFactory;
477
- }
478
-
479
- createContextModuleFactory() {
480
- const contextModuleFactory = new ContextModuleFactory(this.resolvers, this.inputFileSystem);
481
- this.applyPlugins("context-module-factory", contextModuleFactory);
482
- return contextModuleFactory;
483
- }
484
-
485
- newCompilationParams() {
486
- const params = {
487
- normalModuleFactory: this.createNormalModuleFactory(),
488
- contextModuleFactory: this.createContextModuleFactory(),
489
- compilationDependencies: []
490
- };
491
- return params;
492
- }
493
-
494
- compile(callback) {
495
- const params = this.newCompilationParams();
496
- this.applyPluginsAsync("before-compile", params, err => {
497
- if(err) return callback(err);
498
-
499
- this.applyPlugins("compile", params);
500
-
501
- const compilation = this.newCompilation(params);
502
-
503
- this.applyPluginsParallel("make", compilation, err => {
504
- if(err) return callback(err);
505
-
506
- compilation.finish();
507
-
508
- compilation.seal(err => {
509
- if(err) return callback(err);
510
-
511
- this.applyPluginsAsync("after-compile", compilation, err => {
512
- if(err) return callback(err);
513
-
514
- return callback(null, compilation);
515
- });
516
- });
517
- });
518
- });
519
- }
520
- }
521
-
522
- Compiler.Watching = Watching;
523
- module.exports = Compiler;
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+
7
+ const path = require("path");
8
+ const Tapable = require("tapable");
9
+
10
+ const Compilation = require("./Compilation");
11
+ const Stats = require("./Stats");
12
+ const NormalModuleFactory = require("./NormalModuleFactory");
13
+ const ContextModuleFactory = require("./ContextModuleFactory");
14
+
15
+ const makePathsRelative = require("./util/identifier").makePathsRelative;
16
+
17
+ class Watching {
18
+ constructor(compiler, watchOptions, handler) {
19
+ this.startTime = null;
20
+ this.invalid = false;
21
+ this.handler = handler;
22
+ this.callbacks = [];
23
+ this.closed = false;
24
+ if(typeof watchOptions === "number") {
25
+ this.watchOptions = {
26
+ aggregateTimeout: watchOptions
27
+ };
28
+ } else if(watchOptions && typeof watchOptions === "object") {
29
+ this.watchOptions = Object.assign({}, watchOptions);
30
+ } else {
31
+ this.watchOptions = {};
32
+ }
33
+ this.watchOptions.aggregateTimeout = this.watchOptions.aggregateTimeout || 200;
34
+ this.compiler = compiler;
35
+ this.running = true;
36
+ this.compiler.readRecords(err => {
37
+ if(err) return this._done(err);
38
+
39
+ this._go();
40
+ });
41
+ }
42
+
43
+ _go() {
44
+ this.startTime = Date.now();
45
+ this.running = true;
46
+ this.invalid = false;
47
+ this.compiler.applyPluginsAsync("watch-run", this, err => {
48
+ if(err) return this._done(err);
49
+ const onCompiled = (err, compilation) => {
50
+ if(err) return this._done(err);
51
+ if(this.invalid) return this._done();
52
+
53
+ if(this.compiler.applyPluginsBailResult("should-emit", compilation) === false) {
54
+ return this._done(null, compilation);
55
+ }
56
+
57
+ this.compiler.emitAssets(compilation, err => {
58
+ if(err) return this._done(err);
59
+ if(this.invalid) return this._done();
60
+
61
+ this.compiler.emitRecords(err => {
62
+ if(err) return this._done(err);
63
+
64
+ if(compilation.applyPluginsBailResult("need-additional-pass")) {
65
+ compilation.needAdditionalPass = true;
66
+
67
+ const stats = new Stats(compilation);
68
+ stats.startTime = this.startTime;
69
+ stats.endTime = Date.now();
70
+ this.compiler.applyPlugins("done", stats);
71
+
72
+ this.compiler.applyPluginsAsync("additional-pass", err => {
73
+ if(err) return this._done(err);
74
+ this.compiler.compile(onCompiled);
75
+ });
76
+ return;
77
+ }
78
+ return this._done(null, compilation);
79
+ });
80
+ });
81
+ };
82
+ this.compiler.compile(onCompiled);
83
+ });
84
+ }
85
+
86
+ _getStats(compilation) {
87
+ const stats = new Stats(compilation);
88
+ stats.startTime = this.startTime;
89
+ stats.endTime = Date.now();
90
+ return stats;
91
+ }
92
+
93
+ _done(err, compilation) {
94
+ this.running = false;
95
+ if(this.invalid) return this._go();
96
+
97
+ const stats = compilation ? this._getStats(compilation) : null;
98
+ if(err) {
99
+ this.compiler.applyPlugins("failed", err);
100
+ this.handler(err, stats);
101
+ return;
102
+ }
103
+
104
+ this.compiler.applyPlugins("done", stats);
105
+ this.handler(null, stats);
106
+ if(!this.closed) {
107
+ this.watch(compilation.fileDependencies, compilation.contextDependencies, compilation.missingDependencies);
108
+ }
109
+ this.callbacks.forEach(cb => cb());
110
+ this.callbacks.length = 0;
111
+ }
112
+
113
+ watch(files, dirs, missing) {
114
+ this.pausedWatcher = null;
115
+ this.watcher = this.compiler.watchFileSystem.watch(files, dirs, missing, this.startTime, this.watchOptions, (err, filesModified, contextModified, missingModified, fileTimestamps, contextTimestamps) => {
116
+ this.pausedWatcher = this.watcher;
117
+ this.watcher = null;
118
+ if(err) return this.handler(err);
119
+
120
+ this.compiler.fileTimestamps = fileTimestamps;
121
+ this.compiler.contextTimestamps = contextTimestamps;
122
+ this.invalidate();
123
+ }, (fileName, changeTime) => {
124
+ this.compiler.applyPlugins("invalid", fileName, changeTime);
125
+ });
126
+ }
127
+
128
+ invalidate(callback) {
129
+ if(callback) {
130
+ this.callbacks.push(callback);
131
+ }
132
+ if(this.watcher) {
133
+ this.pausedWatcher = this.watcher;
134
+ this.watcher.pause();
135
+ this.watcher = null;
136
+ }
137
+ if(this.running) {
138
+ this.invalid = true;
139
+ return false;
140
+ } else {
141
+ this._go();
142
+ }
143
+ }
144
+
145
+ close(callback) {
146
+ if(callback === undefined) callback = function() {};
147
+
148
+ this.closed = true;
149
+ if(this.watcher) {
150
+ this.watcher.close();
151
+ this.watcher = null;
152
+ }
153
+ if(this.pausedWatcher) {
154
+ this.pausedWatcher.close();
155
+ this.pausedWatcher = null;
156
+ }
157
+ if(this.running) {
158
+ this.invalid = true;
159
+ this._done = () => {
160
+ this.compiler.applyPlugins("watch-close");
161
+ callback();
162
+ };
163
+ } else {
164
+ this.compiler.applyPlugins("watch-close");
165
+ callback();
166
+ }
167
+ }
168
+ }
169
+
170
+ class Compiler extends Tapable {
171
+ constructor() {
172
+ super();
173
+ this.outputPath = "";
174
+ this.outputFileSystem = null;
175
+ this.inputFileSystem = null;
176
+
177
+ this.recordsInputPath = null;
178
+ this.recordsOutputPath = null;
179
+ this.records = {};
180
+
181
+ this.fileTimestamps = {};
182
+ this.contextTimestamps = {};
183
+
184
+ this.resolvers = {
185
+ normal: null,
186
+ loader: null,
187
+ context: null
188
+ };
189
+ let deprecationReported = false;
190
+ this.parser = {
191
+ plugin: (hook, fn) => {
192
+ if(!deprecationReported) {
193
+ console.warn("webpack: Using compiler.parser is deprecated.\n" +
194
+ "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.plugin(/* ... */); });\n}); instead. " +
195
+ "It was called " + new Error().stack.split("\n")[2].trim() + ".");
196
+ deprecationReported = true;
197
+ }
198
+ this.plugin("compilation", (compilation, data) => {
199
+ data.normalModuleFactory.plugin("parser", parser => {
200
+ parser.plugin(hook, fn);
201
+ });
202
+ });
203
+ },
204
+ apply: () => {
205
+ const args = arguments;
206
+ if(!deprecationReported) {
207
+ console.warn("webpack: Using compiler.parser is deprecated.\n" +
208
+ "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.apply(/* ... */); });\n}); instead. " +
209
+ "It was called " + new Error().stack.split("\n")[2].trim() + ".");
210
+ deprecationReported = true;
211
+ }
212
+ this.plugin("compilation", (compilation, data) => {
213
+ data.normalModuleFactory.plugin("parser", parser => {
214
+ parser.apply.apply(parser, args);
215
+ });
216
+ });
217
+ }
218
+ };
219
+
220
+ this.options = {};
221
+ }
222
+
223
+ watch(watchOptions, handler) {
224
+ this.fileTimestamps = {};
225
+ this.contextTimestamps = {};
226
+ const watching = new Watching(this, watchOptions, handler);
227
+ return watching;
228
+ }
229
+
230
+ run(callback) {
231
+ const startTime = Date.now();
232
+
233
+ const onCompiled = (err, compilation) => {
234
+ if(err) return callback(err);
235
+
236
+ if(this.applyPluginsBailResult("should-emit", compilation) === false) {
237
+ const stats = new Stats(compilation);
238
+ stats.startTime = startTime;
239
+ stats.endTime = Date.now();
240
+ this.applyPlugins("done", stats);
241
+ return callback(null, stats);
242
+ }
243
+
244
+ this.emitAssets(compilation, err => {
245
+ if(err) return callback(err);
246
+
247
+ if(compilation.applyPluginsBailResult("need-additional-pass")) {
248
+ compilation.needAdditionalPass = true;
249
+
250
+ const stats = new Stats(compilation);
251
+ stats.startTime = startTime;
252
+ stats.endTime = Date.now();
253
+ this.applyPlugins("done", stats);
254
+
255
+ this.applyPluginsAsync("additional-pass", err => {
256
+ if(err) return callback(err);
257
+ this.compile(onCompiled);
258
+ });
259
+ return;
260
+ }
261
+
262
+ this.emitRecords(err => {
263
+ if(err) return callback(err);
264
+
265
+ const stats = new Stats(compilation);
266
+ stats.startTime = startTime;
267
+ stats.endTime = Date.now();
268
+ this.applyPlugins("done", stats);
269
+ return callback(null, stats);
270
+ });
271
+ });
272
+ };
273
+
274
+ this.applyPluginsAsync("before-run", this, err => {
275
+ if(err) return callback(err);
276
+
277
+ this.applyPluginsAsync("run", this, err => {
278
+ if(err) return callback(err);
279
+
280
+ this.readRecords(err => {
281
+ if(err) return callback(err);
282
+
283
+ this.compile(onCompiled);
284
+ });
285
+ });
286
+ });
287
+ }
288
+
289
+ runAsChild(callback) {
290
+ this.compile((err, compilation) => {
291
+ if(err) return callback(err);
292
+
293
+ this.parentCompilation.children.push(compilation);
294
+ Object.keys(compilation.assets).forEach(name => {
295
+ this.parentCompilation.assets[name] = compilation.assets[name];
296
+ });
297
+
298
+ const entries = Object.keys(compilation.entrypoints).map(name => {
299
+ return compilation.entrypoints[name].chunks;
300
+ }).reduce((array, chunks) => {
301
+ return array.concat(chunks);
302
+ }, []);
303
+
304
+ return callback(null, entries, compilation);
305
+ });
306
+ }
307
+
308
+ purgeInputFileSystem() {
309
+ if(this.inputFileSystem && this.inputFileSystem.purge)
310
+ this.inputFileSystem.purge();
311
+ }
312
+
313
+ emitAssets(compilation, callback) {
314
+ let outputPath;
315
+
316
+ const emitFiles = (err) => {
317
+ if(err) return callback(err);
318
+
319
+ require("async").forEach(Object.keys(compilation.assets), (file, callback) => {
320
+
321
+ let targetFile = file;
322
+ const queryStringIdx = targetFile.indexOf("?");
323
+ if(queryStringIdx >= 0) {
324
+ targetFile = targetFile.substr(0, queryStringIdx);
325
+ }
326
+
327
+ const writeOut = (err) => {
328
+ if(err) return callback(err);
329
+ const targetPath = this.outputFileSystem.join(outputPath, targetFile);
330
+ const source = compilation.assets[file];
331
+ if(source.existsAt === targetPath) {
332
+ source.emitted = false;
333
+ return callback();
334
+ }
335
+ let content = source.source();
336
+
337
+ if(!Buffer.isBuffer(content)) {
338
+ content = new Buffer(content, "utf8"); // eslint-disable-line
339
+ }
340
+
341
+ source.existsAt = targetPath;
342
+ source.emitted = true;
343
+ this.outputFileSystem.writeFile(targetPath, content, callback);
344
+ };
345
+
346
+ if(targetFile.match(/\/|\\/)) {
347
+ const dir = path.dirname(targetFile);
348
+ this.outputFileSystem.mkdirp(this.outputFileSystem.join(outputPath, dir), writeOut);
349
+ } else writeOut();
350
+
351
+ }, err => {
352
+ if(err) return callback(err);
353
+
354
+ afterEmit.call(this);
355
+ });
356
+ };
357
+
358
+ this.applyPluginsAsync("emit", compilation, err => {
359
+ if(err) return callback(err);
360
+ outputPath = compilation.getPath(this.outputPath);
361
+ this.outputFileSystem.mkdirp(outputPath, emitFiles);
362
+ });
363
+
364
+ function afterEmit() {
365
+ this.applyPluginsAsyncSeries1("after-emit", compilation, err => {
366
+ if(err) return callback(err);
367
+
368
+ return callback();
369
+ });
370
+ }
371
+
372
+ }
373
+
374
+ emitRecords(callback) {
375
+ if(!this.recordsOutputPath) return callback();
376
+ const idx1 = this.recordsOutputPath.lastIndexOf("/");
377
+ const idx2 = this.recordsOutputPath.lastIndexOf("\\");
378
+ let recordsOutputPathDirectory = null;
379
+ if(idx1 > idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx1);
380
+ if(idx1 < idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx2);
381
+ if(!recordsOutputPathDirectory) return writeFile.call(this);
382
+ this.outputFileSystem.mkdirp(recordsOutputPathDirectory, err => {
383
+ if(err) return callback(err);
384
+ writeFile.call(this);
385
+ });
386
+
387
+ function writeFile() {
388
+ this.outputFileSystem.writeFile(this.recordsOutputPath, JSON.stringify(this.records, undefined, 2), callback);
389
+ }
390
+ }
391
+
392
+ readRecords(callback) {
393
+ if(!this.recordsInputPath) {
394
+ this.records = {};
395
+ return callback();
396
+ }
397
+ this.inputFileSystem.stat(this.recordsInputPath, err => {
398
+ // It doesn't exist
399
+ // We can ignore this.
400
+ if(err) return callback();
401
+
402
+ this.inputFileSystem.readFile(this.recordsInputPath, (err, content) => {
403
+ if(err) return callback(err);
404
+
405
+ try {
406
+ this.records = JSON.parse(content.toString("utf-8"));
407
+ } catch(e) {
408
+ e.message = "Cannot parse records: " + e.message;
409
+ return callback(e);
410
+ }
411
+
412
+ return callback();
413
+ });
414
+ });
415
+ }
416
+
417
+ createChildCompiler(compilation, compilerName, compilerIndex, outputOptions, plugins) {
418
+ const childCompiler = new Compiler();
419
+ if(Array.isArray(plugins)) {
420
+ plugins.forEach(plugin => childCompiler.apply(plugin));
421
+ }
422
+ for(const name in this._plugins) {
423
+ if(["make", "compile", "emit", "after-emit", "invalid", "done", "this-compilation"].indexOf(name) < 0)
424
+ childCompiler._plugins[name] = this._plugins[name].slice();
425
+ }
426
+ childCompiler.name = compilerName;
427
+ childCompiler.outputPath = this.outputPath;
428
+ childCompiler.inputFileSystem = this.inputFileSystem;
429
+ childCompiler.outputFileSystem = null;
430
+ childCompiler.resolvers = this.resolvers;
431
+ childCompiler.fileTimestamps = this.fileTimestamps;
432
+ childCompiler.contextTimestamps = this.contextTimestamps;
433
+
434
+ const relativeCompilerName = makePathsRelative(this.context, compilerName);
435
+ if(!this.records[relativeCompilerName]) this.records[relativeCompilerName] = [];
436
+ if(this.records[relativeCompilerName][compilerIndex])
437
+ childCompiler.records = this.records[relativeCompilerName][compilerIndex];
438
+ else
439
+ this.records[relativeCompilerName].push(childCompiler.records = {});
440
+
441
+ childCompiler.options = Object.create(this.options);
442
+ childCompiler.options.output = Object.create(childCompiler.options.output);
443
+ for(const name in outputOptions) {
444
+ childCompiler.options.output[name] = outputOptions[name];
445
+ }
446
+ childCompiler.parentCompilation = compilation;
447
+
448
+ compilation.applyPlugins("child-compiler", childCompiler, compilerName, compilerIndex);
449
+
450
+ return childCompiler;
451
+ }
452
+
453
+ isChild() {
454
+ return !!this.parentCompilation;
455
+ }
456
+
457
+ createCompilation() {
458
+ return new Compilation(this);
459
+ }
460
+
461
+ newCompilation(params) {
462
+ const compilation = this.createCompilation();
463
+ compilation.fileTimestamps = this.fileTimestamps;
464
+ compilation.contextTimestamps = this.contextTimestamps;
465
+ compilation.name = this.name;
466
+ compilation.records = this.records;
467
+ compilation.compilationDependencies = params.compilationDependencies;
468
+ this.applyPlugins("this-compilation", compilation, params);
469
+ this.applyPlugins("compilation", compilation, params);
470
+ return compilation;
471
+ }
472
+
473
+ createNormalModuleFactory() {
474
+ const normalModuleFactory = new NormalModuleFactory(this.options.context, this.resolvers, this.options.module || {});
475
+ this.applyPlugins("normal-module-factory", normalModuleFactory);
476
+ return normalModuleFactory;
477
+ }
478
+
479
+ createContextModuleFactory() {
480
+ const contextModuleFactory = new ContextModuleFactory(this.resolvers, this.inputFileSystem);
481
+ this.applyPlugins("context-module-factory", contextModuleFactory);
482
+ return contextModuleFactory;
483
+ }
484
+
485
+ newCompilationParams() {
486
+ const params = {
487
+ normalModuleFactory: this.createNormalModuleFactory(),
488
+ contextModuleFactory: this.createContextModuleFactory(),
489
+ compilationDependencies: []
490
+ };
491
+ return params;
492
+ }
493
+
494
+ compile(callback) {
495
+ const params = this.newCompilationParams();
496
+ this.applyPluginsAsync("before-compile", params, err => {
497
+ if(err) return callback(err);
498
+
499
+ this.applyPlugins("compile", params);
500
+
501
+ const compilation = this.newCompilation(params);
502
+
503
+ this.applyPluginsParallel("make", compilation, err => {
504
+ if(err) return callback(err);
505
+
506
+ compilation.finish();
507
+
508
+ compilation.seal(err => {
509
+ if(err) return callback(err);
510
+
511
+ this.applyPluginsAsync("after-compile", compilation, err => {
512
+ if(err) return callback(err);
513
+
514
+ return callback(null, compilation);
515
+ });
516
+ });
517
+ });
518
+ });
519
+ }
520
+ }
521
+
522
+ Compiler.Watching = Watching;
523
+ module.exports = Compiler;