Skip to content

Commit 14b0d6d

Browse files
authored
Fix nested package json lookup in modes that respect package.json exports (#51995)
1 parent b3eca68 commit 14b0d6d

File tree

5 files changed

+129
-19
lines changed

5 files changed

+129
-19
lines changed

src/compiler/moduleNameResolver.ts

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2771,27 +2771,31 @@ function loadModuleFromImmediateNodeModulesDirectory(extensions: Extensions, mod
27712771

27722772
function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, moduleName: string, nodeModulesDirectory: string, nodeModulesDirectoryExists: boolean, state: ModuleResolutionState, cache: ModuleResolutionCache | undefined, redirectedReference: ResolvedProjectReference | undefined): Resolved | undefined {
27732773
const candidate = normalizePath(combinePaths(nodeModulesDirectory, moduleName));
2774+
const { packageName, rest } = parsePackageName(moduleName);
2775+
const packageDirectory = combinePaths(nodeModulesDirectory, packageName);
27742776

2777+
let rootPackageInfo: PackageJsonInfo | undefined;
27752778
// First look for a nested package.json, as in `node_modules/foo/bar/package.json`.
27762779
let packageInfo = getPackageJsonInfo(candidate, !nodeModulesDirectoryExists, state);
27772780
// 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);
27942788
}
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);
27952799
}
27962800

27972801
const loader: ResolutionKindSpecificLoader = (extensions, candidate, onlyRecordFailures, state) => {
@@ -2818,11 +2822,9 @@ function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, modu
28182822
return withPackageId(packageInfo, pathAndExtension);
28192823
};
28202824

