Skip to content

Commit 86c0020

Browse files
timseTheLarkInn
authored andcommitted
Extract to parser helpers (webpack#3843)
* rename ModuleParserHelpers to ParserHelpers - rename module and file from ModuleParserHelpers to ParserHelpers - change imports and usages - rename addParsedVariable to addParsedVariableToModule to add module context again * introduce setTypeof helper to ParserHelpers * switch setTypeof in amdplugin - use ParsersHelpers instead * switch setTypeof in CommonJsPlugin - use ParsersHelpers instead * switch setTypeof in SystemPlugin - use ParsersHelpers instead * add ParserHelpers.expressionIsUnsupported method * use ParserHelpers.expressionIsUnsupported in SystemPlugin and NodeStuffPlugin * refactor setTypeOf to more atomic helper methods - reduces sideeffects as parser is called outside of helper - allows better reuse * use ParserHelper on more pieces in CommonJsPlugin making BasicEvaluatedExpression obsolete * switch new BasicEvaluatedExpression().setString(<somestring>).setRange(expr.range) in dependencies to ParserHelpers * switch other new BasicEvaluatedExpression().setString(<somestring>).setRange(expr.range) to ParserHelpers * rename wrongly named function - name anonymous functions
1 parent ef8c6fb commit 86c0020

14 files changed

+106
-125
lines changed

lib/APIPlugin.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"use strict";
66

77
const ConstDependency = require("./dependencies/ConstDependency");
8-
const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
8+
const ParserHelpers = require("./ParserHelpers");
99

1010
const NullFactory = require("./NullFactory");
1111

@@ -43,9 +43,8 @@ class APIPlugin {
4343
parser.state.current.addDependency(dep);
4444
return true;
4545
});
46-
parser.plugin(`evaluate typeof ${key}`, expr => {
47-
return new BasicEvaluatedExpression().setString(REPLACEMENT_TYPES[key]).setRange(expr.range);
48-
});
46+
47+
parser.plugin(`evaluate typeof ${key}`, ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key]));
4948
});
5049
IGNORES.forEach(key => {
5150
parser.plugin(key, () => true);

lib/DefinePlugin.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
const ConstDependency = require("./dependencies/ConstDependency");
88
const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
9+
const ParserHelpers = require("./ParserHelpers");
910
const NullFactory = require("./NullFactory");
1011

1112
class DefinePlugin {
@@ -101,7 +102,7 @@ class DefinePlugin {
101102
let code = stringifyObj(obj);
102103
parser.plugin("can-rename " + key, () => true);
103104
parser.plugin("evaluate Identifier " + key, (expr) => new BasicEvaluatedExpression().setRange(expr.range));
104-
parser.plugin("evaluate typeof " + key, expr => new BasicEvaluatedExpression().setString("object").setRange(expr.range));
105+
parser.plugin("evaluate typeof " + key, ParserHelpers.evaluateToString("object"));
105106
parser.plugin("expression " + key, (expr) => {
106107
let dep = new ConstDependency(code, expr.range);
107108
dep.loc = expr.loc;

lib/ExtendedAPIPlugin.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Tobias Koppers @sokra
44
*/
5+
"use strict";
56
var ConstDependency = require("./dependencies/ConstDependency");
6-
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
7+
const ParserHelpers = require("./ParserHelpers");
78

89
var NullFactory = require("./NullFactory");
910

@@ -39,9 +40,7 @@ ExtendedAPIPlugin.prototype.apply = function(compiler) {
3940
this.state.current.addDependency(dep);
4041
return true;
4142
});
42-
parser.plugin("evaluate typeof " + key, function(expr) {
43-
return new BasicEvaluatedExpression().setString(REPLACEMENT_TYPES[key]).setRange(expr.range);
44-
});
43+
parser.plugin("evaluate typeof " + key, ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key]));
4544
});
4645
});
4746
});

lib/HotModuleReplacementPlugin.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Tobias Koppers @sokra
44
*/
5+
"use strict";
56
var Template = require("./Template");
67
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
78
var ModuleHotAcceptDependency = require("./dependencies/ModuleHotAcceptDependency");
89
var ModuleHotDeclineDependency = require("./dependencies/ModuleHotDeclineDependency");
910
var RawSource = require("webpack-sources").RawSource;
1011
var ConstDependency = require("./dependencies/ConstDependency");
1112
var NullFactory = require("./NullFactory");
13+
const ParserHelpers = require("./ParserHelpers");
1214

