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) {
|
if(dependencies) {
|
||||||
dependencies.forEach(function(dep) {
|
dependencies.forEach(function(dep) {
|
||||||
dep.loc = dep.userRequest;
|
dep.loc = dep.userRequest;
|
||||||
dep.userRequest = dep.request;
|
dep.request = addon + dep.request;
|
||||||
dep.request = addon + dep.userRequest;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if(this.async) {
|
if(this.async) {
|
||||||
|
|
|
@ -79,14 +79,15 @@ ContextModuleFactory.prototype.create = function(context, dependency, callback)
|
||||||
resource: result[0],
|
resource: result[0],
|
||||||
recursive: recursive,
|
recursive: recursive,
|
||||||
regExp: regExp,
|
regExp: regExp,
|
||||||
async: asyncContext
|
async: asyncContext,
|
||||||
|
resolveDependencies: module.resolveDependencies.bind(module)
|
||||||
}, function(err, result) {
|
}, function(err, result) {
|
||||||
if(err) return callback(err);
|
if(err) return callback(err);
|
||||||
|
|
||||||
// Ignored
|
// Ignored
|
||||||
if(!result) return callback();
|
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
|
Author Tobias Koppers @sokra
|
||||||
*/
|
*/
|
||||||
var path = require("path");
|
var path = require("path");
|
||||||
|
var ContextElementDependency = require("./dependencies/ContextElementDependency");
|
||||||
|
|
||||||
function ContextReplacementPlugin(resourceRegExp, newContentResource, newContentRecursive, newContentRegExp) {
|
function ContextReplacementPlugin(resourceRegExp, newContentResource, newContentRecursive, newContentRegExp) {
|
||||||
this.resourceRegExp = resourceRegExp;
|
this.resourceRegExp = resourceRegExp;
|
||||||
if(typeof newContentResource === "function") {
|
if(typeof newContentResource === "function") {
|
||||||
this.newContentCallback = newContentResource;
|
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 {
|
} else {
|
||||||
if(typeof newContentResource !== "string") {
|
if(typeof newContentResource !== "string") {
|
||||||
newContentRegExp = newContentRecursive;
|
newContentRegExp = newContentRecursive;
|
||||||
|
@ -30,19 +39,19 @@ ContextReplacementPlugin.prototype.apply = function(compiler) {
|
||||||
var newContentResource = this.newContentResource;
|
var newContentResource = this.newContentResource;
|
||||||
var newContentRecursive = this.newContentRecursive;
|
var newContentRecursive = this.newContentRecursive;
|
||||||
var newContentRegExp = this.newContentRegExp;
|
var newContentRegExp = this.newContentRegExp;
|
||||||
|
var newContentCreateContextMap = this.newContentCreateContextMap;
|
||||||
compiler.plugin("context-module-factory", function(cmf) {
|
compiler.plugin("context-module-factory", function(cmf) {
|
||||||
cmf.plugin("before-resolve", function(result, callback) {
|
cmf.plugin("before-resolve", function(result, callback) {
|
||||||
if(!result) return callback();
|
if(!result) return callback();
|
||||||
if(resourceRegExp.test(result.request)) {
|
if(resourceRegExp.test(result.request)) {
|
||||||
if(typeof newContentCallback === "function") {
|
|
||||||
newContentCallback(result);
|
|
||||||
} else {
|
|
||||||
if(typeof newContentResource !== "undefined")
|
if(typeof newContentResource !== "undefined")
|
||||||
result.request = newContentResource;
|
result.request = newContentResource;
|
||||||
if(typeof newContentRecursive !== "undefined")
|
if(typeof newContentRecursive !== "undefined")
|
||||||
result.recursive = newContentRecursive;
|
result.recursive = newContentRecursive;
|
||||||
if(typeof newContentRegExp !== "undefined")
|
if(typeof newContentRegExp !== "undefined")
|
||||||
result.regExp = newContentRegExp;
|
result.regExp = newContentRegExp;
|
||||||
|
if(typeof newContentCallback === "function") {
|
||||||
|
newContentCallback(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return callback(null, result);
|
return callback(null, result);
|
||||||
|
@ -50,22 +59,35 @@ ContextReplacementPlugin.prototype.apply = function(compiler) {
|
||||||
cmf.plugin("after-resolve", function(result, callback) {
|
cmf.plugin("after-resolve", function(result, callback) {
|
||||||
if(!result) return callback();
|
if(!result) return callback();
|
||||||
if(resourceRegExp.test(result.resource)) {
|
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")
|
if(typeof newContentResource !== "undefined")
|
||||||
result.resource = path.resolve(result.resource, newContentResource);
|
result.resource = path.resolve(result.resource, newContentResource);
|
||||||
if(typeof newContentRecursive !== "undefined")
|
if(typeof newContentRecursive !== "undefined")
|
||||||
result.recursive = newContentRecursive;
|
result.recursive = newContentRecursive;
|
||||||
if(typeof newContentRegExp !== "undefined")
|
if(typeof newContentRegExp !== "undefined")
|
||||||
result.regExp = newContentRegExp;
|
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);
|
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");
|
var ModuleDependency = require("./ModuleDependency");
|
||||||
|
|
||||||
function ContextElementDependency(request) {
|
function ContextElementDependency(request, userRequest) {
|
||||||
ModuleDependency.call(this, request);
|
ModuleDependency.call(this, request);
|
||||||
|
if(userRequest) {
|
||||||
|
this.userRequest = userRequest;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
module.exports = ContextElementDependency;
|
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