Skip to content

Commit f4adee3

Browse files
authored
Merge pull request webpack#3360 from webpack/bugfix/loader-options-remaining-request
fixes a bug in which complex options are not passed through chain
2 parents 3e86907 + 5f9dd3c commit f4adee3

7 files changed

Lines changed: 63 additions & 7 deletions

File tree

lib/NormalModuleFactory.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,17 @@ function NormalModuleFactory(context, resolvers, options) {
118118
var loaders = results[0];
119119
resource = results[1];
120120

121+
// translate option idents
122+
try {
123+
loaders.forEach(function(item) {
124+
if(typeof item.options === "string" && /^\?/.test(item.options)) {
125+
item.options = _this.ruleSet.findOptionsByIdent(item.options.substr(1));
126+
}
127+
})
128+
} catch(e) {
129+
return callback(e);
130+
}
131+
121132
if(resource === false)
122133
return callback(null,
123134
new RawModule("/* (ignored) */",

lib/RuleSet.js

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,24 +71,25 @@ normalized:
7171
*/
7272

7373
function RuleSet(rules) {
74-
this.rules = RuleSet.normalizeRules(rules);
74+
this.references = {};
75+
this.rules = RuleSet.normalizeRules(rules, this.references);
7576
}
7677

7778
module.exports = RuleSet;
7879

79-
RuleSet.normalizeRules = function(rules) {
80+
RuleSet.normalizeRules = function(rules, refs) {
8081
if(Array.isArray(rules)) {
8182
return rules.map(function(rule) {
82-
return RuleSet.normalizeRule(rule);
83+
return RuleSet.normalizeRule(rule, refs);
8384
});
8485
} else if(rules) {
85-
return [RuleSet.normalizeRule(rules)]
86+
return [RuleSet.normalizeRule(rules, refs)]
8687
} else {
8788
return [];
8889
}
8990
};
9091

91-
RuleSet.normalizeRule = function(rule) {
92+
RuleSet.normalizeRule = function(rule, refs) {
9293
if(typeof rule === "string")
9394
return {
9495
use: [{
@@ -171,10 +172,10 @@ RuleSet.normalizeRule = function(rule) {
171172
}
172173

173174
if(rule.rules)
174-
newRule.rules = RuleSet.normalizeRules(rule.rules);
175+
newRule.rules = RuleSet.normalizeRules(rule.rules, refs);
175176

176177
if(rule.oneOf)
177-
newRule.oneOf = RuleSet.normalizeRules(rule.oneOf);
178+
newRule.oneOf = RuleSet.normalizeRules(rule.oneOf, refs);
178179

179180
var keys = Object.keys(rule).filter(function(key) {
180181
return ["resource", "resourceQuery", "test", "include", "exclude", "issuer", "loader", "options", "query", "loaders", "use", "rules", "oneOf"].indexOf(key) < 0;
@@ -195,6 +196,14 @@ RuleSet.normalizeRule = function(rule) {
195196
resourceSource = newSource;
196197
}
197198

199+
if(Array.isArray(newRule.use)) {
200+
newRule.use.forEach(function(item) {
201+
if(typeof item.options === "object" && item.options && item.options.ident) {
202+
refs["$" + item.options.ident] = item.options;
203+
}
204+
});
205+
}
206+
198207
return newRule;
199208
};
200209

@@ -398,3 +407,9 @@ RuleSet.prototype._run = function _run(data, rule, result) {
398407

399408
return true;
400409
};
410+
411+
RuleSet.prototype.findOptionsByIdent = function findOptionsByIdent(ident) {
412+
var options = this.references["$" + ident];
413+
if(!options) throw new Error("Can't find options with ident '" + ident + "'");
414+
return options;
415+
};

test/configCases/loaders/remaining-request/a.js

Whitespace-only changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
it("should correctly pass complex query object with remaining request", function() {
2+
require("./a").should.be.eql("ok");
3+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports.pitch = function(remainingRequest) {
2+
return "module.exports = require(" + JSON.stringify("!!" + remainingRequest) + ");";
3+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = function(source) {
2+
return "module.exports = " + JSON.stringify(this.query.f());
3+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module.exports = {
2+
module: {
3+
rules: [
4+
{
5+
test: /a\.js$/,
6+
use: [
7+
"./loader1",
8+
{
9+
loader: "./loader2",
10+
options: {
11+
ident: "loader2",
12+
f: function() {
13+
return "ok";
14+
}
15+
}
16+
}
17+
]
18+
}
19+
]
20+
}
21+
}

0 commit comments

Comments
 (0)