Skip to content

Commit a4cc54e

Browse files
committed
added manual context map option to ContextReplacementPlugin
1 parent dc7a19d commit a4cc54e

10 files changed

Lines changed: 77 additions & 19 deletions

File tree

lib/ContextModule.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ ContextModule.prototype.build = function(options, compilation, resolver, fs, cal
7575
if(dependencies) {
7676
dependencies.forEach(function(dep) {
7777
dep.loc = dep.userRequest;
78-
dep.userRequest = dep.request;
79-
dep.request = addon + dep.userRequest;
78+
dep.request = addon + dep.request;
8079
});
8180
}
8281
if(this.async) {

lib/ContextModuleFactory.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,15 @@ ContextModuleFactory.prototype.create = function(context, dependency, callback)
7979
resource: result[0],
8080
recursive: recursive,
8181
regExp: regExp,
82-
async: asyncContext
82+
async: asyncContext,
83+
resolveDependencies: module.resolveDependencies.bind(module)
8384
}, function(err, result) {
8485
if(err) return callback(err);
8586

8687
// Ignored
8788
if(!result) return callback();
8889

89-
return callback(null, new ContextModule(module.resolveDependencies.bind(module), result.resource, result.recursive, result.regExp, result.loaders, result.async));
90+
return callback(null, new ContextModule(result.resolveDependencies, result.resource, result.recursive, result.regExp, result.loaders, result.async));
9091
});
9192
});
9293
});

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)