diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5057b16c9a8..01b8436b8b6 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4047,9 +4047,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function canHaveSyntheticDefault(file: SourceFile | undefined, moduleSymbol: Symbol, dontResolveAlias: boolean, usage: Expression) { const usageMode = file && getModuleFormatInteropKind(compilerOptions) !== ModuleFormatInteropKind.Babel && getUsageModeForExpression(usage); + // fallthrough on cjs usages so we imply defaults for interop'd imports, too if (usageMode === ModuleKind.ESNext) { return isESMFormatImportImportingCommonjsFormatFile(usageMode, file!.impliedNodeFormat); - // fallthrough on cjs usages so we imply defaults for interop'd imports, too } if (!allowSyntheticDefaultImports) { return false; diff --git a/tests/baselines/reference/esbuildInterop.errors.txt b/tests/baselines/reference/esbuildInterop.errors.txt new file mode 100644 index 00000000000..8f8d5f72ad3 --- /dev/null +++ b/tests/baselines/reference/esbuildInterop.errors.txt @@ -0,0 +1,26 @@ +/index.ts(2,5): error TS2339: Property 'toLowerCase' does not exist on type 'typeof import("/node_modules/dep/index")'. + + +==== /node_modules/dep/package.json (0 errors) ==== + { + "name": "dep", + "version": "1.0.0", + "main": "index.js" + } + +==== /node_modules/dep/index.d.ts (0 errors) ==== + declare const _default: string; + export default _default; + +==== /package.json (0 errors) ==== + { + "type": "module" + } + +==== /index.ts (1 errors) ==== + import dep from "dep"; + dep.toLowerCase(); // Error + ~~~~~~~~~~~ +!!! error TS2339: Property 'toLowerCase' does not exist on type 'typeof import("/node_modules/dep/index")'. + dep.default.toLowerCase(); // Ok + \ No newline at end of file diff --git a/tests/baselines/reference/esbuildInterop.js b/tests/baselines/reference/esbuildInterop.js new file mode 100644 index 00000000000..8663c506432 --- /dev/null +++ b/tests/baselines/reference/esbuildInterop.js @@ -0,0 +1,28 @@ +//// [tests/cases/conformance/module/esbuildInterop.ts] //// + +//// [package.json] +{ + "name": "dep", + "version": "1.0.0", + "main": "index.js" +} + +//// [index.d.ts] +declare const _default: string; +export default _default; + +//// [package.json] +{ + "type": "module" +} + +//// [index.ts] +import dep from "dep"; +dep.toLowerCase(); // Error +dep.default.toLowerCase(); // Ok + + +//// [index.js] +import dep from "dep"; +dep.toLowerCase(); // Error +dep.default.toLowerCase(); // Ok diff --git a/tests/baselines/reference/esbuildInterop.symbols b/tests/baselines/reference/esbuildInterop.symbols new file mode 100644 index 00000000000..37607295651 --- /dev/null +++ b/tests/baselines/reference/esbuildInterop.symbols @@ -0,0 +1,23 @@ +//// [tests/cases/conformance/module/esbuildInterop.ts] //// + +=== /node_modules/dep/index.d.ts === +declare const _default: string; +>_default : Symbol(_default, Decl(index.d.ts, 0, 13)) + +export default _default; +>_default : Symbol(_default, Decl(index.d.ts, 0, 13)) + +=== /index.ts === +import dep from "dep"; +>dep : Symbol(dep, Decl(index.ts, 0, 6)) + +dep.toLowerCase(); // Error +>dep : Symbol(dep, Decl(index.ts, 0, 6)) + +dep.default.toLowerCase(); // Ok +>dep.default.toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --)) +>dep.default : Symbol(dep.default, Decl(index.d.ts, 0, 31)) +>dep : Symbol(dep, Decl(index.ts, 0, 6)) +>default : Symbol(dep.default, Decl(index.d.ts, 0, 31)) +>toLowerCase : Symbol(String.toLowerCase, Decl(lib.es5.d.ts, --, --)) + diff --git a/tests/baselines/reference/esbuildInterop.types b/tests/baselines/reference/esbuildInterop.types new file mode 100644 index 00000000000..392b87cfa0e --- /dev/null +++ b/tests/baselines/reference/esbuildInterop.types @@ -0,0 +1,27 @@ +//// [tests/cases/conformance/module/esbuildInterop.ts] //// + +=== /node_modules/dep/index.d.ts === +declare const _default: string; +>_default : string + +export default _default; +>_default : string + +=== /index.ts === +import dep from "dep"; +>dep : typeof dep + +dep.toLowerCase(); // Error +>dep.toLowerCase() : any +>dep.toLowerCase : any +>dep : typeof dep +>toLowerCase : any + +dep.default.toLowerCase(); // Ok +>dep.default.toLowerCase() : string +>dep.default.toLowerCase : () => string +>dep.default : string +>dep : typeof dep +>default : string +>toLowerCase : () => string + diff --git a/tests/cases/conformance/module/esbuildInterop.ts b/tests/cases/conformance/module/esbuildInterop.ts new file mode 100644 index 00000000000..44b56fb62d1 --- /dev/null +++ b/tests/cases/conformance/module/esbuildInterop.ts @@ -0,0 +1,25 @@ +// @module: esnext +// @moduleResolution: bundler +// @moduleFormatDetection: bundler +// @moduleFormatInterop: bundlernode + +// @Filename: /node_modules/dep/package.json +{ + "name": "dep", + "version": "1.0.0", + "main": "index.js" +} + +// @Filename: /node_modules/dep/index.d.ts +declare const _default: string; +export default _default; + +// @Filename: /package.json +{ + "type": "module" +} + +// @Filename: /index.ts +import dep from "dep"; +dep.toLowerCase(); // Error +dep.default.toLowerCase(); // Ok