Skip to content

Commit dee0774

Browse files
authored
Merge pull request webpack#5717 from webpack/allow-negative-early-bail-for-context
Allow negative early bail for context
2 parents be72b2a + 06d1fb1 commit dee0774

11 files changed

Lines changed: 56 additions & 4 deletions

File tree

lib/ContextExclusionPlugin.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"use strict";
2+
3+
class ContextExclusionPlugin {
4+
constructor(negativeMatcher) {
5+
this.negativeMatcher = negativeMatcher;
6+
}
7+
8+
apply(compiler) {
9+
compiler.plugin("context-module-factory", (cmf) => {
10+
cmf.plugin("context-module-files", (files) => {
11+
return files.filter(filePath => !this.negativeMatcher.test(filePath));
12+
});
13+
});
14+
}
15+
}
16+
17+
module.exports = ContextExclusionPlugin;

lib/ContextModuleFactory.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ module.exports = class ContextModuleFactory extends Tapable {
1818
}
1919

2020
create(data, callback) {
21-
const module = this;
2221
const context = data.context;
2322
const dependencies = data.dependencies;
2423
const dependency = dependencies[0];
@@ -59,7 +58,7 @@ module.exports = class ContextModuleFactory extends Tapable {
5958
resource = request;
6059
}
6160

62-
const resolvers = module.resolvers;
61+
const resolvers = this.resolvers;
6362

6463
asyncLib.parallel([
6564
function(callback) {
@@ -79,14 +78,14 @@ module.exports = class ContextModuleFactory extends Tapable {
7978
], (err, result) => {
8079
if(err) return callback(err);
8180

82-
module.applyPluginsAsyncWaterfall("after-resolve", {
81+
this.applyPluginsAsyncWaterfall("after-resolve", {
8382
loaders: loadersPrefix + result[1].join("!") + (result[1].length > 0 ? "!" : ""),
8483
resource: result[0],
8584
recursive: recursive,
8685
regExp: regExp,
8786
async: asyncContext,
8887
dependencies: dependencies,
89-
resolveDependencies: module.resolveDependencies.bind(module)
88+
resolveDependencies: this.resolveDependencies.bind(this)
9089
}, function(err, result) {
9190
if(err) return callback(err);
9291

@@ -100,11 +99,13 @@ module.exports = class ContextModuleFactory extends Tapable {
10099
}
101100

102101
resolveDependencies(fs, resource, recursive, regExp, callback) {
102+
const cmf = this;
103103
if(!regExp || !resource)
104104
return callback(null, []);
105105
(function addDirectory(directory, callback) {
106106
fs.readdir(directory, (err, files) => {
107107
if(err) return callback(err);
108+
files = cmf.applyPluginsWaterfall("context-module-files", files);
108109
if(!files || files.length === 0) return callback(null, []);
109110
asyncLib.map(files.filter(function(p) {
110111
return p.indexOf(".") !== 0;

lib/webpack.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ exportPlugins(exports, {
7373
"DefinePlugin": () => require("./DefinePlugin"),
7474
"NormalModuleReplacementPlugin": () => require("./NormalModuleReplacementPlugin"),
7575
"ContextReplacementPlugin": () => require("./ContextReplacementPlugin"),
76+
"ContextExclusionPlugin": () => require("./ContextExclusionPlugin"),
7677
"IgnorePlugin": () => require("./IgnorePlugin"),
7778
"WatchIgnorePlugin": () => require("./WatchIgnorePlugin"),
7879
"BannerPlugin": () => require("./BannerPlugin"),
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
function requireInContext(someVariable) {
2+
return require(`./some-dir/${someVariable}`);
3+
}
4+
5+
it("should not exclude paths not matching the exclusion pattern", function() {
6+
requireInContext("file").should.be.eql("thats good");
7+
requireInContext("check-here/file").should.be.eql("thats good");
8+
requireInContext("check-here/check-here/file").should.be.eql("thats good");
9+
});
10+
11+
it("should exclude paths/files matching the exclusion pattern", function() {
12+
(() => requireInContext("dont")).
13+
should.throw(/Cannot find module '.\/dont'/);
14+
15+
(() => requireInContext("dont-check-here/file")).
16+
should.throw(/Cannot find module '.\/dont-check-here\/file'/);
17+
18+
(() => requireInContext("check-here/dont-check-here/file")).
19+
should.throw(/Cannot find module '.\/check-here\/dont-check-here\/file'/);
20+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "thats good";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "thats bad";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "thats good";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "thats bad";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "thats bad";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "thats good";

0 commit comments

Comments
 (0)