Skip to content

Commit

Permalink
Merge pull request #8338 from webpack/bugfix/issue-8293
Browse files Browse the repository at this point in the history
Bugfix for #8293
  • Loading branch information
sokra committed Nov 5, 2018
2 parents af123a8 + babe736 commit e2a2016
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 20 deletions.
4 changes: 3 additions & 1 deletion lib/BasicEvaluatedExpression.js
Expand Up @@ -35,6 +35,7 @@ class BasicEvaluatedExpression {
this.options = null;
this.prefix = null;
this.postfix = null;
this.wrappedInnerExpressions = null;
this.expression = null;
}

Expand Down Expand Up @@ -176,10 +177,11 @@ class BasicEvaluatedExpression {
return this;
}

setWrapped(prefix, postfix) {
setWrapped(prefix, postfix, innerExpressions) {
this.type = TypeWrapped;
this.prefix = prefix;
this.postfix = postfix;
this.wrappedInnerExpressions = innerExpressions;
return this;
}

Expand Down
80 changes: 66 additions & 14 deletions lib/Parser.js
Expand Up @@ -216,62 +216,114 @@ class Parser extends Tapable {
right.prefix &&
right.prefix.isString()
) {
// "left" + ("prefix" + inner + "postfix")
// => ("leftprefix" + inner + "postfix")
res.setWrapped(
new BasicEvaluatedExpression()
.setString(left.string + right.prefix.string)
.setRange(joinRanges(left.range, right.prefix.range)),
right.postfix
right.postfix,
right.wrappedInnerExpressions
);
} else if (right.isWrapped()) {
res.setWrapped(
new BasicEvaluatedExpression()
.setString(left.string)
.setRange(left.range),
right.postfix
);
// "left" + ([null] + inner + "postfix")
// => ("left" + inner + "postfix")
res.setWrapped(left, right.postfix, right.wrappedInnerExpressions);
} else {
res.setWrapped(left, null);
// "left" + expr
// => ("left" + expr + "")
res.setWrapped(left, null, [right]);
}
} else if (left.isNumber()) {
if (right.isString()) {
res.setString(left.number + right.string);
} else if (right.isNumber()) {
res.setNumber(left.number + right.number);
} else {
return;
}
} else if (left.isWrapped()) {
if (left.postfix && left.postfix.isString() && right.isString()) {
// ("prefix" + inner + "postfix") + "right"
// => ("prefix" + inner + "postfixright")
res.setWrapped(
left.prefix,
new BasicEvaluatedExpression()
.setString(left.postfix.string + right.string)
.setRange(joinRanges(left.postfix.range, right.range))
.setRange(joinRanges(left.postfix.range, right.range)),
left.wrappedInnerExpressions
);
} else if (
left.postfix &&
left.postfix.isString() &&
right.isNumber()
) {
// ("prefix" + inner + "postfix") + 123
// => ("prefix" + inner + "postfix123")
res.setWrapped(
left.prefix,
new BasicEvaluatedExpression()
.setString(left.postfix.string + right.number)
.setRange(joinRanges(left.postfix.range, right.range))
.setRange(joinRanges(left.postfix.range, right.range)),
left.wrappedInnerExpressions
);
} else if (right.isString()) {
res.setWrapped(left.prefix, right);
// ("prefix" + inner + [null]) + "right"
// => ("prefix" + inner + "right")
res.setWrapped(left.prefix, right, left.wrappedInnerExpressions);
} else if (right.isNumber()) {
// ("prefix" + inner + [null]) + 123
// => ("prefix" + inner + "123")
res.setWrapped(
left.prefix,
new BasicEvaluatedExpression()
.setString(right.number + "")
.setRange(right.range)
.setRange(right.range),
left.wrappedInnerExpressions
);
} else if (right.isWrapped()) {
// ("prefix1" + inner1 + "postfix1") + ("prefix2" + inner2 + "postfix2")
// ("prefix1" + inner1 + "postfix1" + "prefix2" + inner2 + "postfix2")
res.setWrapped(
left.prefix,
right.postfix,
left.wrappedInnerExpressions &&
right.wrappedInnerExpressions &&
left.wrappedInnerExpressions
.concat(left.postfix ? [left.postfix] : [])
.concat(right.prefix ? [right.prefix] : [])
.concat(right.wrappedInnerExpressions)
);
} else {
res.setWrapped(left.prefix, new BasicEvaluatedExpression());
// ("prefix" + inner + postfix) + expr
// => ("prefix" + inner + postfix + expr + [null])
res.setWrapped(
left.prefix,
null,
left.wrappedInnerExpressions &&
left.wrappedInnerExpressions.concat(
left.postfix ? [left.postfix, right] : [right]
)
);
}
} else {
if (right.isString()) {
res.setWrapped(null, right);
// left + "right"
// => ([null] + left + "right")
res.setWrapped(null, right, [left]);
} else if (right.isWrapped()) {
// left + (prefix + inner + "postfix")
// => ([null] + left + prefix + inner + "postfix")
res.setWrapped(
null,
right.postfix,
right.wrappedInnerExpressions &&
(right.prefix ? [left, right.prefix] : [left]).concat(
right.wrappedInnerExpressions
)
);
} else {
return;
}
}
res.setRange(expr.range);
Expand Down
11 changes: 9 additions & 2 deletions lib/dependencies/ContextDependencyHelpers.js
Expand Up @@ -180,13 +180,13 @@ ContextDependencyHelpers.create = (
);
dep.loc = expr.loc;
const replaces = [];
if (prefixRange && prefix !== prefixRaw) {
if (prefixRange) {
replaces.push({
range: prefixRange,
value: JSON.stringify(prefix)
});
}
if (postfixRange && postfix !== postfixRaw) {
if (postfixRange) {
replaces.push({
range: postfixRange,
value: JSON.stringify(postfix)
Expand All @@ -196,6 +196,13 @@ ContextDependencyHelpers.create = (
dep.critical =
options.wrappedContextCritical &&
"a part of the request of a dependency is an expression";

if (parser && param.wrappedInnerExpressions) {
for (const part of param.wrappedInnerExpressions) {
if (part.expression) parser.walkExpression(part.expression);
}
}

return dep;
} else {
const dep = new Dep(
Expand Down
File renamed without changes.
18 changes: 16 additions & 2 deletions test/configCases/plugins/define-plugin/index.js
Expand Up @@ -2,8 +2,8 @@
it("should define FALSE", function() {
expect(FALSE).toBe(false);
expect((typeof TRUE)).toBe("boolean");
var x = require(FALSE ? "fail" : "./a");
var y = FALSE ? require("fail") : require("./a");
var x = require(FALSE ? "fail" : "./dir/a");
var y = FALSE ? require("fail") : require("./dir/a");
});

it("should define CODE", function() {
Expand Down Expand Up @@ -118,3 +118,17 @@ it("should follow renamings in var (issue 5215)", function() {
it("should check that runtimeValue callback argument is a module", function() {
expect(RUNTIMEVALUE_CALLBACK_ARGUMENT_IS_A_MODULE).toEqual(true);
});

it("should expand properly", function() {
const a = require("./dir/a");
var tmp = '';
expect(require('./dir/' + A_DOT_J + tmp + 's')).toBe(a);
expect(require('./dir/' + tmp + A_DOT_J + 's')).toBe(a);
expect(require('./dir/' + tmp + A_DOT_J + tmp + 's')).toBe(a);
expect(require('./dir/' + tmp + A_DOT_J + (tmp + 's'))).toBe(a);
expect(require('./dir/' + tmp + (A_DOT_J + tmp + 's'))).toBe(a);
expect(require('./dir/' + tmp + (A_DOT_J + tmp) + 's')).toBe(a);
expect(require('./dir/' + (tmp + A_DOT_J + tmp + 's'))).toBe(a);
expect(require('./dir/' + (tmp + A_DOT_J + tmp) + 's')).toBe(a);
expect(require('./dir/' + (tmp + A_DOT_J) + tmp + 's')).toBe(a);
});
3 changes: 2 additions & 1 deletion test/configCases/plugins/define-plugin/webpack.config.js
Expand Up @@ -32,7 +32,8 @@ module.exports = {
function({ module }) {
return module instanceof Module;
}
)
),
A_DOT_J: '"a.j"'
})
]
};

0 comments on commit e2a2016

Please sign in to comment.