@@ -2756,27 +2756,31 @@ function loadModuleFromImmediateNodeModulesDirectory(extensions: Extensions, mod
27562756
27572757function loadModuleFromSpecificNodeModulesDirectory ( extensions : Extensions , moduleName : string , nodeModulesDirectory : string , nodeModulesDirectoryExists : boolean , state : ModuleResolutionState , cache : ModuleResolutionCache | undefined , redirectedReference : ResolvedProjectReference | undefined ) : Resolved | undefined {
27582758 const candidate = normalizePath ( combinePaths ( nodeModulesDirectory , moduleName ) ) ;
2759+ const { packageName, rest } = parsePackageName ( moduleName ) ;
2760+ const packageDirectory = combinePaths ( nodeModulesDirectory , packageName ) ;
27592761
2762+ let rootPackageInfo : PackageJsonInfo | undefined ;
27602763 // First look for a nested package.json, as in `node_modules/foo/bar/package.json`.
27612764 let packageInfo = getPackageJsonInfo ( candidate , ! nodeModulesDirectoryExists , state ) ;
27622765 // 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 ) ;
27792773 }
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 ) ;
27802784 }
27812785
27822786 const loader : ResolutionKindSpecificLoader = ( extensions , candidate , onlyRecordFailures , state ) => {
@@ -2803,11 +2807,9 @@ function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, modu
28032807 return withPackageId ( packageInfo , pathAndExtension ) ;
28042808 } ;
28052809
2806- const { packageName, rest } = parsePackageName ( moduleName ) ;
2807- const packageDirectory = combinePaths ( nodeModulesDirectory , packageName ) ;
28082810 if ( rest !== "" ) {
28092811 // 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 ) ;
28112813 }
28122814 // package exports are higher priority than file/directory/typesVersions lookups and (and, if there's exports present, blocks them)
28132815 if ( packageInfo && packageInfo . contents . packageJsonContent . exports && state . features & NodeResolutionFeatures . Exports ) {
0 commit comments