Skip to content

Commit 27cc834

Browse files
committed
evaluate some identifiers to truthy values
fixes webpack#4596
1 parent d3a0fc9 commit 27cc834

9 files changed

Lines changed: 43 additions & 6 deletions

File tree

lib/BasicEvaluatedExpression.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ class BasicEvaluatedExpression {
5656
}
5757

5858
asBool() {
59-
if(this.isBoolean()) return this.bool;
59+
if(this.truthy) return true;
60+
else if(this.falsy) return false;
61+
else if(this.isBoolean()) return this.bool;
6062
else if(this.isNull()) return false;
6163
else if(this.isString()) return !!this.string;
6264
else if(this.isNumber()) return !!this.number;
@@ -163,6 +165,18 @@ class BasicEvaluatedExpression {
163165
return this;
164166
}
165167

168+
setTruthy() {
169+
this.falsy = false;
170+
this.truthy = true;
171+
return this;
172+
}
173+
174+
setFalsy() {
175+
this.falsy = true;
176+
this.truthy = false;
177+
return this;
178+
}
179+
166180
addOptions(options) {
167181
if(!this.options) this.options = [];
168182
options.forEach(item => {

lib/DefinePlugin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class DefinePlugin {
111111
function applyObjectDefine(key, obj) {
112112
const code = stringifyObj(obj);
113113
parser.plugin("can-rename " + key, ParserHelpers.approve);
114-
parser.plugin("evaluate Identifier " + key, (expr) => new BasicEvaluatedExpression().setRange(expr.range));
114+
parser.plugin("evaluate Identifier " + key, (expr) => new BasicEvaluatedExpression().setTruthy().setRange(expr.range));
115115
parser.plugin("evaluate typeof " + key, ParserHelpers.evaluateToString("object"));
116116
parser.plugin("expression " + key, ParserHelpers.toConstantDependency(code));
117117
parser.plugin("typeof " + key, ParserHelpers.toConstantDependency(JSON.stringify("object")));

lib/HotModuleReplacementPlugin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ HotModuleReplacementPlugin.prototype.apply = function(compiler) {
200200
parser.plugin("expression __webpack_hash__", ParserHelpers.toConstantDependency("__webpack_require__.h()"));
201201
parser.plugin("evaluate typeof __webpack_hash__", ParserHelpers.evaluateToString("string"));
202202
parser.plugin("evaluate Identifier module.hot", function(expr) {
203-
return ParserHelpers.evaluateToBoolean(!!this.state.compilation.hotUpdateChunkTemplate)(expr);
203+
return ParserHelpers.evaluateToIdentifier("module.hot", !!this.state.compilation.hotUpdateChunkTemplate)(expr);
204204
});
205205
parser.plugin("call module.hot.accept", function(expr) {
206206
if(!this.state.compilation.hotUpdateChunkTemplate) return false;

lib/NodeStuffPlugin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class NodeStuffPlugin {
7777
if(!isHarmony)
7878
return true;
7979
});
80-
parser.plugin("evaluate Identifier module.hot", ParserHelpers.evaluateToBoolean(false));
80+
parser.plugin("evaluate Identifier module.hot", ParserHelpers.evaluateToIdentifier("module.hot", false));
8181
parser.plugin("expression module", function() {
8282
const module = this.state.module;
8383
const isHarmony = module.meta && module.meta.harmonyModule;

lib/ParserHelpers.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ ParserHelpers.evaluateToBoolean = function(value) {
5656
};
5757
};
5858

59+
ParserHelpers.evaluateToIdentifier = function(identifier, truthy) {
60+
return function identifierExpression(expr) {
61+
let evex = new BasicEvaluatedExpression().setIdentifier(identifier).setRange(expr.range);
62+
if(truthy === true) evex = evex.setTruthy();
63+
else if(truthy === false) evex = evex.setFalsy();
64+
return evex;
65+
};
66+
};
67+
5968
ParserHelpers.expressionIsUnsupported = function(message) {
6069
return function unsupportedExpression(expr) {
6170
var dep = new ConstDependency("(void 0)", expr.range);

lib/dependencies/AMDPlugin.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ class AMDPlugin {
8282
parser.state.current.addVariable("__webpack_amd_options__", JSON.stringify(amdOptions)));
8383
parser.plugin("evaluate typeof define.amd", ParserHelpers.evaluateToString(typeof amdOptions));
8484
parser.plugin("evaluate typeof require.amd", ParserHelpers.evaluateToString(typeof amdOptions));
85-
parser.plugin("evaluate Identifier define.amd", ParserHelpers.evaluateToBoolean(true));
86-
parser.plugin("evaluate Identifier require.amd", ParserHelpers.evaluateToBoolean(true));
85+
parser.plugin("evaluate Identifier define.amd", ParserHelpers.evaluateToIdentifier("define.amd", true));
86+
parser.plugin("evaluate Identifier require.amd", ParserHelpers.evaluateToIdentifier("require.amd", true));
8787
parser.plugin("typeof define", ParserHelpers.toConstantDependency(JSON.stringify("function")));
8888
parser.plugin("evaluate typeof define", ParserHelpers.evaluateToString("function"));
8989
parser.plugin("can-rename define", ParserHelpers.approve);

lib/dependencies/CommonJsPlugin.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class CommonJsPlugin {
5656
for(let expression of requireExpressions) {
5757
parser.plugin(`typeof ${expression}`, ParserHelpers.toConstantDependency("function"));
5858
parser.plugin(`evaluate typeof ${expression}`, ParserHelpers.evaluateToString("function"));
59+
parser.plugin(`evaluate Identifier ${expression}`, ParserHelpers.evaluateToIdentifier(expression, true));
5960
}
6061

6162
parser.plugin("evaluate typeof module", ParserHelpers.evaluateToString("object"));
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
it("should evaluate require.resolve as truthy value", function() {
2+
var id;
3+
if(require.resolve)
4+
id = require.resolve("./module.js");
5+
6+
(typeof id).should.be.oneOf("number", "string");
7+
});
8+
9+
it("should evaluate require.resolve in ?: expression", function() {
10+
var id = require.resolve ? require.resolve("./module.js") : null;
11+
12+
(typeof id).should.be.oneOf("number", "string");
13+
});

test/cases/parsing/issue-4596/module.js

Whitespace-only changes.

0 commit comments

Comments
 (0)