@@ -2771,27 +2771,31 @@ function loadModuleFromImmediateNodeModulesDirectory(extensions: Extensions, mod
2771
2771
2772
2772
function loadModuleFromSpecificNodeModulesDirectory ( extensions : Extensions , moduleName : string , nodeModulesDirectory : string , nodeModulesDirectoryExists : boolean , state : ModuleResolutionState , cache : ModuleResolutionCache | undefined , redirectedReference : ResolvedProjectReference | undefined ) : Resolved | undefined {
2773
2773
const candidate = normalizePath ( combinePaths ( nodeModulesDirectory , moduleName ) ) ;
2774
+ const { packageName, rest } = parsePackageName ( moduleName ) ;
2775
+ const packageDirectory = combinePaths ( nodeModulesDirectory , packageName ) ;
2774
2776
2777
+ let rootPackageInfo : PackageJsonInfo | undefined ;
2775
2778
// First look for a nested package.json, as in `node_modules/foo/bar/package.json`.
2776
2779
let packageInfo = getPackageJsonInfo ( candidate , ! nodeModulesDirectoryExists , state ) ;
2777
2780
// But only if we're not respecting export maps (if we are, we might redirect around this location)
2778
- if ( ! ( state . features & NodeResolutionFeatures . Exports ) ) {
2779
- if ( packageInfo ) {
2780
- const fromFile = loadModuleFromFile ( extensions , candidate , ! nodeModulesDirectoryExists , state ) ;
2781
- if ( fromFile ) {
2782
- return noPackageId ( fromFile ) ;
2783
- }
2784
-
2785
- const fromDirectory = loadNodeModuleFromDirectoryWorker (
2786
- extensions ,
2787
- candidate ,
2788
- ! nodeModulesDirectoryExists ,
2789
- state ,
2790
- packageInfo . contents . packageJsonContent ,
2791
- getVersionPathsOfPackageJsonInfo ( packageInfo , state ) ,
2792
- ) ;
2793
- return withPackageId ( packageInfo , fromDirectory ) ;
2781
+ if ( rest !== "" && packageInfo && (
2782
+ ! ( state . features & NodeResolutionFeatures . Exports ) ||
2783
+ ! hasProperty ( ( rootPackageInfo = getPackageJsonInfo ( packageDirectory , ! nodeModulesDirectoryExists , state ) ) ?. contents . packageJsonContent ?? emptyArray , "exports" )
2784
+ ) ) {
2785
+ const fromFile = loadModuleFromFile ( extensions , candidate , ! nodeModulesDirectoryExists , state ) ;
2786
+ if ( fromFile ) {
2787
+ return noPackageId ( fromFile ) ;
2794
2788
}
2789
+
2790
+ const fromDirectory = loadNodeModuleFromDirectoryWorker (
2791
+ extensions ,
2792
+ candidate ,
2793
+ ! nodeModulesDirectoryExists ,
2794
+ state ,
2795
+ packageInfo . contents . packageJsonContent ,
2796
+ getVersionPathsOfPackageJsonInfo ( packageInfo , state ) ,
2797
+ ) ;
2798
+ return withPackageId ( packageInfo , fromDirectory ) ;
2795
2799
}
2796
2800
2797
2801
const loader : ResolutionKindSpecificLoader = ( extensions , candidate , onlyRecordFailures , state ) => {
@@ -2818,11 +2822,9 @@ function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, modu
2818
2822
return withPackageId ( packageInfo , pathAndExtension ) ;
2819
2823
} ;
2820
2824
2821
- const { packageName, rest } = parsePackageName ( moduleName ) ;
2822
- const packageDirectory = combinePaths ( nodeModulesDirectory , packageName ) ;
2823
2825
if ( rest !== "" ) {
2824
2826
// Previous `packageInfo` may have been from a nested package.json; ensure we have the one from the package root now.
2825
- packageInfo = getPackageJsonInfo ( packageDirectory , ! nodeModulesDirectoryExists , state ) ;
2827
+ packageInfo = rootPackageInfo ?? getPackageJsonInfo ( packageDirectory , ! nodeModulesDirectoryExists , state ) ;
2826
2828
}
2827
2829
// package exports are higher priority than file/directory/typesVersions lookups and (and, if there's exports present, blocks them)
2828
2830
if ( packageInfo && packageInfo . contents . packageJsonContent . exports && state . features & NodeResolutionFeatures . Exports ) {
0 commit comments