Skip to content

Commit 3ddb26f

Browse files
committed
more reliable parsing of wrapped expressions
fixed webpack#801
1 parent 3d153ef commit 3ddb26f

File tree

5 files changed

+33
-11
lines changed

5 files changed

+33
-11
lines changed

lib/BasicEvaluatedExpression.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ BasicEvaluatedExpression.prototype.isIdentifier = function() {
3535
return Object.prototype.hasOwnProperty.call(this, "identifier");
3636
};
3737
BasicEvaluatedExpression.prototype.isWrapped = function() {
38-
return Object.prototype.hasOwnProperty.call(this, "prefix");
38+
return Object.prototype.hasOwnProperty.call(this, "prefix") || Object.prototype.hasOwnProperty.call(this, "postfix");
3939
};
4040
BasicEvaluatedExpression.prototype.asBool = function() {
4141
if(this.isBoolean()) return this.bool;

lib/Parser.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,14 @@ Parser.prototype.initializeEvaluating = function() {
6666
res.setString(left.string + right.string);
6767
} else if(right.isNumber()) {
6868
res.setString(left.string + right.number);
69-
} else if(right.isWrapped() && right.prefix.isString()) {
69+
} else if(right.isWrapped() && right.prefix && right.prefix.isString()) {
7070
res.setWrapped(
7171
new BasicEvaluatedExpression()
7272
.setString(left.string + right.prefix.string)
7373
.setRange(joinRanges(left.range, right.prefix.range)),
7474
right.postfix);
7575
} else {
76-
res.setWrapped(left, new BasicEvaluatedExpression().setString(""))
76+
res.setWrapped(left, null)
7777
}
7878
} else if(left.isNumber()) {
7979
if(right.isString()) {
@@ -82,13 +82,13 @@ Parser.prototype.initializeEvaluating = function() {
8282
res.setNumber(left.number + right.number);
8383
}
8484
} else if(left.isWrapped()) {
85-
if(left.postfix.isString() && right.isString()) {
85+
if(left.postfix && left.postfix.isString() && right.isString()) {
8686
res.setWrapped(left.prefix,
8787
new BasicEvaluatedExpression()
8888
.setString(left.postfix.string + right.string)
8989
.setRange(joinRanges(left.postfix.range, right.range))
9090
);
91-
} else if(left.postfix.isString() && right.isNumber()) {
91+
} else if(left.postfix && left.postfix.isString() && right.isNumber()) {
9292
res.setWrapped(left.prefix,
9393
new BasicEvaluatedExpression()
9494
.setString(left.postfix.string + right.number)
@@ -106,7 +106,7 @@ Parser.prototype.initializeEvaluating = function() {
106106
}
107107
} else {
108108
if(right.isString()) {
109-
res.setWrapped(new BasicEvaluatedExpression().setString(""), right);
109+
res.setWrapped(null, right);
110110
}
111111
}
112112
res.setRange(expr.range);

lib/dependencies/ContextDependencyHelpers.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
var ContextDependencyHelpers = exports;
66

77
ContextDependencyHelpers.create = function(Dep, range, param, expr, options) {
8-
if(param.isWrapped() && param.prefix.isString()) {
9-
var prefix = param.prefix.string;
10-
var postfix = param.postfix.isString() ? param.postfix.string : "";
11-
var prefixRange = param.prefix.range;
8+
if(param.isWrapped() && (param.prefix && param.prefix.isString() || param.postfix && param.postfix.isString())) {
9+
var prefix = param.prefix && param.prefix.isString() ? param.prefix.string : "";
10+
var postfix = param.postfix && param.postfix.isString() ? param.postfix.string : "";
11+
var prefixRange = param.prefix && param.prefix.isString() ? param.prefix.range : null;
1212
var valueRange = [prefixRange ? prefixRange[1] : param.range[0], param.range[1]];
1313
var idx = prefix.lastIndexOf("/");
1414
var context = ".";
@@ -22,7 +22,7 @@ ContextDependencyHelpers.create = function(Dep, range, param, expr, options) {
2222
postfix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$");
2323
var dep = new Dep(context, options.wrappedContextRecursive, regExp, range, valueRange);
2424
dep.loc = expr.loc;
25-
dep.prepend = prefix;
25+
dep.prepend = param.prefix && param.prefix.isString() ? prefix : null;
2626
dep.critical = options.wrappedContextCritical && "a part of the request of a dependency is an expression";
2727
return dep;
2828
} else {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = function(arg) {
2+
try {
3+
var a = require(arg + ".js");
4+
} catch(e) {}
5+
try {
6+
var b = require("" + arg + ".js");
7+
} catch(e) {}
8+
try {
9+
var c = require("./" + arg + ".js");
10+
} catch(e) {}
11+
try {
12+
var d = require("./" + arg);
13+
} catch(e) {}
14+
return {a: typeof a === "function", b: typeof b === "function", c: typeof c === "function", d: typeof d === "function"}
15+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
it("should emit valid code for dynamic require string with expr", function() {
2+
var test = require("./folder/file");
3+
test("file").should.be.eql({ a: false, b: false, c: true, d: true });
4+
test("file.js").should.be.eql({ a: false, b: false, c: false, d: true });
5+
test("./file").should.be.eql({ a: true, b: true, c: false, d: false });
6+
test("./file.js").should.be.eql({ a: false, b: false, c: false, d: false });
7+
});

0 commit comments

Comments
 (0)