Skip to content

Commit 3661b66

Browse files
committed
add extra argument to 'isRequireCall' to check if argument is string literal
1 parent 2ef6f13 commit 3661b66

8 files changed

Lines changed: 48 additions & 5 deletions

File tree

src/compiler/binder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1462,7 +1462,7 @@ namespace ts {
14621462
function bindCallExpression(node: CallExpression) {
14631463
// We're only inspecting call expressions to detect CommonJS modules, so we can skip
14641464
// this check if we've already seen the module indicator
1465-
if (!file.commonJsModuleIndicator && isRequireCall(node)) {
1465+
if (!file.commonJsModuleIndicator && isRequireCall(node, /*checkArgumentIsStringLiteral*/false)) {
14661466
setCommonJsModuleIndicator(node);
14671467
}
14681468
}

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10239,7 +10239,7 @@ namespace ts {
1023910239
}
1024010240

1024110241
// In JavaScript files, calls to any identifier 'require' are treated as external module imports
10242-
if (isInJavaScriptFile(node) && isRequireCall(node)) {
10242+
if (isInJavaScriptFile(node) && isRequireCall(node, /*checkArgumentIsStringLiteral*/true)) {
1024310243
return resolveExternalModuleTypeByLiteral(<StringLiteral>node.arguments[0]);
1024410244
}
1024510245

src/compiler/program.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1328,7 +1328,7 @@ namespace ts {
13281328
}
13291329

13301330
function collectRequireCalls(node: Node): void {
1331-
if (isRequireCall(node)) {
1331+
if (isRequireCall(node, /*checkArgumentIsStringLiteral*/true)) {
13321332
(imports || (imports = [])).push(<StringLiteral>(<CallExpression>node).arguments[0]);
13331333
}
13341334
else {

src/compiler/utilities.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,12 +1086,13 @@ namespace ts {
10861086
* exactly one argument.
10871087
* This function does not test if the node is in a JavaScript file or not.
10881088
*/
1089-
export function isRequireCall(expression: Node): expression is CallExpression {
1089+
export function isRequireCall(expression: Node, checkArgumentIsStringLiteral: boolean): expression is CallExpression {
10901090
// of the form 'require("name")'
1091-
return expression.kind === SyntaxKind.CallExpression &&
1091+
const isRequire = expression.kind === SyntaxKind.CallExpression &&
10921092
(<CallExpression>expression).expression.kind === SyntaxKind.Identifier &&
10931093
(<Identifier>(<CallExpression>expression).expression).text === "require" &&
10941094
(<CallExpression>expression).arguments.length === 1;
1095+
return isRequire && (!checkArgumentIsStringLiteral || (<CallExpression>expression).arguments[0].kind === SyntaxKind.StringLiteral);
10951096
}
10961097

10971098
/// Given a BinaryExpression, returns SpecialPropertyAssignmentKind for the various kinds of property
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//// [a.js]
2+
3+
function foo(name) {
4+
var s = require("t/" + name)
5+
}
6+
7+
//// [a_out.js]
8+
function foo(name) {
9+
var s = require("t/" + name);
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
=== tests/cases/compiler/a.js ===
2+
3+
function foo(name) {
4+
>foo : Symbol(foo, Decl(a.js, 0, 0))
5+
>name : Symbol(name, Decl(a.js, 1, 13))
6+
7+
var s = require("t/" + name)
8+
>s : Symbol(s, Decl(a.js, 2, 7))
9+
>name : Symbol(name, Decl(a.js, 1, 13))
10+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
=== tests/cases/compiler/a.js ===
2+
3+
function foo(name) {
4+
>foo : (name: any) => void
5+
>name : any
6+
7+
var s = require("t/" + name)
8+
>s : any
9+
>require("t/" + name) : any
10+
>require : any
11+
>"t/" + name : string
12+
>"t/" : string
13+
>name : any
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @allowJs: true
2+
// @module: amd
3+
// @out: a_out.js
4+
5+
// @filename: a.js
6+
function foo(name) {
7+
var s = require("t/" + name)
8+
}

0 commit comments

Comments
 (0)