1315
function HotModuleReplacementPlugin(options) {
1416
options = options || {};
@@ -201,9 +203,7 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
201203
this.state.current.addDependency(dep);
202204
return true;
203205
});
204-
parser.plugin("evaluate typeof __webpack_hash__", function(expr) {
205-
return new BasicEvaluatedExpression().setString("string").setRange(expr.range);
206-
});
206+
parser.plugin("evaluate typeof __webpack_hash__", ParserHelpers.evaluateToString("string"));
207207
parser.plugin("evaluate Identifier module.hot", function(expr) {
208208
return new BasicEvaluatedExpression()
209209
.setBoolean(!!this.state.compilation.hotUpdateChunkTemplate)

lib/ModuleParserHelpers.js

Lines changed: 0 additions & 21 deletions
This file was deleted.

lib/NodeStuffPlugin.js

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
Author Tobias Koppers @sokra
44
*/
55
var path = require("path");
6-
var ModuleParserHelpers = require("./ModuleParserHelpers");
6+
var ParserHelpers = require("./ParserHelpers");
77
var ConstDependency = require("./dependencies/ConstDependency");
88
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
9-
var UnsupportedFeatureWarning = require("./UnsupportedFeatureWarning");
109

1110
var NullFactory = require("./NullFactory");
1211

@@ -83,14 +82,10 @@ NodeStuffPlugin.prototype.apply = function(compiler) {
8382
this.state.current.addDependency(dep);
8483
return true;
8584
});
86-
parser.plugin("expression require.extensions", function(expr) {
87-
var dep = new ConstDependency("(void 0)", expr.range);
88-
dep.loc = expr.loc;
89-
this.state.current.addDependency(dep);
90-
if(!this.state.module) return;
91-
this.state.module.warnings.push(new UnsupportedFeatureWarning(this.state.module, "require.extensions is not supported by webpack. Use a loader instead."));
92-
return true;
93-
});
85+
parser.plugin(
86+
"expression require.extensions",
87+
ParserHelpers.expressionIsUnsupported("require.extensions is not supported by webpack. Use a loader instead.")
88+
);
9489
parser.plugin("expression module.loaded", function(expr) {
9590
var dep = new ConstDependency("module.l", expr.range);
9691
dep.loc = expr.loc;
@@ -115,7 +110,7 @@ NodeStuffPlugin.prototype.apply = function(compiler) {
115110
moduleJsPath = "./" + moduleJsPath.replace(/\\/g, "/");
116111
}
117112
}
118-
return ModuleParserHelpers.addParsedVariable(this, "module", "require(" + JSON.stringify(moduleJsPath) + ")(module)");
113+
return ParserHelpers.addParsedVariableToModule(this, "module", "require(" + JSON.stringify(moduleJsPath) + ")(module)");
119114
});
120115
});
121116
});

lib/ParserHelpers.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
"use strict";
6+
const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
7+
const ConstDependency = require("./dependencies/ConstDependency");
8+
const UnsupportedFeatureWarning = require("./UnsupportedFeatureWarning");
9+
10+
const ParserHelpers = exports;
11+
12+
ParserHelpers.addParsedVariableToModule = function(parser, name, expression) {
13+
if(!parser.state.current.addVariable) return false;
14+
var deps = [];
15+
parser.parse(expression, {
16+
current: {
17+
addDependency: function(dep) {
18+
dep.userRequest = name;
19+
deps.push(dep);
20+
}
21+
},
22+
module: parser.state.module
23+
});
24+
parser.state.current.addVariable(name, expression, deps);
25+
return true;
26+
};
27+
28+
ParserHelpers.toConstantDependency = function toConstantDependency(value) {
29+
return function constantDependency(expr) {
30+
var dep = new ConstDependency(JSON.stringify(value), expr.range);
31+
dep.loc = expr.loc;
32+
this.state.current.addDependency(dep);
33+
return true;
34+
};
35+
};
36+
37+
ParserHelpers.evaluateToString = function evaluateToString(value) {
38+
return function stringExpression(expr) {
39+
return new BasicEvaluatedExpression().setString(value).setRange(expr.range);
40+
};
41+
};
42+
43+
ParserHelpers.expressionIsUnsupported = function expressionIsUnsupported(message) {
44+
return function unsupportedExpression(expr) {
45+
var dep = new ConstDependency("(void 0)", expr.range);
46+
dep.loc = expr.loc;
47+
this.state.current.addDependency(dep);
48+
if(!this.state.module) return;
49+
this.state.module.warnings.push(new UnsupportedFeatureWarning(this.state.module, message));
50+
return true;
51+
};
52+
};

lib/ProvidePlugin.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Tobias Koppers @sokra
44
*/
5-
var ModuleParserHelpers = require("./ModuleParserHelpers");
5+
var ParserHelpers = require("./ParserHelpers");
66
var ConstDependency = require("./dependencies/ConstDependency");
77

