Skip to content

Commit 28452d5

Browse files
authored
Merge pull request microsoft#11370 from Microsoft/requireAsFunctionInExternalModule
Do not treat local resolution of require call as external module
2 parents 722e723 + e72414e commit 28452d5

6 files changed

Lines changed: 128 additions & 2 deletions

File tree

src/compiler/binder.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2072,7 +2072,9 @@ namespace ts {
20722072
function setCommonJsModuleIndicator(node: Node) {
20732073
if (!file.commonJsModuleIndicator) {
20742074
file.commonJsModuleIndicator = node;
2075-
bindSourceFileAsExternalModule();
2075+
if (!file.externalModuleIndicator) {
2076+
bindSourceFileAsExternalModule();
2077+
}
20762078
}
20772079
}
20782080

src/compiler/checker.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12791,7 +12791,10 @@ namespace ts {
1279112791
}
1279212792

1279312793
// In JavaScript files, calls to any identifier 'require' are treated as external module imports
12794-
if (isInJavaScriptFile(node) && isRequireCall(node, /*checkArgumentIsStringLiteral*/true)) {
12794+
if (isInJavaScriptFile(node) &&
12795+
isRequireCall(node, /*checkArgumentIsStringLiteral*/true) &&
12796+
// Make sure require is not a local function
12797+
!resolveName(node.expression, (<Identifier>node.expression).text, SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined)) {
1279512798
return resolveExternalModuleTypeByLiteral(<StringLiteral>node.arguments[0]);
1279612799
}
1279712800

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//// [tests/cases/compiler/requireAsFunctionInExternalModule.ts] ////
2+
3+
//// [c.js]
4+
export default function require(a) { }
5+
export function has(a) { return true }
6+
7+
//// [m.js]
8+
import require, { has } from "./c"
9+
export function hello() { }
10+
if (has('ember-debug')) {
11+
require('ember-debug');
12+
}
13+
14+
//// [m2.ts]
15+
import { hello } from "./m";
16+
hello();
17+
18+
19+
//// [c.js]
20+
"use strict";
21+
function require(a) { }
22+
exports.__esModule = true;
23+
exports["default"] = require;
24+
function has(a) { return true; }
25+
exports.has = has;
26+
//// [m.js]
27+
"use strict";
28+
var c_1 = require("./c");
29+
function hello() { }
30+
exports.hello = hello;
31+
if (c_1.has('ember-debug')) {
32+
c_1["default"]('ember-debug');
33+
}
34+
//// [m2.js]
35+
"use strict";
36+
var m_1 = require("./m");
37+
m_1.hello();
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
=== tests/cases/compiler/c.js ===
2+
export default function require(a) { }
3+
>require : Symbol(require, Decl(c.js, 0, 0))
4+
>a : Symbol(a, Decl(c.js, 0, 32))
5+
6+
export function has(a) { return true }
7+
>has : Symbol(has, Decl(c.js, 0, 38))
8+
>a : Symbol(a, Decl(c.js, 1, 20))
9+
10+
=== tests/cases/compiler/m.js ===
11+
import require, { has } from "./c"
12+
>require : Symbol(require, Decl(m.js, 0, 6))
13+
>has : Symbol(has, Decl(m.js, 0, 17))
14+
15+
export function hello() { }
16+
>hello : Symbol(hello, Decl(m.js, 0, 34))
17+
18+
if (has('ember-debug')) {
19+
>has : Symbol(has, Decl(m.js, 0, 17))
20+
21+
require('ember-debug');
22+
>require : Symbol(require, Decl(m.js, 0, 6))
23+
}
24+
25+
=== tests/cases/compiler/m2.ts ===
26+
import { hello } from "./m";
27+
>hello : Symbol(hello, Decl(m2.ts, 0, 8))
28+
29+
hello();
30+
>hello : Symbol(hello, Decl(m2.ts, 0, 8))
31+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
=== tests/cases/compiler/c.js ===
2+
export default function require(a) { }
3+
>require : (a: any) => void
4+
>a : any
5+
6+
export function has(a) { return true }
7+
>has : (a: any) => boolean
8+
>a : any
9+
>true : true
10+
11+
=== tests/cases/compiler/m.js ===
12+
import require, { has } from "./c"
13+
>require : (a: any) => void
14+
>has : (a: any) => boolean
15+
16+
export function hello() { }
17+
>hello : () => void
18+
19+
if (has('ember-debug')) {
20+
>has('ember-debug') : boolean
21+
>has : (a: any) => boolean
22+
>'ember-debug' : "ember-debug"
23+
24+
require('ember-debug');
25+
>require('ember-debug') : void
26+
>require : (a: any) => void
27+
>'ember-debug' : "ember-debug"
28+
}
29+
30+
=== tests/cases/compiler/m2.ts ===
31+
import { hello } from "./m";
32+
>hello : () => void
33+
34+
hello();
35+
>hello() : void
36+
>hello : () => void
37+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// @allowjs: true
2+
// @outDir: dist
3+
// @Filename: c.js
4+
export default function require(a) { }
5+
export function has(a) { return true }
6+
7+
// @Filename: m.js
8+
import require, { has } from "./c"
9+
export function hello() { }
10+
if (has('ember-debug')) {
11+
require('ember-debug');
12+
}
13+
14+
// @Filename: m2.ts
15+
import { hello } from "./m";
16+
hello();

0 commit comments

Comments
 (0)