From 71a785746646fff85996b171403497ba36ede2b1 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 31 May 2022 21:10:27 +0000 Subject: [PATCH] Cherry-pick PR #49327 into release-4.7 Component commits: 79957c179e Fix index fallback of CJS package from ESM-mode import when `main` is present but does not resolve --- src/compiler/moduleNameResolver.ts | 4 +- ...ortModeImplicitIndexResolution2.errors.txt | 44 +++++++++++++++++++ ...eNextImportModeImplicitIndexResolution2.js | 44 +++++++++++++++++++ ...ImportModeImplicitIndexResolution2.symbols | 38 ++++++++++++++++ ...xtImportModeImplicitIndexResolution2.types | 38 ++++++++++++++++ ...eNextImportModeImplicitIndexResolution2.ts | 37 ++++++++++++++++ 6 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.errors.txt create mode 100644 tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.js create mode 100644 tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.symbols create mode 100644 tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.types create mode 100644 tests/cases/compiler/nodeNextImportModeImplicitIndexResolution2.ts diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index d2b0db1041b4e..fc62e3ee01bd7 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -2413,8 +2413,8 @@ namespace ts { ); if ( !pathAndExtension && packageInfo - && packageInfo.packageJsonContent.exports === undefined - && packageInfo.packageJsonContent.main === undefined + // eslint-disable-next-line no-null/no-null + && (packageInfo.packageJsonContent.exports === undefined || packageInfo.packageJsonContent.exports === null) && state.features & NodeResolutionFeatures.EsmMode ) { // EsmMode disables index lookup in `loadNodeModuleFromDirectoryWorker` generally, however non-relative package resolutions still assume diff --git a/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.errors.txt b/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.errors.txt new file mode 100644 index 0000000000000..914722e2f4d65 --- /dev/null +++ b/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.errors.txt @@ -0,0 +1,44 @@ +/index.cts(4,21): error TS2307: Cannot find module 'dedent4' or its corresponding type declarations. +/index.mts(4,21): error TS2307: Cannot find module 'dedent4' or its corresponding type declarations. + + +==== /node_modules/@types/dedent/package.json (0 errors) ==== + { "name": "@types/dedent", "version": "1.0.0", "main": "" } + +==== /node_modules/@types/dedent2/package.json (0 errors) ==== + { "name": "@types/dedent2", "version": "1.0.0", "main": "asdfasdfasdf" } + +==== /node_modules/@types/dedent3/package.json (0 errors) ==== + { "name": "@types/dedent3", "version": "1.0.0", "main": "asdfasdfasdf", "exports": null } + +==== /node_modules/@types/dedent4/package.json (0 errors) ==== + { "name": "@types/dedent4", "version": "1.0.0", "main": "asdfasdfasdf", "exports": "./asdfasdfasdf" } + +==== /node_modules/@types/dedent/index.d.ts (0 errors) ==== + export {}; + +==== /node_modules/@types/dedent2/index.d.ts (0 errors) ==== + export {}; + +==== /node_modules/@types/dedent3/index.d.ts (0 errors) ==== + export {}; + +==== /node_modules/@types/dedent4/index.d.ts (0 errors) ==== + export {}; + +==== /index.mts (1 errors) ==== + import dedent from "dedent"; + import dedent2 from "dedent2"; + import dedent3 from "dedent3"; + import dedent4 from "dedent4"; // Error + ~~~~~~~~~ +!!! error TS2307: Cannot find module 'dedent4' or its corresponding type declarations. + +==== /index.cts (1 errors) ==== + import dedent from "dedent"; + import dedent2 from "dedent2"; + import dedent3 from "dedent3"; + import dedent4 from "dedent4"; // Error + ~~~~~~~~~ +!!! error TS2307: Cannot find module 'dedent4' or its corresponding type declarations. + \ No newline at end of file diff --git a/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.js b/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.js new file mode 100644 index 0000000000000..3125a73f6e76e --- /dev/null +++ b/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.js @@ -0,0 +1,44 @@ +//// [tests/cases/compiler/nodeNextImportModeImplicitIndexResolution2.ts] //// + +//// [package.json] +{ "name": "@types/dedent", "version": "1.0.0", "main": "" } + +//// [package.json] +{ "name": "@types/dedent2", "version": "1.0.0", "main": "asdfasdfasdf" } + +//// [package.json] +{ "name": "@types/dedent3", "version": "1.0.0", "main": "asdfasdfasdf", "exports": null } + +//// [package.json] +{ "name": "@types/dedent4", "version": "1.0.0", "main": "asdfasdfasdf", "exports": "./asdfasdfasdf" } + +//// [index.d.ts] +export {}; + +//// [index.d.ts] +export {}; + +//// [index.d.ts] +export {}; + +//// [index.d.ts] +export {}; + +//// [index.mts] +import dedent from "dedent"; +import dedent2 from "dedent2"; +import dedent3 from "dedent3"; +import dedent4 from "dedent4"; // Error + +//// [index.cts] +import dedent from "dedent"; +import dedent2 from "dedent2"; +import dedent3 from "dedent3"; +import dedent4 from "dedent4"; // Error + + +//// [index.mjs] +export {}; +//// [index.cjs] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.symbols b/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.symbols new file mode 100644 index 0000000000000..5685121775b0c --- /dev/null +++ b/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.symbols @@ -0,0 +1,38 @@ +=== /node_modules/@types/dedent/index.d.ts === +export {}; +No type information for this code. +No type information for this code.=== /node_modules/@types/dedent2/index.d.ts === +export {}; +No type information for this code. +No type information for this code.=== /node_modules/@types/dedent3/index.d.ts === +export {}; +No type information for this code. +No type information for this code.=== /node_modules/@types/dedent4/index.d.ts === +export {}; +No type information for this code. +No type information for this code.=== /index.mts === +import dedent from "dedent"; +>dedent : Symbol(dedent, Decl(index.mts, 0, 6)) + +import dedent2 from "dedent2"; +>dedent2 : Symbol(dedent2, Decl(index.mts, 1, 6)) + +import dedent3 from "dedent3"; +>dedent3 : Symbol(dedent3, Decl(index.mts, 2, 6)) + +import dedent4 from "dedent4"; // Error +>dedent4 : Symbol(dedent4, Decl(index.mts, 3, 6)) + +=== /index.cts === +import dedent from "dedent"; +>dedent : Symbol(dedent, Decl(index.cts, 0, 6)) + +import dedent2 from "dedent2"; +>dedent2 : Symbol(dedent2, Decl(index.cts, 1, 6)) + +import dedent3 from "dedent3"; +>dedent3 : Symbol(dedent3, Decl(index.cts, 2, 6)) + +import dedent4 from "dedent4"; // Error +>dedent4 : Symbol(dedent4, Decl(index.cts, 3, 6)) + diff --git a/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.types b/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.types new file mode 100644 index 0000000000000..a2a37da0ecdca --- /dev/null +++ b/tests/baselines/reference/nodeNextImportModeImplicitIndexResolution2.types @@ -0,0 +1,38 @@ +=== /node_modules/@types/dedent/index.d.ts === +export {}; +No type information for this code. +No type information for this code.=== /node_modules/@types/dedent2/index.d.ts === +export {}; +No type information for this code. +No type information for this code.=== /node_modules/@types/dedent3/index.d.ts === +export {}; +No type information for this code. +No type information for this code.=== /node_modules/@types/dedent4/index.d.ts === +export {}; +No type information for this code. +No type information for this code.=== /index.mts === +import dedent from "dedent"; +>dedent : typeof dedent + +import dedent2 from "dedent2"; +>dedent2 : typeof dedent2 + +import dedent3 from "dedent3"; +>dedent3 : typeof dedent3 + +import dedent4 from "dedent4"; // Error +>dedent4 : any + +=== /index.cts === +import dedent from "dedent"; +>dedent : typeof dedent + +import dedent2 from "dedent2"; +>dedent2 : typeof dedent2 + +import dedent3 from "dedent3"; +>dedent3 : typeof dedent3 + +import dedent4 from "dedent4"; // Error +>dedent4 : any + diff --git a/tests/cases/compiler/nodeNextImportModeImplicitIndexResolution2.ts b/tests/cases/compiler/nodeNextImportModeImplicitIndexResolution2.ts new file mode 100644 index 0000000000000..12b7844c22b50 --- /dev/null +++ b/tests/cases/compiler/nodeNextImportModeImplicitIndexResolution2.ts @@ -0,0 +1,37 @@ +// @module: nodenext + +// @Filename: /node_modules/@types/dedent/package.json +{ "name": "@types/dedent", "version": "1.0.0", "main": "" } + +// @Filename: /node_modules/@types/dedent2/package.json +{ "name": "@types/dedent2", "version": "1.0.0", "main": "asdfasdfasdf" } + +// @Filename: /node_modules/@types/dedent3/package.json +{ "name": "@types/dedent3", "version": "1.0.0", "main": "asdfasdfasdf", "exports": null } + +// @Filename: /node_modules/@types/dedent4/package.json +{ "name": "@types/dedent4", "version": "1.0.0", "main": "asdfasdfasdf", "exports": "./asdfasdfasdf" } + +// @Filename: /node_modules/@types/dedent/index.d.ts +export {}; + +// @Filename: /node_modules/@types/dedent2/index.d.ts +export {}; + +// @Filename: /node_modules/@types/dedent3/index.d.ts +export {}; + +// @Filename: /node_modules/@types/dedent4/index.d.ts +export {}; + +// @Filename: /index.mts +import dedent from "dedent"; +import dedent2 from "dedent2"; +import dedent3 from "dedent3"; +import dedent4 from "dedent4"; // Error + +// @Filename: /index.cts +import dedent from "dedent"; +import dedent2 from "dedent2"; +import dedent3 from "dedent3"; +import dedent4 from "dedent4"; // Error