From 2be39086cc95c1b01da4c257d35ee9fe09e01cc1 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 7 Oct 2022 20:00:37 -0700 Subject: [PATCH 1/4] Add broken test case --- tests/cases/compiler/issue51099.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 tests/cases/compiler/issue51099.ts diff --git a/tests/cases/compiler/issue51099.ts b/tests/cases/compiler/issue51099.ts new file mode 100644 index 0000000000000..559869fa67663 --- /dev/null +++ b/tests/cases/compiler/issue51099.ts @@ -0,0 +1,25 @@ +// @target: ESNext +// @module: ESNext +// @moduleResolution: NodeNext +// @strict: true + +// @filename: package.json +{ + "name": "test", + "version": "1.0.0", + "description": "", + "type": "module", + "module": "index.mjs" +} + +// @filename: index.mts +import * as namespaceImport from "./other.cjs"; +console.log(namespaceImport); + + +// @filename: other.cjs +module.exports.test = () => 5; + +// @filename: other.d.cts +declare const __: symbol; +export = __; From 8568c2efe09269c16158c92a8796f0a885952f40 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Sun, 9 Oct 2022 15:54:00 -0700 Subject: [PATCH 2/4] Ensure moduleType is structured during cloneTypeAsModuleType --- src/compiler/checker.ts | 9 +++-- .../reference/moduleExportNonStructured.js | 34 +++++++++++++++++++ .../moduleExportNonStructured.symbols | 34 +++++++++++++++++++ .../reference/moduleExportNonStructured.types | 34 +++++++++++++++++++ tests/cases/compiler/issue51099.ts | 25 -------------- .../compiler/moduleExportNonStructured.ts | 33 ++++++++++++++++++ 6 files changed, 142 insertions(+), 27 deletions(-) create mode 100644 tests/baselines/reference/moduleExportNonStructured.js create mode 100644 tests/baselines/reference/moduleExportNonStructured.symbols create mode 100644 tests/baselines/reference/moduleExportNonStructured.types delete mode 100644 tests/cases/compiler/issue51099.ts create mode 100644 tests/cases/compiler/moduleExportNonStructured.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9ebaca719f2b9..9f67a2aac227c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3957,8 +3957,13 @@ namespace ts { if (symbol.constEnumOnlyModule) result.constEnumOnlyModule = true; if (symbol.members) result.members = new Map(symbol.members); if (symbol.exports) result.exports = new Map(symbol.exports); - const resolvedModuleType = resolveStructuredTypeMembers(moduleType as StructuredType); // Should already be resolved from the signature checks above - result.type = createAnonymousType(result, resolvedModuleType.members, emptyArray, emptyArray, resolvedModuleType.indexInfos); + if (moduleType.flags & TypeFlags.StructuredType) { + const resolvedModuleType = resolveStructuredTypeMembers(moduleType as StructuredType); // Should already be resolved from the signature checks above + result.type = createAnonymousType(result, resolvedModuleType.members, emptyArray, emptyArray, resolvedModuleType.indexInfos); + } + else { + result.type = moduleType; + } return result; } diff --git a/tests/baselines/reference/moduleExportNonStructured.js b/tests/baselines/reference/moduleExportNonStructured.js new file mode 100644 index 0000000000000..aec6dd0f6b0e5 --- /dev/null +++ b/tests/baselines/reference/moduleExportNonStructured.js @@ -0,0 +1,34 @@ +//// [tests/cases/compiler/moduleExportNonStructured.ts] //// + +//// [package.json] +{ + "name": "test", + "version": "1.0.0", + "description": "", + "type": "module", + "module": "index.mjs" +} + +//// [index.mts] +import * as exportAny from "./exportAny.cjs"; +import * as exportUnknown from "./exportUnknown.cjs"; +import * as exportSymbol from "./exportSymbol.cjs"; + + +//// [exportAny.d.cts] +declare const __: any; +export = __; + + +//// [exportUnknown.d.cts] +declare const __: unknown; +export = __; + + +//// [exportSymbol.d.cts] +declare const __: symbol; +export = __; + + +//// [index.mjs] +export {}; diff --git a/tests/baselines/reference/moduleExportNonStructured.symbols b/tests/baselines/reference/moduleExportNonStructured.symbols new file mode 100644 index 0000000000000..f30567a50f76e --- /dev/null +++ b/tests/baselines/reference/moduleExportNonStructured.symbols @@ -0,0 +1,34 @@ +=== tests/cases/compiler/index.mts === +import * as exportAny from "./exportAny.cjs"; +>exportAny : Symbol(exportAny, Decl(index.mts, 0, 6)) + +import * as exportUnknown from "./exportUnknown.cjs"; +>exportUnknown : Symbol(exportUnknown, Decl(index.mts, 1, 6)) + +import * as exportSymbol from "./exportSymbol.cjs"; +>exportSymbol : Symbol(exportSymbol, Decl(index.mts, 2, 6)) + + +=== tests/cases/compiler/exportAny.d.cts === +declare const __: any; +>__ : Symbol(__, Decl(exportAny.d.cts, 0, 13)) + +export = __; +>__ : Symbol(__, Decl(exportAny.d.cts, 0, 13)) + + +=== tests/cases/compiler/exportUnknown.d.cts === +declare const __: unknown; +>__ : Symbol(__, Decl(exportUnknown.d.cts, 0, 13)) + +export = __; +>__ : Symbol(__, Decl(exportUnknown.d.cts, 0, 13)) + + +=== tests/cases/compiler/exportSymbol.d.cts === +declare const __: symbol; +>__ : Symbol(__, Decl(exportSymbol.d.cts, 0, 13)) + +export = __; +>__ : Symbol(__, Decl(exportSymbol.d.cts, 0, 13)) + diff --git a/tests/baselines/reference/moduleExportNonStructured.types b/tests/baselines/reference/moduleExportNonStructured.types new file mode 100644 index 0000000000000..043742e60c9a5 --- /dev/null +++ b/tests/baselines/reference/moduleExportNonStructured.types @@ -0,0 +1,34 @@ +=== tests/cases/compiler/index.mts === +import * as exportAny from "./exportAny.cjs"; +>exportAny : any + +import * as exportUnknown from "./exportUnknown.cjs"; +>exportUnknown : unknown + +import * as exportSymbol from "./exportSymbol.cjs"; +>exportSymbol : symbol + + +=== tests/cases/compiler/exportAny.d.cts === +declare const __: any; +>__ : any + +export = __; +>__ : any + + +=== tests/cases/compiler/exportUnknown.d.cts === +declare const __: unknown; +>__ : unknown + +export = __; +>__ : unknown + + +=== tests/cases/compiler/exportSymbol.d.cts === +declare const __: symbol; +>__ : symbol + +export = __; +>__ : symbol + diff --git a/tests/cases/compiler/issue51099.ts b/tests/cases/compiler/issue51099.ts deleted file mode 100644 index 559869fa67663..0000000000000 --- a/tests/cases/compiler/issue51099.ts +++ /dev/null @@ -1,25 +0,0 @@ -// @target: ESNext -// @module: ESNext -// @moduleResolution: NodeNext -// @strict: true - -// @filename: package.json -{ - "name": "test", - "version": "1.0.0", - "description": "", - "type": "module", - "module": "index.mjs" -} - -// @filename: index.mts -import * as namespaceImport from "./other.cjs"; -console.log(namespaceImport); - - -// @filename: other.cjs -module.exports.test = () => 5; - -// @filename: other.d.cts -declare const __: symbol; -export = __; diff --git a/tests/cases/compiler/moduleExportNonStructured.ts b/tests/cases/compiler/moduleExportNonStructured.ts new file mode 100644 index 0000000000000..76b2f1edfd3d4 --- /dev/null +++ b/tests/cases/compiler/moduleExportNonStructured.ts @@ -0,0 +1,33 @@ +// @target: ESNext +// @module: ESNext +// @moduleResolution: NodeNext +// @strict: true + +// @filename: package.json +{ + "name": "test", + "version": "1.0.0", + "description": "", + "type": "module", + "module": "index.mjs" +} + +// @filename: index.mts +import * as exportAny from "./exportAny.cjs"; +import * as exportUnknown from "./exportUnknown.cjs"; +import * as exportSymbol from "./exportSymbol.cjs"; + + +// @filename: exportAny.d.cts +declare const __: any; +export = __; + + +// @filename: exportUnknown.d.cts +declare const __: unknown; +export = __; + + +// @filename: exportSymbol.d.cts +declare const __: symbol; +export = __; From 017709ed8af0afa11848975adfa12bc9a68f9f40 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 15 Feb 2023 15:49:11 -0800 Subject: [PATCH 3/4] Also add type imports --- tests/baselines/reference/moduleExportNonStructured.js | 3 +++ .../baselines/reference/moduleExportNonStructured.symbols | 8 ++++++++ tests/baselines/reference/moduleExportNonStructured.types | 8 ++++++++ tests/cases/compiler/moduleExportNonStructured.ts | 3 +++ 4 files changed, 22 insertions(+) diff --git a/tests/baselines/reference/moduleExportNonStructured.js b/tests/baselines/reference/moduleExportNonStructured.js index aec6dd0f6b0e5..3593b95eb6989 100644 --- a/tests/baselines/reference/moduleExportNonStructured.js +++ b/tests/baselines/reference/moduleExportNonStructured.js @@ -14,6 +14,9 @@ import * as exportAny from "./exportAny.cjs"; import * as exportUnknown from "./exportUnknown.cjs"; import * as exportSymbol from "./exportSymbol.cjs"; +import type * as exportAnyType from "./exportAny.cjs"; +import type * as exportUnknownType from "./exportUnknown.cjs"; +import type * as exportSymbolType from "./exportSymbol.cjs"; //// [exportAny.d.cts] declare const __: any; diff --git a/tests/baselines/reference/moduleExportNonStructured.symbols b/tests/baselines/reference/moduleExportNonStructured.symbols index f30567a50f76e..fb292beb97a69 100644 --- a/tests/baselines/reference/moduleExportNonStructured.symbols +++ b/tests/baselines/reference/moduleExportNonStructured.symbols @@ -8,6 +8,14 @@ import * as exportUnknown from "./exportUnknown.cjs"; import * as exportSymbol from "./exportSymbol.cjs"; >exportSymbol : Symbol(exportSymbol, Decl(index.mts, 2, 6)) +import type * as exportAnyType from "./exportAny.cjs"; +>exportAnyType : Symbol(exportAnyType, Decl(index.mts, 4, 11)) + +import type * as exportUnknownType from "./exportUnknown.cjs"; +>exportUnknownType : Symbol(exportUnknownType, Decl(index.mts, 5, 11)) + +import type * as exportSymbolType from "./exportSymbol.cjs"; +>exportSymbolType : Symbol(exportSymbolType, Decl(index.mts, 6, 11)) === tests/cases/compiler/exportAny.d.cts === declare const __: any; diff --git a/tests/baselines/reference/moduleExportNonStructured.types b/tests/baselines/reference/moduleExportNonStructured.types index 043742e60c9a5..df6d181673fd8 100644 --- a/tests/baselines/reference/moduleExportNonStructured.types +++ b/tests/baselines/reference/moduleExportNonStructured.types @@ -8,6 +8,14 @@ import * as exportUnknown from "./exportUnknown.cjs"; import * as exportSymbol from "./exportSymbol.cjs"; >exportSymbol : symbol +import type * as exportAnyType from "./exportAny.cjs"; +>exportAnyType : any + +import type * as exportUnknownType from "./exportUnknown.cjs"; +>exportUnknownType : unknown + +import type * as exportSymbolType from "./exportSymbol.cjs"; +>exportSymbolType : symbol === tests/cases/compiler/exportAny.d.cts === declare const __: any; diff --git a/tests/cases/compiler/moduleExportNonStructured.ts b/tests/cases/compiler/moduleExportNonStructured.ts index 76b2f1edfd3d4..756f948570a86 100644 --- a/tests/cases/compiler/moduleExportNonStructured.ts +++ b/tests/cases/compiler/moduleExportNonStructured.ts @@ -17,6 +17,9 @@ import * as exportAny from "./exportAny.cjs"; import * as exportUnknown from "./exportUnknown.cjs"; import * as exportSymbol from "./exportSymbol.cjs"; +import type * as exportAnyType from "./exportAny.cjs"; +import type * as exportUnknownType from "./exportUnknown.cjs"; +import type * as exportSymbolType from "./exportSymbol.cjs"; // @filename: exportAny.d.cts declare const __: any; From e7aed81d331f488633f800839e63b26d01fee7d2 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:13:41 -0800 Subject: [PATCH 4/4] If not structured, make the module type be one with a default property of that type instead --- src/compiler/checker.ts | 15 ++++++--------- .../reference/moduleExportNonStructured.types | 12 ++++++------ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6c46186a5fd1e..da6bb3b16b0a3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5127,7 +5127,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { getPropertyOfType(type, InternalSymbolName.Default, /*skipObjectFunctionPropertyAugment*/ true) || isEsmCjsRef ) { - const moduleType = getTypeWithSyntheticDefaultImportType(type, symbol, moduleSymbol!, reference); + const moduleType = type.flags & TypeFlags.StructuredType + ? getTypeWithSyntheticDefaultImportType(type, symbol, moduleSymbol!, reference) + : createDefaultPropertyWrapperForModule(symbol, symbol.parent); return cloneTypeAsModuleType(symbol, moduleType, referenceParent); } } @@ -5149,13 +5151,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (symbol.constEnumOnlyModule) result.constEnumOnlyModule = true; if (symbol.members) result.members = new Map(symbol.members); if (symbol.exports) result.exports = new Map(symbol.exports); - if (moduleType.flags & TypeFlags.StructuredType) { - const resolvedModuleType = resolveStructuredTypeMembers(moduleType as StructuredType); // Should already be resolved from the signature checks above - result.links.type = createAnonymousType(result, resolvedModuleType.members, emptyArray, emptyArray, resolvedModuleType.indexInfos); - } - else { - result.links.type = moduleType; - } + const resolvedModuleType = resolveStructuredTypeMembers(moduleType as StructuredType); // Should already be resolved from the signature checks above + result.links.type = createAnonymousType(result, resolvedModuleType.members, emptyArray, emptyArray, resolvedModuleType.indexInfos); return result; } @@ -33979,7 +33976,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return createPromiseReturnType(node, anyType); } - function createDefaultPropertyWrapperForModule(symbol: Symbol, originalSymbol: Symbol, anonymousSymbol?: Symbol | undefined) { + function createDefaultPropertyWrapperForModule(symbol: Symbol, originalSymbol: Symbol | undefined, anonymousSymbol?: Symbol | undefined) { const memberTable = createSymbolTable(); const newSymbol = createSymbol(SymbolFlags.Alias, InternalSymbolName.Default); newSymbol.parent = originalSymbol; diff --git a/tests/baselines/reference/moduleExportNonStructured.types b/tests/baselines/reference/moduleExportNonStructured.types index df6d181673fd8..2b9bcc5340c12 100644 --- a/tests/baselines/reference/moduleExportNonStructured.types +++ b/tests/baselines/reference/moduleExportNonStructured.types @@ -1,21 +1,21 @@ === tests/cases/compiler/index.mts === import * as exportAny from "./exportAny.cjs"; ->exportAny : any +>exportAny : { default: any; } import * as exportUnknown from "./exportUnknown.cjs"; ->exportUnknown : unknown +>exportUnknown : { default: unknown; } import * as exportSymbol from "./exportSymbol.cjs"; ->exportSymbol : symbol +>exportSymbol : { default: symbol; } import type * as exportAnyType from "./exportAny.cjs"; ->exportAnyType : any +>exportAnyType : { default: any; } import type * as exportUnknownType from "./exportUnknown.cjs"; ->exportUnknownType : unknown +>exportUnknownType : { default: unknown; } import type * as exportSymbolType from "./exportSymbol.cjs"; ->exportSymbolType : symbol +>exportSymbolType : { default: symbol; } === tests/cases/compiler/exportAny.d.cts === declare const __: any;