Skip to content

Commit 5f9dd3c

Browse files
committed
fixes a bug in which complex options are not passed through chain
1 parent e3865e0 commit 5f9dd3c

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
@@ -74,24 +74,25 @@ normalized:
7474
*/
7575

7676
function RuleSet(rules) {
77-
this.rules = RuleSet.normalizeRules(rules);
77+
this.references = {};
78+
this.rules = RuleSet.normalizeRules(rules, this.references);
7879
}
7980

8081
module.exports = RuleSet;
8182

82-
RuleSet.normalizeRules = function(rules) {
83+
RuleSet.normalizeRules = function(rules, refs) {
8384
if(Array.isArray(rules)) {
8485
return rules.map(function(rule) {
85-
return RuleSet.normalizeRule(rule);
86+
return RuleSet.normalizeRule(rule, refs);
8687
});
8788
} else if(rules) {
88-
return [RuleSet.normalizeRule(rules)]
89+
return [RuleSet.normalizeRule(rules, refs)]
8990
} else {
9091
return [];
9192
}
9293
};
9394

94-
RuleSet.normalizeRule = function(rule) {
95+
RuleSet.normalizeRule = function(rule, refs) {
9596
if(typeof rule === "string")
9697
return {
9798
use: [{
@@ -166,10 +167,10 @@ RuleSet.normalizeRule = function(rule) {
166167
}
167168

168169
if(rule.rules)
169-
newRule.rules = RuleSet.normalizeRules(rule.rules);
170+
newRule.rules = RuleSet.normalizeRules(rule.rules, refs);
170171

171172
if(rule.oneOf)
172-
newRule.oneOf = RuleSet.normalizeRules(rule.oneOf);
173+
newRule.oneOf = RuleSet.normalizeRules(rule.oneOf, refs);
173174

174175
var keys = Object.keys(rule).filter(function(key) {
175176
return ["resource", "test", "include", "exclude", "issuer", "loader", "options", "query", "loaders", "use", "rules", "oneOf"].indexOf(key) < 0;
@@ -190,6 +191,14 @@ RuleSet.normalizeRule = function(rule) {
190191
resourceSource = newSource;
191192
}
192193

194+
if(Array.isArray(newRule.use)) {
195+
newRule.use.forEach(function(item) {
196+
if(typeof item.options === "object" && item.options && item.options.ident) {
197+
refs["$" + item.options.ident] = item.options;
198+
}
199+
});
200+
}
201+
193202
return newRule;
194203
};
195204

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

390399
return true;
391400
};
401+
402+
RuleSet.prototype.findOptionsByIdent = function findOptionsByIdent(ident) {
403+
var options = this.references["$" + ident];
404+
if(!options) throw new Error("Can't find options with ident '" + ident + "'");
405+
return options;
406+
};

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)