From 4edc0399a8de04ce14b00cf9d0e8d5308cab63e6 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 20 Aug 2025 15:24:52 -0700 Subject: [PATCH] Disable package.json conditional exports fallback lookups --- src/compiler/moduleNameResolver.ts | 1 + ...lback(moduleresolution=bundler).trace.json | 34 +++++++++++++++---- ...llback(moduleresolution=node16).errors.txt | 7 +--- ...llback(moduleresolution=node16).trace.json | 28 +++++++++++---- ...back(moduleresolution=nodenext).errors.txt | 7 +--- ...back(moduleresolution=nodenext).trace.json | 28 +++++++++++---- .../conditionalExportsResolutionFallback.ts | 6 +--- 7 files changed, 73 insertions(+), 38 deletions(-) diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 3fa7da5d5c9..5f890b0140f 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -2818,6 +2818,7 @@ function getLoadModuleFromTargetExportOrImport(extensions: Extensions, state: Mo } else { traceIfEnabled(state, Diagnostics.Failed_to_resolve_under_condition_0, condition); + return { value: undefined }; } } else { diff --git a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=bundler).trace.json b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=bundler).trace.json index 03336ac61ee..075fcf3591e 100644 --- a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=bundler).trace.json +++ b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=bundler).trace.json @@ -15,15 +15,35 @@ "File '/node_modules/dep/dist/index.mts' does not exist.", "File '/node_modules/dep/dist/index.d.mts' does not exist.", "Failed to resolve under condition 'import'.", - "Saw non-matching condition 'require'.", - "Matched 'exports' condition 'types'.", - "Using 'exports' subpath '.' with target './dist/index.d.ts'.", - "File '/node_modules/dep/dist/index.d.ts' exists - use it as a name resolution result.", + "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.", + "File '/node_modules/dep/package.json' exists according to earlier cached lookups.", + "Entering conditional exports.", + "Matched 'exports' condition 'import'.", + "Using 'exports' subpath '.' with target './dist/index.mjs'.", + "File name '/node_modules/dep/dist/index.mjs' has a '.mjs' extension - stripping it.", + "File '/node_modules/dep/dist/index.mjs' exists - use it as a name resolution result.", "'package.json' does not have a 'peerDependencies' field.", - "Resolved under condition 'types'.", + "Resolved under condition 'import'.", "Exiting conditional exports.", - "Resolving real path for '/node_modules/dep/dist/index.d.ts', result '/node_modules/dep/dist/index.d.ts'.", - "======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.d.ts' with Package ID 'dep/dist/index.d.ts@1.0.0'. ========", + "Resolution of non-relative name failed; trying with modern Node resolution features disabled to see if npm library needs configuration update.", + "File '/package.json' does not exist according to earlier cached lookups.", + "Loading module 'dep' from 'node_modules' folder, target file types: TypeScript, Declaration.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", + "File '/node_modules/dep/package.json' exists according to earlier cached lookups.", + "File '/node_modules/dep.ts' does not exist.", + "File '/node_modules/dep.tsx' does not exist.", + "File '/node_modules/dep.d.ts' does not exist.", + "'package.json' does not have a 'typesVersions' field.", + "'package.json' does not have a 'typings' field.", + "'package.json' does not have a 'types' field.", + "'package.json' does not have a 'main' field.", + "File '/node_modules/dep/index.ts' does not exist.", + "File '/node_modules/dep/index.tsx' does not exist.", + "File '/node_modules/dep/index.d.ts' does not exist.", + "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", + "Resolving real path for '/node_modules/dep/dist/index.mjs', result '/node_modules/dep/dist/index.mjs'.", + "======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.mjs' with Package ID 'dep/dist/index.mjs@1.0.0'. ========", "======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========", "Explicitly specified module resolution kind: 'Node10'.", "Loading module '@typescript/lib-es5' from 'node_modules' folder, target file types: TypeScript, Declaration.", diff --git a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=node16).errors.txt b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=node16).errors.txt index e205e8b437d..a1f73ab9d15 100644 --- a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=node16).errors.txt +++ b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=node16).errors.txt @@ -22,9 +22,4 @@ error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolut export {}; ==== /index.mts (0 errors) ==== - import {} from "dep"; - // Should be an untyped resolution to dep/dist/index.mjs, - // but the first search is only for TS files, and when - // there's no dist/index.d.mts, it continues looking for - // matching conditions and resolves via `types`. - \ No newline at end of file + import {} from "dep"; \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=node16).trace.json b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=node16).trace.json index 0534b1d7109..6d9e009d8a4 100644 --- a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=node16).trace.json +++ b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=node16).trace.json @@ -15,15 +15,29 @@ "File '/node_modules/dep/dist/index.mts' does not exist.", "File '/node_modules/dep/dist/index.d.mts' does not exist.", "Failed to resolve under condition 'import'.", - "Saw non-matching condition 'require'.", - "Matched 'exports' condition 'types'.", - "Using 'exports' subpath '.' with target './dist/index.d.ts'.", - "File '/node_modules/dep/dist/index.d.ts' exists - use it as a name resolution result.", + "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript.", + "File '/node_modules/dep/package.json' exists according to earlier cached lookups.", + "Entering conditional exports.", + "Matched 'exports' condition 'import'.", + "Using 'exports' subpath '.' with target './dist/index.mjs'.", + "File name '/node_modules/dep/dist/index.mjs' has a '.mjs' extension - stripping it.", + "File '/node_modules/dep/dist/index.mjs' exists - use it as a name resolution result.", "'package.json' does not have a 'peerDependencies' field.", - "Resolved under condition 'types'.", + "Resolved under condition 'import'.", "Exiting conditional exports.", - "Resolving real path for '/node_modules/dep/dist/index.d.ts', result '/node_modules/dep/dist/index.d.ts'.", - "======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.d.ts' with Package ID 'dep/dist/index.d.ts@1.0.0'. ========", + "Resolution of non-relative name failed; trying with modern Node resolution features disabled to see if npm library needs configuration update.", + "File '/package.json' does not exist according to earlier cached lookups.", + "Loading module 'dep' from 'node_modules' folder, target file types: TypeScript, Declaration.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", + "File '/node_modules/dep/package.json' exists according to earlier cached lookups.", + "'package.json' does not have a 'typesVersions' field.", + "'package.json' does not have a 'typings' field.", + "'package.json' does not have a 'types' field.", + "'package.json' does not have a 'main' field.", + "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", + "Resolving real path for '/node_modules/dep/dist/index.mjs', result '/node_modules/dep/dist/index.mjs'.", + "======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.mjs' with Package ID 'dep/dist/index.mjs@1.0.0'. ========", "File '/.ts/package.json' does not exist.", "File '/package.json' does not exist according to earlier cached lookups.", "======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========", diff --git a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=nodenext).errors.txt b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=nodenext).errors.txt index 85cf980ae49..73da8d1030d 100644 --- a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=nodenext).errors.txt +++ b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=nodenext).errors.txt @@ -22,9 +22,4 @@ error TS5110: Option 'module' must be set to 'NodeNext' when option 'moduleResol export {}; ==== /index.mts (0 errors) ==== - import {} from "dep"; - // Should be an untyped resolution to dep/dist/index.mjs, - // but the first search is only for TS files, and when - // there's no dist/index.d.mts, it continues looking for - // matching conditions and resolves via `types`. - \ No newline at end of file + import {} from "dep"; \ No newline at end of file diff --git a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=nodenext).trace.json b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=nodenext).trace.json index 71b30dcb23a..b7ce0ccc7be 100644 --- a/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=nodenext).trace.json +++ b/tests/baselines/reference/conditionalExportsResolutionFallback(moduleresolution=nodenext).trace.json @@ -15,15 +15,29 @@ "File '/node_modules/dep/dist/index.mts' does not exist.", "File '/node_modules/dep/dist/index.d.mts' does not exist.", "Failed to resolve under condition 'import'.", - "Saw non-matching condition 'require'.", - "Matched 'exports' condition 'types'.", - "Using 'exports' subpath '.' with target './dist/index.d.ts'.", - "File '/node_modules/dep/dist/index.d.ts' exists - use it as a name resolution result.", + "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", + "Searching all ancestor node_modules directories for fallback extensions: JavaScript.", + "File '/node_modules/dep/package.json' exists according to earlier cached lookups.", + "Entering conditional exports.", + "Matched 'exports' condition 'import'.", + "Using 'exports' subpath '.' with target './dist/index.mjs'.", + "File name '/node_modules/dep/dist/index.mjs' has a '.mjs' extension - stripping it.", + "File '/node_modules/dep/dist/index.mjs' exists - use it as a name resolution result.", "'package.json' does not have a 'peerDependencies' field.", - "Resolved under condition 'types'.", + "Resolved under condition 'import'.", "Exiting conditional exports.", - "Resolving real path for '/node_modules/dep/dist/index.d.ts', result '/node_modules/dep/dist/index.d.ts'.", - "======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.d.ts' with Package ID 'dep/dist/index.d.ts@1.0.0'. ========", + "Resolution of non-relative name failed; trying with modern Node resolution features disabled to see if npm library needs configuration update.", + "File '/package.json' does not exist according to earlier cached lookups.", + "Loading module 'dep' from 'node_modules' folder, target file types: TypeScript, Declaration.", + "Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.", + "File '/node_modules/dep/package.json' exists according to earlier cached lookups.", + "'package.json' does not have a 'typesVersions' field.", + "'package.json' does not have a 'typings' field.", + "'package.json' does not have a 'types' field.", + "'package.json' does not have a 'main' field.", + "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", + "Resolving real path for '/node_modules/dep/dist/index.mjs', result '/node_modules/dep/dist/index.mjs'.", + "======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.mjs' with Package ID 'dep/dist/index.mjs@1.0.0'. ========", "File '/.ts/package.json' does not exist.", "File '/package.json' does not exist according to earlier cached lookups.", "======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========", diff --git a/tests/cases/conformance/moduleResolution/conditionalExportsResolutionFallback.ts b/tests/cases/conformance/moduleResolution/conditionalExportsResolutionFallback.ts index 2076f434272..e703022dd68 100644 --- a/tests/cases/conformance/moduleResolution/conditionalExportsResolutionFallback.ts +++ b/tests/cases/conformance/moduleResolution/conditionalExportsResolutionFallback.ts @@ -27,8 +27,4 @@ export {}; export {}; // @Filename: /index.mts -import {} from "dep"; -// Should be an untyped resolution to dep/dist/index.mjs, -// but the first search is only for TS files, and when -// there's no dist/index.d.mts, it continues looking for -// matching conditions and resolves via `types`. +import {} from "dep"; \ No newline at end of file