Skip to content

Commit dccd862

Browse files
committed
fix for local modules
1 parent 9a8095e commit dccd862

File tree

3 files changed

+22
-11
lines changed

3 files changed

+22
-11
lines changed

lib/dependencies/CommonJsRequireDependencyParserPlugin.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class CommonJsRequireDependencyParserPlugin {
7474
return true;
7575
});
7676

77-
const handler = expr => {
77+
const createHandler = ({ callNew = false }) => expr => {
7878
if (expr.arguments.length !== 1) return;
7979
let localModule;
8080
const param = parser.evaluateExpression(expr.arguments[0]);
@@ -103,7 +103,7 @@ class CommonJsRequireDependencyParserPlugin {
103103
param.string
104104
))
105105
) {
106-
const dep = new LocalModuleDependency(localModule, expr.range);
106+
const dep = new LocalModuleDependency(localModule, expr.range, callNew);
107107
dep.loc = expr.loc;
108108
parser.state.current.addDependency(dep);
109109
return true;
@@ -121,10 +121,10 @@ class CommonJsRequireDependencyParserPlugin {
121121
};
122122
parser.hooks.call
123123
.for("require")
124-
.tap("CommonJsRequireDependencyParserPlugin", handler);
124+
.tap("CommonJsRequireDependencyParserPlugin", createHandler({ callNew: false }));
125125
parser.hooks.new
126126
.for("require")
127-
.tap("CommonJsRequireDependencyParserPlugin", handler);
127+
.tap("CommonJsRequireDependencyParserPlugin", createHandler({ callNew: false }));
128128
}
129129
}
130130
module.exports = CommonJsRequireDependencyParserPlugin;

lib/dependencies/LocalModuleDependency.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,31 @@
66
const NullDependency = require("./NullDependency");
77

88
class LocalModuleDependency extends NullDependency {
9-
constructor(localModule, range) {
9+
constructor(localModule, range, callNew) {
1010
super();
1111
localModule.flagUsed();
1212
this.localModule = localModule;
1313
this.range = range;
14+
this.callNew = callNew;
1415
}
1516
}
1617

1718
LocalModuleDependency.Template = class LocalModuleDependencyTemplate {
1819
apply(dep, source) {
1920
if (!dep.range) return;
20-
source.replace(
21-
dep.range[0],
22-
dep.range[1] - 1,
23-
dep.localModule.variableName()
24-
);
21+
if (dep.callNew) {
22+
source.replace(
23+
dep.range[0],
24+
dep.range[1] - 1,
25+
`new (function () { return ${dep.localModule.variableName()}; })()`
26+
);
27+
} else {
28+
source.replace(
29+
dep.range[0],
30+
dep.range[1] - 1,
31+
dep.localModule.variableName()
32+
);
33+
}
2534
}
2635
};
2736

test/cases/parsing/issue-4940/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ it("should create dependency with 'new' on a local dependency (object export)",
3737

3838
it("shouldn't fail with a local dependency (non-object export)", function() {
3939
const sideEffect = require("local-side-effect");
40-
new require("local-module-non-object");
40+
const result = new require("local-module-non-object");
41+
result.should.not.equal(1);
4142
sideEffect.foo.should.equal("bar");
43+
result.should.not.equal(require("local-module-non-object"));
4244
});
4345

4446
it("should work with 'require' in parentheses", function () {

0 commit comments

Comments
 (0)