webpack 2.3.3 → 2.5.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 (81) hide show
  1. package/README.md +148 -133
  2. package/lib/APIPlugin.js +0 -6
  3. package/lib/AsyncDependenciesBlock.js +1 -1
  4. package/lib/AutomaticPrefetchPlugin.js +2 -2
  5. package/lib/BannerPlugin.js +30 -8
  6. package/lib/CachePlugin.js +2 -2
  7. package/lib/CaseSensitiveModulesWarning.js +6 -3
  8. package/lib/ChunkRenderError.js +3 -1
  9. package/lib/ChunkTemplate.js +2 -2
  10. package/lib/Compilation.js +17 -17
  11. package/lib/Compiler.js +30 -25
  12. package/lib/ContextModule.js +4 -3
  13. package/lib/ContextModuleFactory.js +5 -5
  14. package/lib/DelegatedModule.js +69 -63
  15. package/lib/DependenciesBlock.js +65 -59
  16. package/lib/Dependency.js +1 -0
  17. package/lib/EntryModuleNotFoundError.js +16 -10
  18. package/lib/ExtendedAPIPlugin.js +7 -2
  19. package/lib/ExternalModule.js +1 -1
  20. package/lib/ExternalModuleFactoryPlugin.js +26 -23
  21. package/lib/FlagDependencyUsagePlugin.js +63 -75
  22. package/lib/HotModuleReplacement.runtime.js +25 -27
  23. package/lib/HotModuleReplacementPlugin.js +3 -5
  24. package/lib/IgnorePlugin.js +48 -17
  25. package/lib/JsonpChunkTemplatePlugin.js +24 -24
  26. package/lib/JsonpMainTemplatePlugin.js +182 -182
  27. package/lib/LibManifestPlugin.js +51 -46
  28. package/lib/MainTemplate.js +17 -18
  29. package/lib/Module.js +158 -160
  30. package/lib/ModuleBuildError.js +4 -2
  31. package/lib/ModuleDependencyError.js +2 -1
  32. package/lib/ModuleDependencyWarning.js +2 -1
  33. package/lib/ModuleError.js +2 -2
  34. package/lib/ModuleFilenameHelpers.js +27 -27
  35. package/lib/ModuleNotFoundError.js +3 -1
  36. package/lib/ModuleParseError.js +6 -4
  37. package/lib/ModuleWarning.js +2 -2
  38. package/lib/MultiCompiler.js +3 -4
  39. package/lib/MultiStats.js +3 -3
  40. package/lib/MultiWatching.js +2 -2
  41. package/lib/NamedChunksPlugin.js +30 -0
  42. package/lib/NodeStuffPlugin.js +80 -79
  43. package/lib/NormalModule.js +7 -3
  44. package/lib/NormalModuleFactory.js +244 -240
  45. package/lib/Parser.js +1256 -1079
  46. package/lib/ProgressPlugin.js +2 -2
  47. package/lib/RawModule.js +1 -1
  48. package/lib/RecordIdsPlugin.js +5 -9
  49. package/lib/SetVarMainTemplatePlugin.js +1 -1
  50. package/lib/SourceMapDevToolPlugin.js +153 -157
  51. package/lib/Stats.js +34 -6
  52. package/lib/TemplatedPathPlugin.js +1 -0
  53. package/lib/UnsupportedFeatureWarning.js +2 -1
  54. package/lib/WebpackError.js +11 -0
  55. package/lib/WebpackOptionsApply.js +4 -4
  56. package/lib/WebpackOptionsValidationError.js +2 -3
  57. package/lib/dependencies/AMDDefineDependency.js +10 -6
  58. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +8 -1
  59. package/lib/dependencies/AMDPlugin.js +3 -3
  60. package/lib/dependencies/ContextDependencyHelpers.js +19 -16
  61. package/lib/dependencies/CriticalDependencyWarning.js +4 -1
  62. package/lib/dependencies/DepBlockHelpers.js +3 -3
  63. package/lib/dependencies/HarmonyCompatibilityDependency.js +1 -1
  64. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +3 -3
  65. package/lib/dependencies/ImportContextDependency.js +2 -1
  66. package/lib/dependencies/ImportDependenciesBlock.js +2 -2
  67. package/lib/dependencies/ImportParserPlugin.js +16 -2
  68. package/lib/dependencies/RequireEnsureDependenciesBlock.js +11 -3
  69. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +42 -13
  70. package/lib/dependencies/RequireEnsureDependency.js +9 -2
  71. package/lib/formatLocation.js +44 -27
  72. package/lib/optimize/AggressiveSplittingPlugin.js +10 -17
  73. package/lib/optimize/CommonsChunkPlugin.js +2 -2
  74. package/lib/performance/AssetsOverSizeLimitWarning.js +4 -1
  75. package/lib/performance/EntrypointsOverSizeLimitWarning.js +5 -1
  76. package/lib/performance/NoAsyncChunksWarning.js +5 -1
  77. package/lib/removeAndDo.js +6 -4
  78. package/lib/util/identifier.js +16 -0
  79. package/lib/webpack.js +2 -1
  80. package/package.json +7 -4
  81. package/schemas/webpackOptionsSchema.json +35 -0