88
var NullFactory = require("./NullFactory");
@@ -40,7 +40,7 @@ ProvidePlugin.prototype.apply = function(compiler) {
4040
return "[" + JSON.stringify(r) + "]";
4141
}).join("");
4242
}
43-
if(!ModuleParserHelpers.addParsedVariable(this, nameIdentifier, expression)) {
43+
if(!ParserHelpers.addParsedVariableToModule(this, nameIdentifier, expression)) {
4444
return false;
4545
}
4646
if(scopedName) {

lib/dependencies/AMDPlugin.js

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ var AMDRequireContextDependency = require("./AMDRequireContextDependency");
1010
var AMDDefineDependency = require("./AMDDefineDependency");
1111
var UnsupportedDependency = require("./UnsupportedDependency");
1212
var LocalModuleDependency = require("./LocalModuleDependency");
13-
var ConstDependency = require("./ConstDependency");
1413

1514
var NullFactory = require("../NullFactory");
1615

@@ -20,6 +19,7 @@ var AMDDefineDependencyParserPlugin = require("./AMDDefineDependencyParserPlugin
2019
var AliasPlugin = require("enhanced-resolve/lib/AliasPlugin");
2120

2221
var BasicEvaluatedExpression = require("../BasicEvaluatedExpression");
22+
var ParserHelpers = require("../ParserHelpers");
2323

2424
function AMDPlugin(options, amdOptions) {
2525
this.amdOptions = amdOptions;
@@ -60,18 +60,6 @@ AMDPlugin.prototype.apply = function(compiler) {
6060
if(typeof parserOptions.amd !== "undefined" && !parserOptions.amd)
6161
return;
6262

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-
7563
function setExpressionToModule(expr, module) {
7664
parser.plugin("expression " + expr, function(expr) {
7765
var dep = new AMDRequireItemDependency(module, expr.range);
@@ -92,19 +80,16 @@ AMDPlugin.prototype.apply = function(compiler) {
9280
parser.plugin("expression __webpack_amd_options__", function() {
9381
return this.state.current.addVariable("__webpack_amd_options__", JSON.stringify(amdOptions));
9482
});
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-
});
83+
parser.plugin("evaluate typeof define.amd", ParserHelpers.evaluateToString(typeof amdOptions));
84+
parser.plugin("evaluate typeof require.amd", ParserHelpers.evaluateToString(typeof amdOptions));
10185
parser.plugin("evaluate Identifier define.amd", function(expr) {
10286
return new BasicEvaluatedExpression().setBoolean(true).setRange(expr.range);
10387
});
10488
parser.plugin("evaluate Identifier require.amd", function(expr) {
10589
return new BasicEvaluatedExpression().setBoolean(true).setRange(expr.range);
10690
});
107-
setTypeof("define", "function");
91+
parser.plugin("typeof define", ParserHelpers.toConstantDependency("function"));
92+
parser.plugin("evaluate typeof define", ParserHelpers.evaluateToString("function"));
10893
parser.plugin("can-rename define", function() {
10994
return true;
11095
});
@@ -115,7 +100,8 @@ AMDPlugin.prototype.apply = function(compiler) {
115100
this.state.current.addDependency(dep);
116101
return false;
117102
});
118-
setTypeof("require", "function");
103+
parser.plugin("typeof require", ParserHelpers.toConstantDependency("function"));
104+
parser.plugin("evaluate typeof require", ParserHelpers.evaluateToString("function"));
119105
});
120106
});
121107
compiler.plugin("after-resolvers", function() {

lib/dependencies/CommonJsPlugin.js

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Tobias Koppers @sokra
44
*/
5+
"use strict";
56
var ConstDependency = require("./ConstDependency");
67
var CommonJsRequireDependency = require("./CommonJsRequireDependency");
78
var CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
@@ -15,7 +16,7 @@ var NullFactory = require("../NullFactory");
1516
var RequireResolveDependencyParserPlugin = require("./RequireResolveDependencyParserPlugin");
1617
var CommonJsRequireDependencyParserPlugin = require("./CommonJsRequireDependencyParserPlugin");
1718

18-
var BasicEvaluatedExpression = require("../BasicEvaluatedExpression");
19+
var ParserHelpers = require("../ParserHelpers");
1920

2021
function CommonJsPlugin(options) {
2122
this.options = options;
@@ -51,24 +52,13 @@ CommonJsPlugin.prototype.apply = function(compiler) {
5152
if(typeof parserOptions.commonjs !== "undefined" && !parserOptions.commonjs)
5253
return;
5354

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-
});
55+
const requireExpressions = ["require", "require.resolve", "require.resolveWeak"];
56+
for(const expression of requireExpressions) {
57+
parser.plugin(`typeof ${expression}`, ParserHelpers.toConstantDependency("function"));
58+
parser.plugin(`evaluate typeof ${expression}`, ParserHelpers.evaluateToString("function"));
6459
}
6560

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-
});
61+
parser.plugin("evaluate typeof module", ParserHelpers.evaluateToString("object"));
7262
parser.plugin("assign require", function(expr) {
7363
// to not leak to global "require", we need to define a local require here.
7464
var dep = new ConstDependency("var require;", 0);
@@ -90,9 +80,7 @@ CommonJsPlugin.prototype.apply = function(compiler) {
9080
parser.plugin("typeof module", function() {
9181
return true;
9282
});
93-
parser.plugin("evaluate typeof exports", function(expr) {
94-
return new BasicEvaluatedExpression().setString("object").setRange(expr.range);
95-
});
83+
parser.plugin("evaluate typeof exports", ParserHelpers.evaluateToString("object"));
9684
parser.apply(
9785
new CommonJsRequireDependencyParserPlugin(options),
9886
new RequireResolveDependencyParserPlugin(options)

0 commit comments

Comments
 (0)