webpack 2.4.1 → 2.6.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 (38) hide show
  1. package/README.md +9 -1
  2. package/lib/BannerPlugin.js +30 -8
  3. package/lib/Compilation.js +14 -14
  4. package/lib/Compiler.js +29 -24
  5. package/lib/ContextModule.js +133 -33
  6. package/lib/DelegatedModule.js +3 -1
  7. package/lib/ExternalModule.js +1 -1
  8. package/lib/FunctionModuleTemplatePlugin.js +1 -1
  9. package/lib/HotModuleReplacement.runtime.js +3 -1
  10. package/lib/IgnorePlugin.js +2 -2
  11. package/lib/JsonpMainTemplatePlugin.js +8 -7
  12. package/lib/LibManifestPlugin.js +1 -1
  13. package/lib/NormalModule.js +1 -1
  14. package/lib/Parser.js +33 -20
  15. package/lib/ProgressPlugin.js +2 -2
  16. package/lib/RawModule.js +1 -1
  17. package/lib/Stats.js +2 -1
  18. package/lib/Template.js +5 -0
  19. package/lib/WebpackOptionsApply.js +3 -3
  20. package/lib/WebpackOptionsDefaulter.js +1 -0
  21. package/lib/dependencies/DepBlockHelpers.js +1 -1
  22. package/lib/dependencies/HarmonyCompatibilityDependency.js +1 -1
  23. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +1 -1
  24. package/lib/dependencies/ImportContextDependency.js +0 -1
  25. package/lib/dependencies/ImportDependency.js +1 -1
  26. package/lib/dependencies/ImportEagerContextDependency.js +22 -0
  27. package/lib/dependencies/ImportEagerDependency.js +46 -0
  28. package/lib/dependencies/ImportLazyContextDependency.js +22 -0
  29. package/lib/dependencies/ImportLazyOnceContextDependency.js +22 -0
  30. package/lib/dependencies/ImportParserPlugin.js +37 -6
  31. package/lib/dependencies/ImportPlugin.js +15 -3
  32. package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -7
  33. package/lib/formatLocation.js +44 -27
  34. package/lib/node/NodeSourcePlugin.js +72 -70
  35. package/lib/optimize/CommonsChunkPlugin.js +1 -1
  36. package/lib/webworker/WebWorkerMainTemplatePlugin.js +18 -14
  37. package/package.json +6 -4
  38. package/schemas/webpackOptionsSchema.json +12 -0
