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
@@ -1,431 +1,431 @@
1
- /*
2
- MIT License http://www.opensource.org/licenses/mit-license.php
3
- Author Tobias Koppers @sokra
4
- */
5
- "use strict";
6
- const path = require("path");
7
- const Module = require("./Module");
8
- const OriginalSource = require("webpack-sources").OriginalSource;
9
- const RawSource = require("webpack-sources").RawSource;
10
- const AsyncDependenciesBlock = require("./AsyncDependenciesBlock");
11
- const DepBlockHelpers = require("./dependencies/DepBlockHelpers");
12
- const Template = require("./Template");
13
-
14
- class ContextModule extends Module {
15
- constructor(resolveDependencies, context, recursive, regExp, addon, asyncMode, chunkName) {
16
- super();
17
- this.resolveDependencies = resolveDependencies;
18
- this.context = context;
19
- this.recursive = recursive;
20
- this.regExp = regExp;
21
- this.addon = addon;
22
- this.async = asyncMode;
23
- this.cacheable = true;
24
- this.contextDependencies = [context];
25
- this.built = false;
26
- this.chunkName = chunkName;
27
- }
28
-
29
- prettyRegExp(regexString) {
30
- // remove the "/" at the front and the beginning
31
- // "/foo/" -> "foo"
32
- return regexString.substring(1, regexString.length - 1);
33
- }
34
-
35
- contextify(context, request) {
36
- return request.split("!").map(subrequest => {
37
- let rp = path.relative(context, subrequest);
38
- if(path.sep === "\\")
39
- rp = rp.replace(/\\/g, "/");
40
- if(rp.indexOf("../") !== 0)
41
- rp = "./" + rp;
42
- return rp;
43
- }).join("!");
44
- }
45
-
46
- identifier() {
47
- let identifier = this.context;
48
- if(this.async)
49
- identifier += ` ${this.async}`;
50
- if(!this.recursive)
51
- identifier += " nonrecursive";
52
- if(this.addon)
53
- identifier += ` ${this.addon}`;
54
- if(this.regExp)
55
- identifier += ` ${this.regExp}`;
56
-
57
- return identifier;
58
- }
59
-
60
- readableIdentifier(requestShortener) {
61
- let identifier = requestShortener.shorten(this.context);
62
- if(this.async)
63
- identifier += ` ${this.async}`;
64
- if(!this.recursive)
65
- identifier += " nonrecursive";
66
- if(this.addon)
67
- identifier += ` ${requestShortener.shorten(this.addon)}`;
68
- if(this.regExp)
69
- identifier += ` ${this.prettyRegExp(this.regExp + "")}`;
70
-
71
- return identifier;
72
- }
73
-
74
- libIdent(options) {
75
- let identifier = this.contextify(options.context, this.context);
76
- if(this.async)
77
- identifier += ` ${this.async}`;
78
- if(this.recursive)
79
- identifier += " recursive";
80
- if(this.addon)
81
- identifier += ` ${this.contextify(options.context, this.addon)}`;
82
- if(this.regExp)
83
- identifier += ` ${this.prettyRegExp(this.regExp + "")}`;
84
-
85
- return identifier;
86
- }
87
-
88
- needRebuild(fileTimestamps, contextTimestamps) {
89
- const ts = contextTimestamps[this.context];
90
- if(!ts) {
91
- return true;
92
- }
93
-
94
- return ts >= this.builtTime;
95
- }
96
-
97
- unbuild() {
98
- this.built = false;
99
- super.unbuild();
100
- }
101
-
102
- build(options, compilation, resolver, fs, callback) {
103
- this.built = true;
104
- this.builtTime = Date.now();
105
- this.resolveDependencies(fs, this.context, this.recursive, this.regExp, (err, dependencies) => {
106
- if(err) return callback(err);
107
-
108
- // Reset children
109
- this.dependencies = [];
110
- this.blocks = [];
111
-
112
- // abort if something failed
113
- // this will create an empty context
114
- if(!dependencies) {
115
- callback();
116
- return;
117
- }
118
-
119
- // enhance dependencies with meta info
120
- dependencies.forEach(dep => {
121
- dep.loc = dep.userRequest;
122
- dep.request = this.addon + dep.request;
123
- });
124
-
125
- if(!this.async || this.async === "eager") {
126
-
127
- // if we have an sync or eager context
128
- // just add all dependencies and continue
129
- this.dependencies = dependencies;
130
-
131
- } else if(this.async === "lazy-once") {
132
-
133
- // for the lazy-once mode create a new async dependency block
134
- // and add that block to this context
135
- if(dependencies.length > 0) {
136
- const block = new AsyncDependenciesBlock(this.chunkName, this);
137
- dependencies.forEach(dep => {
138
- block.addDependency(dep);
139
- });
140
- this.addBlock(block);
141
- }
142
-
143
- } else if(this.async === "weak" || this.async === "async-weak") {
144
-
145
- // we mark all dependencies as weak
146
- dependencies.forEach(dep => dep.weak = true);
147
- this.dependencies = dependencies;
148
-
149
- } else {
150
- // if we are lazy create a new async dependency block per dependency
151
- // and add all blocks to this context
152
- dependencies.forEach((dep, idx) => {
153
- let chunkName = this.chunkName;
154
- if(chunkName) {
155
- if(!/\[(index|request)\]/.test(chunkName))
156
- chunkName += "[index]";
157
- chunkName = chunkName.replace(/\[index\]/g, idx);
158
- chunkName = chunkName.replace(/\[request\]/g, Template.toPath(dep.userRequest));
159
- }
160
- const block = new AsyncDependenciesBlock(chunkName, dep.module, dep.loc);
161
- block.addDependency(dep);
162
- this.addBlock(block);
163
- });
164
- }
165
- callback();
166
- });
167
- }
168
-
169
- getUserRequestMap(dependencies) {
170
- // if we filter first we get a new array
171
- // therefor we dont need to create a clone of dependencies explicitly
172
- // therefore the order of this is !important!
173
- return dependencies
174
- .filter(dependency => dependency.module)
175
- .sort((a, b) => {
176
- if(a.userRequest === b.userRequest) {
177
- return 0;
178
- }
179
- return a.userRequest < b.userRequest ? -1 : 1;
180
- }).reduce(function(map, dep) {
181
- map[dep.userRequest] = dep.module.id;
182
- return map;
183
- }, Object.create(null));
184
- }
185
-
186
- getSyncSource(dependencies, id) {
187
- const map = this.getUserRequestMap(dependencies);
188
- return `var map = ${JSON.stringify(map, null, "\t")};
189
- function webpackContext(req) {
190
- return __webpack_require__(webpackContextResolve(req));
191
- };
192
- function webpackContextResolve(req) {
193
- var id = map[req];
194
- if(!(id + 1)) // check for number or string
195
- throw new Error("Cannot find module '" + req + "'.");
196
- return id;
197
- };
198
- webpackContext.keys = function webpackContextKeys() {
199
- return Object.keys(map);
200
- };
201
- webpackContext.resolve = webpackContextResolve;
202
- module.exports = webpackContext;
203
- webpackContext.id = ${JSON.stringify(id)};`;
204
- }
205
-
206
- getWeakSyncSource(dependencies, id) {
207
- const map = this.getUserRequestMap(dependencies);
208
- return `var map = ${JSON.stringify(map, null, "\t")};
209
- function webpackContext(req) {
210
- var id = webpackContextResolve(req);
211
- if(!__webpack_require__.m[id])
212
- throw new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
213
- return __webpack_require__(id);
214
- };
215
- function webpackContextResolve(req) {
216
- var id = map[req];
217
- if(!(id + 1)) // check for number or string
218
- throw new Error("Cannot find module '" + req + "'.");
219
- return id;
220
- };
221
- webpackContext.keys = function webpackContextKeys() {
222
- return Object.keys(map);
223
- };
224
- webpackContext.resolve = webpackContextResolve;
225
- webpackContext.id = ${JSON.stringify(id)};
226
- module.exports = webpackContext;`;
227
- }
228
-
229
- getAsyncWeakSource(dependencies, id) {
230
- const map = this.getUserRequestMap(dependencies);
231
-
232
- return `var map = ${JSON.stringify(map, null, "\t")};
233
- function webpackAsyncContext(req) {
234
- return webpackAsyncContextResolve(req).then(function(id) {
235
- if(!__webpack_require__.m[id])
236
- throw new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
237
- return __webpack_require__(id);
238
- });
239
- };
240
- function webpackAsyncContextResolve(req) {
241
- // Here Promise.resolve().then() is used instead of new Promise() to prevent
242
- // uncatched exception popping up in devtools
243
- return Promise.resolve().then(function() {
244
- var id = map[req];
245
- if(!(id + 1)) // check for number or string
246
- throw new Error("Cannot find module '" + req + "'.");
247
- return id;
248
- });
249
- };
250
- webpackAsyncContext.keys = function webpackAsyncContextKeys() {
251
- return Object.keys(map);
252
- };
253
- webpackAsyncContext.resolve = webpackAsyncContextResolve;
254
- webpackAsyncContext.id = ${JSON.stringify(id)};
255
- module.exports = webpackAsyncContext;`;
256
- }
257
-
258
- getEagerSource(dependencies, id) {
259
- const map = this.getUserRequestMap(dependencies);
260
- return `var map = ${JSON.stringify(map, null, "\t")};
261
- function webpackAsyncContext(req) {
262
- return webpackAsyncContextResolve(req).then(__webpack_require__);
263
- };
264
- function webpackAsyncContextResolve(req) {
265
- // Here Promise.resolve().then() is used instead of new Promise() to prevent
266
- // uncatched exception popping up in devtools
267
- return Promise.resolve().then(function() {
268
- var id = map[req];
269
- if(!(id + 1)) // check for number or string
270
- throw new Error("Cannot find module '" + req + "'.");
271
- return id;
272
- });
273
- };
274
- webpackAsyncContext.keys = function webpackAsyncContextKeys() {
275
- return Object.keys(map);
276
- };
277
- webpackAsyncContext.resolve = webpackAsyncContextResolve;
278
- webpackAsyncContext.id = ${JSON.stringify(id)};
279
- module.exports = webpackAsyncContext;`;
280
- }
281
-
282
- getLazyOnceSource(block, dependencies, id, outputOptions, requestShortener) {
283
- const promise = DepBlockHelpers.getDepBlockPromise(block, outputOptions, requestShortener, "lazy-once context");
284
- const map = this.getUserRequestMap(dependencies);
285
- return `var map = ${JSON.stringify(map, null, "\t")};
286
- function webpackAsyncContext(req) {
287
- return webpackAsyncContextResolve(req).then(__webpack_require__);
288
- };
289
- function webpackAsyncContextResolve(req) {
290
- return ${promise}.then(function() {
291
- var id = map[req];
292
- if(!(id + 1)) // check for number or string
293
- throw new Error("Cannot find module '" + req + "'.");
294
- return id;
295
- });
296
- };
297
- webpackAsyncContext.keys = function webpackAsyncContextKeys() {
298
- return Object.keys(map);
299
- };
300
- webpackAsyncContext.resolve = webpackAsyncContextResolve;
301
- webpackAsyncContext.id = ${JSON.stringify(id)};
302
- module.exports = webpackAsyncContext;`;
303
- }
304
-
305
- getLazySource(blocks, id) {
306
- let hasMultipleOrNoChunks = false;
307
- const map = blocks
308
- .filter(block => block.dependencies[0].module)
309
- .map((block) => ({
310
- dependency: block.dependencies[0],
311
- block: block,
312
- userRequest: block.dependencies[0].userRequest
313
- })).sort((a, b) => {
314
- if(a.userRequest === b.userRequest) return 0;
315
- return a.userRequest < b.userRequest ? -1 : 1;
316
- }).reduce((map, item) => {
317
- const chunks = item.block.chunks || [];
318
- if(chunks.length !== 1) {
319
- hasMultipleOrNoChunks = true;
320
- }
321
- map[item.userRequest] = [item.dependency.module.id]
322
- .concat(chunks.map(chunk => chunk.id));
323
-
324
- return map;
325
- }, Object.create(null));
326
-
327
- const requestPrefix = hasMultipleOrNoChunks ?
328
- "Promise.all(ids.slice(1).map(__webpack_require__.e))" :
329
- "__webpack_require__.e(ids[1])";
330
-
331
- return `var map = ${JSON.stringify(map, null, "\t")};
332
- function webpackAsyncContext(req) {
333
- var ids = map[req];
334
- if(!ids)
335
- return Promise.reject(new Error("Cannot find module '" + req + "'."));
336
- return ${requestPrefix}.then(function() {
337
- return __webpack_require__(ids[0]);
338
- });
339
- };
340
- webpackAsyncContext.keys = function webpackAsyncContextKeys() {
341
- return Object.keys(map);
342
- };
343
- webpackAsyncContext.id = ${JSON.stringify(id)};
344
- module.exports = webpackAsyncContext;`;
345
- }
346
-
347
- getSourceForEmptyContext(id) {
348
- return `function webpackEmptyContext(req) {
349
- throw new Error("Cannot find module '" + req + "'.");
350
- }
351
- webpackEmptyContext.keys = function() { return []; };
352
- webpackEmptyContext.resolve = webpackEmptyContext;
353
- module.exports = webpackEmptyContext;
354
- webpackEmptyContext.id = ${JSON.stringify(id)};`;
355
- }
356
-
357
- getSourceForEmptyAsyncContext(id) {
358
- return `function webpackEmptyAsyncContext(req) {
359
- // Here Promise.resolve().then() is used instead of new Promise() to prevent
360
- // uncatched exception popping up in devtools
361
- return Promise.resolve().then(function() {
362
- throw new Error("Cannot find module '" + req + "'.");
363
- });
364
- }
365
- webpackEmptyAsyncContext.keys = function() { return []; };
366
- webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
367
- module.exports = webpackEmptyAsyncContext;
368
- webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`;
369
- }
370
-
371
- getSourceString(asyncMode, outputOptions, requestShortener) {
372
- if(asyncMode === "lazy") {
373
- if(this.blocks && this.blocks.length > 0) {
374
- return this.getLazySource(this.blocks, this.id);
375
- }
376
- return this.getSourceForEmptyAsyncContext(this.id);
377
- }
378
- if(asyncMode === "eager") {
379
- if(this.dependencies && this.dependencies.length > 0) {
380
- return this.getEagerSource(this.dependencies, this.id);
381
- }
382
- return this.getSourceForEmptyAsyncContext(this.id);
383
- }
384
- if(asyncMode === "lazy-once") {
385
- const block = this.blocks[0];
386
- if(block) {
387
- return this.getLazyOnceSource(block, block.dependencies, this.id, outputOptions, requestShortener);
388
- }
389
- return this.getSourceForEmptyAsyncContext(this.id);
390
- }
391
- if(asyncMode === "async-weak") {
392
- if(this.dependencies && this.dependencies.length > 0) {
393
- return this.getAsyncWeakSource(this.dependencies, this.id);
394
- }
395
- return this.getSourceForEmptyAsyncContext(this.id);
396
- }
397
- if(asyncMode === "weak") {
398
- if(this.dependencies && this.dependencies.length > 0) {
399
- return this.getWeakSyncSource(this.dependencies, this.id);
400
- }
401
- }
402
- if(this.dependencies && this.dependencies.length > 0) {
403
- return this.getSyncSource(this.dependencies, this.id);
404
- }
405
- return this.getSourceForEmptyContext(this.id);
406
- }
407
-
408
- getSource(sourceString) {
409
- if(this.useSourceMap) {
410
- return new OriginalSource(sourceString, this.identifier());
411
- }
412
- return new RawSource(sourceString);
413
- }
414
-
415
- source(dependencyTemplates, outputOptions, requestShortener) {
416
- return this.getSource(
417
- this.getSourceString(this.async, outputOptions, requestShortener)
418
- );
419
- }
420
-
421
- size() {
422
- // base penalty
423
- const initialSize = 160;
424
-
425
- // if we dont have dependencies we stop here.
426
- return this.dependencies
427
- .reduce((size, dependency) => size + 5 + dependency.userRequest.length, initialSize);
428
- }
429
- }
430
-
431
- module.exports = ContextModule;
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+ const path = require("path");
7
+ const Module = require("./Module");
8
+ const OriginalSource = require("webpack-sources").OriginalSource;
9
+ const RawSource = require("webpack-sources").RawSource;
10
+ const AsyncDependenciesBlock = require("./AsyncDependenciesBlock");
11
+ const DepBlockHelpers = require("./dependencies/DepBlockHelpers");
12
+ const Template = require("./Template");
13
+
14
+ class ContextModule extends Module {
15
+ constructor(resolveDependencies, context, recursive, regExp, addon, asyncMode, chunkName) {
16
+ super();
17
+ this.resolveDependencies = resolveDependencies;
18
+ this.context = context;
19
+ this.recursive = recursive;
20
+ this.regExp = regExp;
21
+ this.addon = addon;
22
+ this.async = asyncMode;
23
+ this.cacheable = true;
24
+ this.contextDependencies = [context];
25
+ this.built = false;
26
+ this.chunkName = chunkName;
27
+ }
28
+
29
+ prettyRegExp(regexString) {
30
+ // remove the "/" at the front and the beginning
31
+ // "/foo/" -> "foo"
32
+ return regexString.substring(1, regexString.length - 1);
33
+ }
34
+
35
+ contextify(context, request) {
36
+ return request.split("!").map(subrequest => {
37
+ let rp = path.relative(context, subrequest);
38
+ if(path.sep === "\\")
39
+ rp = rp.replace(/\\/g, "/");
40
+ if(rp.indexOf("../") !== 0)
41
+ rp = "./" + rp;
42
+ return rp;
43
+ }).join("!");
44
+ }
45
+
46
+ identifier() {
47
+ let identifier = this.context;
48
+ if(this.async)
49
+ identifier += ` ${this.async}`;
50
+ if(!this.recursive)
51
+ identifier += " nonrecursive";
52
+ if(this.addon)
53
+ identifier += ` ${this.addon}`;
54
+ if(this.regExp)
55
+ identifier += ` ${this.regExp}`;
56
+
57
+ return identifier;
58
+ }
59
+
60
+ readableIdentifier(requestShortener) {
61
+ let identifier = requestShortener.shorten(this.context);
62
+ if(this.async)
63
+ identifier += ` ${this.async}`;
64
+ if(!this.recursive)
65
+ identifier += " nonrecursive";
66
+ if(this.addon)
67
+ identifier += ` ${requestShortener.shorten(this.addon)}`;
68
+ if(this.regExp)
69
+ identifier += ` ${this.prettyRegExp(this.regExp + "")}`;
70
+
71
+ return identifier;
72
+ }
73
+
74
+ libIdent(options) {
75
+ let identifier = this.contextify(options.context, this.context);
76
+ if(this.async)
77
+ identifier += ` ${this.async}`;
78
+ if(this.recursive)
79
+ identifier += " recursive";
80
+ if(this.addon)
81
+ identifier += ` ${this.contextify(options.context, this.addon)}`;
82
+ if(this.regExp)
83
+ identifier += ` ${this.prettyRegExp(this.regExp + "")}`;
84
+
85
+ return identifier;
86
+ }
87
+
88
+ needRebuild(fileTimestamps, contextTimestamps) {
89
+ const ts = contextTimestamps[this.context];
90
+ if(!ts) {
91
+ return true;
92
+ }
93
+
94
+ return ts >= this.builtTime;
95
+ }
96
+
97
+ unbuild() {
98
+ this.built = false;
99
+ super.unbuild();
100
+ }
101
+
102
+ build(options, compilation, resolver, fs, callback) {
103
+ this.built = true;
104
+ this.builtTime = Date.now();
105
+ this.resolveDependencies(fs, this.context, this.recursive, this.regExp, (err, dependencies) => {
106
+ if(err) return callback(err);
107
+
108
+ // Reset children
109
+ this.dependencies = [];
110
+ this.blocks = [];
111
+
112
+ // abort if something failed
113
+ // this will create an empty context
114
+ if(!dependencies) {
115
+ callback();
116
+ return;
117
+ }
118
+
119
+ // enhance dependencies with meta info
120
+ dependencies.forEach(dep => {
121
+ dep.loc = dep.userRequest;
122
+ dep.request = this.addon + dep.request;
123
+ });
124
+
125
+ if(!this.async || this.async === "eager") {
126
+
127
+ // if we have an sync or eager context
128
+ // just add all dependencies and continue
129
+ this.dependencies = dependencies;
130
+
131
+ } else if(this.async === "lazy-once") {
132
+
133
+ // for the lazy-once mode create a new async dependency block
134
+ // and add that block to this context
135
+ if(dependencies.length > 0) {
136
+ const block = new AsyncDependenciesBlock(this.chunkName, this);
137
+ dependencies.forEach(dep => {
138
+ block.addDependency(dep);
139
+ });
140
+ this.addBlock(block);
141
+ }
142
+
143
+ } else if(this.async === "weak" || this.async === "async-weak") {
144
+
145
+ // we mark all dependencies as weak
146
+ dependencies.forEach(dep => dep.weak = true);
147
+ this.dependencies = dependencies;
148
+
149
+ } else {
150
+ // if we are lazy create a new async dependency block per dependency
151
+ // and add all blocks to this context
152
+ dependencies.forEach((dep, idx) => {
153
+ let chunkName = this.chunkName;
154
+ if(chunkName) {
155
+ if(!/\[(index|request)\]/.test(chunkName))
156
+ chunkName += "[index]";
157
+ chunkName = chunkName.replace(/\[index\]/g, idx);
158
+ chunkName = chunkName.replace(/\[request\]/g, Template.toPath(dep.userRequest));
159
+ }
160
+ const block = new AsyncDependenciesBlock(chunkName, dep.module, dep.loc);
161
+ block.addDependency(dep);
162
+ this.addBlock(block);
163
+ });
164
+ }
165
+ callback();
166
+ });
167
+ }
168
+
169
+ getUserRequestMap(dependencies) {
170
+ // if we filter first we get a new array
171
+ // therefor we dont need to create a clone of dependencies explicitly
172
+ // therefore the order of this is !important!
173
+ return dependencies
174
+ .filter(dependency => dependency.module)
175
+ .sort((a, b) => {
176
+ if(a.userRequest === b.userRequest) {
177
+ return 0;
178
+ }
179
+ return a.userRequest < b.userRequest ? -1 : 1;
180
+ }).reduce(function(map, dep) {
181
+ map[dep.userRequest] = dep.module.id;
182
+ return map;
183
+ }, Object.create(null));
184
+ }
185
+
186
+ getSyncSource(dependencies, id) {
187
+ const map = this.getUserRequestMap(dependencies);
188
+ return `var map = ${JSON.stringify(map, null, "\t")};
189
+ function webpackContext(req) {
190
+ return __webpack_require__(webpackContextResolve(req));
191
+ };
192
+ function webpackContextResolve(req) {
193
+ var id = map[req];
194
+ if(!(id + 1)) // check for number or string
195
+ throw new Error("Cannot find module '" + req + "'.");
196
+ return id;
197
+ };
198
+ webpackContext.keys = function webpackContextKeys() {
199
+ return Object.keys(map);
200
+ };
201
+ webpackContext.resolve = webpackContextResolve;
202
+ module.exports = webpackContext;
203
+ webpackContext.id = ${JSON.stringify(id)};`;
204
+ }
205
+
206
+ getWeakSyncSource(dependencies, id) {
207
+ const map = this.getUserRequestMap(dependencies);
208
+ return `var map = ${JSON.stringify(map, null, "\t")};
209
+ function webpackContext(req) {
210
+ var id = webpackContextResolve(req);
211
+ if(!__webpack_require__.m[id])
212
+ throw new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
213
+ return __webpack_require__(id);
214
+ };
215
+ function webpackContextResolve(req) {
216
+ var id = map[req];
217
+ if(!(id + 1)) // check for number or string
218
+ throw new Error("Cannot find module '" + req + "'.");
219
+ return id;
220
+ };
221
+ webpackContext.keys = function webpackContextKeys() {
222
+ return Object.keys(map);
223
+ };
224
+ webpackContext.resolve = webpackContextResolve;
225
+ webpackContext.id = ${JSON.stringify(id)};
226
+ module.exports = webpackContext;`;
227
+ }
228
+
229
+ getAsyncWeakSource(dependencies, id) {
230
+ const map = this.getUserRequestMap(dependencies);
231
+
232
+ return `var map = ${JSON.stringify(map, null, "\t")};
233
+ function webpackAsyncContext(req) {
234
+ return webpackAsyncContextResolve(req).then(function(id) {
235
+ if(!__webpack_require__.m[id])
236
+ throw new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
237
+ return __webpack_require__(id);
238
+ });
239
+ };
240
+ function webpackAsyncContextResolve(req) {
241
+ // Here Promise.resolve().then() is used instead of new Promise() to prevent
242
+ // uncatched exception popping up in devtools
243
+ return Promise.resolve().then(function() {
244
+ var id = map[req];
245
+ if(!(id + 1)) // check for number or string
246
+ throw new Error("Cannot find module '" + req + "'.");
247
+ return id;
248
+ });
249
+ };
250
+ webpackAsyncContext.keys = function webpackAsyncContextKeys() {
251
+ return Object.keys(map);
252
+ };
253
+ webpackAsyncContext.resolve = webpackAsyncContextResolve;
254
+ webpackAsyncContext.id = ${JSON.stringify(id)};
255
+ module.exports = webpackAsyncContext;`;
256
+ }
257
+
258
+ getEagerSource(dependencies, id) {
259
+ const map = this.getUserRequestMap(dependencies);
260
+ return `var map = ${JSON.stringify(map, null, "\t")};
261
+ function webpackAsyncContext(req) {
262
+ return webpackAsyncContextResolve(req).then(__webpack_require__);
263
+ };
264
+ function webpackAsyncContextResolve(req) {
265
+ // Here Promise.resolve().then() is used instead of new Promise() to prevent
266
+ // uncatched exception popping up in devtools
267
+ return Promise.resolve().then(function() {
268
+ var id = map[req];
269
+ if(!(id + 1)) // check for number or string
270
+ throw new Error("Cannot find module '" + req + "'.");
271
+ return id;
272
+ });
273
+ };
274
+ webpackAsyncContext.keys = function webpackAsyncContextKeys() {
275
+ return Object.keys(map);
276
+ };
277
+ webpackAsyncContext.resolve = webpackAsyncContextResolve;
278
+ webpackAsyncContext.id = ${JSON.stringify(id)};
279
+ module.exports = webpackAsyncContext;`;
280
+ }
281
+
282
+ getLazyOnceSource(block, dependencies, id, outputOptions, requestShortener) {
283
+ const promise = DepBlockHelpers.getDepBlockPromise(block, outputOptions, requestShortener, "lazy-once context");
284
+ const map = this.getUserRequestMap(dependencies);
285
+ return `var map = ${JSON.stringify(map, null, "\t")};
286
+ function webpackAsyncContext(req) {
287
+ return webpackAsyncContextResolve(req).then(__webpack_require__);
288
+ };
289
+ function webpackAsyncContextResolve(req) {
290
+ return ${promise}.then(function() {
291
+ var id = map[req];
292
+ if(!(id + 1)) // check for number or string
293
+ throw new Error("Cannot find module '" + req + "'.");
294
+ return id;
295
+ });
296
+ };
297
+ webpackAsyncContext.keys = function webpackAsyncContextKeys() {
298
+ return Object.keys(map);
299
+ };
300
+ webpackAsyncContext.resolve = webpackAsyncContextResolve;
301
+ webpackAsyncContext.id = ${JSON.stringify(id)};
302
+ module.exports = webpackAsyncContext;`;
303
+ }
304
+
305
+ getLazySource(blocks, id) {
306
+ let hasMultipleOrNoChunks = false;
307
+ const map = blocks
308
+ .filter(block => block.dependencies[0].module)
309
+ .map((block) => ({
310
+ dependency: block.dependencies[0],
311
+ block: block,
312
+ userRequest: block.dependencies[0].userRequest
313
+ })).sort((a, b) => {
314
+ if(a.userRequest === b.userRequest) return 0;
315
+ return a.userRequest < b.userRequest ? -1 : 1;
316
+ }).reduce((map, item) => {
317
+ const chunks = item.block.chunks || [];
318
+ if(chunks.length !== 1) {
319
+ hasMultipleOrNoChunks = true;
320
+ }
321
+ map[item.userRequest] = [item.dependency.module.id]
322
+ .concat(chunks.map(chunk => chunk.id));
323
+
324
+ return map;
325
+ }, Object.create(null));
326
+
327
+ const requestPrefix = hasMultipleOrNoChunks ?
328
+ "Promise.all(ids.slice(1).map(__webpack_require__.e))" :
329
+ "__webpack_require__.e(ids[1])";
330
+
331
+ return `var map = ${JSON.stringify(map, null, "\t")};
332
+ function webpackAsyncContext(req) {
333
+ var ids = map[req];
334
+ if(!ids)
335
+ return Promise.reject(new Error("Cannot find module '" + req + "'."));
336
+ return ${requestPrefix}.then(function() {
337
+ return __webpack_require__(ids[0]);
338
+ });
339
+ };
340
+ webpackAsyncContext.keys = function webpackAsyncContextKeys() {
341
+ return Object.keys(map);
342
+ };
343
+ webpackAsyncContext.id = ${JSON.stringify(id)};
344
+ module.exports = webpackAsyncContext;`;
345
+ }
346
+
347
+ getSourceForEmptyContext(id) {
348
+ return `function webpackEmptyContext(req) {
349
+ throw new Error("Cannot find module '" + req + "'.");
350
+ }
351
+ webpackEmptyContext.keys = function() { return []; };
352
+ webpackEmptyContext.resolve = webpackEmptyContext;
353
+ module.exports = webpackEmptyContext;
354
+ webpackEmptyContext.id = ${JSON.stringify(id)};`;
355
+ }
356
+
357
+ getSourceForEmptyAsyncContext(id) {
358
+ return `function webpackEmptyAsyncContext(req) {
359
+ // Here Promise.resolve().then() is used instead of new Promise() to prevent
360
+ // uncatched exception popping up in devtools
361
+ return Promise.resolve().then(function() {
362
+ throw new Error("Cannot find module '" + req + "'.");
363
+ });
364
+ }
365
+ webpackEmptyAsyncContext.keys = function() { return []; };
366
+ webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
367
+ module.exports = webpackEmptyAsyncContext;
368
+ webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`;
369
+ }
370
+
371
+ getSourceString(asyncMode, outputOptions, requestShortener) {
372
+ if(asyncMode === "lazy") {
373
+ if(this.blocks && this.blocks.length > 0) {
374
+ return this.getLazySource(this.blocks, this.id);
375
+ }
376
+ return this.getSourceForEmptyAsyncContext(this.id);
377
+ }
378
+ if(asyncMode === "eager") {
379
+ if(this.dependencies && this.dependencies.length > 0) {
380
+ return this.getEagerSource(this.dependencies, this.id);
381
+ }
382
+ return this.getSourceForEmptyAsyncContext(this.id);
383
+ }
384
+ if(asyncMode === "lazy-once") {
385
+ const block = this.blocks[0];
386
+ if(block) {
387
+ return this.getLazyOnceSource(block, block.dependencies, this.id, outputOptions, requestShortener);
388
+ }
389
+ return this.getSourceForEmptyAsyncContext(this.id);
390
+ }
391
+ if(asyncMode === "async-weak") {
392
+ if(this.dependencies && this.dependencies.length > 0) {
393
+ return this.getAsyncWeakSource(this.dependencies, this.id);
394
+ }
395
+ return this.getSourceForEmptyAsyncContext(this.id);
396
+ }
397
+ if(asyncMode === "weak") {
398
+ if(this.dependencies && this.dependencies.length > 0) {
399
+ return this.getWeakSyncSource(this.dependencies, this.id);
400
+ }
401
+ }
402
+ if(this.dependencies && this.dependencies.length > 0) {
403
+ return this.getSyncSource(this.dependencies, this.id);
404
+ }
405
+ return this.getSourceForEmptyContext(this.id);
406
+ }
407
+
408
+ getSource(sourceString) {
409
+ if(this.useSourceMap) {
410
+ return new OriginalSource(sourceString, this.identifier());
411
+ }
412
+ return new RawSource(sourceString);
413
+ }
414
+
415
+ source(dependencyTemplates, outputOptions, requestShortener) {
416
+ return this.getSource(
417
+ this.getSourceString(this.async, outputOptions, requestShortener)
418
+ );
419
+ }
420
+
421
+ size() {
422
+ // base penalty
423
+ const initialSize = 160;
424
+
425
+ // if we dont have dependencies we stop here.
426
+ return this.dependencies
427
+ .reduce((size, dependency) => size + 5 + dependency.userRequest.length, initialSize);
428
+ }
429
+ }
430
+
431
+ module.exports = ContextModule;