mirror of https://github.com/webpack/webpack.git
added manual context map option to ContextReplacementPlugin
This commit is contained in:
parent
dc7a19dc87
commit
a4cc54e759
|
@ -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) {
|
||||
|
|
|
@ -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));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
});
|
|
@ -0,0 +1 @@
|
|||
module.exports = "a";
|
|
@ -0,0 +1 @@
|
|||
module.exports = "b";
|
|
@ -0,0 +1 @@
|
|||
module.exports = "d";
|
|
@ -0,0 +1,3 @@
|
|||
module.exports = [
|
||||
[/Critical dependencies/, /c\/index\.js/]
|
||||
];
|
|
@ -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"
|
||||
})
|
||||
]
|
||||
};
|
Loading…
Reference in New Issue