added manual context map option to ContextReplacementPlugin

This commit is contained in:
Tobias Koppers 2016-01-06 19:56:17 +01:00
parent dc7a19dc87
commit a4cc54e759
10 changed files with 77 additions and 19 deletions

View File

@ -75,8 +75,7 @@ ContextModule.prototype.build = function(options, compilation, resolver, fs, cal
if(dependencies) {
dependencies.forEach(function(dep) {
dep.loc = dep.userRequest;
dep.userRequest = dep.request;
dep.request = addon + dep.userRequest;
dep.request = addon + dep.request;
});
}
if(this.async) {

View File

@ -79,14 +79,15 @@ ContextModuleFactory.prototype.create = function(context, dependency, callback)
resource: result[0],
recursive: recursive,
regExp: regExp,
async: asyncContext
async: asyncContext,
resolveDependencies: module.resolveDependencies.bind(module)
}, function(err, result) {
if(err) return callback(err);
// Ignored
if(!result) return callback();
return callback(null, new ContextModule(module.resolveDependencies.bind(module), result.resource, result.recursive, result.regExp, result.loaders, result.async));
return callback(null, new ContextModule(result.resolveDependencies, result.resource, result.recursive, result.regExp, result.loaders, result.async));
});
});
});

View File

@ -3,11 +3,20 @@
Author Tobias Koppers @sokra
*/
var path = require("path");
var ContextElementDependency = require("./dependencies/ContextElementDependency");
function ContextReplacementPlugin(resourceRegExp, newContentResource, newContentRecursive, newContentRegExp) {
this.resourceRegExp = resourceRegExp;
if(typeof newContentResource === "function") {
this.newContentCallback = newContentResource;
} else if(typeof newContentResource === "string" && typeof newContentRecursive === "object") {
this.newContentResource = newContentResource;
this.newContentCreateContextMap = function(fs, callback) {
callback(null, newContentRecursive)
};
} else if(typeof newContentResource === "string" && typeof newContentRecursive === "function") {
this.newContentResource = newContentResource;
this.newContentCreateContextMap = newContentRecursive;
} else {
if(typeof newContentResource !== "string") {
newContentRegExp = newContentRecursive;
@ -30,19 +39,19 @@ ContextReplacementPlugin.prototype.apply = function(compiler) {
var newContentResource = this.newContentResource;
var newContentRecursive = this.newContentRecursive;
var newContentRegExp = this.newContentRegExp;
var newContentCreateContextMap = this.newContentCreateContextMap;
compiler.plugin("context-module-factory", function(cmf) {
cmf.plugin("before-resolve", function(result, callback) {
if(!result) return callback();
if(resourceRegExp.test(result.request)) {
if(typeof newContentCallback === "function") {
newContentCallback(result);
} else {
if(typeof newContentResource !== "undefined")
result.request = newContentResource;
if(typeof newContentRecursive !== "undefined")
result.recursive = newContentRecursive;
if(typeof newContentRegExp !== "undefined")
result.regExp = newContentRegExp;
if(typeof newContentCallback === "function") {
newContentCallback(result);
}
}
return callback(null, result);
@ -50,22 +59,35 @@ ContextReplacementPlugin.prototype.apply = function(compiler) {
cmf.plugin("after-resolve", function(result, callback) {
if(!result) return callback();
if(resourceRegExp.test(result.resource)) {
if(typeof newContentCallback === "function") {
var origResource = result.resource;
newContentCallback(result);
if(result.resource !== origResource) {
result.resource = path.resolve(origResource, result.resource);
}
} else {
if(typeof newContentResource !== "undefined")
result.resource = path.resolve(result.resource, newContentResource);
if(typeof newContentRecursive !== "undefined")
result.recursive = newContentRecursive;
if(typeof newContentRegExp !== "undefined")
result.regExp = newContentRegExp;
if(typeof newContentCreateContextMap === "function")
result.resolveDependencies = createResolveDependenciesFromContextMap(newContentCreateContextMap);
if(typeof newContentCallback === "function") {
var origResource = result.resource;
newContentCallback(result);
if(result.resource !== origResource) {
result.resource = path.resolve(origResource, result.resource);
}
}
}
return callback(null, result);
});
});
};
function createResolveDependenciesFromContextMap(createContextMap) {
return function resolveDependenciesFromContextMap(fs, resource, recursive, regExp, callback) {
createContextMap(fs, function(err, map) {
if(err) return callback(err);
var dependencies = Object.keys(map).map(function(key) {
return new ContextElementDependency(map[key], key);
});
callback(null, dependencies);
});
}
};

View File

@ -4,8 +4,11 @@
*/
var ModuleDependency = require("./ModuleDependency");
function ContextElementDependency(request) {
function ContextElementDependency(request, userRequest) {
ModuleDependency.call(this, request);
if(userRequest) {
this.userRequest = userRequest;
}
}
module.exports = ContextElementDependency;

View File

@ -0,0 +1,13 @@
it("should replace a context with a manual map", function() {
function rqInContext(x) {
return require(x);
}
rqInContext("a").should.be.eql("a");
rqInContext("b").should.be.eql("b");
rqInContext("./c").should.be.eql("b");
rqInContext("d").should.be.eql("d");
rqInContext("./d").should.be.eql("d");
(function() {
rqInContext("module-b")
}.should.throw());
});

View File

@ -0,0 +1 @@
module.exports = "a";

View File

@ -0,0 +1 @@
module.exports = "b";

View File

@ -0,0 +1 @@
module.exports = "d";

View File

@ -0,0 +1,3 @@
module.exports = [
[/Critical dependencies/, /c\/index\.js/]
];

View File

@ -0,0 +1,14 @@
var path = require("path");
var webpack = require("../../../../");
module.exports = {
plugins: [
new webpack.ContextReplacementPlugin(/context-replacement.c$/, path.resolve(__dirname, "modules"), {
"a": "./a",
"b": "./module-b",
"./c": "./module-b",
"d": "d",
"./d": "d"
})
]
};