2821-
const { packageName, rest } = parsePackageName(moduleName);
2822-
const packageDirectory = combinePaths(nodeModulesDirectory, packageName);
28232825
if (rest !== "") {
28242826
// 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);
28262828
}
28272829
// package exports are higher priority than file/directory/typesVersions lookups and (and, if there's exports present, blocks them)
28282830
if (packageInfo && packageInfo.contents.packageJsonContent.exports && state.features & NodeResolutionFeatures.Exports) {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[
2+
"======== Resolving module '@restart/hooks/useMergedRefs' from '/main.ts'. ========",
3+
"Explicitly specified module resolution kind: 'Bundler'.",
4+
"File '/package.json' does not exist.",
5+
"Loading module '@restart/hooks/useMergedRefs' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration, JSON.",
6+
"Found 'package.json' at '/node_modules/@restart/hooks/useMergedRefs/package.json'.",
7+
"Found 'package.json' at '/node_modules/@restart/hooks/package.json'.",
8+
"File '/node_modules/@restart/hooks/useMergedRefs.ts' does not exist.",
9+
"File '/node_modules/@restart/hooks/useMergedRefs.tsx' does not exist.",
10+
"File '/node_modules/@restart/hooks/useMergedRefs.d.ts' does not exist.",
11+
"'package.json' does not have a 'typesVersions' field.",
12+
"'package.json' does not have a 'typings' field.",
13+
"'package.json' has 'types' field '../esm/useMergedRefs.d.ts' that references '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts'.",
14+
"File '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts' exist - use it as a name resolution result.",
15+
"Resolving real path for '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts', result '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts'.",
16+
"======== Module name '@restart/hooks/useMergedRefs' was successfully resolved to '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts'. ========"
17+
]
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
[
2+
"File '/node_modules/@restart/hooks/esm/package.json' does not exist.",
3+
"Found 'package.json' at '/node_modules/@restart/hooks/package.json'.",
4+
"File '/package.json' does not exist.",
5+
"======== Resolving module '@restart/hooks/useMergedRefs' from '/main.ts'. ========",
6+
"Explicitly specified module resolution kind: 'Node16'.",
7+
"Resolving in CJS mode with conditions 'node', 'require', 'types'.",
8+
"File '/package.json' does not exist according to earlier cached lookups.",
9+
"Loading module '@restart/hooks/useMergedRefs' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration.",
10+
"Found 'package.json' at '/node_modules/@restart/hooks/useMergedRefs/package.json'.",
11+
"File '/node_modules/@restart/hooks/package.json' exists according to earlier cached lookups.",
12+
"File '/node_modules/@restart/hooks/useMergedRefs.ts' does not exist.",
13+
"File '/node_modules/@restart/hooks/useMergedRefs.tsx' does not exist.",
14+
"File '/node_modules/@restart/hooks/useMergedRefs.d.ts' does not exist.",
15+
"'package.json' does not have a 'typesVersions' field.",
16+
"'package.json' does not have a 'typings' field.",
17+
"'package.json' has 'types' field '../esm/useMergedRefs.d.ts' that references '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts'.",
18+
"File '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts' exist - use it as a name resolution result.",
19+
"Resolving real path for '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts', result '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts'.",
20+
"======== Module name '@restart/hooks/useMergedRefs' was successfully resolved to '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts'. ========",
21+
"File 'package.json' does not exist.",
22+
"File '/package.json' does not exist according to earlier cached lookups.",
23+
"File 'package.json' does not exist according to earlier cached lookups.",
24+
"File '/package.json' does not exist according to earlier cached lookups.",
25+
"File 'package.json' does not exist according to earlier cached lookups.",
26+
"File '/package.json' does not exist according to earlier cached lookups.",
27+
"File 'package.json' does not exist according to earlier cached lookups.",
28+
"File '/package.json' does not exist according to earlier cached lookups.",
29+
"File 'package.json' does not exist according to earlier cached lookups.",
30+
"File '/package.json' does not exist according to earlier cached lookups."
31+
]
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
[
2+
"File '/node_modules/@restart/hooks/esm/package.json' does not exist.",
3+
"Found 'package.json' at '/node_modules/@restart/hooks/package.json'.",
4+
"File '/package.json' does not exist.",
5+
"======== Resolving module '@restart/hooks/useMergedRefs' from '/main.ts'. ========",
6+
"Explicitly specified module resolution kind: 'NodeNext'.",
7+
"Resolving in CJS mode with conditions 'node', 'require', 'types'.",
8+
"File '/package.json' does not exist according to earlier cached lookups.",
9+
"Loading module '@restart/hooks/useMergedRefs' from 'node_modules' folder, target file types: TypeScript, JavaScript, Declaration.",
10+
"Found 'package.json' at '/node_modules/@restart/hooks/useMergedRefs/package.json'.",
11+
"File '/node_modules/@restart/hooks/package.json' exists according to earlier cached lookups.",
12+
"File '/node_modules/@restart/hooks/useMergedRefs.ts' does not exist.",
13+
"File '/node_modules/@restart/hooks/useMergedRefs.tsx' does not exist.",
14+
"File '/node_modules/@restart/hooks/useMergedRefs.d.ts' does not exist.",
15+
"'package.json' does not have a 'typesVersions' field.",
16+
"'package.json' does not have a 'typings' field.",
17+
"'package.json' has 'types' field '../esm/useMergedRefs.d.ts' that references '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts'.",
18+
"File '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts' exist - use it as a name resolution result.",
19+
"Resolving real path for '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts', result '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts'.",
20+
"======== Module name '@restart/hooks/useMergedRefs' was successfully resolved to '/node_modules/@restart/hooks/esm/useMergedRefs.d.ts'. ========",
21+
"File 'package.json' does not exist.",
22+
"File '/package.json' does not exist according to earlier cached lookups.",
23+
"File 'package.json' does not exist according to earlier cached lookups.",
24+
"File '/package.json' does not exist according to earlier cached lookups.",
25+
"File 'package.json' does not exist according to earlier cached lookups.",
26+
"File '/package.json' does not exist according to earlier cached lookups.",
27+
"File 'package.json' does not exist according to earlier cached lookups.",
28+
"File '/package.json' does not exist according to earlier cached lookups.",
29+
"File 'package.json' does not exist according to earlier cached lookups.",
30+
"File '/package.json' does not exist according to earlier cached lookups."
31+
]
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// @moduleResolution: node16,nodenext,bundler
2+
// @noEmit: true
3+
// @noTypesAndSymbols: true
4+
// @traceResolution: true
5+
// @strict: true
6+
7+
// @Filename: /node_modules/@restart/hooks/package.json
8+
{
9+
"name": "@restart/hooks",
10+
"version": "0.3.25",
11+
"main": "cjs/index.js",
12+
"types": "cjs/index.d.ts",
13+
"module": "esm/index.js"
14+
}
15+
16+
// @Filename: /node_modules/@restart/hooks/useMergedRefs/package.json
17+
{
18+
"name": "@restart/hooks/useMergedRefs",
19+
"private": true,
20+
"main": "../cjs/useMergedRefs.js",
21+
"module": "../esm/useMergedRefs.js",
22+
"types": "../esm/useMergedRefs.d.ts"
23+
}
24+
25+
// @Filename: /node_modules/@restart/hooks/esm/useMergedRefs.d.ts
26+
export {};
27+
28+
// @Filename: /main.ts
29+
import {} from "@restart/hooks/useMergedRefs";

0 commit comments

Comments
 (0)