Add test demonstrating interop for esbuild and webpack

This commit is contained in:
Andrew Branch
2023-11-20 16:51:06 -08:00
parent 17592d3e04
commit a415aed1fd
6 changed files with 130 additions and 1 deletions
+1 -1
View File
@@ -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;
@@ -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
@@ -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
@@ -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, --, --))
@@ -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
@@ -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