@@ -2,7 +2,9 @@
2
2
  MIT License http://www.opensource.org/licenses/mit-license.php
3
3
  Author Tobias Koppers @sokra
4
4
  */
5
- var ContextDependencyHelpers = exports;
5
+ "use strict";
6
+
7
+ const ContextDependencyHelpers = exports;
6
8
 
7
9
  /**
8
10
  * Escapes regular expression metacharacters
@@ -13,8 +15,15 @@ function quotemeta(str) {
13
15
  return str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&");
14
16
  }
15
17
 
16
- ContextDependencyHelpers.create = function(Dep, range, param, expr, options) {
17
- var dep, prefix, postfix, prefixRange, valueRange, idx, context, regExp;
18
+ ContextDependencyHelpers.create = function(Dep, range, param, expr, options, chunkName) {
19
+ let dep;
20
+ let prefix;
21
+ let postfix;
22
+ let prefixRange;
23
+ let valueRange;
24
+ let idx;
25
+ let context;
26
+ let regExp;
18
27
  if(param.isTemplateString()) {
19
28
  prefix = param.quasis[0].string;
20
29
  postfix = param.quasis.length > 1 ? param.quasis[param.quasis.length - 1].string : "";
@@ -24,14 +33,11 @@ ContextDependencyHelpers.create = function(Dep, range, param, expr, options) {
24
33
  context = ".";
25
34
  if(idx >= 0) {
26
35
  context = prefix.substr(0, idx);
27
- prefix = "." + prefix.substr(idx);
36
+ prefix = `.${prefix.substr(idx)}`;
28
37
  }
29
38
  // If there are more than two quasis, maybe the generated RegExp can be more precise?
30
- regExp = new RegExp("^" +
31
- quotemeta(prefix) +
32
- options.wrappedContextRegExp.source +
33
- quotemeta(postfix) + "$");
34
- dep = new Dep(context, options.wrappedContextRecursive, regExp, range, valueRange);
39
+ regExp = new RegExp(`^${quotemeta(prefix)}${options.wrappedContextRegExp.source}${quotemeta(postfix)}$`);
40
+ dep = new Dep(context, options.wrappedContextRecursive, regExp, range, valueRange, chunkName);
35
41
  dep.loc = expr.loc;
36
42
  dep.replaces = [{
37
43
  range: prefixRange,
@@ -48,19 +54,16 @@ ContextDependencyHelpers.create = function(Dep, range, param, expr, options) {
48
54
  context = ".";
49
55
  if(idx >= 0) {
50
56
  context = prefix.substr(0, idx);
51
- prefix = "." + prefix.substr(idx);
57
+ prefix = `.${prefix.substr(idx)}`;
52
58
  }
53
- regExp = new RegExp("^" +
54
- quotemeta(prefix) +
55
- options.wrappedContextRegExp.source +
56
- quotemeta(postfix) + "$");
57
- dep = new Dep(context, options.wrappedContextRecursive, regExp, range, valueRange);
59
+ regExp = new RegExp(`^${quotemeta(prefix)}${options.wrappedContextRegExp.source}${quotemeta(postfix)}$`);
60
+ dep = new Dep(context, options.wrappedContextRecursive, regExp, range, valueRange, chunkName);
58
61
  dep.loc = expr.loc;
59
62
  dep.prepend = param.prefix && param.prefix.isString() ? prefix : null;
60
63
  dep.critical = options.wrappedContextCritical && "a part of the request of a dependency is an expression";
61
64
  return dep;
62
65
  } else {
63
- dep = new Dep(options.exprContextRequest, options.exprContextRecursive, options.exprContextRegExp, range, param.range);
66
+ dep = new Dep(options.exprContextRequest, options.exprContextRecursive, options.exprContextRegExp, range, param.range, chunkName);
64
67
  dep.loc = expr.loc;
65
68
  dep.critical = options.exprContextCritical && "the request of a dependency is an expression";
66
69
  return dep;
@@ -4,12 +4,15 @@
4
4
  */
