diff --git a/src/compiler/transformers/utilities.ts b/src/compiler/transformers/utilities.ts index 935f5b0ffd4e8..13d2dff895a80 100644 --- a/src/compiler/transformers/utilities.ts +++ b/src/compiler/transformers/utilities.ts @@ -15,14 +15,6 @@ namespace ts { hasExportStarsToExportValues: boolean; // whether this module contains export* } - function getNamedImportCount(node: ImportDeclaration) { - if (!(node.importClause && node.importClause.namedBindings)) return 0; - const names = node.importClause.namedBindings; - if (!names) return 0; - if (!isNamedImports(names)) return 0; - return names.elements.length; - } - function containsDefaultReference(node: NamedImportBindings) { if (!node) return false; if (!isNamedImports(node)) return false; @@ -34,11 +26,27 @@ namespace ts { } export function getImportNeedsImportStarHelper(node: ImportDeclaration) { - return !!getNamespaceDeclarationNode(node) || (getNamedImportCount(node) > 1 && containsDefaultReference(node.importClause.namedBindings)); + if (!!getNamespaceDeclarationNode(node)) { + return true; + } + const bindings = node.importClause && node.importClause.namedBindings; + if (!bindings) { + return false; + } + if (!isNamedImports(bindings)) return false; + let defaultRefCount = 0; + for (const binding of bindings.elements) { + if (isNamedDefaultReference(binding)) { + defaultRefCount++; + } + } + // Import star is required if there's default named refs mixed with non-default refs, or if theres non-default refs and it has a default import + return (defaultRefCount > 0 && defaultRefCount !== bindings.elements.length) || (!!(bindings.elements.length - defaultRefCount) && isDefaultImport(node)); } export function getImportNeedsImportDefaultHelper(node: ImportDeclaration) { - return isDefaultImport(node) || (getNamedImportCount(node) === 1 && containsDefaultReference(node.importClause.namedBindings)); + // Import default is needed if there's a default import or a default ref and no other refs (meaning an import star helper wasn't requested) + return !getImportNeedsImportStarHelper(node) && (isDefaultImport(node) || (node.importClause && isNamedImports(node.importClause.namedBindings) && containsDefaultReference(node.importClause.namedBindings))); } export function collectExternalModuleInfo(sourceFile: SourceFile, resolver: EmitResolver, compilerOptions: CompilerOptions): ExternalModuleInfo { diff --git a/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.errors.txt b/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.errors.txt new file mode 100644 index 0000000000000..a31b6647198c5 --- /dev/null +++ b/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.errors.txt @@ -0,0 +1,9 @@ +tests/cases/compiler/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts(1,42): error TS2307: Cannot find module 'm'. + + +==== tests/cases/compiler/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts (1 errors) ==== + import {default as a, default as b} from "m"; + ~~~ +!!! error TS2307: Cannot find module 'm'. + void a; + void b; \ No newline at end of file diff --git a/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.js b/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.js new file mode 100644 index 0000000000000..918efb4fbbbfd --- /dev/null +++ b/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.js @@ -0,0 +1,14 @@ +//// [esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts] +import {default as a, default as b} from "m"; +void a; +void b; + +//// [esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.js] +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +exports.__esModule = true; +var m_1 = __importDefault(require("m")); +void m_1["default"]; +void m_1["default"]; diff --git a/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.symbols b/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.symbols new file mode 100644 index 0000000000000..3b8c7f5c40549 --- /dev/null +++ b/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.symbols @@ -0,0 +1,13 @@ +=== tests/cases/compiler/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts === +import {default as a, default as b} from "m"; +>default : Symbol(a, Decl(esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts, 0, 8)) +>a : Symbol(a, Decl(esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts, 0, 8)) +>default : Symbol(b, Decl(esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts, 0, 21)) +>b : Symbol(b, Decl(esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts, 0, 21)) + +void a; +>a : Symbol(a, Decl(esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts, 0, 8)) + +void b; +>b : Symbol(b, Decl(esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts, 0, 21)) + diff --git a/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.types b/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.types new file mode 100644 index 0000000000000..de3fa1d547d58 --- /dev/null +++ b/tests/baselines/reference/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.types @@ -0,0 +1,15 @@ +=== tests/cases/compiler/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts === +import {default as a, default as b} from "m"; +>default : any +>a : any +>default : any +>b : any + +void a; +>void a : undefined +>a : any + +void b; +>void b : undefined +>b : any + diff --git a/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.errors.txt b/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.errors.txt new file mode 100644 index 0000000000000..2634c6ea44161 --- /dev/null +++ b/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.errors.txt @@ -0,0 +1,9 @@ +tests/cases/compiler/esModuleInteropUsesExportStarWhenDefaultPlusNames.ts(1,28): error TS2307: Cannot find module './dep'. + + +==== tests/cases/compiler/esModuleInteropUsesExportStarWhenDefaultPlusNames.ts (1 errors) ==== + import Deps, { var2 } from './dep'; + ~~~~~~~ +!!! error TS2307: Cannot find module './dep'. + void Deps; + void var2; \ No newline at end of file diff --git a/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.js b/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.js new file mode 100644 index 0000000000000..a15c1907f8da2 --- /dev/null +++ b/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.js @@ -0,0 +1,18 @@ +//// [esModuleInteropUsesExportStarWhenDefaultPlusNames.ts] +import Deps, { var2 } from './dep'; +void Deps; +void var2; + +//// [esModuleInteropUsesExportStarWhenDefaultPlusNames.js] +"use strict"; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var dep_1 = __importStar(require("./dep")); +void dep_1["default"]; +void dep_1.var2; diff --git a/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.symbols b/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.symbols new file mode 100644 index 0000000000000..bc700c7bd28ad --- /dev/null +++ b/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.symbols @@ -0,0 +1,11 @@ +=== tests/cases/compiler/esModuleInteropUsesExportStarWhenDefaultPlusNames.ts === +import Deps, { var2 } from './dep'; +>Deps : Symbol(Deps, Decl(esModuleInteropUsesExportStarWhenDefaultPlusNames.ts, 0, 6)) +>var2 : Symbol(var2, Decl(esModuleInteropUsesExportStarWhenDefaultPlusNames.ts, 0, 14)) + +void Deps; +>Deps : Symbol(Deps, Decl(esModuleInteropUsesExportStarWhenDefaultPlusNames.ts, 0, 6)) + +void var2; +>var2 : Symbol(var2, Decl(esModuleInteropUsesExportStarWhenDefaultPlusNames.ts, 0, 14)) + diff --git a/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.types b/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.types new file mode 100644 index 0000000000000..5434009cf5e7b --- /dev/null +++ b/tests/baselines/reference/esModuleInteropUsesExportStarWhenDefaultPlusNames.types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/esModuleInteropUsesExportStarWhenDefaultPlusNames.ts === +import Deps, { var2 } from './dep'; +>Deps : any +>var2 : any + +void Deps; +>void Deps : undefined +>Deps : any + +void var2; +>void var2 : undefined +>var2 : any + diff --git a/tests/cases/compiler/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts b/tests/cases/compiler/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts new file mode 100644 index 0000000000000..313fbf4ceb31e --- /dev/null +++ b/tests/cases/compiler/esModuleInteropImportDefaultWhenAllNamedAreDefaultAlias.ts @@ -0,0 +1,4 @@ +// @esModuleInterop: true +import {default as a, default as b} from "m"; +void a; +void b; \ No newline at end of file diff --git a/tests/cases/compiler/esModuleInteropUsesExportStarWhenDefaultPlusNames.ts b/tests/cases/compiler/esModuleInteropUsesExportStarWhenDefaultPlusNames.ts new file mode 100644 index 0000000000000..0a8263d1a0664 --- /dev/null +++ b/tests/cases/compiler/esModuleInteropUsesExportStarWhenDefaultPlusNames.ts @@ -0,0 +1,4 @@ +// @esModuleInterop: true +import Deps, { var2 } from './dep'; +void Deps; +void var2; \ No newline at end of file