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
@@ -0,0 +1,186 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Gajus Kuizinas @gajus
4
+ */
5
+ var webpackOptionsSchema = require("../schemas/webpackOptionsSchema.json");
6
+
7
+ function WebpackOptionsValidationError(validationErrors) {
8
+ Error.call(this);
9
+ Error.captureStackTrace(this, WebpackOptionsValidationError);
10
+ this.name = "WebpackOptionsValidationError";
11
+ this.message = "Invalid configuration object. " +
12
+ "Webpack has been initialised using a configuration object that does not match the API schema.\n" +
13
+ validationErrors.map(function(err) {
14
+ return " - " + indent(WebpackOptionsValidationError.formatValidationError(err), " ", false);
15
+ }).join("\n");
16
+ this.validationErrors = validationErrors;
17
+ }
18
+ module.exports = WebpackOptionsValidationError;
19
+
20
+ WebpackOptionsValidationError.prototype = Object.create(Error.prototype);
21
+ WebpackOptionsValidationError.prototype.constructor = WebpackOptionsValidationError;
22
+
23
+ WebpackOptionsValidationError.formatValidationError = function formatValidationError(err) {
24
+ var dataPath = "configuration" + err.dataPath;
25
+ switch(err.keyword) {
26
+ case "additionalProperties":
27
+ var baseMessage = dataPath + " has an unknown property '" + err.params.additionalProperty + "'. These properties are valid:\n" +
28
+ getSchemaPartText(err.parentSchema);
29
+ if(!err.dataPath) {
30
+ switch(err.params.additionalProperty) {
31
+ case "debug":
32
+ return baseMessage + "\n" +
33
+ "The 'debug' property was removed in webpack 2.\n" +
34
+ "Loaders should be updated to allow passing this option via loader options in module.rules.\n" +
35
+ "Until loaders are updated one can use the LoaderOptionsPlugin to switch loaders into debug mode:\n" +
36
+ "plugins: {\n" +
37
+ " new webpack.LoaderOptionsPlugin({\n" +
38
+ " debug: true\n" +
39
+ " })\n" +
40
+ "}";
41
+ }
42
+ return baseMessage + "\n" +
43
+ "For typos: please correct them.\n" +
44
+ "For loader options: webpack 2 no longer allows custom properties in configuration.\n" +
45
+ " Loaders should be updated to allow passing options via loader options in module.rules.\n" +
46
+ " Until loaders are updated one can use the LoaderOptionsPlugin to pass these options to the loader:\n" +
47
+ " plugins: {\n" +
48
+ " new webpack.LoaderOptionsPlugin({\n" +
49
+ " // test: /\\.xxx$/, // may apply this only for some modules\n" +
50
+ " options: {\n" +
51
+ " " + err.params.additionalProperty + ": ...\n" +
52
+ " }\n" +
53
+ " })\n" +
54
+ " }";
55
+ }
56
+ return baseMessage;
57
+ case "oneOf":
58
+ case "anyOf":
59
+ case "enum":
60
+ return dataPath + " should be one of these:\n" +
61
+ getSchemaPartText(err.parentSchema);
62
+ case "allOf":
63
+ return dataPath + " should be:\n" +
64
+ getSchemaPartText(err.parentSchema);
65
+ case "type":
66
+ switch(err.params.type) {
67
+ case "object":
68
+ return dataPath + " should be an object.";
69
+ case "string":
70
+ return dataPath + " should be a string.";
71
+ case "boolean":
72
+ return dataPath + " should be a boolean.";
73
+ case "number":
74
+ return dataPath + " should be a number.";
75
+ }
76
+ return dataPath + " should be " + err.params.type + ":\n" +
77
+ getSchemaPartText(err.parentSchema);
78
+ case "required":
79
+ var missingProperty = err.params.missingProperty.replace(/^\./, "");
80
+ return dataPath + " misses the property '" + missingProperty + "'.\n" +
81
+ getSchemaPartText(err.parentSchema, ["properties", missingProperty]);
82
+ case "minLength":
83
+ if(err.params.limit === 1)
84
+ return dataPath + " should not be empty.";
85
+ else
86
+ return dataPath + " " + err.message;
87
+ default:
88
+ return dataPath + " " + err.message + " (" + JSON.stringify(err, 0, 2) + ").\n" +
89
+ getSchemaPartText(err.parentSchema);
90
+ }
91
+ }
92
+
93
+ function getSchemaPart(path, parents, additionalPath) {
94
+ parents = parents || 0;
95
+ path = path.split("/");
96
+ path = path.slice(0, path.length - parents);
97
+ if(additionalPath) {
98
+ additionalPath = additionalPath.split("/");
99
+ path = path.concat(additionalPath);
100
+ }
101
+ var schemaPart = webpackOptionsSchema;
102
+ for(var i = 1; i < path.length; i++) {
103
+ var inner = schemaPart[path[i]];
104
+ if(inner)
105
+ schemaPart = inner;
106
+ }
107
+ return schemaPart;
108
+ }
109
+
110
+ function getSchemaPartText2(path, parents, additionalPath) {
111
+ var schemaPart = getSchemaPart(path, parents, additionalPath);
112
+ while(schemaPart.$ref) schemaPart = getSchemaPart(schemaPart.$ref);
113
+ var schemaText = WebpackOptionsValidationError.formatSchema(schemaPart);
114
+ if(schemaPart.description)
115
+ schemaText += "\n" + schemaPart.description;
116
+ return schemaText;
117
+ }
118
+
119
+ function getSchemaPartText(schemaPart, additionalPath) {
120
+ if(additionalPath) {
121
+ for(var i = 0; i < additionalPath.length; i++) {
122
+ var inner = schemaPart[additionalPath[i]];
123
+ if(inner)
124
+ schemaPart = inner;
125
+ }
126
+ }
127
+ while(schemaPart.$ref) schemaPart = getSchemaPart(schemaPart.$ref);
128
+ var schemaText = WebpackOptionsValidationError.formatSchema(schemaPart);
129
+ if(schemaPart.description)
130
+ schemaText += "\n" + schemaPart.description;
131
+ return schemaText;
132
+ }
133
+
134
+ function formatSchema(schema, prevSchemas) {
135
+ prevSchemas = prevSchemas || [];
136
+
137
+ function formatInnerSchema(innerSchema, addSelf) {
138
+ if(!addSelf) return formatSchema(innerSchema, prevSchemas);
139
+ if(prevSchemas.indexOf(innerSchema) >= 0) return "(recursive)";
140
+ return formatSchema(innerSchema, prevSchemas.concat(schema));
141
+ }
142
+ switch(schema.type) {
143
+ case "string":
144
+ return "string";
145
+ case "boolean":
146
+ return "boolean";
147
+ case "object":
148
+ if(schema.properties) {
149
+ var required = schema.required || [];
150
+ return "object { " + Object.keys(schema.properties).map(function(property) {
151
+ if(required.indexOf(property) < 0) return property + "?";
152
+ return property;
153
+ }).concat(schema.additionalProperties ? ["..."] : []).join(", ") + " }";
154
+ }
155
+ if(schema.additionalProperties) {
156
+ return "object { <key>: " + formatInnerSchema(schema.additionalProperties) + " }";
157
+ }
158
+ return "object";
159
+ case "array":
160
+ return "[" + formatInnerSchema(schema.items) + "]";
161
+ }
162
+ switch(schema.instanceof) {
163
+ case "Function":
164
+ return "function";
165
+ case "RegExp":
166
+ return "RegExp";
167
+ }
168
+ if(schema.$ref) return formatInnerSchema(getSchemaPart(schema.$ref), true);
169
+ if(schema.allOf) return schema.allOf.map(formatInnerSchema).join(" & ");
170
+ if(schema.oneOf) return schema.oneOf.map(formatInnerSchema).join(" | ");
171
+ if(schema.anyOf) return schema.anyOf.map(formatInnerSchema).join(" | ");
172
+ if(schema.enum) return schema.enum.map(function(item) {
173
+ return JSON.stringify(item);
174
+ }).join(" | ");
175
+ return JSON.stringify(schema, 0, 2);
176
+ }
177
+
178
+ function indent(str, prefix, firstLine) {
179
+ if(firstLine) {
180
+ return prefix + str.replace(/\n(?!$)/g, "\n" + prefix);
181
+ } else {
182
+ return str.replace(/\n(?!$)/g, "\n" + prefix);
183
+ }
184
+ }
185
+
186
+ WebpackOptionsValidationError.formatSchema = formatSchema;
@@ -28,27 +28,7 @@ function AMDPlugin(options, amdOptions) {
28
28
  module.exports = AMDPlugin;
29
29
 
30
30
  AMDPlugin.prototype.apply = function(compiler) {
31
- function setTypeof(expr, value) {
32
- compiler.parser.plugin("evaluate typeof " + expr, function(expr) {
33
- return new BasicEvaluatedExpression().setString(value).setRange(expr.range);
34
- });
35
- compiler.parser.plugin("typeof " + expr, function(expr) {
36
- var dep = new ConstDependency(JSON.stringify(value), expr.range);
37
- dep.loc = expr.loc;
38
- this.state.current.addDependency(dep);
39
- return true;
40
- });
41
- }
42
-
43
- function setExpressionToModule(expr, module) {
44
- compiler.parser.plugin("expression " + expr, function(expr) {
45
- var dep = new AMDRequireItemDependency(module, expr.range);
46
- dep.userRequest = expr;
47
- dep.loc = expr.loc;
48
- this.state.current.addDependency(dep);
49
- return true;
50
- });
51
- }
31
+ var options = this.options;
52
32
  var amdOptions = this.amdOptions;
53
33
  compiler.plugin("compilation", function(compilation, params) {
54
34
  var normalModuleFactory = params.normalModuleFactory;
@@ -74,41 +54,70 @@ AMDPlugin.prototype.apply = function(compiler) {
74
54
 
75
55
  compilation.dependencyFactories.set(LocalModuleDependency, new NullFactory());
76
56
  compilation.dependencyTemplates.set(LocalModuleDependency, new LocalModuleDependency.Template());
57
+
58
+ params.normalModuleFactory.plugin("parser", function(parser, parserOptions) {
59
+
60
+ if(typeof parserOptions.amd !== "undefined" && !parserOptions.amd)
61
+ return;
62
+
63
+ function setTypeof(expr, value) {
64
+ parser.plugin("evaluate typeof " + expr, function(expr) {
65
+ return new BasicEvaluatedExpression().setString(value).setRange(expr.range);
66
+ });
67
+ parser.plugin("typeof " + expr, function(expr) {
68
+ var dep = new ConstDependency(JSON.stringify(value), expr.range);
69
+ dep.loc = expr.loc;
70
+ this.state.current.addDependency(dep);
71
+ return true;
72
+ });
73
+ }
74
+
75
+ function setExpressionToModule(expr, module) {
76
+ parser.plugin("expression " + expr, function(expr) {
77
+ var dep = new AMDRequireItemDependency(module, expr.range);
78
+ dep.userRequest = expr;
79
+ dep.loc = expr.loc;
80
+ this.state.current.addDependency(dep);
81
+ return true;
82
+ });
83
+ }
84
+
85
+ parser.apply(
86
+ new AMDRequireDependenciesBlockParserPlugin(options),
87
+ new AMDDefineDependencyParserPlugin(options)
88
+ );
89
+ setExpressionToModule("require.amd", "!!webpack amd options");
90
+ setExpressionToModule("define.amd", "!!webpack amd options");
91
+ setExpressionToModule("define", "!!webpack amd define");
92
+ parser.plugin("expression __webpack_amd_options__", function() {
93
+ return this.state.current.addVariable("__webpack_amd_options__", JSON.stringify(amdOptions));
94
+ });
95
+ parser.plugin("evaluate typeof define.amd", function(expr) {
96
+ return new BasicEvaluatedExpression().setString(typeof amdOptions).setRange(expr.range);
97
+ });
98
+ parser.plugin("evaluate typeof require.amd", function(expr) {
99
+ return new BasicEvaluatedExpression().setString(typeof amdOptions).setRange(expr.range);
100
+ });
101
+ parser.plugin("evaluate Identifier define.amd", function(expr) {
102
+ return new BasicEvaluatedExpression().setBoolean(true).setRange(expr.range);
103
+ });
104
+ parser.plugin("evaluate Identifier require.amd", function(expr) {
105
+ return new BasicEvaluatedExpression().setBoolean(true).setRange(expr.range);
106
+ });
107
+ setTypeof("define", "function");
108
+ parser.plugin("can-rename define", function() {
109
+ return true;
110
+ });
111
+ parser.plugin("rename define", function(expr) {
112
+ var dep = new AMDRequireItemDependency("!!webpack amd define", expr.range);
113
+ dep.userRequest = "define";
114
+ dep.loc = expr.loc;
115
+ this.state.current.addDependency(dep);
116
+ return false;
117
+ });
118
+ setTypeof("require", "function");
119
+ });
77
120
  });
78
- compiler.parser.apply(
79
- new AMDRequireDependenciesBlockParserPlugin(this.options),
80
- new AMDDefineDependencyParserPlugin(this.options)
81
- );
82
- setExpressionToModule("require.amd", "!!webpack amd options");
83
- setExpressionToModule("define.amd", "!!webpack amd options");
84
- setExpressionToModule("define", "!!webpack amd define");
85
- compiler.parser.plugin("expression __webpack_amd_options__", function() {
86
- return this.state.current.addVariable("__webpack_amd_options__", JSON.stringify(amdOptions));
87
- });
88
- compiler.parser.plugin("evaluate typeof define.amd", function(expr) {
89
- return new BasicEvaluatedExpression().setString(typeof amdOptions).setRange(expr.range);
90
- });
91
- compiler.parser.plugin("evaluate typeof require.amd", function(expr) {
92
- return new BasicEvaluatedExpression().setString(typeof amdOptions).setRange(expr.range);
93
- });
94
- compiler.parser.plugin("evaluate Identifier define.amd", function(expr) {
95
- return new BasicEvaluatedExpression().setBoolean(true).setRange(expr.range);
96
- });
97
- compiler.parser.plugin("evaluate Identifier require.amd", function(expr) {
98
- return new BasicEvaluatedExpression().setBoolean(true).setRange(expr.range);
99
- });
100
- setTypeof("define", "function");
101
- compiler.parser.plugin("can-rename define", function() {
102
- return true;
103
- });
104
- compiler.parser.plugin("rename define", function(expr) {
105
- var dep = new AMDRequireItemDependency("!!webpack amd define", expr.range);
106
- dep.userRequest = "define";
107
- dep.loc = expr.loc;
108
- this.state.current.addDependency(dep);
109
- return false;
110
- });
111
- setTypeof("require", "function");
112
121
  compiler.resolvers.normal.apply(
113
122
  new AliasPlugin("described-resolve", {
114
123
  name: "amdefine",
@@ -23,17 +23,7 @@ function CommonJsPlugin(options) {
23
23
  module.exports = CommonJsPlugin;
24
24
 
25
25
  CommonJsPlugin.prototype.apply = function(compiler) {
26
- function setTypeof(expr, value) {
27
- compiler.parser.plugin("evaluate typeof " + expr, function(expr) {
28
- return new BasicEvaluatedExpression().setString(value).setRange(expr.range);
29
- });
30
- compiler.parser.plugin("typeof " + expr, function(expr) {
31
- var dep = new ConstDependency(JSON.stringify(value), expr.range);
32
- dep.loc = expr.loc;
33
- this.state.current.addDependency(dep);
34
- return true;
35
- });
36
- }
26
+ var options = this.options;
37
27
  compiler.plugin("compilation", function(compilation, params) {
38
28
  var normalModuleFactory = params.normalModuleFactory;
39
29
  var contextModuleFactory = params.contextModuleFactory;
@@ -55,39 +45,59 @@ CommonJsPlugin.prototype.apply = function(compiler) {
55
45
 
56
46
  compilation.dependencyFactories.set(RequireHeaderDependency, new NullFactory());
57
47
  compilation.dependencyTemplates.set(RequireHeaderDependency, new RequireHeaderDependency.Template());
48
+
49
+ params.normalModuleFactory.plugin("parser", function(parser, parserOptions) {
50
+
51
+ if(typeof parserOptions.commonjs !== "undefined" && !parserOptions.commonjs)
52
+ return;
53
+
54
+ function setTypeof(expr, value) {
55
+ parser.plugin("evaluate typeof " + expr, function(expr) {
56
+ return new BasicEvaluatedExpression().setString(value).setRange(expr.range);
57
+ });
58
+ parser.plugin("typeof " + expr, function(expr) {
59
+ var dep = new ConstDependency(JSON.stringify(value), expr.range);
60
+ dep.loc = expr.loc;
61
+ this.state.current.addDependency(dep);
62
+ return true;
63
+ });
64
+ }
65
+
66
+ setTypeof("require", "function");
67
+ setTypeof("require.resolve", "function");
68
+ setTypeof("require.resolveWeak", "function");
69
+ parser.plugin("evaluate typeof module", function(expr) {
70
+ return new BasicEvaluatedExpression().setString("object").setRange(expr.range);
71
+ });
72
+ parser.plugin("assign require", function(expr) {
73
+ // to not leak to global "require", we need to define a local require here.
74
+ var dep = new ConstDependency("var require;", 0);
75
+ dep.loc = expr.loc;
76
+ this.state.current.addDependency(dep);
77
+ this.scope.definitions.push("require");
78
+ return true;
79
+ });
80
+ parser.plugin("can-rename require", function() {
81
+ return true;
82
+ });
83
+ parser.plugin("rename require", function(expr) {
84
+ // define the require variable. It's still undefined, but not "not defined".
85
+ var dep = new ConstDependency("var require;", 0);
86
+ dep.loc = expr.loc;
87
+ this.state.current.addDependency(dep);
88
+ return false;
89
+ });
90
+ parser.plugin("typeof module", function() {
91
+ return true;
92
+ });
93
+ parser.plugin("evaluate typeof exports", function(expr) {
94
+ return new BasicEvaluatedExpression().setString("object").setRange(expr.range);
95
+ });
96
+ parser.apply(
97
+ new CommonJsRequireDependencyParserPlugin(options),
98
+ new RequireResolveDependencyParserPlugin(options)
99
+ );
100
+ });
58
101
  });
59
- setTypeof("require", "function");
60
- setTypeof("require.resolve", "function");
61
- setTypeof("require.resolveWeak", "function");
62
- compiler.parser.plugin("evaluate typeof module", function(expr) {
63
- return new BasicEvaluatedExpression().setString("object").setRange(expr.range);
64
- });
65
- compiler.parser.plugin("assign require", function(expr) {
66
- // to not leak to global "require", we need to define a local require here.
67
- var dep = new ConstDependency("var require;", 0);
68
- dep.loc = expr.loc;
69
- this.state.current.addDependency(dep);
70
- this.scope.definitions.push("require");
71
- return true;
72
- });
73
- compiler.parser.plugin("can-rename require", function() {
74
- return true;
75
- });
76
- compiler.parser.plugin("rename require", function(expr) {
77
- // define the require variable. It's still undefined, but not "not defined".
78
- var dep = new ConstDependency("var require;", 0);
79
- dep.loc = expr.loc;
80
- this.state.current.addDependency(dep);
81
- return false;
82
- });
83
- compiler.parser.plugin("typeof module", function() {
84
- return true;
85
- });
86
- compiler.parser.plugin("evaluate typeof exports", function(expr) {
87
- return new BasicEvaluatedExpression().setString("object").setRange(expr.range);
88
- });
89
- compiler.parser.apply(
90
- new CommonJsRequireDependencyParserPlugin(this.options),
91
- new RequireResolveDependencyParserPlugin(this.options)
92
- );
102
+
93
103
  };
@@ -16,6 +16,12 @@ HarmonyExportExpressionDependency.prototype = Object.create(NullDependency.proto
16
16
  HarmonyExportExpressionDependency.prototype.constructor = HarmonyExportExpressionDependency;
17
17
  HarmonyExportExpressionDependency.prototype.type = "harmony export expression";
18
18
 
19
+ HarmonyExportExpressionDependency.prototype.getExports = function() {
20
+ return {
21
+ exports: ["default"]
22
+ };
23
+ };
24
+
19
25
  HarmonyExportExpressionDependency.prototype.describeHarmonyExport = function() {
20
26
  return {
21
27
  exportedName: "default",
@@ -31,10 +31,26 @@ HarmonyExportImportedSpecifierDependency.prototype.getReference = function() {
31
31
  if(Array.isArray(this.originModule.usedExports)) {
32
32
  // reexport * with known used exports
33
33
  var activeExports = HarmonyModulesHelpers.getActiveExports(this.originModule);
34
+ if(Array.isArray(m.providedExports)) {
35
+ return {
36
+ module: m,
37
+ importedNames: this.originModule.usedExports.filter(function(id) {
38
+ return activeExports.indexOf(id) < 0 && m.providedExports.indexOf(id) >= 0 && id !== "default";
39
+ }, this)
40
+ }
41
+ } else {
42
+ return {
43
+ module: m,
44
+ importedNames: this.originModule.usedExports.filter(function(id) {
45
+ return activeExports.indexOf(id) < 0 && id !== "default";
46
+ }, this)
47
+ }
48
+ }
49
+ } else if(Array.isArray(m.providedExports)) {
34
50
  return {
35
51
  module: m,
36
- importedNames: this.originModule.usedExports.filter(function(id) {
37
- return activeExports.indexOf(id) < 0;
52
+ importedNames: m.providedExports.filter(function(id) {
53
+ return id !== "default"
38
54
  })
39
55
  }
40
56
  } else {
@@ -61,6 +77,36 @@ HarmonyExportImportedSpecifierDependency.prototype.getReference = function() {
61
77
  }
62
78
  };
63
79
 
80
+ HarmonyExportImportedSpecifierDependency.prototype.getExports = function() {
81
+ if(this.name) {
82
+ return {
83
+ exports: [this.name]
84
+ }
85
+ };
86
+ if(this.importDependency.module && Array.isArray(this.importDependency.module.providedExports)) {
87
+ return {
88
+ exports: this.importDependency.module.providedExports.filter(function(id) {
89
+ return id !== "default"
90
+ }),
91
+ dependencies: [this.importDependency.module]
92
+ };
93
+ }
94
+ if(this.importDependency.module && this.importDependency.module.providedExports) {
95
+ return {
96
+ exports: true
97
+ };
98
+ }
99
+ if(this.importDependency.module) {
100
+ return {
101
+ exports: null,
102
+ dependencies: [this.importDependency.module]
103
+ };
104
+ }
105
+ return {
106
+ exports: null
107
+ }
108
+ };
109
+
64
110
  HarmonyExportImportedSpecifierDependency.prototype.describeHarmonyExport = function() {
65
111
  return {
66
112
  exportedName: this.name,
@@ -71,7 +117,7 @@ HarmonyExportImportedSpecifierDependency.prototype.describeHarmonyExport = funct
71
117
  HarmonyExportImportedSpecifierDependency.prototype.updateHash = function(hash) {
72
118
  NullDependency.prototype.updateHash.call(this, hash);
73
119
  var importedModule = this.importDependency.module;
74
- hash.update((importedModule && (importedModule.used + JSON.stringify(importedModule.usedExports))) + "");
120
+ hash.update((importedModule && (importedModule.used + JSON.stringify(importedModule.usedExports) + JSON.stringify(importedModule.providedExports))) + "");
75
121
  };
76
122
 
77
123
  HarmonyExportImportedSpecifierDependency.Template = function HarmonyExportImportedSpecifierDependencyTemplate() {};
@@ -83,43 +129,57 @@ HarmonyExportImportedSpecifierDependency.Template.prototype.apply = function(dep
83
129
  var active = HarmonyModulesHelpers.isActive(dep.originModule, dep);
84
130
  var content;
85
131
  var activeExports;
132
+ var items;
133
+ var importIsHarmony = importedModule && (!importedModule.meta || importedModule.meta.harmonyModule);
86
134
 
87
135
  function getReexportStatement(key, valueKey) {
88
136
  return(importIsHarmony || !valueKey ? "" : "if(__webpack_require__.o(" + name + ", " + valueKey + ")) ") +
89
137
  "__webpack_require__.d(exports, " + key + ", " +
90
- "function() { return " + name + (valueKey === null ? "_default.a" : valueKey && "[" + valueKey + "]") + "; });"
138
+ "function() { return " + name + (valueKey === null ? "_default.a" : valueKey && "[" + valueKey + "]") + "; });\n"
91
139
  }
92
140
  if(!used) { // we want to rexport something, but the export isn't used
93
141
  content = "/* unused harmony reexport " + dep.name + " */\n";
94
142
  } else if(!active) { // we want to reexport something but another exports overrides this one
95
143
  content = "/* inactive harmony reexport " + (dep.name || "namespace") + " */\n";
96
144
  } else if(dep.name && dep.id === "default" && !(importedModule && (!importedModule.meta || importedModule.meta.harmonyModule))) { // we want to reexport the default export from a non-hamory module
97
- content = "/* harmony reexport */ " + getReexportStatement(JSON.stringify(used), null) + "\n";
145
+ content = "/* harmony reexport (default from non-hamory) */ " + getReexportStatement(JSON.stringify(used), null);
98
146
  } else if(dep.name && dep.id) { // we want to reexport a key as new key
99
147
  var idUsed = importedModule && importedModule.isUsed(dep.id);
100
- content = "/* harmony reexport */ " + getReexportStatement(JSON.stringify(used), JSON.stringify(idUsed)) + "\n";
148
+ content = "/* harmony reexport (binding) */ " + getReexportStatement(JSON.stringify(used), JSON.stringify(idUsed));
101
149
  } else if(dep.name) { // we want to reexport the module object as named export
102
- content = "/* harmony reexport */ " + getReexportStatement(JSON.stringify(used), "") + "\n";
150
+ content = "/* harmony reexport (module object) */ " + getReexportStatement(JSON.stringify(used), "");
103
151
  } else if(Array.isArray(dep.originModule.usedExports)) { // we know which exports are used
104
152
  activeExports = HarmonyModulesHelpers.getActiveExports(dep.originModule);
105
- var importIsHarmony = importedModule && (!importedModule.meta || importedModule.meta.harmonyModule);
106
- var importActiveExports = importedModule && HarmonyModulesHelpers.getActiveExports(importedModule);
107
- var items = dep.originModule.usedExports.map(function(id) {
153
+ items = dep.originModule.usedExports.map(function(id) {
108
154
  if(id === "default") return;
109
155
  if(activeExports.indexOf(id) >= 0) return;
110
- if(importIsHarmony && !HarmonyModulesHelpers.isExportedByHarmony(importedModule, id)) return;
156
+ if(importedModule.isProvided(id) === false) return;
111
157
  var exportUsed = dep.originModule.isUsed(id);
112
158
  var idUsed = importedModule && importedModule.isUsed(id);
113
159
  return [exportUsed, idUsed];
114
160
  }).filter(Boolean);
115
161
  if(items.length > 0) {
116
- content = "/* harmony namespace reexport */ " + items.map(function(item) {
117
- return getReexportStatement(JSON.stringify(item[0]), JSON.stringify(item[1]));
118
- }).join(" ") + "\n";
162
+ content = items.map(function(item) {
163
+ return "/* harmony namespace reexport (by used) */ " + getReexportStatement(JSON.stringify(item[0]), JSON.stringify(item[1]));
164
+ }).join("");
119
165
  } else content = "/* unused harmony namespace reexport */\n";
120
- } else if(dep.originModule.usedExports) { // not sure which exports are used
166
+ } else if(dep.originModule.usedExports && importedModule && Array.isArray(importedModule.providedExports)) { // not sure which exports are used, but we know which are provided
167
+ activeExports = HarmonyModulesHelpers.getActiveExports(dep.originModule);
168
+ items = importedModule.providedExports.map(function(id) {
169
+ if(id === "default") return;
170
+ if(activeExports.indexOf(id) >= 0) return;
171
+ var exportUsed = dep.originModule.isUsed(id);
172
+ var idUsed = importedModule && importedModule.isUsed(id);
173
+ return [exportUsed, idUsed];
174
+ }).filter(Boolean);
175
+ if(items.length > 0) {
176
+ content = items.map(function(item) {
177
+ return "/* harmony namespace reexport (by provided) */ " + getReexportStatement(JSON.stringify(item[0]), JSON.stringify(item[1]));
178
+ }).join("");
179
+ } else content = "/* empty harmony namespace reexport */\n";
180
+ } else if(dep.originModule.usedExports) { // not sure which exports are used and provided
121
181
  activeExports = HarmonyModulesHelpers.getActiveExports(dep.originModule);
122
- content = "/* harmony namespace reexport */ for(var __WEBPACK_IMPORT_KEY__ in " + name + ") ";
182
+ content = "/* harmony namespace reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in " + name + ") ";
123
183
 
124
184
  // Filter out exports which are defined by other exports
125
185
  // and filter out default export because it cannot be reexported with *
@@ -19,6 +19,12 @@ HarmonyExportSpecifierDependency.prototype = Object.create(NullDependency.protot
19
19
  HarmonyExportSpecifierDependency.prototype.constructor = HarmonyExportSpecifierDependency;
20
20
  HarmonyExportSpecifierDependency.prototype.type = "harmony export specifier";
21
21
 
22
+ HarmonyExportSpecifierDependency.prototype.getExports = function() {
23
+ return {
24
+ exports: [this.name]
25
+ }
26
+ };
27
+
22
28
  HarmonyExportSpecifierDependency.prototype.describeHarmonyExport = function() {
23
29
  return {
24
30
  exportedName: this.name,
@@ -33,14 +39,16 @@ HarmonyExportSpecifierDependency.Template.prototype.apply = function(dep, source
33
39
  var active = HarmonyModulesHelpers.isActive(dep.originModule, dep);
34
40
  var content;
35
41
  if(!used) {
36
- content = "/* unused harmony export " + (dep.name || "namespace") + " */";
42
+ content = "/* unused harmony export " + (dep.name || "namespace") + " */\n";
37
43
  } else if(!active) {
38
- content = "/* inactive harmony export " + (dep.name || "namespace") + " */";
44
+ content = "/* inactive harmony export " + (dep.name || "namespace") + " */\n";
39
45
  } else if(dep.immutable) {
40
- content = "/* harmony export */ exports[" + JSON.stringify(used) + "] = " + dep.id + ";";
46
+ content = "/* harmony export (immutable) */ exports[" + JSON.stringify(used) + "] = " + dep.id + ";\n";
41
47
  } else {
42
- content = "\n/* harmony export */ __webpack_require__.d(exports, " + JSON.stringify(used) + ", function() { return " + dep.id + "; });";
48
+ content = "/* harmony export (binding) */ __webpack_require__.d(exports, " + JSON.stringify(used) + ", function() { return " + dep.id + "; });\n";
43
49
  }
50
+ if(dep.position > 0)
51
+ content = "\n" + content;
44
52
  source.insert(dep.position, content);
45
53
 
46
54
  };
@@ -30,11 +30,13 @@ HarmonyImportSpecifierDependency.prototype.getReference = function() {
30
30
  HarmonyImportSpecifierDependency.prototype.getWarnings = function() {
31
31
  var importedModule = this.importDependency.module;
32
32
  if(importedModule && importedModule.meta && importedModule.meta.harmonyModule) {
33
- if(this.id && !HarmonyModulesHelpers.isExportedByHarmony(importedModule, this.id)) {
33
+ if(this.id && importedModule.isProvided(this.id) === false) {
34
+ var err = new Error("export '" + this.id + "'" +
35
+ (this.id !== this.name ? " (imported as '" + this.name + "')" : "") +
36
+ " was not found in '" + this.importDependency.userRequest + "'");
37
+ err.hideStack = true;
34
38
  return [
35
- new Error("export '" + this.id + "'" +
36
- (this.id !== this.name ? " (imported as '" + this.name + "')" : "") +
37
- " was not found in '" + this.importDependency.userRequest + "'")
39
+ err
38
40
  ];
39
41
  }
40
42
  }
@@ -68,32 +68,3 @@ HarmonyModulesHelpers.getActiveExports = function(module) {
68
68
  return arr;
69
69
  }, [])
70
70
  };
71
-
72
- HarmonyModulesHelpers.hasStarExport = function(module) {
73
- if(typeof module.hasStarExport === "boolean")
74
- return module.hasStarExport;
75
- return module.dependencies.some(function(dep) {
76
- if(!dep.describeHarmonyExport) return false;
77
- var d = dep.describeHarmonyExport();
78
- if(!d) return false;
79
- var name = d.exportedName;
80
- return !name;
81
- }, [])
82
- };
83
-
84
- HarmonyModulesHelpers.isExportedByHarmony = function(module, exportedName) {
85
- if(module.hasStarExport)
86
- return exportedName !== "default";
87
- if(module.activeExports && module.activeExports.indexOf(exportedName) >= 0)
88
- return true;
89
- if(module.activeExports && typeof module.hasStarExport === "boolean")
90
- return false;
91
- return module.dependencies.some(function(dep) {
92
- if(!dep.describeHarmonyExport) return false;
93
- var d = dep.describeHarmonyExport();
94
- if(!d) return false;
95
- var name = d.exportedName;
96
- if(!name) return exportedName !== "default"; // namespace export
97
- return name === exportedName; // direct export
98
- }, [])
99
- };