Skip to content

Commit

Permalink
added manual context map option to ContextReplacementPlugin
Browse files Browse the repository at this point in the history
  • Loading branch information
sokra committed Jan 6, 2016
1 parent dc7a19d commit a4cc54e
Show file tree
Hide file tree
Showing 10 changed files with 77 additions and 19 deletions.
3 changes: 1 addition & 2 deletions lib/ContextModule.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
5 changes: 3 additions & 2 deletions lib/ContextModuleFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -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));
});
});
});
Expand Down
50 changes: 36 additions & 14 deletions lib/ContextReplacementPlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -30,42 +39,55 @@ 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 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);
} else {
if(typeof newContentResource !== "undefined")
result.request = newContentResource;
if(typeof newContentRecursive !== "undefined")
result.recursive = newContentRecursive;
if(typeof newContentRegExp !== "undefined")
result.regExp = newContentRegExp;
}
}
return callback(null, result);
});
cmf.plugin("after-resolve", function(result, callback) {
if(!result) return callback();
if(resourceRegExp.test(result.resource)) {
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);
}
} 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;
}
}
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);
});
}
};
5 changes: 4 additions & 1 deletion lib/dependencies/ContextElementDependency.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
13 changes: 13 additions & 0 deletions test/configCases/context-replacement/c/index.js
Original file line number Diff line number Diff line change
@@ -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());
});
1 change: 1 addition & 0 deletions test/configCases/context-replacement/c/modules/a.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = "a";
1 change: 1 addition & 0 deletions test/configCases/context-replacement/c/modules/module-b.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = "b";
1 change: 1 addition & 0 deletions test/configCases/context-replacement/c/node_modules/d.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions test/configCases/context-replacement/c/warnings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = [
[/Critical dependencies/, /c\/index\.js/]
];
14 changes: 14 additions & 0 deletions test/configCases/context-replacement/c/webpack.config.js
Original file line number Diff line number Diff line change
@@ -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"
})
]
};

0 comments on commit a4cc54e

Please sign in to comment.