@@ -28,7 +28,7 @@ class JsonpMainTemplatePlugin {
28
28
  const chunkFilename = this.outputOptions.chunkFilename;
29
29
  const chunkMaps = chunk.getChunkMaps();
30
30
  const crossOriginLoading = this.outputOptions.crossOriginLoading;
31
- const chunkLoadTimeout = this.outputOptions.chunkLoadTimeout || 120000;
31
+ const chunkLoadTimeout = this.outputOptions.chunkLoadTimeout;
32
32
  const scriptSrcPath = this.applyPluginsWaterfall("asset-path", JSON.stringify(chunkFilename), {
33
33
  hash: `" + ${this.renderCurrentHashCode(hash)} + "`,
34
34
  hashWithLength: length => `" + ${this.renderCurrentHashCode(hash, length)} + "`,
@@ -79,26 +79,27 @@ class JsonpMainTemplatePlugin {
79
79
  });
80
80
  mainTemplate.plugin("require-ensure", function(_, chunk, hash) {
81
81
  return this.asString([
82
- "if(installedChunks[chunkId] === 0) {",
82
+ "var installedChunkData = installedChunks[chunkId];",
83
+ "if(installedChunkData === 0) {",
83
84
  this.indent([
84
- "return Promise.resolve();"
85
+ "return new Promise(function(resolve) { resolve(); });"
85
86
  ]),
86
87
  "}",
87
88
  "",
88
89
  "// a Promise means \"currently loading\".",
89
- "if(installedChunks[chunkId]) {",
90
+ "if(installedChunkData) {",
90
91
  this.indent([
91
- "return installedChunks[chunkId][2];"
92
+ "return installedChunkData[2];"
92
93
  ]),
93
94
  "}",
94
95
  "",
95
96
  "// setup Promise in chunk cache",
96
97
  "var promise = new Promise(function(resolve, reject) {",
97
98
  this.indent([
98
- "installedChunks[chunkId] = [resolve, reject];"
99
+ "installedChunkData = installedChunks[chunkId] = [resolve, reject];"
99
100
  ]),
100
101
  "});",
101
- "installedChunks[chunkId][2] = promise;",
102
+ "installedChunkData[2] = promise;",
102
103
  "",
103
104
  "// start chunk loading",
104
105
  "var head = document.getElementsByTagName('head')[0];",
@@ -46,7 +46,7 @@ class LibManifestPlugin {
46
46
  return obj;
47
47
  }, {})
48
48
  };
49
- const content = new Buffer(JSON.stringify(manifest, null, 2), "utf8"); //eslint-disable-line
49
+ const content = new Buffer(JSON.stringify(manifest), "utf8"); //eslint-disable-line
50
50
  compiler.outputFileSystem.mkdirp(path.dirname(targetPath), err => {
51
51
  if(err) return callback(err);
52
52
  compiler.outputFileSystem.writeFile(targetPath, content, callback);
@@ -257,7 +257,7 @@ class NormalModule extends Module {
257
257
  }
258
258
 
259
259
  build(options, compilation, resolver, fs, callback) {
260
- this.buildTimestamp = new Date().getTime();
260
+ this.buildTimestamp = Date.now();
261
261
  this.built = true;
262
262
  this._source = null;
263
263
  this.error = null;
package/lib/Parser.js CHANGED
@@ -636,6 +636,9 @@ class Parser extends Tapable {
636
636
  }
637
637
 
638
638
  walkFunctionDeclaration(statement) {
639
+ statement.params.forEach(param => {
640
+ this.walkPattern(param);
641
+ });
639
642
  this.inScope(statement.params, function() {
640
643
  if(statement.body.type === "BlockStatement") {
641
644
  this.prewalkStatement(statement.body);
@@ -797,24 +800,15 @@ class Parser extends Tapable {
797
800
  switch(declarator.type) {
798
801
  case "VariableDeclarator":
799
802
  {
800
- const renameIdentifier = declarator.init && this.getRenameIdentifier(declarator.init);
801
- if(renameIdentifier && declarator.id.type === "Identifier" && this.applyPluginsBailResult1("can-rename " + renameIdentifier, declarator.init)) {
802
- // renaming with "var a = b;"
803
- if(!this.applyPluginsBailResult1("rename " + renameIdentifier, declarator.init)) {
804
- this.scope.renames["$" + declarator.id.name] = this.scope.renames["$" + renameIdentifier] || renameIdentifier;
805
- const idx = this.scope.definitions.indexOf(declarator.id.name);
806
- if(idx >= 0) this.scope.definitions.splice(idx, 1);
807
- }
808
- } else {
809
- this.enterPattern(declarator.id, (name, decl) => {
810
- if(!this.applyPluginsBailResult1("var-" + declarator.kind + " " + name, decl)) {
811
- if(!this.applyPluginsBailResult1("var " + name, decl)) {
812
- this.scope.renames["$" + name] = undefined;
803
+ this.enterPattern(declarator.id, (name, decl) => {
804
+ if(!this.applyPluginsBailResult1("var-" + declarator.kind + " " + name, decl)) {
805
+ if(!this.applyPluginsBailResult1("var " + name, decl)) {
806
+ this.scope.renames["$" + name] = undefined;
807
+ if(this.scope.definitions.indexOf(name) < 0)
813
808
  this.scope.definitions.push(name);
814
- }
815
809
  }
816
- });
817
- }
810
+ }
811
+ });
818
812
  break;
819
813
  }
820
814
  }
@@ -827,7 +821,14 @@ class Parser extends Tapable {
827
821
  case "VariableDeclarator":
828
822
  {
829
823
  const renameIdentifier = declarator.init && this.getRenameIdentifier(declarator.init);
830
- if(!renameIdentifier || declarator.id.type !== "Identifier" || !this.applyPluginsBailResult1("can-rename " + renameIdentifier, declarator.init)) {
824
+ if(renameIdentifier && declarator.id.type === "Identifier" && this.applyPluginsBailResult1("can-rename " + renameIdentifier, declarator.init)) {
825
+ // renaming with "var a = b;"
826
+ if(!this.applyPluginsBailResult1("rename " + renameIdentifier, declarator.init)) {
827
+ this.scope.renames["$" + declarator.id.name] = this.scope.renames["$" + renameIdentifier] || renameIdentifier;
828
+ const idx = this.scope.definitions.indexOf(declarator.id.name);
829
+ if(idx >= 0) this.scope.definitions.splice(idx, 1);
830
+ }
831
+ } else {
831
832
  this.walkPattern(declarator.id);
832
833
  if(declarator.init)
833
834
  this.walkExpression(declarator.init);
@@ -845,6 +846,11 @@ class Parser extends Tapable {
845
846
  this["walk" + pattern.type](pattern);
846
847
  }
847
848
 
849
+ walkAssignmentPattern(pattern) {
850
+ this.walkExpression(pattern.right);
851
+ this.walkPattern(pattern.left);
852
+ }
853
+
848
854
  walkObjectPattern(pattern) {
849
855
  for(let i = 0, len = pattern.properties.length; i < len; i++) {
850
856
  const prop = pattern.properties[i];
@@ -912,6 +918,9 @@ class Parser extends Tapable {
912
918
  }
913
919
 
914
920
  walkFunctionExpression(expression) {
921
+ expression.params.forEach(param => {
922
+ this.walkPattern(param);
923
+ });
915
924
  this.inScope(expression.params, function() {
916
925
  if(expression.body.type === "BlockStatement") {
917
926
  this.prewalkStatement(expression.body);
@@ -923,6 +932,9 @@ class Parser extends Tapable {
923
932
  }
924
933
 
925
934
  walkArrowFunctionExpression(expression) {
935
+ expression.params.forEach(param => {
936
+ this.walkPattern(param);
937
+ });
926
938
  this.inScope(expression.params, function() {
927
939
  if(expression.body.type === "BlockStatement") {
928
940
  this.prewalkStatement(expression.body);
@@ -993,8 +1005,10 @@ class Parser extends Tapable {
993
1005
  }
994
1006
  } else {
995
1007
  this.walkExpression(expression.right);
996
- this.scope.renames["$" + expression.left.name] = undefined;
997
- this.walkExpression(expression.left);
1008
+ this.walkPattern(expression.left);
1009
+ this.enterPattern(expression.left, (name, decl) => {
1010
+ this.scope.renames["$" + name] = undefined;
1011
+ });
998
1012
  }
999
1013
  }
1000
1014
 
@@ -1191,7 +1205,6 @@ class Parser extends Tapable {
1191
1205
 
1192
1206
  enterAssignmentPattern(pattern, onIdent) {
1193
1207
  this.enterPattern(pattern.left, onIdent);
1194
- this.walkExpression(pattern.right);
1195
1208
  }
1196
1209
 
1197
1210
  evaluateExpression(expression) {
@@ -157,9 +157,9 @@ class ProgressPlugin {
157
157
  state = state.replace(/^\d+\/\d+\s+/, "");
158
158
  if(percentage === 0) {
159
159
  lastState = null;
160
- lastStateTime = +new Date();
160
+ lastStateTime = Date.now();
161
161
  } else if(state !== lastState || percentage === 1) {
162
- const now = +new Date();
162
+ const now = Date.now();
163
163
  if(lastState) {
164
164
  const stateMsg = `${now - lastStateTime}ms ${lastState}`;
165
165
  goToLineStart(stateMsg);
package/lib/RawModule.js CHANGED
@@ -36,7 +36,7 @@ module.exports = class RawModule extends Module {
36
36
  }
37
37
 
38
38
  build(options, compilations, resolver, fs, callback) {
39
- this.builtTime = new Date().getTime();
39
+ this.builtTime = Date.now();
40
40
  callback();
41
41
  }
42
42
 
package/lib/Stats.js CHANGED
@@ -95,6 +95,7 @@ class Stats {
95
95
  const showProvidedExports = optionOrFallback(options.providedExports, !forToString);
96
96
  const showChildren = optionOrFallback(options.children, true);
97
97
  const showSource = optionOrFallback(options.source, !forToString);
98
+ const showModuleTrace = optionOrFallback(options.moduleTrace, true);
98
99
  const showErrors = optionOrFallback(options.errors, true);
99
100
  const showErrorDetails = optionOrFallback(options.errorDetails, !forToString);
100
101
  const showWarnings = optionOrFallback(options.warnings, true);
@@ -164,7 +165,7 @@ class Stats {
164
165
  text += e.message;
165
166
  if(showErrorDetails && e.details) text += `\n${e.details}`;
166
167
  if(showErrorDetails && e.missing) text += e.missing.map(item => `\n[${item}]`).join("");
167
- if(e.dependencies && e.origin) {
168
+ if(showModuleTrace && e.dependencies && e.origin) {
168
169
  text += `\n @ ${e.origin.readableIdentifier(requestShortener)}`;
169
170
  e.dependencies.forEach(dep => {
170
171
  if(!dep.loc) return;
package/lib/Template.js CHANGED
@@ -26,6 +26,11 @@ module.exports = class Template extends Tapable {
26
26
  return str.replace(/^[^a-zA-Z$_]/, "_").replace(/[^a-zA-Z0-9$_]/g, "_");
27
27
  }
28
28
 
29
+ static toPath(str) {
30
+ if(typeof str !== "string") return "";
31
+ return str.replace(/[^a-zA-Z0-9_!§$()=\-\^°]+/g, "-").replace(/^-|-$/, "");
32
+ }
33
+
29
34
  // map number to a single character a-z, A-Z or <_ + number> if number is too big
30
35
  static numberToIdentifer(n) {
31
36
  // lower case
@@ -206,9 +206,9 @@ class WebpackOptionsApply extends OptionsApply {
206
206
  noSources = options.devtool.indexOf("nosources") >= 0;
207
207
  legacy = options.devtool.indexOf("@") >= 0;
208
208
  modern = options.devtool.indexOf("#") >= 0;
209
- comment = legacy && modern ? "\n/*\n//@ sourceMappingURL=[url]\n//# sourceMappingURL=[url]\n*/" :
210
- legacy ? "\n/*\n//@ sourceMappingURL=[url]\n*/" :
211
- modern ? "\n//# sourceMappingURL=[url]" :
209
+ comment = legacy && modern ? "\n/*\n//@ source" + "MappingURL=[url]\n//# source" + "MappingURL=[url]\n*/" :
210
+ legacy ? "\n/*\n//@ source" + "MappingURL=[url]\n*/" :
211
+ modern ? "\n//# source" + "MappingURL=[url]" :
212
212
  null;
213
213
  let Plugin = evalWrapped ? EvalSourceMapDevToolPlugin : SourceMapDevToolPlugin;
214
214
  compiler.apply(new Plugin({
@@ -60,6 +60,7 @@ class WebpackOptionsDefaulter extends OptionsDefaulter {
60
60
  this.set("output.hotUpdateChunkFilename", "[id].[hash].hot-update.js");
61
61
  this.set("output.hotUpdateMainFilename", "[hash].hot-update.json");
62
62
  this.set("output.crossOriginLoading", false);
63
+ this.set("output.chunkLoadTimeout", 120000);
63
64
  this.set("output.hashFunction", "md5");
64
65
  this.set("output.hashDigest", "hex");
65
66
  this.set("output.hashDigestLength", 20);
@@ -33,7 +33,7 @@ DepBlockHelpers.getDepBlockPromise = function(depBlock, outputOptions, requestSh
33
33
  "])";
34
34
  }
35
35
  }
36
- return "Promise.resolve()";
36
+ return "new Promise(function(resolve) { resolve(); })";
37
37
  };
38
38
 
39
39
  function asComment(str) {
@@ -22,7 +22,7 @@ HarmonyCompatibilityDependency.Template = class HarmonyExportDependencyTemplate
22
22
  if(usedExports && !Array.isArray(usedExports)) {
23
23
  const exportName = dep.originModule.exportsArgument || "exports";
24
24
  const content = `Object.defineProperty(${exportName}, \"__esModule\", { value: true });\n`;
25
- source.insert(-1, content);
25
+ source.insert(-10, content);
26
26
  }
27
27
  }
28
28
  };
@@ -45,7 +45,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
45
45
  } else {
46
46
  const immutable = statement.declaration && isImmutableStatement(statement.declaration);
47
47
  const hoisted = statement.declaration && isHoistedStatement(statement.declaration);
48
- dep = new HarmonyExportSpecifierDependency(parser.state.module, id, name, !immutable || hoisted ? -0.5 : (statement.range[1] + 0.5), immutable);
48
+ dep = new HarmonyExportSpecifierDependency(parser.state.module, id, name, !immutable || hoisted ? -2 : (statement.range[1] + 0.5), immutable);
49
49
  }
50
50
  dep.loc = Object.create(statement.loc);
51
51
  dep.loc.index = idx;
@@ -12,7 +12,6 @@ class ImportContextDependency extends ContextDependency {
12
12
  super(request, recursive, regExp);
13
13
  this.range = range;
14
14
  this.valueRange = valueRange;
15
- this.async = true;
16
15
  this.chunkName = chunkName;
17
16
  }
18
17
 
@@ -44,7 +44,7 @@ ImportDependency.Template = class ImportDependencyTemplate {
44
44
 
45
45
  if(dep.module) {
46
46
  const stringifiedId = JSON.stringify(dep.module.id);
47
- return `Promise.resolve(__webpack_require__(${comment}${stringifiedId}))`;
47
+ return `new Promise(function(resolve) { resolve(__webpack_require__(${comment}${stringifiedId})); })`;
48
48
  }
49
49
 
50
50
  return webpackMissingPromiseModule(dep.request);
@@ -0,0 +1,22 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+ const ImportContextDependency = require("./ImportContextDependency");
7
+ const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
8
+
9
+ class ImportEagerContextDependency extends ImportContextDependency {
10
+ constructor(request, recursive, regExp, range, valueRange, chunkName) {
11
+ super(request, recursive, regExp, range, valueRange, chunkName);
12
+ this.async = "eager";
13
+ }
14
+
15
+ get type() {
16
+ return "import() context eager";
17
+ }
18
+ }
19
+
20
+ ImportEagerContextDependency.Template = ContextDependencyTemplateAsRequireCall;
21
+
22
+ module.exports = ImportEagerContextDependency;
@@ -0,0 +1,46 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+ const ModuleDependency = require("./ModuleDependency");
7
+ const webpackMissingPromiseModule = require("./WebpackMissingModule").promise;
8
+
9
+ class ImportEagerDependency extends ModuleDependency {
10
+ constructor(request, range) {
11
+ super(request);
12
+ this.range = range;
13
+ }
14
+
15
+ get type() {
16
+ return "import()";
17
+ }
18
+ }
19
+
20
+ ImportEagerDependency.Template = class ImportEagerDependencyTemplate {
21
+ apply(dep, source, outputOptions, requestShortener) {
22
+ const comment = this.getOptionalComment(outputOptions.pathinfo, requestShortener.shorten(dep.request));
23
+
24
+ const content = this.getContent(dep, comment);
25
+ source.replace(dep.range[0], dep.range[1] - 1, content);
26
+ }
27
+
28
+ getOptionalComment(pathinfo, shortenedRequest) {
29
+ if(!pathinfo) {
30
+ return "";
31
+ }
32
+
33
+ return `/*! ${shortenedRequest} */ `;
34
+ }
35
+
36
+ getContent(dep, comment) {
37
+ if(dep.module) {
38
+ const stringifiedId = JSON.stringify(dep.module.id);
39
+ return `new Promise(function(resolve) { resolve(__webpack_require__(${comment}${stringifiedId})); })`;
40
+ }
41
+
42
+ return webpackMissingPromiseModule(dep.request);
43
+ }
44
+ };
45
+
46
+ module.exports = ImportEagerDependency;
@@ -0,0 +1,22 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+ const ImportContextDependency = require("./ImportContextDependency");
7
+ const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
8
+
9
+ class ImportLazyContextDependency extends ImportContextDependency {
10
+ constructor(request, recursive, regExp, range, valueRange, chunkName) {
11
+ super(request, recursive, regExp, range, valueRange, chunkName);
12
+ this.async = "lazy";
13
+ }
14
+
15
+ get type() {
16
+ return "import() context lazy";
17
+ }
18
+ }
19
+
20
+ ImportLazyContextDependency.Template = ContextDependencyTemplateAsRequireCall;
21
+
22
+ module.exports = ImportLazyContextDependency;
@@ -0,0 +1,22 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+ const ImportContextDependency = require("./ImportContextDependency");
7
+ const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
8
+
9
+ class ImportLazyOnceContextDependency extends ImportContextDependency {
10
+ constructor(request, recursive, regExp, range, valueRange, chunkName) {
11
+ super(request, recursive, regExp, range, valueRange, chunkName);
12
+ this.async = "lazy-once";
13
+ }
14
+
15
+ get type() {
16
+ return "import() context lazy-once";
17
+ }
18
+ }
19
+
20
+ ImportLazyOnceContextDependency.Template = ContextDependencyTemplateAsRequireCall;
21
+
22
+ module.exports = ImportLazyOnceContextDependency;
@@ -4,9 +4,13 @@
4
4
  */
5
5
  "use strict";
6
6
 
7
- const ImportContextDependency = require("./ImportContextDependency");
7
+ const ImportEagerContextDependency = require("./ImportEagerContextDependency");
8
+ const ImportLazyOnceContextDependency = require("./ImportLazyOnceContextDependency");
9
+ const ImportLazyContextDependency = require("./ImportLazyContextDependency");
8
10
  const ImportDependenciesBlock = require("./ImportDependenciesBlock");
11
+ const ImportEagerDependency = require("./ImportEagerDependency");
9
12
  const ContextDependencyHelpers = require("./ContextDependencyHelpers");
13
+ const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
10
14
 
11
15
  class ImportParserPlugin {
12
16
  constructor(options) {
@@ -23,22 +27,49 @@ class ImportParserPlugin {
23
27
  const param = parser.evaluateExpression(expr.arguments[0]);
24
28
 
25
29
  let chunkName = null;
30
+ let mode = "lazy";
26
31
 
27
32
  const importOptions = parser.getCommentOptions(expr.range);
28
33
  if(importOptions) {
29
34
  if(typeof importOptions.webpackChunkName !== "undefined") {
30
35
  if(typeof importOptions.webpackChunkName !== "string")
31
- throw new Error(`\`webpackChunkName\` expected a string, but received: ${importOptions.webpackChunkName}.`);
32
- chunkName = importOptions.webpackChunkName;
36
+ parser.state.module.warnings.push(new UnsupportedFeatureWarning(parser.state.module, `\`webpackChunkName\` expected a string, but received: ${importOptions.webpackChunkName}.`));
37
+ else
38
+ chunkName = importOptions.webpackChunkName;
39
+ }
40
+ if(typeof importOptions.webpackMode !== "undefined") {
41
+ if(typeof importOptions.webpackMode !== "string")
42
+ parser.state.module.warnings.push(new UnsupportedFeatureWarning(parser.state.module, `\`webpackMode\` expected a string, but received: ${importOptions.webpackMode}.`));
43
+ else
44
+ mode = importOptions.webpackMode;
33
45
  }
34
46
  }
35
47
 
36
48
  if(param.isString()) {
37
- const depBlock = new ImportDependenciesBlock(param.string, expr.range, chunkName, parser.state.module, expr.loc);
38
- parser.state.current.addBlock(depBlock);
49
+ if(mode !== "lazy" && mode !== "eager") {
50
+ parser.state.module.warnings.push(new UnsupportedFeatureWarning(parser.state.module, `\`webpackMode\` expected 'lazy' or 'eager', but received: ${mode}.`));
51
+ }
52
+
53
+ if(mode === "eager") {
54
+ const dep = new ImportEagerDependency(param.string, expr.range);
55
+ parser.state.current.addDependency(dep);
56
+ } else {
57
+ const depBlock = new ImportDependenciesBlock(param.string, expr.range, chunkName, parser.state.module, expr.loc);
58
+ parser.state.current.addBlock(depBlock);
59
+ }
39
60
  return true;
40
61
  } else {
41
- const dep = ContextDependencyHelpers.create(ImportContextDependency, expr.range, param, expr, options, chunkName);
62
+ if(mode !== "lazy" && mode !== "lazy-once" && mode !== "eager") {
63
+ parser.state.module.warnings.push(new UnsupportedFeatureWarning(parser.state.module, `\`webpackMode\` expected 'lazy', 'lazy-once' or 'eager', but received: ${mode}.`));
64
+ }
65
+
66
+ let Dep = ImportLazyContextDependency;
67
+ if(mode === "eager") {
68
+ Dep = ImportEagerContextDependency;
69
+ } else if(mode === "lazy-once") {
70
+ Dep = ImportLazyOnceContextDependency;
71
+ }
72
+ const dep = ContextDependencyHelpers.create(Dep, expr.range, param, expr, options, chunkName);
42
73
  if(!dep) return;
43
74
  dep.loc = expr.loc;
44
75
  dep.optional = !!parser.scope.inTry;
@@ -5,7 +5,10 @@
5
5
  "use strict";
6
6
 
7
7
  const ImportDependency = require("./ImportDependency");
8
- const ImportContextDependency = require("./ImportContextDependency");
8
+ const ImportEagerDependency = require("./ImportEagerDependency");
9
+ const ImportEagerContextDependency = require("./ImportEagerContextDependency");
10
+ const ImportLazyOnceContextDependency = require("./ImportLazyOnceContextDependency");
11
+ const ImportLazyContextDependency = require("./ImportLazyContextDependency");
9
12
  const ImportParserPlugin = require("./ImportParserPlugin");
10
13
 
11
14
  class ImportPlugin {
@@ -22,8 +25,17 @@ class ImportPlugin {
22
25
  compilation.dependencyFactories.set(ImportDependency, normalModuleFactory);
23
26
  compilation.dependencyTemplates.set(ImportDependency, new ImportDependency.Template());
24
27
 
25
- compilation.dependencyFactories.set(ImportContextDependency, contextModuleFactory);
26
- compilation.dependencyTemplates.set(ImportContextDependency, new ImportContextDependency.Template());
28
+ compilation.dependencyFactories.set(ImportEagerDependency, normalModuleFactory);
29
+ compilation.dependencyTemplates.set(ImportEagerDependency, new ImportEagerDependency.Template());
30
+
31
+ compilation.dependencyFactories.set(ImportEagerContextDependency, contextModuleFactory);
32
+ compilation.dependencyTemplates.set(ImportEagerContextDependency, new ImportEagerContextDependency.Template());
33
+
34
+ compilation.dependencyFactories.set(ImportLazyOnceContextDependency, contextModuleFactory);
35
+ compilation.dependencyTemplates.set(ImportLazyOnceContextDependency, new ImportLazyOnceContextDependency.Template());
36
+
37
+ compilation.dependencyFactories.set(ImportLazyContextDependency, contextModuleFactory);
38
+ compilation.dependencyTemplates.set(ImportLazyContextDependency, new ImportLazyContextDependency.Template());
27
39
 
28
40
  params.normalModuleFactory.plugin("parser", (parser, parserOptions) => {
29
41
 
@@ -11,14 +11,8 @@ module.exports = class RequireEnsureDependenciesBlock extends AsyncDependenciesB
11
11
  super(chunkName, module, loc);
12
12
  this.expr = expr;
13
13
  const successBodyRange = successExpression && successExpression.body && successExpression.body.range;
14
- const errorBodyRange = errorExpression && errorExpression.body && errorExpression.body.range;
15
- this.range = null;
16
14
  if(successBodyRange) {
17
- if(errorBodyRange) {
18
- this.range = [successBodyRange[0] + 1, errorBodyRange[1] - 1];
19
- } else {
20
- this.range = [successBodyRange[0] + 1, successBodyRange[1] - 1];
21
- }
15
+ this.range = [successBodyRange[0] + 1, successBodyRange[1] - 1];
22
16
  }
23
17
  this.chunkNameRange = chunkNameRange;
24
18
  const dep = new RequireEnsureDependency(this);
@@ -2,36 +2,53 @@
2
2
  MIT License http://www.opensource.org/licenses/mit-license.php
3
3
  Author Tobias Koppers @sokra
4
4
  */
5
- module.exports = function formatLocation(loc) {
6
- if(typeof loc === "string")
7
- return loc;
8
- if(typeof loc === "number")
9
- return loc + "";
10
- if(loc && typeof loc === "object") {
11
- if(loc.start && loc.end) {
12
- if(typeof loc.start.line === "number" && typeof loc.end.line === "number" && typeof loc.end.column === "number" && loc.start.line === loc.end.line)
13
- return formatPosition(loc.start) + "-" + loc.end.column;
14
- return formatPosition(loc.start) + "-" + formatPosition(loc.end);
15
- }
16
- if(loc.start)
17
- return formatPosition(loc.start);
18
- return formatPosition(loc);
19
- }
20
- return "";
21
5
 
22
- function formatPosition(pos) {
23
- if(typeof pos === "string")
6
+ "use strict";
7
+
8
+ const formatPosition = (pos) => {
9
+ if(pos === null)
10
+ return "";
11
+ const typeOfPos = typeof pos;
12
+ switch(typeOfPos) {
13
+ case "string":
24
14
  return pos;
25
- if(typeof pos === "number")
26
- return pos + "";
27
- if(pos && typeof pos === "object") {
15
+ case "number":
16
+ return `${pos}`;
17
+ case "object":
28
18
  if(typeof pos.line === "number" && typeof pos.column === "number")
29
- return pos.line + ":" + pos.column;
30
- if(typeof pos.line === "number")
31
- return pos.line + ":?";
32
- if(typeof pos.index === "number")
33
- return "+" + pos.index;
34
- }
19
+ return `${pos.line}:${pos.column}`;
20
+ else if(typeof pos.line === "number")
21
+ return `${pos.line}:?`;
22
+ else if(typeof pos.index === "number")
23
+ return `+${pos.index}`;
24
+ else
25
+ return "";
26
+ default:
27
+ return "";
28
+ }
29
+ };
30
+
31
+ const formatLocation = (loc) => {
32
+ if(loc === null)
35
33
  return "";
34
+ const typeOfLoc = typeof loc;
35
+ switch(typeOfLoc) {
36
+ case "string":
37
+ return loc;
38
+ case "number":
39
+ return `${loc}`;
40
+ case "object":
41
+ if(loc.start && loc.end) {
42
+ if(typeof loc.start.line === "number" && typeof loc.end.line === "number" && typeof loc.end.column === "number" && loc.start.line === loc.end.line)
43
+ return `${formatPosition(loc.start)}-${loc.end.column}`;
44
+ return `${formatPosition(loc.start)}-${formatPosition(loc.end)}`;
45
+ }
46
+ if(loc.start)
47
+ return formatPosition(loc.start);
48
+ return formatPosition(loc);
49
+ default:
50
+ return "";
36
51
  }
37
52
  };
53
+
54
+ module.exports = formatLocation;