Skip to content

Commit f3213f2

Browse files
committed
create context for more stuff
1 parent 57ddbc0 commit f3213f2

8 files changed

+79
-6
lines changed

lib/ContextModule.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,15 @@ ContextModule.prototype.source = function(dependencyTemplates, outputOptions, re
8686
var str = [
8787
"var map = ", JSON.stringify(map, null, "\t"), ";\n",
8888
"function webpackContext(req) {\n",
89-
"\treturn require(map[req] || (function() { throw new Error(\"Cannot find module '\" + req + \"'.\") }()));\n",
89+
"\treturn require(webpackContextResolve(req));\n",
90+
"};\n",
91+
"function webpackContextResolve(req) {\n",
92+
"\treturn map[req] || (function() { throw new Error(\"Cannot find module '\" + req + \"'.\") }());\n",
9093
"};\n",
9194
"webpackContext.keys = function webpackContextKeys() {\n",
9295
"\treturn Object.keys(map);\n",
9396
"};\n",
97+
"webpackContext.resolve = webpackContextResolve;\n",
9498
"module.exports = webpackContext;\n",
9599
];
96100
return new RawSource(str.join(""));

lib/dependencies/AMDDefineDependencyParserPlugin.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
*/
55
var AbstractPlugin = require("../AbstractPlugin");
66
var AMDRequireItemDependency = require("./AMDRequireItemDependency");
7+
var AMDRequireContextDependency = require("./AMDRequireContextDependency");
78
var ConstDependency = require("./ConstDependency");
89
var AMDDefineDependency = require("./AMDDefineDependency");
10+
var ContextDependencyHelpers = require("./ContextDependencyHelpers");
911

1012
module.exports = AbstractPlugin.create({
1113
"call define": function(expr) {
@@ -51,7 +53,7 @@ module.exports = AbstractPlugin.create({
5153
param.items.forEach(function(param) {
5254
var result = this.applyPluginsBailResult("call define:amd:item", expr, param);
5355
if(result === undefined) {
54-
// TODO: context
56+
this.applyPluginsBailResult("call define:amd:context", expr, param);
5557
}
5658
}, this);
5759
}
@@ -77,7 +79,7 @@ module.exports = AbstractPlugin.create({
7779
param.options.forEach(function(param) {
7880
var result = this.applyPluginsBailResult("call define:amd:item", expr, param);
7981
if(result === undefined) {
80-
// TODO: context
82+
this.applyPluginsBailResult("call define:amd:context", expr, param);
8183
}
8284
}, this);
8385
return true;
@@ -93,6 +95,14 @@ module.exports = AbstractPlugin.create({
9395
this.state.current.addDependency(dep);
9496
return true;
9597
}
98+
},
99+
"call define:amd:context": function(expr, param) {
100+
var dep = ContextDependencyHelpers.create(AMDRequireContextDependency, param.range, param, expr);
101+
if(!dep) return;
102+
dep.loc = expr.loc;
103+
dep.optional = !!this.scope.inTry;
104+
this.state.current.addDependency(dep);
105+
return true;
96106
}
97107
});
98108

lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ module.exports = AbstractPlugin.create({
9393
param.options.forEach(function(param) {
9494
var result = this.applyPluginsBailResult("call require:amd:item", expr, param);
9595
if(result === undefined) {
96-
// TODO: context
96+
this.applyPluginsBailResult("call require:amd:context", expr, param);
9797
}
9898
}, this);
9999
return true;

lib/dependencies/CommonJsPlugin.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
var CommonJsRequireDependency = require("./CommonJsRequireDependency");
66
var CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
77
var RequireResolveDependency = require("./RequireResolveDependency");
8+
var RequireResolveContextDependency = require("./RequireResolveContextDependency");
89
var RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
910

1011
var NullFactory = require("../NullFactory");
@@ -32,6 +33,9 @@ CommonJsPlugin.prototype.apply = function(compiler) {
3233
compilation.dependencyFactories.set(RequireResolveDependency, normalModuleFactory);
3334
compilation.dependencyTemplates.set(RequireResolveDependency, new RequireResolveDependency.Template());
3435

36+
compilation.dependencyFactories.set(RequireResolveContextDependency, contextModuleFactory);
37+
compilation.dependencyTemplates.set(RequireResolveContextDependency, new RequireResolveContextDependency.Template());
38+
3539
compilation.dependencyFactories.set(RequireResolveHeaderDependency, new NullFactory());
3640
compilation.dependencyTemplates.set(RequireResolveHeaderDependency, new RequireResolveHeaderDependency.Template());
3741
});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
function ContextDependencyTemplateAsId() {}
6+
module.exports = ContextDependencyTemplateAsId;
7+
8+
ContextDependencyTemplateAsId.prototype.apply = function(dep, source, outputOptions, requestShortener) {
9+
var comment = "";
10+
if(outputOptions.pathinfo) comment = "/*! " + requestShortener.shorten(dep.request) + " */ ";
11+
if(dep.module) {
12+
if(dep.valueRange) {
13+
source.replace(dep.valueRange[1], dep.range[1]-1, ")");
14+
source.replace(dep.range[0], dep.valueRange[0]-1, "require(" + comment + dep.module.id + ").resolve(" + (typeof dep.prepend == "string" ? JSON.stringify(dep.prepend) : "") + "");
15+
} else {
16+
source.replace(dep.range[0], dep.range[1]-1, "require(" + comment + dep.module.id + ").resolve");
17+
}
18+
} else {
19+
var content = "(function webpackMissingModule() { throw new Error(" + JSON.stringify("Cannot find module \"" + dep.request + "\"") + "); }())";
20+
source.replace(dep.range[0], dep.range[1]-1, content);
21+
}
22+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var ContextDependency = require("./ContextDependency");
6+
7+
function RequireResolveContextDependency(request, recursive, regExp, range, valueRange) {
8+
ContextDependency.call(this, request, recursive, regExp);
9+
this.range = range;
10+
this.valueRange = valueRange;
11+
this.Class = RequireResolveContextDependency;
12+
}
13+
module.exports = RequireResolveContextDependency;
14+
15+
RequireResolveContextDependency.prototype = Object.create(ContextDependency.prototype);
16+
RequireResolveContextDependency.prototype.type = "amd require context";
17+
18+
RequireResolveContextDependency.Template = require("./ContextDependencyTemplateAsId");

lib/dependencies/RequireResolveDependencyParserPlugin.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
*/
55
var AbstractPlugin = require("../AbstractPlugin");
66
var RequireResolveDependency = require("./RequireResolveDependency");
7+
var RequireResolveContextDependency = require("./RequireResolveContextDependency");
78
var RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
9+
var ContextDependencyHelpers = require("./ContextDependencyHelpers");
810

911
module.exports = AbstractPlugin.create({
1012
"call require.resolve": function(expr) {
@@ -14,15 +16,15 @@ module.exports = AbstractPlugin.create({
1416
param.options.forEach(function(option) {
1517
var result = this.applyPluginsBailResult("call require.resolve:item", expr, option);
1618
if(result === undefined) {
17-
// TODO: context
19+
this.applyPluginsBailResult("call require.resolve:context", expr, option);
1820
}
1921
}, this);
2022
this.state.current.addDependency(new RequireResolveHeaderDependency(expr.callee.range));
2123
return true;
2224
} else {
2325
var result = this.applyPluginsBailResult("call require.resolve:item", expr, param);
2426
if(result === undefined) {
25-
// TODO: context
27+
this.applyPluginsBailResult("call require.resolve:context", expr, param);
2628
}
2729
this.state.current.addDependency(new RequireResolveHeaderDependency(expr.callee.range));
2830
return true;
@@ -36,6 +38,14 @@ module.exports = AbstractPlugin.create({
3638
this.state.current.addDependency(dep);
3739
return true;
3840
}
41+
},
42+
"call require.resolve:context": function(expr, param) {
43+
var dep = ContextDependencyHelpers.create(RequireResolveContextDependency, param.range, param, expr);
44+
if(!dep) return;
45+
dep.loc = expr.loc;
46+
dep.optional = !!this.scope.inTry;
47+
this.state.current.addDependency(dep);
48+
return true;
3949
}
4050
});
4151

test/browsertest/lib/index.web.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ describe("main", function() {
167167
require("raw!../resources/" + abc + ".txt").should.be.eql("abc");
168168
});
169169

170+
it("should be able to require.resolve with automatical context", function() {
171+
var template = "tmpl";
172+
require.resolve("../templates/" + template).should.be.eql(require.resolve("../templates/tmpl"));
173+
});
174+
170175
it("should resolve loaders relative to require", function() {
171176
var index = "index", test = "test";
172177
require("../loaders/queryloader?query!!!!../node_modules/subcontent/" + index + ".js").should.be.eql({

0 commit comments

Comments
 (0)