webpack 2.1.0-beta.21 → 2.1.0-beta.25

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 (66) hide show
  1. package/bin/config-yargs.js +6 -5
  2. package/bin/convert-argv.js +59 -31
  3. package/bin/webpack.js +30 -2
  4. package/lib/APIPlugin.js +19 -16
  5. package/lib/Chunk.js +1 -1
  6. package/lib/CommonJsHarmonyMainTemplatePlugin.js +21 -0
  7. package/lib/CompatibilityPlugin.js +24 -17
  8. package/lib/Compilation.js +36 -15
  9. package/lib/Compiler.js +48 -15
  10. package/lib/ConstPlugin.js +40 -37
  11. package/lib/DefinePlugin.js +107 -103
  12. package/lib/DelegatedModule.js +1 -2
  13. package/lib/Dependency.js +5 -0
  14. package/lib/DllReferencePlugin.js +41 -15
  15. package/lib/ExtendedAPIPlugin.js +14 -11
  16. package/lib/FlagDependencyExportsPlugin.js +102 -0
  17. package/lib/FlagInitialModulesAsUsedPlugin.js +23 -23
  18. package/lib/FunctionModuleTemplatePlugin.js +4 -0
  19. package/lib/HotModuleReplacement.runtime.js +1 -1
  20. package/lib/HotModuleReplacementPlugin.js +71 -68
  21. package/lib/LibManifestPlugin.js +1 -2
  22. package/lib/LibraryTemplatePlugin.js +4 -0
  23. package/lib/MainTemplate.js +12 -13
  24. package/lib/Module.js +10 -1
  25. package/lib/MovedToPluginWarningPlugin.js +3 -1
  26. package/lib/MultiCompiler.js +81 -7
  27. package/lib/NodeStuffPlugin.js +97 -86
  28. package/lib/NormalModule.js +6 -0
  29. package/lib/NormalModuleFactory.js +87 -34
  30. package/lib/Parser.js +13 -4
  31. package/lib/ProvidePlugin.js +30 -27
  32. package/lib/RequireJsStuffPlugin.js +27 -21
  33. package/lib/RuleSet.js +369 -0
  34. package/lib/Stats.js +74 -90
  35. package/lib/UseStrictPlugin.js +12 -8
  36. package/lib/WebpackOptionsApply.js +3 -13
  37. package/lib/WebpackOptionsDefaulter.js +0 -1
  38. package/lib/WebpackOptionsValidationError.js +186 -0
  39. package/lib/dependencies/AMDPlugin.js +64 -55
  40. package/lib/dependencies/CommonJsPlugin.js +55 -45
  41. package/lib/dependencies/HarmonyExportExpressionDependency.js +6 -0
  42. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +76 -16
  43. package/lib/dependencies/HarmonyExportSpecifierDependency.js +12 -4
  44. package/lib/dependencies/HarmonyImportSpecifierDependency.js +6 -4
  45. package/lib/dependencies/HarmonyModulesHelpers.js +0 -29
  46. package/lib/dependencies/HarmonyModulesPlugin.js +11 -4
  47. package/lib/dependencies/RequireContextPlugin.js +12 -5
  48. package/lib/dependencies/RequireEnsurePlugin.js +17 -10
  49. package/lib/dependencies/RequireIncludePlugin.js +18 -10
  50. package/lib/dependencies/SystemPlugin.js +48 -29
  51. package/lib/node/NodeMainTemplate.runtime.js +2 -2
  52. package/lib/node/NodeMainTemplateAsync.runtime.js +2 -2
  53. package/lib/node/NodeSourcePlugin.js +84 -71
  54. package/lib/optimize/ChunkModuleIdRangePlugin.js +52 -0
  55. package/lib/optimize/EnsureChunkConditionsPlugin.js +7 -2
  56. package/lib/validateWebpackOptions.js +63 -0
  57. package/lib/webpack.js +9 -6
  58. package/lib/webworker/WebWorkerMainTemplate.runtime.js +35 -33
  59. package/package.json +13 -8
  60. package/schemas/webpackOptionsSchema.json +802 -0
  61. package/README.md +0 -315
  62. package/lib/LoadersList.js +0 -110
  63. package/lib/dependencies/LabeledExportsDependency.js +0 -21
  64. package/lib/dependencies/LabeledModuleDependency.js +0 -36
  65. package/lib/dependencies/LabeledModuleDependencyParserPlugin.js +0 -78
  66. package/lib/dependencies/LabeledModulesPlugin.js +0 -26
