Skip to content

Commit

Permalink
fix(42765): require should not work in ts files (#42792)
Browse files Browse the repository at this point in the history
* add failing test

* fix(42765): require should not work in ts files
  • Loading branch information
Zzzen committed Mar 2, 2021
1 parent 0b337f1 commit 3d1c6e8
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 12 deletions.
25 changes: 13 additions & 12 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3144,18 +3144,19 @@ namespace ts {
else if (namespace === unknownSymbol) {
return namespace;
}
if (isInJSFile(name)) {
if (namespace.valueDeclaration &&
isVariableDeclaration(namespace.valueDeclaration) &&
namespace.valueDeclaration.initializer &&
isCommonJsRequire(namespace.valueDeclaration.initializer)) {
const moduleName = (namespace.valueDeclaration.initializer as CallExpression).arguments[0] as StringLiteral;
const moduleSym = resolveExternalModuleName(moduleName, moduleName);
if (moduleSym) {
const resolvedModuleSymbol = resolveExternalModuleSymbol(moduleSym);
if (resolvedModuleSymbol) {
namespace = resolvedModuleSymbol;
}
if (
namespace.valueDeclaration &&
isInJSFile(namespace.valueDeclaration) &&
isVariableDeclaration(namespace.valueDeclaration) &&
namespace.valueDeclaration.initializer &&
isCommonJsRequire(namespace.valueDeclaration.initializer)
) {
const moduleName = (namespace.valueDeclaration.initializer as CallExpression).arguments[0] as StringLiteral;
const moduleSym = resolveExternalModuleName(moduleName, moduleName);
if (moduleSym) {
const resolvedModuleSymbol = resolveExternalModuleSymbol(moduleSym);
if (resolvedModuleSymbol) {
namespace = resolvedModuleSymbol;
}
}
}
Expand Down
26 changes: 26 additions & 0 deletions tests/baselines/reference/resolveNameWithNamspace.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//// [tests/cases/compiler/resolveNameWithNamspace.ts] ////

//// [node.d.ts]
declare function require(moduleName: string): any;

declare module "assert" {
export function equal(actual: any, expected: any, message?: string | Error): void;
}

//// [ns.ts]
/// <reference path="node.d.ts"/>
namespace myAssert {
export type cool = 'cool'
}
var myAssert = require('assert')

//// [app.js]
exports.equal = myAssert.equal
exports.equal()

//// [ns.js]
/// <reference path="node.d.ts"/>
var myAssert = require('assert');
//// [app.js]
exports.equal = myAssert.equal;
exports.equal();
40 changes: 40 additions & 0 deletions tests/baselines/reference/resolveNameWithNamspace.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
=== tests/cases/compiler/node.d.ts ===
declare function require(moduleName: string): any;
>require : Symbol(require, Decl(node.d.ts, 0, 0))
>moduleName : Symbol(moduleName, Decl(node.d.ts, 0, 25))

declare module "assert" {
>"assert" : Symbol("assert", Decl(node.d.ts, 0, 50))

export function equal(actual: any, expected: any, message?: string | Error): void;
>equal : Symbol(equal, Decl(node.d.ts, 2, 25))
>actual : Symbol(actual, Decl(node.d.ts, 3, 26))
>expected : Symbol(expected, Decl(node.d.ts, 3, 38))
>message : Symbol(message, Decl(node.d.ts, 3, 53))
>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
}

=== tests/cases/compiler/ns.ts ===
/// <reference path="node.d.ts"/>
namespace myAssert {
>myAssert : Symbol(myAssert, Decl(ns.ts, 0, 0), Decl(ns.ts, 4, 3))

export type cool = 'cool'
>cool : Symbol(cool, Decl(ns.ts, 1, 20))
}
var myAssert = require('assert')
>myAssert : Symbol(myAssert, Decl(ns.ts, 0, 0), Decl(ns.ts, 4, 3))
>require : Symbol(require, Decl(node.d.ts, 0, 0))

=== tests/cases/compiler/app.js ===
exports.equal = myAssert.equal
>exports.equal : Symbol(equal, Decl(app.js, 0, 0))
>exports : Symbol(equal, Decl(app.js, 0, 0))
>equal : Symbol(equal, Decl(app.js, 0, 0))
>myAssert : Symbol(myAssert, Decl(ns.ts, 0, 0), Decl(ns.ts, 4, 3))

exports.equal()
>exports.equal : Symbol(equal, Decl(app.js, 0, 0))
>exports : Symbol("tests/cases/compiler/app", Decl(app.js, 0, 0))
>equal : Symbol(equal, Decl(app.js, 0, 0))

43 changes: 43 additions & 0 deletions tests/baselines/reference/resolveNameWithNamspace.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
=== tests/cases/compiler/node.d.ts ===
declare function require(moduleName: string): any;
>require : (moduleName: string) => any
>moduleName : string

declare module "assert" {
>"assert" : typeof import("assert")

export function equal(actual: any, expected: any, message?: string | Error): void;
>equal : (actual: any, expected: any, message?: string | Error) => void
>actual : any
>expected : any
>message : string | Error
}

=== tests/cases/compiler/ns.ts ===
/// <reference path="node.d.ts"/>
namespace myAssert {
export type cool = 'cool'
>cool : "cool"
}
var myAssert = require('assert')
>myAssert : any
>require('assert') : any
>require : (moduleName: string) => any
>'assert' : "assert"

=== tests/cases/compiler/app.js ===
exports.equal = myAssert.equal
>exports.equal = myAssert.equal : any
>exports.equal : error
>exports : typeof import("tests/cases/compiler/app")
>equal : any
>myAssert.equal : any
>myAssert : any
>equal : any

exports.equal()
>exports.equal() : error
>exports.equal : error
>exports : typeof import("tests/cases/compiler/app")
>equal : any

21 changes: 21 additions & 0 deletions tests/cases/compiler/resolveNameWithNamspace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// @module: commonjs
// @allowJs: true
// @outDir: ./out/

// @filename: node.d.ts
declare function require(moduleName: string): any;

declare module "assert" {
export function equal(actual: any, expected: any, message?: string | Error): void;
}

// @filename: ns.ts
/// <reference path="node.d.ts"/>
namespace myAssert {
export type cool = 'cool'
}
var myAssert = require('assert')

// @filename: app.js
exports.equal = myAssert.equal
exports.equal()

0 comments on commit 3d1c6e8

Please sign in to comment.