@@ -2756,27 +2756,31 @@ function loadModuleFromImmediateNodeModulesDirectory(extensions: Extensions, mod
2756
2756
2757
2757
function loadModuleFromSpecificNodeModulesDirectory ( extensions : Extensions , moduleName : string , nodeModulesDirectory : string , nodeModulesDirectoryExists : boolean , state : ModuleResolutionState , cache : ModuleResolutionCache | undefined , redirectedReference : ResolvedProjectReference | undefined ) : Resolved | undefined {
2758
2758
const candidate = normalizePath ( combinePaths ( nodeModulesDirectory , moduleName ) ) ;
2759
+ const { packageName, rest } = parsePackageName ( moduleName ) ;
2760
+ const packageDirectory = combinePaths ( nodeModulesDirectory , packageName ) ;
2759
2761
2762
+ let rootPackageInfo : PackageJsonInfo | undefined ;
2760
2763
// First look for a nested package.json, as in `node_modules/foo/bar/package.json`.
2761
2764
let packageInfo = getPackageJsonInfo ( candidate , ! nodeModulesDirectoryExists , state ) ;
2762
2765
// But only if we're not respecting export maps (if we are, we might redirect around this location)
2763
- if ( ! ( state . features & NodeResolutionFeatures . Exports ) ) {
2764
- if ( packageInfo ) {
2765
- const fromFile = loadModuleFromFile ( extensions , candidate , ! nodeModulesDirectoryExists , state ) ;
2766
- if ( fromFile ) {
2767
- return noPackageId ( fromFile ) ;
2768
- }
2769
-
2770
- const fromDirectory = loadNodeModuleFromDirectoryWorker (
2771
- extensions ,
2772
- candidate ,
2773
- ! nodeModulesDirectoryExists ,
2774
- state ,
2775
- packageInfo . contents . packageJsonContent ,
2776
- getVersionPathsOfPackageJsonInfo ( packageInfo , state ) ,
2777
- ) ;
2778
- return withPackageId ( packageInfo , fromDirectory ) ;
2766
+ if ( rest !== "" && packageInfo && (
2767
+ ! ( state . features & NodeResolutionFeatures . Exports ) ||
2768
+ ! hasProperty ( ( rootPackageInfo = getPackageJsonInfo ( packageDirectory , ! nodeModulesDirectoryExists , state ) ) ?. contents . packageJsonContent ?? emptyArray , "exports" )
2769
+ ) ) {
2770
+ const fromFile = loadModuleFromFile ( extensions , candidate , ! nodeModulesDirectoryExists , state ) ;
2771
+ if ( fromFile ) {
2772
+ return noPackageId ( fromFile ) ;
2779
2773
}
2774
+
2775
+ const fromDirectory = loadNodeModuleFromDirectoryWorker (
2776
+ extensions ,
2777
+ candidate ,
2778
+ ! nodeModulesDirectoryExists ,
2779
+ state ,
2780
+ packageInfo . contents . packageJsonContent ,
2781
+ getVersionPathsOfPackageJsonInfo ( packageInfo , state ) ,
2782
+ ) ;
2783
+ return withPackageId ( packageInfo , fromDirectory ) ;
2780
2784
}
2781
2785
2782
2786
const loader : ResolutionKindSpecificLoader = ( extensions , candidate , onlyRecordFailures , state ) => {
@@ -2803,11 +2807,9 @@ function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, modu
2803
2807
return withPackageId ( packageInfo , pathAndExtension ) ;
2804
2808
} ;
2805
2809
2806
- const { packageName, rest } = parsePackageName ( moduleName ) ;
2807
- const packageDirectory = combinePaths ( nodeModulesDirectory , packageName ) ;
2808
2810
if ( rest !== "" ) {
2809
2811
// Previous `packageInfo` may have been from a nested package.json; ensure we have the one from the package root now.
2810
- packageInfo = getPackageJsonInfo ( packageDirectory , ! nodeModulesDirectoryExists , state ) ;
2812
+ packageInfo = rootPackageInfo ?? getPackageJsonInfo ( packageDirectory , ! nodeModulesDirectoryExists , state ) ;
2811
2813
}
2812
2814
// package exports are higher priority than file/directory/typesVersions lookups and (and, if there's exports present, blocks them)
2813
2815
if ( packageInfo && packageInfo . contents . packageJsonContent . exports && state . features & NodeResolutionFeatures . Exports ) {
0 commit comments