From ef810f5d0230e4dfbebd63b75a9420b623c15aad Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Mon, 26 Oct 2020 14:37:35 -0700 Subject: [PATCH] Fix visibility lookup for cjs require aliases --- src/compiler/checker.ts | 8 ++++++++ ...clarationsImportAliasExposedWithinNamespaceCjs.js | 12 ++---------- ...rationsImportAliasExposedWithinNamespaceCjs.types | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 19a7085f7d0..dab7b68e6c9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4164,6 +4164,14 @@ namespace ts { && isDeclarationVisible(declaration.parent)) { return addVisibleAlias(declaration, declaration); } + else if (isBindingElement(declaration) && isInJSFile(declaration) && declaration.parent?.parent // exported import-like top-level JS require statement + && isVariableDeclaration(declaration.parent.parent) + && declaration.parent.parent.parent?.parent && isVariableStatement(declaration.parent.parent.parent.parent) + && !hasSyntacticModifier(declaration.parent.parent.parent.parent, ModifierFlags.Export) + && declaration.parent.parent.parent.parent.parent // check if the thing containing the variable statement is visible (ie, the file) + && isDeclarationVisible(declaration.parent.parent.parent.parent.parent)) { + return addVisibleAlias(declaration, declaration.parent.parent.parent.parent); + } // Declaration is not visible return false; diff --git a/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.js b/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.js index e1f3f00b801..56fda8a0425 100644 --- a/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.js +++ b/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.js @@ -94,14 +94,6 @@ export const testFnTypes: { [x: string]: any; }; export namespace testFnTypes { - type input = boolean | Function | { - /** - * - Prop 1. - */ - prop1: string | RegExp | (string | RegExp)[]; - /** - * - Prop 2. - */ - prop2: string; - }; + type input = boolean | Function | myTypes.typeB; } +import { myTypes } from "./file.js"; diff --git a/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.types b/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.types index ad7d3cc0ef6..261724d0410 100644 --- a/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.types +++ b/tests/baselines/reference/jsDeclarationsImportAliasExposedWithinNamespaceCjs.types @@ -27,12 +27,12 @@ const testFnTypes = { */ function testFn(input) { >testFn : (input: testFnTypes.input) => number | null ->input : boolean | Function | { prop1: string | RegExp | (string | RegExp)[]; prop2: string; } +>input : boolean | Function | myTypes.typeB if (typeof input === 'number') { >typeof input === 'number' : boolean >typeof input : "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" ->input : boolean | Function | { prop1: string | RegExp | (string | RegExp)[]; prop2: string; } +>input : boolean | Function | myTypes.typeB >'number' : "number" return 2 * input;