Merge pull request #3360 from webpack/bugfix/loader-options-remaining-request

fixes a bug in which complex options are not passed through chain
This commit is contained in:
Tobias Koppers 2016-11-23 22:28:45 +01:00 committed by GitHub
commit f4adee3e9d
7 changed files with 63 additions and 7 deletions

View File

@ -118,6 +118,17 @@ function NormalModuleFactory(context, resolvers, options) {
var loaders = results[0];
resource = results[1];
// translate option idents
try {
loaders.forEach(function(item) {
if(typeof item.options === "string" && /^\?/.test(item.options)) {
item.options = _this.ruleSet.findOptionsByIdent(item.options.substr(1));
}
})
} catch(e) {
return callback(e);
}
if(resource === false)
return callback(null,
new RawModule("/* (ignored) */",

View File

@ -71,24 +71,25 @@ normalized:
*/
function RuleSet(rules) {
this.rules = RuleSet.normalizeRules(rules);
this.references = {};
this.rules = RuleSet.normalizeRules(rules, this.references);
}
module.exports = RuleSet;
RuleSet.normalizeRules = function(rules) {
RuleSet.normalizeRules = function(rules, refs) {
if(Array.isArray(rules)) {
return rules.map(function(rule) {
return RuleSet.normalizeRule(rule);
return RuleSet.normalizeRule(rule, refs);
});
} else if(rules) {
return [RuleSet.normalizeRule(rules)]
return [RuleSet.normalizeRule(rules, refs)]
} else {
return [];
}
};
RuleSet.normalizeRule = function(rule) {
RuleSet.normalizeRule = function(rule, refs) {
if(typeof rule === "string")
return {
use: [{
@ -171,10 +172,10 @@ RuleSet.normalizeRule = function(rule) {
}
if(rule.rules)
newRule.rules = RuleSet.normalizeRules(rule.rules);
newRule.rules = RuleSet.normalizeRules(rule.rules, refs);
if(rule.oneOf)
newRule.oneOf = RuleSet.normalizeRules(rule.oneOf);
newRule.oneOf = RuleSet.normalizeRules(rule.oneOf, refs);
var keys = Object.keys(rule).filter(function(key) {
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) {
resourceSource = newSource;
}
if(Array.isArray(newRule.use)) {
newRule.use.forEach(function(item) {
if(typeof item.options === "object" && item.options && item.options.ident) {
refs["$" + item.options.ident] = item.options;
}
});
}
return newRule;
};
@ -398,3 +407,9 @@ RuleSet.prototype._run = function _run(data, rule, result) {
return true;
};
RuleSet.prototype.findOptionsByIdent = function findOptionsByIdent(ident) {
var options = this.references["$" + ident];
if(!options) throw new Error("Can't find options with ident '" + ident + "'");
return options;
};

View File

@ -0,0 +1,3 @@
it("should correctly pass complex query object with remaining request", function() {
require("./a").should.be.eql("ok");
});

View File

@ -0,0 +1,3 @@
module.exports.pitch = function(remainingRequest) {
return "module.exports = require(" + JSON.stringify("!!" + remainingRequest) + ");";
};

View File

@ -0,0 +1,3 @@
module.exports = function(source) {
return "module.exports = " + JSON.stringify(this.query.f());
};

View File

@ -0,0 +1,21 @@
module.exports = {
module: {
rules: [
{
test: /a\.js$/,
use: [
"./loader1",
{
loader: "./loader2",
options: {
ident: "loader2",
f: function() {
return "ok";
}
}
}
]
}
]
}
}