Skip to content

Commit 479a0a4

Browse files
authored
Merge pull request webpack#4189 from webpack/feature/child-plugins
child compiler features
2 parents 0518115 + fbf84d5 commit 479a0a4

File tree

11 files changed

+61
-6
lines changed

11 files changed

+61
-6
lines changed

lib/Compilation.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,8 @@ class Compilation extends Tapable {
228228
const factory = item[0];
229229
factory.create({
230230
contextInfo: {
231-
issuer: module.nameForCondition && module.nameForCondition()
231+
issuer: module.nameForCondition && module.nameForCondition(),
232+
compiler: _this.compiler.name
232233
},
233234
context: module.context,
234235
dependencies: dependencies
@@ -375,6 +376,10 @@ class Compilation extends Tapable {
375376
}
376377

377378
moduleFactory.create({
379+
contextInfo: {
380+
issuer: "",
381+
compiler: this.compiler.name
382+
},
378383
context: context,
379384
dependencies: [dependency]
380385
}, (err, module) => {

lib/Compiler.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,8 +391,11 @@ Compiler.prototype.readRecords = function readRecords(callback) {
391391
});
392392
};
393393

394-
Compiler.prototype.createChildCompiler = function(compilation, compilerName, outputOptions) {
394+
Compiler.prototype.createChildCompiler = function(compilation, compilerName, outputOptions, plugins) {
395395
var childCompiler = new Compiler();
396+
if(Array.isArray(plugins)) {
397+
plugins.forEach(plugin => childCompiler.apply(plugin));
398+
}
396399
for(var name in this._plugins) {
397400
if(["make", "compile", "emit", "after-emit", "invalid", "done", "this-compilation"].indexOf(name) < 0)
398401
childCompiler._plugins[name] = this._plugins[name].slice();

lib/NormalModuleFactory.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ function NormalModuleFactory(context, resolvers, options) {
164164
var result = _this.ruleSet.exec({
165165
resource: resourcePath,
166166
resourceQuery: resourceQuery,
167-
issuer: contextInfo.issuer
167+
issuer: contextInfo.issuer,
168+
compiler: contextInfo.compiler
168169
});
169170
var settings = {};
170171
var useLoadersPost = [];

lib/RuleSet.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
include: <condition>, -> resource.include
1717
exclude: <condition>, -> resource.exclude
1818
resourceQuery: <condition>,
19+
compiler: <condition>,
1920
issuer: <condition>,
2021
use: "loader", -> use[0].loader
2122
loader: <>, -> use[0].loader
@@ -55,6 +56,7 @@ normalized:
5556
{
5657
resource: function(),
5758
resourceQuery: function(),
59+
compiler: function(),
5860
issuer: function(),
5961
use: [
6062
{
@@ -138,6 +140,14 @@ module.exports = class RuleSet {
138140
}
139141
}
140142

143+
if(rule.compiler) {
144+
try {
145+
newRule.compiler = RuleSet.normalizeCondition(rule.compiler);
146+
} catch(error) {
147+
throw new Error(RuleSet.buildErrorMessage(rule.compiler, error));
148+
}
149+
}
150+
141151
if(rule.issuer) {
142152
try {
143153
newRule.issuer = RuleSet.normalizeCondition(rule.issuer);
@@ -181,7 +191,7 @@ module.exports = class RuleSet {
181191
newRule.oneOf = RuleSet.normalizeRules(rule.oneOf, refs, `${ident}-oneOf`);
182192

183193
const keys = Object.keys(rule).filter((key) => {
184-
return ["resource", "resourceQuery", "test", "include", "exclude", "issuer", "loader", "options", "query", "loaders", "use", "rules", "oneOf"].indexOf(key) < 0;
194+
return ["resource", "resourceQuery", "compiler", "test", "include", "exclude", "issuer", "loader", "options", "query", "loaders", "use", "rules", "oneOf"].indexOf(key) < 0;
185195
});
186196
keys.forEach((key) => {
187197
newRule[key] = rule[key];
@@ -350,6 +360,8 @@ module.exports = class RuleSet {
350360
return false;
351361
if(rule.resourceQuery && !data.resourceQuery)
352362
return false;
363+
if(rule.compiler && !data.compiler)
364+
return false;
353365
if(rule.issuer && !data.issuer)
354366
return false;
355367
if(rule.resource && !rule.resource(data.resource))
@@ -358,10 +370,12 @@ module.exports = class RuleSet {
358370
return false;
359371
if(data.resourceQuery && rule.resourceQuery && !rule.resourceQuery(data.resourceQuery))
360372
return false;
373+
if(data.compiler && rule.compiler && !rule.compiler(data.compiler))
374+
return false;
361375

362376
// apply
363377
const keys = Object.keys(rule).filter((key) => {
364-
return ["resource", "resourceQuery", "issuer", "rules", "oneOf", "use", "enforce"].indexOf(key) < 0;
378+
return ["resource", "resourceQuery", "compiler", "issuer", "rules", "oneOf", "use", "enforce"].indexOf(key) < 0;
365379
});
366380
keys.forEach((key) => {
367381
result.push({

schemas/webpackOptionsSchema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,9 @@
636636
"resourceQuery": {
637637
"$ref": "#/definitions/ruleSet-condition"
638638
},
639+
"compiler": {
640+
"$ref": "#/definitions/ruleSet-condition"
641+
},
639642
"rules": {
640643
"$ref": "#/definitions/ruleSet-rules"
641644
},

test/Validation.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ describe("Validation", () => {
135135
},
136136
message: [
137137
" - configuration.module.rules[0].oneOf[0] has an unknown property 'paser'. These properties are valid:",
138-
" object { enforce?, exclude?, include?, issuer?, loader?, loaders?, oneOf?, options?, parser?, query?, resource?, resourceQuery?, rules?, test?, use? }"
138+
" object { enforce?, exclude?, include?, issuer?, loader?, loaders?, oneOf?, options?, parser?, query?, resource?, resourceQuery?, compiler?, rules?, test?, use? }"
139139
]
140140
}, {
141141
name: "additional key on root",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "loader not matched";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "loader not matched";
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
it("should match rule with compiler name", function() {
2+
var a = require("./a");
3+
a.should.be.eql("loader matched");
4+
var b = require("./b");
5+
b.should.be.eql("loader not matched");
6+
});
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = function(source) {
2+
return "module.exports = " + JSON.stringify("loader matched");
3+
};
4+

0 commit comments

Comments
 (0)