Skip to content

Commit 581bfca

Browse files
committed
added manual context map option to ContextReplacementPlugin
1 parent 0335729 commit 581bfca

10 files changed

Lines changed: 78 additions & 20 deletions

File tree

lib/ContextModule.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ ContextModule.prototype.build = function(options, compilation, resolver, fs, cal
6969
if(dependencies) {
7070
dependencies.forEach(function(dep) {
7171
dep.loc = dep.userRequest;
72-
dep.userRequest = dep.request;
73-
dep.request = addon + dep.userRequest;
72+
dep.request = addon + dep.request;
7473
});
7574
}
7675
this.dependencies = dependencies;

lib/ContextModuleFactory.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,16 @@ ContextModuleFactory.prototype.create = function(context, dependency, callback)
6161
loaders: loadersPrefix + result[1].join("!") + (result[1].length > 0 ? "!" : ""),
6262
resource: result[0],
6363
recursive: recursive,
64-
regExp: regExp
64+
regExp: regExp,
65+
resolveDependencies: this.resolveDependencies.bind(this)
6566
}, function(err, result) {
6667
if(err) return callback(err);
6768

6869
// Ignored
6970
if(!result) return callback();
7071

71-
return callback(null, new ContextModule(this.resolveDependencies.bind(this), result.resource, result.recursive, result.regExp, result.loaders));
72-
}.bind(this));
72+
return callback(null, new ContextModule(result.resolveDependencies, result.resource, result.recursive, result.regExp, result.loaders));
73+
});
7374
}.bind(this));
7475
}.bind(this));
7576
};

lib/ContextReplacementPlugin.js

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,20 @@
33
Author Tobias Koppers @sokra
44
*/
55
var path = require("path");
6+
var ContextElementDependency = require("./dependencies/ContextElementDependency");
67

78
function ContextReplacementPlugin(resourceRegExp, newContentResource, newContentRecursive, newContentRegExp) {
89
this.resourceRegExp = resourceRegExp;
910
if(typeof newContentResource === "function") {
1011
this.newContentCallback = newContentResource;
12+
} else if(typeof newContentResource === "string" && typeof newContentRecursive === "object") {
13+
this.newContentResource = newContentResource;
14+
this.newContentCreateContextMap = function(fs, callback) {
15+
callback(null, newContentRecursive)
16+
};
17+
} else if(typeof newContentResource === "string" && typeof newContentRecursive === "function") {
18+
this.newContentResource = newContentResource;
19+
this.newContentCreateContextMap = newContentRecursive;
1120
} else {
1221
if(typeof newContentResource !== "string") {
1322
newContentRegExp = newContentRecursive;
@@ -30,42 +39,55 @@ ContextReplacementPlugin.prototype.apply = function(compiler) {
3039
var newContentResource = this.newContentResource;
3140
var newContentRecursive = this.newContentRecursive;
3241
var newContentRegExp = this.newContentRegExp;
42+
var newContentCreateContextMap = this.newContentCreateContextMap;
3343
compiler.plugin("context-module-factory", function(cmf) {
3444
cmf.plugin("before-resolve", function(result, callback) {
3545
if(!result) return callback();
3646
if(resourceRegExp.test(result.request)) {
47+
if(typeof newContentResource !== "undefined")
48+
result.request = newContentResource;
49+
if(typeof newContentRecursive !== "undefined")
50+
result.recursive = newContentRecursive;
51+
if(typeof newContentRegExp !== "undefined")
52+
result.regExp = newContentRegExp;
3753
if(typeof newContentCallback === "function") {
3854
newContentCallback(result);
39-
} else {
40-
if(typeof newContentResource !== "undefined")
41-
result.request = newContentResource;
42-
if(typeof newContentRecursive !== "undefined")
43-
result.recursive = newContentRecursive;
44-
if(typeof newContentRegExp !== "undefined")
45-
result.regExp = newContentRegExp;
4655
}
4756
}
4857
return callback(null, result);
4958
});
5059
cmf.plugin("after-resolve", function(result, callback) {
5160
if(!result) return callback();
5261
if(resourceRegExp.test(result.resource)) {
62+
if(typeof newContentResource !== "undefined")
63+
result.resource = path.resolve(result.resource, newContentResource);
64+
if(typeof newContentRecursive !== "undefined")
65+
result.recursive = newContentRecursive;
66+
if(typeof newContentRegExp !== "undefined")
67+
result.regExp = newContentRegExp;
68+
if(typeof newContentCreateContextMap === "function")
69+
result.resolveDependencies = createResolveDependenciesFromContextMap(newContentCreateContextMap);
5370
if(typeof newContentCallback === "function") {
5471
var origResource = result.resource;
5572
newContentCallback(result);
5673
if(result.resource !== origResource) {
5774
result.resource = path.resolve(origResource, result.resource);
5875
}
59-
} else {
60-
if(typeof newContentResource !== "undefined")
61-
result.resource = path.resolve(result.resource, newContentResource);
62-
if(typeof newContentRecursive !== "undefined")
63-
result.recursive = newContentRecursive;
64-
if(typeof newContentRegExp !== "undefined")
65-
result.regExp = newContentRegExp;
6676
}
6777
}
6878
return callback(null, result);
6979
});
7080
});
7181
};
82+
83+
function createResolveDependenciesFromContextMap(createContextMap) {
84+
return function resolveDependenciesFromContextMap(fs, resource, recursive, regExp, callback) {
85+
createContextMap(fs, function(err, map) {
86+
if(err) return callback(err);
87+
var dependencies = Object.keys(map).map(function(key) {
88+
return new ContextElementDependency(map[key], key);
89+
});
90+
callback(null, dependencies);
91+
});
92+
}
93+
};

lib/dependencies/ContextElementDependency.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
*/
55
var ModuleDependency = require("./ModuleDependency");
66

7-
function ContextElementDependency(request) {
7+
function ContextElementDependency(request, userRequest) {
88
ModuleDependency.call(this, request);
9+
if(userRequest) {
10+
this.userRequest = userRequest;
11+
}
912
}
1013
module.exports = ContextElementDependency;
1114

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
it("should replace a context with a manual map", function() {
2+
function rqInContext(x) {
3+
return require(x);
4+
}
5+
rqInContext("a").should.be.eql("a");
6+
rqInContext("b").should.be.eql("b");
7+
rqInContext("./c").should.be.eql("b");
8+
rqInContext("d").should.be.eql("d");
9+
rqInContext("./d").should.be.eql("d");
10+
(function() {
11+
rqInContext("module-b")
12+
}.should.throw());
13+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "a";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = "b";

test/configCases/context-replacement/c/node_modules/d.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = [
2+
[/Critical dependencies/, /c\/index\.js/]
3+
];
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
var path = require("path");
2+
var webpack = require("../../../../");
3+
4+
module.exports = {
5+
plugins: [
6+
new webpack.ContextReplacementPlugin(/context-replacement.c$/, path.resolve(__dirname, "modules"), {
7+
"a": "./a",
8+
"b": "./module-b",
9+
"./c": "./module-b",
10+
"d": "d",
11+
"./d": "d"
12+
})
13+
]
14+
};

0 commit comments

Comments
 (0)