Skip to content

Commit 3d1c6e8

Browse files
authored
fix(42765): require should not work in ts files (#42792)
* add failing test * fix(42765): require should not work in ts files
1 parent 0b337f1 commit 3d1c6e8

File tree

5 files changed

+143
-12
lines changed

5 files changed

+143
-12
lines changed

src/compiler/checker.ts

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3144,18 +3144,19 @@ namespace ts {
31443144
else if (namespace === unknownSymbol) {
31453145
return namespace;
31463146
}
3147-
if (isInJSFile(name)) {
3148-
if (namespace.valueDeclaration &&
3149-
isVariableDeclaration(namespace.valueDeclaration) &&
3150-
namespace.valueDeclaration.initializer &&
3151-
isCommonJsRequire(namespace.valueDeclaration.initializer)) {
3152-
const moduleName = (namespace.valueDeclaration.initializer as CallExpression).arguments[0] as StringLiteral;
3153-
const moduleSym = resolveExternalModuleName(moduleName, moduleName);
3154-
if (moduleSym) {
3155-
const resolvedModuleSymbol = resolveExternalModuleSymbol(moduleSym);
3156-
if (resolvedModuleSymbol) {
3157-
namespace = resolvedModuleSymbol;
3158-
}
3147+
if (
3148+
namespace.valueDeclaration &&
3149+
isInJSFile(namespace.valueDeclaration) &&
3150+
isVariableDeclaration(namespace.valueDeclaration) &&
3151+
namespace.valueDeclaration.initializer &&
3152+
isCommonJsRequire(namespace.valueDeclaration.initializer)
3153+
) {
3154+
const moduleName = (namespace.valueDeclaration.initializer as CallExpression).arguments[0] as StringLiteral;
3155+
const moduleSym = resolveExternalModuleName(moduleName, moduleName);
3156+
if (moduleSym) {
3157+
const resolvedModuleSymbol = resolveExternalModuleSymbol(moduleSym);
3158+
if (resolvedModuleSymbol) {
3159+
namespace = resolvedModuleSymbol;
31593160
}
31603161
}
31613162
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//// [tests/cases/compiler/resolveNameWithNamspace.ts] ////
2+
3+
//// [node.d.ts]
4+
declare function require(moduleName: string): any;
5+
6+
declare module "assert" {
7+
export function equal(actual: any, expected: any, message?: string | Error): void;
8+
}
9+
10+
//// [ns.ts]
11+
/// <reference path="node.d.ts"/>
12+
namespace myAssert {
13+
export type cool = 'cool'
14+
}
15+
var myAssert = require('assert')
16+
17+
//// [app.js]
18+
exports.equal = myAssert.equal
19+
exports.equal()
20+
21+
//// [ns.js]
22+
/// <reference path="node.d.ts"/>
23+
var myAssert = require('assert');
24+
//// [app.js]
25+
exports.equal = myAssert.equal;
26+
exports.equal();
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
=== tests/cases/compiler/node.d.ts ===
2+
declare function require(moduleName: string): any;
3+
>require : Symbol(require, Decl(node.d.ts, 0, 0))
4+
>moduleName : Symbol(moduleName, Decl(node.d.ts, 0, 25))
5+
6+
declare module "assert" {
7+
>"assert" : Symbol("assert", Decl(node.d.ts, 0, 50))
8+
9+
export function equal(actual: any, expected: any, message?: string | Error): void;
10+
>equal : Symbol(equal, Decl(node.d.ts, 2, 25))
11+
>actual : Symbol(actual, Decl(node.d.ts, 3, 26))
12+
>expected : Symbol(expected, Decl(node.d.ts, 3, 38))
13+
>message : Symbol(message, Decl(node.d.ts, 3, 53))
14+
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
15+
}
16+
17+
=== tests/cases/compiler/ns.ts ===
18+
/// <reference path="node.d.ts"/>
19+
namespace myAssert {
20+
>myAssert : Symbol(myAssert, Decl(ns.ts, 0, 0), Decl(ns.ts, 4, 3))
21+
22+
export type cool = 'cool'
23+
>cool : Symbol(cool, Decl(ns.ts, 1, 20))
24+
}
25+
var myAssert = require('assert')
26+
>myAssert : Symbol(myAssert, Decl(ns.ts, 0, 0), Decl(ns.ts, 4, 3))
27+
>require : Symbol(require, Decl(node.d.ts, 0, 0))
28+
29+
=== tests/cases/compiler/app.js ===
30+
exports.equal = myAssert.equal
31+
>exports.equal : Symbol(equal, Decl(app.js, 0, 0))
32+
>exports : Symbol(equal, Decl(app.js, 0, 0))
33+
>equal : Symbol(equal, Decl(app.js, 0, 0))
34+
>myAssert : Symbol(myAssert, Decl(ns.ts, 0, 0), Decl(ns.ts, 4, 3))
35+
36+
exports.equal()
37+
>exports.equal : Symbol(equal, Decl(app.js, 0, 0))
38+
>exports : Symbol("tests/cases/compiler/app", Decl(app.js, 0, 0))
39+
>equal : Symbol(equal, Decl(app.js, 0, 0))
40+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
=== tests/cases/compiler/node.d.ts ===
2+
declare function require(moduleName: string): any;
3+
>require : (moduleName: string) => any
4+
>moduleName : string
5+
6+
declare module "assert" {
7+
>"assert" : typeof import("assert")
8+
9+
export function equal(actual: any, expected: any, message?: string | Error): void;
10+
>equal : (actual: any, expected: any, message?: string | Error) => void
11+
>actual : any
12+
>expected : any
13+
>message : string | Error
14+
}
15+
16+
=== tests/cases/compiler/ns.ts ===
17+
/// <reference path="node.d.ts"/>
18+
namespace myAssert {
19+
export type cool = 'cool'
20+
>cool : "cool"
21+
}
22+
var myAssert = require('assert')
23+
>myAssert : any
24+
>require('assert') : any
25+
>require : (moduleName: string) => any
26+
>'assert' : "assert"
27+
28+
=== tests/cases/compiler/app.js ===
29+
exports.equal = myAssert.equal
30+
>exports.equal = myAssert.equal : any
31+
>exports.equal : error
32+
>exports : typeof import("tests/cases/compiler/app")
33+
>equal : any
34+
>myAssert.equal : any
35+
>myAssert : any
36+
>equal : any
37+
38+
exports.equal()
39+
>exports.equal() : error
40+
>exports.equal : error
41+
>exports : typeof import("tests/cases/compiler/app")
42+
>equal : any
43+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// @module: commonjs
2+
// @allowJs: true
3+
// @outDir: ./out/
4+
5+
// @filename: node.d.ts
6+
declare function require(moduleName: string): any;
7+
8+
declare module "assert" {
9+
export function equal(actual: any, expected: any, message?: string | Error): void;
10+
}
11+
12+
// @filename: ns.ts
13+
/// <reference path="node.d.ts"/>
14+
namespace myAssert {
15+
export type cool = 'cool'
16+
}
17+
var myAssert = require('assert')
18+
19+
// @filename: app.js
20+
exports.equal = myAssert.equal
21+
exports.equal()

0 commit comments

Comments
 (0)