@@ -7,16 +7,27 @@ var async = require("async");
7
7
  var Tapable = require("tapable");
8
8
  var NormalModule = require("./NormalModule");
9
9
  var RawModule = require("./RawModule");
10
- var LoadersList = require("./LoadersList");
10
+ var Parser = require("./Parser");
11
+ var RuleSet = require("./RuleSet");
12
+
13
+ function loaderToIdent(data) {
14
+ if(!data.options)
15
+ return data.loader;
16
+ if(typeof data.options === "string")
17
+ return data.loader + "?" + data.options;
18
+ if(typeof data.options !== "object")
19
+ throw new Error("loader options must be string or object");
20
+ if(data.options.ident)
21
+ return data.loader + "??" + data.options.ident;
22
+ return data.loader + "?" + JSON.stringify(data.options);
23
+ }
11
24
 
12
- function NormalModuleFactory(context, resolvers, parser, options) {
25
+ function NormalModuleFactory(context, resolvers, options) {
13
26
  Tapable.call(this);
14
27
  this.resolvers = resolvers;
15
- this.parser = parser;
16
- this.loaders = new LoadersList(options.loaders);
17
- this.preLoaders = new LoadersList(options.preLoaders);
18
- this.postLoaders = new LoadersList(options.postLoaders);
28
+ this.ruleSet = new RuleSet(options.rules || options.loaders);
19
29
  this.context = context || "";
30
+ this.parserCache = {};
20
31
  this.plugin("factory", function() {
21
32
  var _this = this;
22
33
  return function(result, callback) {
@@ -77,6 +88,18 @@ function NormalModuleFactory(context, resolvers, parser, options) {
77
88
  var noPostAutoLoaders = /^-!/.test(request);
78
89
  var elements = request.replace(/^-?!+/, "").replace(/!!+/g, "!").split("!");
79
90
  var resource = elements.pop();
91
+ elements = elements.map(function(element) {
92
+ var idx = element.indexOf("?");
93
+ var options;
94
+ if(idx >= 0) {
95
+ options = element.substr(idx + 1);
96
+ element = element.substr(0, idx);
97
+ }
98
+ return {
99
+ loader: element,
100
+ options: options
101
+ };
102
+ });
80
103
 
81
104
  async.parallel([
82
105
  function(callback) {
@@ -101,46 +124,53 @@ function NormalModuleFactory(context, resolvers, parser, options) {
101
124
  "ignored " + context + " " + request,
102
125
  request + " (ignored)")); // ignored
103
126
 
104
- var userRequest = loaders.concat([resource]).join("!");
127
+ var userRequest = loaders.map(loaderToIdent).concat([resource]).join("!");
105
128
 
106
129
  var resourcePath = resource;
107
130
  var queryIndex = resourcePath.indexOf("?");
108
131
  if(queryIndex >= 0)
109
132
  resourcePath = resourcePath.substr(0, queryIndex);
110
133
 
111
- if(noPrePostAutoLoaders)
112
- return onDoneResolving();
113
- if(noAutoLoaders) {
114
- async.parallel([
115
- _this.resolveRequestArray.bind(_this, contextInfo, _this.context, noPostAutoLoaders ? [] : _this.postLoaders.match(resourcePath), _this.resolvers.loader),
116
- _this.resolveRequestArray.bind(_this, contextInfo, _this.context, _this.preLoaders.match(resourcePath), _this.resolvers.loader)
117
- ], function(err, results) {
118
- if(err) return callback(err);
119
- loaders = results[0].concat(loaders).concat(results[1]);
120
- onDoneResolving();
121
- });
122
- } else {
123
- async.parallel([
124
- _this.resolveRequestArray.bind(_this, contextInfo, _this.context, noPostAutoLoaders ? [] : _this.postLoaders.match(resourcePath), _this.resolvers.loader),
125
- _this.resolveRequestArray.bind(_this, contextInfo, _this.context, _this.loaders.match(resourcePath), _this.resolvers.loader),
126
- _this.resolveRequestArray.bind(_this, contextInfo, _this.context, _this.preLoaders.match(resourcePath), _this.resolvers.loader)
127
- ], function(err, results) {
128
- if(err) return callback(err);
129
- loaders = results[0].concat(loaders).concat(results[1]).concat(results[2]);
130
- onDoneResolving();
131
- });
132
- }
134
+ var result = _this.ruleSet.exec({
135
+ resource: resourcePath,
136
+ issuer: contextInfo.issuer
137
+ });
138
+ var settings = {};
139
+ var useLoadersPost = [];
140
+ var useLoaders = [];
141
+ var useLoadersPre = [];
142
+ result.forEach(function(r) {
143
+ if(r.type === "use") {
144
+ if(r.enforce === "post" && !noPostAutoLoaders && !noPrePostAutoLoaders)
145
+ useLoadersPost.push(r.value);
146
+ else if(r.enforce === "pre" && !noPrePostAutoLoaders)
147
+ useLoadersPre.push(r.value);
148
+ else if(!r.enforce && !noAutoLoaders && !noPrePostAutoLoaders)
149
+ useLoaders.push(r.value);
150
+ } else {
151
+ settings[r.type] = r.value;
152
+ }
153
+ });
154
+ async.parallel([
155
+ _this.resolveRequestArray.bind(_this, contextInfo, _this.context, useLoadersPost, _this.resolvers.loader),
156
+ _this.resolveRequestArray.bind(_this, contextInfo, _this.context, useLoaders, _this.resolvers.loader),
157
+ _this.resolveRequestArray.bind(_this, contextInfo, _this.context, useLoadersPre, _this.resolvers.loader)
158
+ ], function(err, results) {
159
+ if(err) return callback(err);
160
+ loaders = results[0].concat(loaders).concat(results[1]).concat(results[2]);
161
+ onDoneResolving();
162
+ });
133
163
 
134
164
  function onDoneResolving() {
135
165
  callback(null, {
136
166
  context: context,
137
- request: loaders.concat([resource]).join("!"),
167
+ request: loaders.map(loaderToIdent).concat([resource]).join("!"),
138
168
  dependencies: data.dependencies,
139
169
  userRequest: userRequest,
140
170
  rawRequest: request,
141
171
  loaders: loaders,
142
172
  resource: resource,
143
- parser: _this.parser
173
+ parser: _this.getParser(settings.parser)
144
174
  });
145
175
  }
146
176
  });
@@ -182,8 +212,31 @@ NormalModuleFactory.prototype.create = function(data, callback) {
182
212
  NormalModuleFactory.prototype.resolveRequestArray = function resolveRequestArray(contextInfo, context, array, resolver, callback) {
183
213
  if(array.length === 0) return callback(null, []);
184
214
  async.map(array, function(item, callback) {
185
- if(item === "" || item[0] === "?")
186
- return callback(null, item);
187
- resolver.resolve(contextInfo, context, item, callback);
215
+ resolver.resolve(contextInfo, context, item.loader, function(err, result) {
216
+ if(err) return callback(err);
217
+ return callback(null, Object.assign({}, item, {
218
+ loader: result
219
+ }));
220
+ });
188
221
  }, callback);
189
222
  };
223
+
224
+ NormalModuleFactory.prototype.getParser = function getParser(parserOptions) {
225
+ var ident = "null"
226
+ if(parserOptions) {
227
+ if(parserOptions.ident)
228
+ ident = parserOptions.ident;
229
+ else
230
+ ident = JSON.stringify(parserOptions);
231
+ }
232
+ var parser = this.parserCache[ident];
233
+ if(parser)
234
+ return parser;
235
+ return this.parserCache[ident] = this.createParser(parserOptions);
236
+ };
237
+
238
+ NormalModuleFactory.prototype.createParser = function createParser(parserOptions) {
239
+ var parser = new Parser();
240
+ this.applyPlugins("parser", parser, parserOptions || {});
241
+ return parser;
242
+ };
package/lib/Parser.js CHANGED
@@ -817,7 +817,13 @@ Parser.prototype.walkCallExpression = function walkCallExpression(expression) {
817
817
  this.walkExpression(functionExpression.body);
818
818
  }.bind(this));
819
819
  }
820
- if(expression.callee.type === "MemberExpression" && expression.callee.object.type === "FunctionExpression" && !expression.callee.computed && ["call", "bind"].indexOf(expression.callee.property.name) >= 0 && expression.arguments && expression.arguments.length > 1) {
820
+ if(expression.callee.type === "MemberExpression" &&
821
+ expression.callee.object.type === "FunctionExpression" &&
822
+ !expression.callee.computed &&
823
+ (["call", "bind"]).indexOf(expression.callee.property.name) >= 0 &&
824
+ expression.arguments &&
825
+ expression.arguments.length > 1
826
+ ) {
821
827
  // (function(...) { }.call/bind(?, ...))
822
828
  walkIIFE.call(this, expression.callee.object, expression.arguments.slice(1));
823
829
  this.walkExpression(expression.arguments[0]);
@@ -1039,10 +1045,12 @@ var POSSIBLE_AST_OPTIONS = [{
1039
1045
  }]
1040
1046
 
1041
1047
  Parser.prototype.parse = function parse(source, initialState) {
1042
- var ast;
1048
+ var ast, comments = [];
1043
1049
  for(var i = 0; i < POSSIBLE_AST_OPTIONS.length; i++) {
1044
1050
  if(!ast) {
1045
1051
  try {
1052
+ comments.length = 0;
1053
+ POSSIBLE_AST_OPTIONS[i].onComment = comments;
1046
1054
  ast = acorn.parse(source, POSSIBLE_AST_OPTIONS[i]);
1047
1055
  } catch(e) {
1048
1056
  // ignore the error
@@ -1055,7 +1063,8 @@ Parser.prototype.parse = function parse(source, initialState) {
1055
1063
  ranges: true,
1056
1064
  locations: true,
1057
1065
  ecmaVersion: 6,
1058
- sourceType: "module"
1066
+ sourceType: "module",
1067
+ onComment: comments
1059
1068
  });
1060
1069
  }
1061
1070
  if(!ast || typeof ast !== "object")
@@ -1068,7 +1077,7 @@ Parser.prototype.parse = function parse(source, initialState) {
1068
1077
  renames: {}
1069
1078
  };
1070
1079
  var state = this.state = initialState || {};
1071
- if(this.applyPluginsBailResult("program", ast) === undefined)
1080
+ if(this.applyPluginsBailResult("program", ast, comments) === undefined)
1072
1081
  this.walkStatements(ast.body);
1073
1082
  this.scope = oldScope;
1074
1083
  this.state = oldState;
@@ -12,37 +12,40 @@ function ProvidePlugin(definitions) {
12
12
  }
13
13
  module.exports = ProvidePlugin;
14
14
  ProvidePlugin.prototype.apply = function(compiler) {
15
- compiler.plugin("compilation", function(compilation) {
15
+ var definitions = this.definitions;
16
+ compiler.plugin("compilation", function(compilation, params) {
16
17
  compilation.dependencyFactories.set(ConstDependency, new NullFactory());
17
18
  compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
18
- });
19
- Object.keys(this.definitions).forEach(function(name) {
20
- var request = this.definitions[name];
21
- var splittedName = name.split(".");
22
- if(splittedName.length > 0) {
23
- splittedName.slice(1).forEach(function(_, i) {
24
- var name = splittedName.slice(0, i + 1).join(".");
25
- compiler.parser.plugin("can-rename " + name, function() {
19
+ params.normalModuleFactory.plugin("parser", function(parser, parserOptions) {
20
+ Object.keys(definitions).forEach(function(name) {
21
+ var request = definitions[name];
22
+ var splittedName = name.split(".");
23
+ if(splittedName.length > 0) {
24
+ splittedName.slice(1).forEach(function(_, i) {
25
+ var name = splittedName.slice(0, i + 1).join(".");
26
+ parser.plugin("can-rename " + name, function() {
27
+ return true;
28
+ });
29
+ });
30
+ }
31
+ parser.plugin("expression " + name, function(expr) {
32
+ var nameIdentifier = name;
33
+ var scopedName = name.indexOf(".") >= 0;
34
+ if(scopedName) {
35
+ nameIdentifier = "__webpack_provided_" + name.replace(/\./g, "_dot_");
36
+ }
37
+ if(!ModuleParserHelpers.addParsedVariable(this, nameIdentifier, "require(" + JSON.stringify(request) + ")")) {
38
+ return false;
39
+ }
40
+ if(scopedName) {
41
+ nameIdentifier = "__webpack_provided_" + name.replace(/\./g, "_dot_");
42
+ var dep = new ConstDependency(nameIdentifier, expr.range);
43
+ dep.loc = expr.loc;
44
+ this.state.current.addDependency(dep);
45
+ }
26
46
  return true;
27
47
  });
28
48
  });
29
- }
30
- compiler.parser.plugin("expression " + name, function(expr) {
31
- var nameIdentifier = name;
32
- var scopedName = name.indexOf(".") >= 0;
33
- if(scopedName) {
34
- nameIdentifier = "__webpack_provided_" + name.replace(/\./g, "_dot_");
35
- }
36
- if(!ModuleParserHelpers.addParsedVariable(this, nameIdentifier, "require(" + JSON.stringify(request) + ")")) {
37
- return false;
38
- }
39
- if(scopedName) {
40
- nameIdentifier = "__webpack_provided_" + name.replace(/\./g, "_dot_");
41
- var dep = new ConstDependency(nameIdentifier, expr.range);
42
- dep.loc = expr.loc;
43
- this.state.current.addDependency(dep);
44
- }
45
- return true;
46
49
  });
47
- }, this);
50
+ });
48
51
  };
@@ -9,30 +9,36 @@ var NullFactory = require("./NullFactory");
9
9
  function RequireJsStuffPlugin() {}
10
10
  module.exports = RequireJsStuffPlugin;
11
11
  RequireJsStuffPlugin.prototype.apply = function(compiler) {
12
- compiler.plugin("compilation", function(compilation) {
12
+ compiler.plugin("compilation", function(compilation, params) {
13
13
  compilation.dependencyFactories.set(ConstDependency, new NullFactory());
14
14
  compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
15
- });
15
+ params.normalModuleFactory.plugin("parser", function(parser, parserOptions) {
16
16
 
17
- function remove(expr) {
18
- var dep = new ConstDependency(";", expr.range);
19
- dep.loc = expr.loc;
20
- this.state.current.addDependency(dep);
21
- return true;
22
- }
23
- compiler.parser.plugin("call require.config", remove);
24
- compiler.parser.plugin("call requirejs.config", remove);
17
+ if(typeof parserOptions.requireJs !== "undefined" && !parserOptions.requireJs)
18
+ return;
25
19
 
26
- compiler.parser.plugin("expression require.version", function(expr) {
27
- var dep = new ConstDependency(JSON.stringify("0.0.0"), expr.range);
28
- dep.loc = expr.loc;
29
- this.state.current.addDependency(dep);
30
- return true;
31
- });
32
- compiler.parser.plugin("expression requirejs.onError", function(expr) {
33
- var dep = new ConstDependency(JSON.stringify("__webpack_require__.oe"), expr.range);
34
- dep.loc = expr.loc;
35
- this.state.current.addDependency(dep);
36
- return true;
20
+ function remove(expr) {
21
+ var dep = new ConstDependency(";", expr.range);
22
+ dep.loc = expr.loc;
23
+ this.state.current.addDependency(dep);
24
+ return true;
25
+ }
26
+ parser.plugin("call require.config", remove);
27
+ parser.plugin("call requirejs.config", remove);
28
+
29
+ parser.plugin("expression require.version", function(expr) {
30
+ var dep = new ConstDependency(JSON.stringify("0.0.0"), expr.range);
31
+ dep.loc = expr.loc;
32
+ this.state.current.addDependency(dep);
33
+ return true;
34
+ });
35
+ parser.plugin("expression requirejs.onError", function(expr) {
36
+ var dep = new ConstDependency(JSON.stringify("__webpack_require__.oe"), expr.range);
37
+ dep.loc = expr.loc;
38
+ this.state.current.addDependency(dep);
39
+ return true;
40
+ });
41
+ });
37
42
  });
43
+
38
44
  };