Skip to content

Check for require when binding commonjs #50130

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/compiler/binder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3260,6 +3260,7 @@ namespace ts {
if (isInJSFile(node) &&
isVariableDeclarationInitializedToBareOrAccessedRequire(possibleVariableDecl) &&
!getJSDocTypeTag(node) &&
!(lookupSymbolForName(container, "require" as __String) && file.externalModuleIndicator) &&
!(getCombinedModifierFlags(node) & ModifierFlags.Export)
) {
declareSymbolAndAddToSymbolTable(node as Declaration, SymbolFlags.Alias, SymbolFlags.AliasExcludes);
Expand Down
42 changes: 42 additions & 0 deletions tests/baselines/reference/requireAsDeclaredFunction.errors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
tests/cases/conformance/salsa/first.js(5,10): error TS2441: Duplicate identifier 'require'. Compiler reserves name 'require' in top level scope of a module.
tests/cases/conformance/salsa/global.js(5,10): error TS2441: Duplicate identifier 'require'. Compiler reserves name 'require' in top level scope of a module.
tests/cases/conformance/salsa/global.js(6,28): error TS2307: Cannot find module 'google-closure-compiler' or its corresponding type declarations.
tests/cases/conformance/salsa/last.js(6,10): error TS2441: Duplicate identifier 'require'. Compiler reserves name 'require' in top level scope of a module.


==== tests/cases/conformance/salsa/first.js (1 errors) ====
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
~~~~~~~
!!! error TS2441: Duplicate identifier 'require'. Compiler reserves name 'require' in top level scope of a module.
const someModule = require("google-closure-compiler");
export {someModule};
==== tests/cases/conformance/salsa/last.js (1 errors) ====
const someModule = require("google-closure-compiler");
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
~~~~~~~
!!! error TS2441: Duplicate identifier 'require'. Compiler reserves name 'require' in top level scope of a module.
export {someModule};
==== tests/cases/conformance/salsa/global.js (2 errors) ====
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
~~~~~~~
!!! error TS2441: Duplicate identifier 'require'. Compiler reserves name 'require' in top level scope of a module.
const someModule = require("google-closure-compiler");
~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2307: Cannot find module 'google-closure-compiler' or its corresponding type declarations.

==== tests/cases/conformance/salsa/main.ts (0 errors) ====
import { someModule as m1 } from './first'
import { someModule as m2 } from './last'

73 changes: 73 additions & 0 deletions tests/baselines/reference/requireAsDeclaredFunction.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
//// [tests/cases/conformance/salsa/requireAsDeclaredFunction.ts] ////

//// [first.js]
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
const someModule = require("google-closure-compiler");
export {someModule};
//// [last.js]
const someModule = require("google-closure-compiler");
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
export {someModule};
//// [global.js]
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
const someModule = require("google-closure-compiler");

//// [main.ts]
import { someModule as m1 } from './first'
import { someModule as m2 } from './last'


//// [first.js]
"use strict";
exports.__esModule = true;
exports.someModule = void 0;
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length; }
var someModule = require("google-closure-compiler");
exports.someModule = someModule;
//// [last.js]
"use strict";
exports.__esModule = true;
exports.someModule = void 0;
var someModule = require("google-closure-compiler");
exports.someModule = someModule;
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length; }
//// [global.js]
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length; }
var someModule = require("google-closure-compiler");
//// [main.js]
"use strict";
exports.__esModule = true;


//// [first.d.ts]
export const someModule: number;
//// [last.d.ts]
export const someModule: number;
//// [global.d.ts]
export {};
//// [main.d.ts]
export {};
63 changes: 63 additions & 0 deletions tests/baselines/reference/requireAsDeclaredFunction.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
=== tests/cases/conformance/salsa/first.js ===
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
>require : Symbol(require, Decl(first.js, 0, 0))
>str : Symbol(str, Decl(first.js, 4, 17))
>str.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>str : Symbol(str, Decl(first.js, 4, 17))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))

const someModule = require("google-closure-compiler");
>someModule : Symbol(someModule, Decl(first.js, 5, 5))
>require : Symbol(require, Decl(first.js, 0, 0))

export {someModule};
>someModule : Symbol(someModule, Decl(first.js, 6, 8))

=== tests/cases/conformance/salsa/last.js ===
const someModule = require("google-closure-compiler");
>someModule : Symbol(someModule, Decl(last.js, 0, 5))
>require : Symbol(require, Decl(last.js, 0, 54))

/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
>require : Symbol(require, Decl(last.js, 0, 54))
>str : Symbol(str, Decl(last.js, 5, 17))
>str.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>str : Symbol(str, Decl(last.js, 5, 17))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))

export {someModule};
>someModule : Symbol(someModule, Decl(last.js, 6, 8))

=== tests/cases/conformance/salsa/global.js ===
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
>require : Symbol(require, Decl(global.js, 0, 0))
>str : Symbol(str, Decl(global.js, 4, 17))
>str.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
>str : Symbol(str, Decl(global.js, 4, 17))
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))

const someModule = require("google-closure-compiler");
>someModule : Symbol(someModule, Decl(global.js, 5, 5))
>require : Symbol(require, Decl(global.js, 0, 0))

=== tests/cases/conformance/salsa/main.ts ===
import { someModule as m1 } from './first'
>someModule : Symbol(someModule, Decl(first.js, 6, 8))
>m1 : Symbol(m1, Decl(main.ts, 0, 8))

import { someModule as m2 } from './last'
>someModule : Symbol(someModule, Decl(last.js, 6, 8))
>m2 : Symbol(m2, Decl(main.ts, 1, 8))

69 changes: 69 additions & 0 deletions tests/baselines/reference/requireAsDeclaredFunction.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
=== tests/cases/conformance/salsa/first.js ===
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
>require : (str: string) => number
>str : string
>str.length : number
>str : string
>length : number

const someModule = require("google-closure-compiler");
>someModule : number
>require("google-closure-compiler") : number
>require : (str: string) => number
>"google-closure-compiler" : "google-closure-compiler"

export {someModule};
>someModule : number

=== tests/cases/conformance/salsa/last.js ===
const someModule = require("google-closure-compiler");
>someModule : number
>require("google-closure-compiler") : number
>require : (str: string) => number
>"google-closure-compiler" : "google-closure-compiler"

/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
>require : (str: string) => number
>str : string
>str.length : number
>str : string
>length : number

export {someModule};
>someModule : number

=== tests/cases/conformance/salsa/global.js ===
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
>require : (str: string) => number
>str : string
>str.length : number
>str : string
>length : number

const someModule = require("google-closure-compiler");
>someModule : any
>require("google-closure-compiler") : number
>require : (str: string) => number
>"google-closure-compiler" : "google-closure-compiler"

=== tests/cases/conformance/salsa/main.ts ===
import { someModule as m1 } from './first'
>someModule : number
>m1 : number

import { someModule as m2 } from './last'
>someModule : number
>m2 : number

31 changes: 31 additions & 0 deletions tests/cases/conformance/salsa/requireAsDeclaredFunction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// @outDir: out/
// @declaration: true
// @checkJs: true
// @filename: first.js
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
const someModule = require("google-closure-compiler");
export {someModule};
// @filename: last.js
const someModule = require("google-closure-compiler");
/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
export {someModule};
// @filename: global.js

/**
* @param {string} str
* @return {number}
*/
function require(str) { return str.length }
const someModule = require("google-closure-compiler");

// @filename: main.ts
import { someModule as m1 } from './first'
import { someModule as m2 } from './last'