5
5
  "use strict";
6
6
 
7
- class CriticalDependencyWarning extends Error {
7
+ const WebpackError = require("../WebpackError");
8
8
 
9
+ class CriticalDependencyWarning extends WebpackError {
9
10
  constructor(message) {
10
11
  super();
12
+
11
13
  this.name = "CriticalDependencyWarning";
12
14
  this.message = "Critical dependency: " + message;
15
+
13
16
  Error.captureStackTrace(this, this.constructor);
14
17
  }
15
18
  }
@@ -16,11 +16,11 @@ DepBlockHelpers.getLoadDepBlockWrapper = function(depBlock, outputOptions, reque
16
16
  DepBlockHelpers.getDepBlockPromise = function(depBlock, outputOptions, requestShortener, name) {
17
17
  if(depBlock.chunks) {
18
18
  var chunks = depBlock.chunks.filter(function(chunk) {
19
- return !chunk.hasRuntime() && typeof chunk.id === "number";
19
+ return !chunk.hasRuntime() && chunk.id !== null;
20
20
  });
21
21
  if(chunks.length === 1) {
22
22
  var chunk = chunks[0];
23
- return "__webpack_require__.e" + asComment(name) + "(" + chunk.id + "" +
23
+ return "__webpack_require__.e" + asComment(name) + "(" + JSON.stringify(chunk.id) + "" +
24
24
  (outputOptions.pathinfo && depBlock.chunkName ? "/*! " + requestShortener.shorten(depBlock.chunkName) + " */" : "") +
25
25
  asComment(depBlock.chunkReason) + ")";
26
26
  } else if(chunks.length > 0) {
@@ -28,7 +28,7 @@ DepBlockHelpers.getDepBlockPromise = function(depBlock, outputOptions, requestSh
28
28
  (outputOptions.pathinfo && depBlock.chunkName ? "/*! " + requestShortener.shorten(depBlock.chunkName) + " */" : "") +
29
29
  "[" +
30
30
  chunks.map(function(chunk) {
31
- return "__webpack_require__.e(" + chunk.id + ")";
31
+ return "__webpack_require__.e(" + JSON.stringify(chunk.id) + ")";
32
32
  }).join(", ") +
33
33
  "])";
34
34
  }
@@ -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
  };
@@ -25,7 +25,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
25
25
  dep.loc = Object.create(statement.loc);
26
26
  dep.loc.index = -1;
27
27
  parser.state.current.addDependency(dep);
28
- parser.state.lastHarmoryImport = dep;
28
+ parser.state.lastHarmonyImport = dep;
29
29
  return true;
30
30
  });
31
31
  parser.plugin("export expression", (statement, expr) => {
@@ -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;
@@ -53,7 +53,7 @@ module.exports = class HarmonyExportDependencyParserPlugin {
53
53
  return true;
54
54
  });
55
55
  parser.plugin("export import specifier", (statement, source, id, name, idx) => {
56
- const dep = new HarmonyExportImportedSpecifierDependency(parser.state.module, parser.state.lastHarmoryImport, HarmonyModulesHelpers.getModuleVar(parser.state, source), id, name);
56
+ const dep = new HarmonyExportImportedSpecifierDependency(parser.state.module, parser.state.lastHarmonyImport, HarmonyModulesHelpers.getModuleVar(parser.state, source), id, name);
57
57
  dep.loc = Object.create(statement.loc);
58
58
  dep.loc.index = idx;
59
59
  parser.state.current.addDependency(dep);
@@ -8,11 +8,12 @@ const CriticalDependencyWarning = require("./CriticalDependencyWarning");
8
8
  const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
9
9
 
10
10
  class ImportContextDependency extends ContextDependency {
11
- constructor(request, recursive, regExp, range, valueRange) {
11
+ constructor(request, recursive, regExp, range, valueRange, chunkName) {
12
12
  super(request, recursive, regExp);
13
13
  this.range = range;
14
14
  this.valueRange = valueRange;
15
15
  this.async = true;
16
+ this.chunkName = chunkName;
16
17
  }
17
18
 
18
19
  get type() {
@@ -7,8 +7,8 @@ const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
7
7
  const ImportDependency = require("./ImportDependency");
8
8
 
9
9
  module.exports = class ImportDependenciesBlock extends AsyncDependenciesBlock {
10
- constructor(request, range, module, loc) {
11
- super(null, module, loc);
10
+ constructor(request, range, chunkName, module, loc) {
11
+ super(chunkName, module, loc);
12
12
  this.range = range;
13
13
  const dep = new ImportDependency(request, this);
14
14
  dep.loc = loc;
@@ -15,16 +15,30 @@ class ImportParserPlugin {
15
15
 
16
16
  apply(parser) {
17
17
  const options = this.options;
18
+
18
19
  parser.plugin(["call System.import", "import-call"], (expr) => {
19
20
  if(expr.arguments.length !== 1)
20
21
  throw new Error("Incorrect number of arguments provided to 'import(module: string) -> Promise'.");
22
+
21
23
  const param = parser.evaluateExpression(expr.arguments[0]);
24
+
25
+ let chunkName = null;
26
+
27
+ const importOptions = parser.getCommentOptions(expr.range);
28
+ if(importOptions) {
29
+ if(typeof importOptions.webpackChunkName !== "undefined") {
30
+ if(typeof importOptions.webpackChunkName !== "string")
31
+ throw new Error(`\`webpackChunkName\` expected a string, but received: ${importOptions.webpackChunkName}.`);
32
+ chunkName = importOptions.webpackChunkName;
33
+ }
34
+ }
35
+
22
36
  if(param.isString()) {
23
- const depBlock = new ImportDependenciesBlock(param.string, expr.range, parser.state.module, expr.loc);
37
+ const depBlock = new ImportDependenciesBlock(param.string, expr.range, chunkName, parser.state.module, expr.loc);
24
38
  parser.state.current.addBlock(depBlock);
25
39
  return true;
26
40
  } else {
27
- const dep = ContextDependencyHelpers.create(ImportContextDependency, expr.range, param, expr, options);
41
+ const dep = ContextDependencyHelpers.create(ImportContextDependency, expr.range, param, expr, options, chunkName);
28
42
  if(!dep) return;
29
43
  dep.loc = expr.loc;
30
44
  dep.optional = !!parser.scope.inTry;
@@ -7,11 +7,19 @@ const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
7
7
  const RequireEnsureDependency = require("./RequireEnsureDependency");
8
8
 
9
9
  module.exports = class RequireEnsureDependenciesBlock extends AsyncDependenciesBlock {
10
- constructor(expr, fnExpression, chunkName, chunkNameRange, module, loc) {
10
+ constructor(expr, successExpression, errorExpression, chunkName, chunkNameRange, module, loc) {
11
11
  super(chunkName, module, loc);
12
12
  this.expr = expr;
13
- const bodyRange = fnExpression && fnExpression.body && fnExpression.body.range;
14
- this.range = bodyRange && [bodyRange[0] + 1, bodyRange[1] - 1] || null;
13
+ const successBodyRange = successExpression && successExpression.body && successExpression.body.range;
14
+ const errorBodyRange = errorExpression && errorExpression.body && errorExpression.body.range;
15
+ this.range = null;
16
+ 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
+ }
22
+ }
15
23
  this.chunkNameRange = chunkNameRange;
16
24
  const dep = new RequireEnsureDependency(this);
17
25
  dep.loc = loc;
@@ -13,27 +13,48 @@ module.exports = class RequireEnsureDependenciesBlockParserPlugin {
13
13
  parser.plugin("call require.ensure", expr => {
14
14
  let chunkName = null;
15
15
  let chunkNameRange = null;
16
+ let errorExpressionArg = null;
17
+ let errorExpression = null;
16
18
  switch(expr.arguments.length) {
17
- case 3:
19
+ case 4:
18
20
  {
19
- const chunkNameExpr = parser.evaluateExpression(expr.arguments[2]);
21
+ const chunkNameExpr = parser.evaluateExpression(expr.arguments[3]);
20
22
  if(!chunkNameExpr.isString()) return;
21
23
  chunkNameRange = chunkNameExpr.range;
22
24
  chunkName = chunkNameExpr.string;
23
25
  }
24
26
  // falls through
27
+ case 3:
28
+ {
29
+ errorExpressionArg = expr.arguments[2];
30
+ errorExpression = getFunctionExpression(errorExpressionArg);
31
+
32
+ if(!errorExpression && !chunkName) {
33
+ const chunkNameExpr = parser.evaluateExpression(expr.arguments[2]);
34
+ if(!chunkNameExpr.isString()) return;
35
+ chunkNameRange = chunkNameExpr.range;
36
+ chunkName = chunkNameExpr.string;
37
+ }
38
+ }
39
+ // falls through
25
40
  case 2:
26
41
  {
27
42
  const dependenciesExpr = parser.evaluateExpression(expr.arguments[0]);
28
43
  const dependenciesItems = dependenciesExpr.isArray() ? dependenciesExpr.items : [dependenciesExpr];
29
- const fnExpressionArg = expr.arguments[1];
30
- const fnExpression = getFunctionExpression(fnExpressionArg);
44
+ const successExpressionArg = expr.arguments[1];
45
+ const successExpression = getFunctionExpression(successExpressionArg);
31
46
 
32
- if(fnExpression) {
33
- parser.walkExpressions(fnExpression.expressions);
47
+ if(successExpression) {
48
+ parser.walkExpressions(successExpression.expressions);
49
+ }
50
+ if(errorExpression) {
51
+ parser.walkExpressions(errorExpression.expressions);
34
52
  }
35
53
 
36
- const dep = new RequireEnsureDependenciesBlock(expr, fnExpression ? fnExpression.fn : fnExpressionArg, chunkName, chunkNameRange, parser.state.module, expr.loc);
54
+ const dep = new RequireEnsureDependenciesBlock(expr,
55
+ successExpression ? successExpression.fn : successExpressionArg,
56
+ errorExpression ? errorExpression.fn : errorExpressionArg,
57
+ chunkName, chunkNameRange, parser.state.module, expr.loc);
37
58
  const old = parser.state.current;
38
59
  parser.state.current = dep;
39
60
  try {
@@ -52,18 +73,26 @@ module.exports = class RequireEnsureDependenciesBlockParserPlugin {
52
73
  if(failed) {
53
74
  return;
54
75
  }
55
- if(fnExpression) {
56
- if(fnExpression.fn.body.type === "BlockStatement")
57
- parser.walkStatement(fnExpression.fn.body);
76
+ if(successExpression) {
77
+ if(successExpression.fn.body.type === "BlockStatement")
78
+ parser.walkStatement(successExpression.fn.body);
58
79
  else
59
- parser.walkExpression(fnExpression.fn.body);
80
+ parser.walkExpression(successExpression.fn.body);
60
81
  }
61
82
  old.addBlock(dep);
62
83
  } finally {
63
84
  parser.state.current = old;
64
85
  }
65
- if(!fnExpression) {
66
- parser.walkExpression(fnExpressionArg);
86
+ if(!successExpression) {
87
+ parser.walkExpression(successExpressionArg);
88
+ }
89
+ if(errorExpression) {
90
+ if(errorExpression.fn.body.type === "BlockStatement")
91
+ parser.walkStatement(errorExpression.fn.body);
92
+ else
93
+ parser.walkExpression(errorExpression.fn.body);
94
+ } else if(errorExpressionArg) {
95
+ parser.walkExpression(errorExpressionArg);
67
96
  }
68
97
  return true;
69
98
  }
@@ -21,10 +21,17 @@ RequireEnsureDependency.Template = class RequireEnsureDependencyTemplate {
21
21
  apply(dep, source, outputOptions, requestShortener) {
22
22
  const depBlock = dep.block;
23
23
  const wrapper = DepBlockHelpers.getLoadDepBlockWrapper(depBlock, outputOptions, requestShortener, "require.ensure");
24
+ const errorCallbackExists = depBlock.expr.arguments.length === 4 || (!depBlock.chunkName && depBlock.expr.arguments.length === 3);
24
25
  const startBlock = wrapper[0] + "(";
25
- const endBlock = `).bind(null, __webpack_require__)${wrapper[1]}__webpack_require__.oe${wrapper[2]}`;
26
+ const middleBlock = `).bind(null, __webpack_require__)${wrapper[1]}`;
27
+ const endBlock = `${middleBlock}__webpack_require__.oe${wrapper[2]}`;
26
28
  source.replace(depBlock.expr.range[0], depBlock.expr.arguments[1].range[0] - 1, startBlock);
27
- source.replace(depBlock.expr.arguments[1].range[1], depBlock.expr.range[1] - 1, endBlock);
29
+ if(errorCallbackExists) {
30
+ source.replace(depBlock.expr.arguments[1].range[1], depBlock.expr.arguments[2].range[0] - 1, middleBlock);
31
+ source.replace(depBlock.expr.arguments[2].range[1], depBlock.expr.range[1] - 1, wrapper[2]);
32
+ } else {
33
+ source.replace(depBlock.expr.arguments[1].range[1], depBlock.expr.range[1] - 1, endBlock);
34
+ }
28
35
  }
29
36
  };
30
37
 
@@ -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;
@@ -4,18 +4,7 @@
4
4
  */
5
5
  "use strict";
6
6
 
7
- let path = require("path");
8
-
9
- function makeRelative(context) {
10
- return function(module) {
11
- const identifier = module.identifier();
12
- return identifier.split("|").map((str) => {
13
- return str.split("!").map((str) => {
14
- return path.relative(context, str);
15
- }).join("!");
16
- }).join("|");
17
- };
18
- }
7
+ const identifierUtils = require("../util/identifier");
19
8
 
20
9
  function toIndexOf(list) {
21
10
  return function(item) {
@@ -73,7 +62,7 @@ class AggressiveSplittingPlugin {
73
62
  const splitData = usedSplits[j];
74
63
  for(let i = 0; i < chunks.length; i++) {
75
64
  const chunk = chunks[i];
76
- const chunkModuleNames = chunk.modules.map(makeRelative(compiler.context));
65
+ const chunkModuleNames = chunk.modules.map(m => identifierUtils.makePathsRelative(compiler.context, m.identifier()));
77
66
 
78
67
  if(chunkModuleNames.length < splitData.modules.length)
79
68
  continue;
@@ -91,7 +80,9 @@ class AggressiveSplittingPlugin {
91
80
  newChunk._fromAggressiveSplitting = true;
92
81
  if(j < savedSplits.length)
93
82
  newChunk._fromAggressiveSplittingIndex = j;
94
- if(typeof splitData.id === "number") newChunk.id = splitData.id;
83
+ if(splitData.id !== null && splitData.id !== undefined) {
84
+ newChunk.id = splitData.id;
85
+ }
95
86
  newChunk.origins = chunk.origins.map(copyWithReason);
96
87
  chunk.origins = chunk.origins.map(copyWithReason);
97
88
  return true;
@@ -99,7 +90,9 @@ class AggressiveSplittingPlugin {
99
90
  if(j < savedSplits.length)
100
91
  chunk._fromAggressiveSplittingIndex = j;
101
92
  chunk.name = null;
102
- if(typeof splitData.id === "number") chunk.id = splitData.id;
93
+ if(splitData.id !== null && splitData.id !== undefined) {
94
+ chunk.id = splitData.id;
95
+ }
103
96
  }
104
97
  }
105
98
  }
@@ -144,7 +137,7 @@ class AggressiveSplittingPlugin {
144
137
  newChunk.origins = chunk.origins.map(copyWithReason);
145
138
  chunk.origins = chunk.origins.map(copyWithReason);
146
139
  compilation._aggressiveSplittingSplits = (compilation._aggressiveSplittingSplits || []).concat({
147
- modules: newChunk.modules.map(makeRelative(compiler.context))
140
+ modules: newChunk.modules.map(m => identifierUtils.makePathsRelative(compiler.context, m.identifier()))
148
141
  });
149
142
  return true;
150
143
  } else {
@@ -161,7 +154,7 @@ class AggressiveSplittingPlugin {
161
154
  if(chunk.hasEntryModule()) return;
162
155
  const size = chunk.size(this.options);
163
156
  const incorrectSize = size < minSize;
164
- const modules = chunk.modules.map(makeRelative(compiler.context));
157
+ const modules = chunk.modules.map(m => identifierUtils.makePathsRelative(compiler.context, m.identifier()));
165
158
  if(typeof chunk._fromAggressiveSplittingIndex === "undefined") {
166
159
  if(incorrectSize) return;
167
160
  chunk.recorded = true;
@@ -190,7 +190,7 @@ You can however specify the name of the async chunk by passing the desired strin
190
190
 
191
191
  // we dont have named chunks specified, so we just take all of them
192
192
  if(asyncOrNoSelectedChunk) {
193
- return allChunks;
193
+ return allChunks.filter(chunk => !chunk.isInitial());
194
194
  }
195
195
 
196
196
  /**
@@ -244,7 +244,7 @@ Take a look at the "name"/"names" or async/children option.`);
244
244
  return allChunks.filter((chunk) => {
245
245
  const found = targetChunks.indexOf(chunk);
246
246
  if(found >= currentIndex) return false;
247
- return chunk.parents.length === 0;
247
+ return chunk.hasRuntime();
248
248
  });
249
249
  }
250
250
 
@@ -3,9 +3,11 @@
3
3
  Author Sean Larkin @thelarkinn
4
4
  */
5
5
  "use strict";
6
+
7
+ const WebpackError = require("../WebpackError");
6
8
  const SizeFormatHelpers = require("../SizeFormatHelpers");
7
9
 
8
- module.exports = class AssetsOverSizeLimitWarning extends Error {
10
+ module.exports = class AssetsOverSizeLimitWarning extends WebpackError {
9
11
  constructor(assetsOverSizeLimit, assetLimit) {
10
12
  super();
11
13
 
@@ -15,6 +17,7 @@ module.exports = class AssetsOverSizeLimitWarning extends Error {
15
17
  this.message = `asset size limit: The following asset(s) exceed the recommended size limit (${SizeFormatHelpers.formatSize(assetLimit)}).
16
18
  This can impact web performance.
17
19
  Assets: ${assetLists}`;
20
+
18
21
  Error.captureStackTrace(this, this.constructor);
19
22
  }
20
23
  };
@@ -3,11 +3,14 @@
3
3
  Author Sean Larkin @thelarkinn
4
4
  */
5
5
  "use strict";
6
+
7
+ const WebpackError = require("../WebpackError");
6
8
  const SizeFormatHelpers = require("../SizeFormatHelpers");
7
9
 
8
- module.exports = class EntrypointsOverSizeLimitWarning extends Error {
10
+ module.exports = class EntrypointsOverSizeLimitWarning extends WebpackError {
9
11
  constructor(entrypoints, entrypointLimit) {
10
12
  super();
13
+
11
14
  this.name = "EntrypointsOverSizeLimitWarning";
12
15
  this.entrypoints = entrypoints;
13
16
  const entrypointList = this.entrypoints.map(entrypoint => `\n ${
@@ -19,6 +22,7 @@ module.exports = class EntrypointsOverSizeLimitWarning extends Error {
19
22
  }`).join("");
20
23
  this.message = `entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (${SizeFormatHelpers.formatSize(entrypointLimit)}). This can impact web performance.
21
24
  Entrypoints:${entrypointList}\n`;
25
+
22
26
  Error.captureStackTrace(this, this.constructor);
23
27
  }
24
28
  };
@@ -4,13 +4,17 @@
4
4
  */
5
5
  "use strict";
6
6
 
7
- module.exports = class NoAsyncChunksWarning extends Error {
7
+ const WebpackError = require("../WebpackError");
8
+
9
+ module.exports = class NoAsyncChunksWarning extends WebpackError {
8
10
  constructor() {
9
11
  super();
12
+
10
13
  this.name = "NoAsyncChunksWarning";
11
14
  this.message = "webpack performance recommendations: \n" +
12
15
  "You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application.\n" +
13
16
  "For more info visit https://webpack.js.org/guides/code-splitting/";
17
+
14
18
  Error.captureStackTrace(this, this.constructor);
15
19
  }
16
20
  };
@@ -2,12 +2,14 @@
2
2
  MIT License http://www.opensource.org/licenses/mit-license.php
3
3
  Author Tobias Koppers @sokra
4
4
  */
5
+ "use strict";
6
+
5
7
  module.exports = function removeAndDo(collection, thing, action) {
6
- var idx = this[collection].indexOf(thing);
7
- if(idx >= 0) {
8
+ const idx = this[collection].indexOf(thing);
9
+ const hasThingInCollection = idx >= 0;
10
+ if(hasThingInCollection) {
8
11
  this[collection].splice(idx, 1);
9
12
  thing[action](this);
10
- return true;
11
13
  }
12
- return false;
14
+ return hasThingInCollection;
13
15
  };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ const path = require("path");
3
+
4
+ const looksLikeAbsolutePath = (maybeAbsolutePath) => {
5
+ return /^(?:[a-z]:\\|\/)/i.test(maybeAbsolutePath);
6
+ };
7
+
8
+ const normalizePathSeparator = (p) => p.replace(/\\/g, "/");
9
+
10
+ exports.makePathsRelative = (context, identifier) => {
11
+ return identifier
12
+ .split(/([|! ])/)
13
+ .map(str => looksLikeAbsolutePath(str) ?
14
+ normalizePathSeparator(path.relative(context, str)) : str)
15
+ .join("");
16
+ };
package/lib/webpack.js CHANGED
@@ -40,7 +40,7 @@ function webpack(options, callback) {
40
40
  if(callback) {
41
41
  if(typeof callback !== "function") throw new Error("Invalid argument: callback");
42
42
  if(options.watch === true || (Array.isArray(options) && options.some(o => o.watch))) {
43
- const watchOptions = (!Array.isArray(options) ? options : options[0]).watchOptions || {};
43
+ const watchOptions = Array.isArray(options) ? options.map(o => o.watchOptions || {}) : (options.watchOptions || {});
44
44
  return compiler.watch(watchOptions, callback);
45
45
  }
46
46
  compiler.run(callback);
@@ -102,6 +102,7 @@ exportPlugins(exports, ".", [
102
102
  "DllReferencePlugin",
103
103
  "LoaderOptionsPlugin",
104
104
  "NamedModulesPlugin",
105
+ "NamedChunksPlugin",
105
106
  "HashedModuleIdsPlugin",
106
107
  "ModuleFilenameHelpers"
107
108
  ]);