Skip to content

Commit 85af275

Browse files
committed
Merge pull request webpack#745 from wbinnssmith/wbinnssmith/resolve-named-amd-deps-relatively
Resolves webpack#727: Resolve AMD module dependencies relative to named modules being defined
2 parents e75019a + 6230c4f commit 85af275

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

lib/dependencies/AMDDefineDependencyParserPlugin.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ AMDDefineDependencyParserPlugin.prototype.apply = function(parser) {
106106
if(array) {
107107
var identifiers = {};
108108
var param = this.evaluateExpression(array);
109-
var result = this.applyPluginsBailResult("call define:amd:array", expr, param, identifiers);
109+
var result = this.applyPluginsBailResult("call define:amd:array", expr, param, identifiers, namedModule);
110110
if(!result) return;
111111
if(fnParams) fnParams = fnParams.slice(fnParamsOffset).filter(function(param, idx) {
112112
if(identifiers[idx]) {
@@ -160,12 +160,12 @@ AMDDefineDependencyParserPlugin.prototype.apply = function(parser) {
160160
this.state.current.addDependency(dep);
161161
return true;
162162
});
163-
parser.plugin("call define:amd:array", function(expr, param, identifiers) {
163+
parser.plugin("call define:amd:array", function(expr, param, identifiers, namedModule) {
164164
if(param.isArray()) {
165165
param.items.forEach(function(param, idx) {
166166
if(param.isString() && ["require", "module", "exports"].indexOf(param.string) >= 0)
167167
identifiers[idx] = param.string;
168-
var result = this.applyPluginsBailResult("call define:amd:item", expr, param);
168+
var result = this.applyPluginsBailResult("call define:amd:item", expr, param, namedModule);
169169
if(result === undefined) {
170170
this.applyPluginsBailResult("call define:amd:context", expr, param);
171171
}
@@ -200,7 +200,7 @@ AMDDefineDependencyParserPlugin.prototype.apply = function(parser) {
200200
return true;
201201
}
202202
});
203-
parser.plugin("call define:amd:item", function(expr, param) {
203+
parser.plugin("call define:amd:item", function(expr, param, namedModule) {
204204
if(param.isConditional()) {
205205
param.options.forEach(function(param) {
206206
var result = this.applyPluginsBailResult("call define:amd:item", expr, param);
@@ -215,7 +215,7 @@ AMDDefineDependencyParserPlugin.prototype.apply = function(parser) {
215215
dep = new ConstDependency("__webpack_require__", param.range);
216216
} else if(["require", "exports", "module"].indexOf(param.string) >= 0) {
217217
dep = new ConstDependency(param.string, param.range);
218-
} else if(localModule = LocalModulesHelpers.getLocalModule(this.state, param.string)) {
218+
} else if(localModule = LocalModulesHelpers.getLocalModule(this.state, param.string, namedModule)) {
219219
dep = new LocalModuleDependency(localModule, param.range);
220220
} else {
221221
dep = new AMDRequireItemDependency(param.string, param.range);

lib/dependencies/LocalModulesHelpers.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,32 @@ LocalModulesHelpers.addLocalModule = function(state, name) {
1313
return m;
1414
};
1515

16-
LocalModulesHelpers.getLocalModule = function(state, name) {
16+
LocalModulesHelpers.getLocalModule = function(state, name, namedModule) {
1717
if(!state.localModules) return null;
18+
if(namedModule) {
19+
// resolve dependency name relative to the defining named module
20+
name = lookup(namedModule, name);
21+
}
1822
for(var i = 0; i < state.localModules.length; i++) {
1923
if(state.localModules[i].name === name)
2024
return state.localModules[i];
2125
}
2226
return null;
2327
};
28+
29+
function lookup(parent, mod) {
30+
if ('.' != mod.charAt(0)) return mod;
31+
32+
var path = parent.split('/')
33+
, segs = mod.split('/');
34+
path.pop();
35+
36+
for (var i = 0; i < segs.length; i++) {
37+
var seg = segs[i];
38+
if ('..' == seg) path.pop();
39+
else if ('.' != seg) path.push(seg);
40+
}
41+
42+
return path.join('/');
43+
}
44+

test/cases/parsing/local-modules/index.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,18 @@ it("should define and require a local module with deps", function() {
4141
require("my-module3").should.be.eql(1234);
4242
require("my-module4").should.be.eql(2345);
4343
});
44+
45+
it("should define and require a local module that is relative", function () {
46+
define("my-dir/my-module3", function() {
47+
return 1234;
48+
});
49+
define("my-dir/my-other-dir/my-module4", function() {
50+
return 2345;
51+
});
52+
define("my-dir/my-other-dir/my-module5", ["./my-module4", "../my-module3"], function(myModule4, myModule3) {
53+
myModule3.should.be.eql(1234);
54+
myModule4.should.be.eql(2345);
55+
return 3456;
56+
});
57+
require("my-dir/my-other-dir/my-module5").should.be.eql(3456);
58+
})

0 commit comments

Comments
 (0)