Skip to content

Commit 421f5c5

Browse files
authored
Fix incorrect usage of package.json types/main in package subdirectories (#60696)
1 parent 239a2a9 commit 421f5c5

5 files changed

+11
-75
lines changed

src/compiler/moduleNameResolver.ts

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2208,9 +2208,7 @@ function tryFileLookup(fileName: string, onlyRecordFailures: boolean, state: Mod
22082208

22092209
function loadNodeModuleFromDirectory(extensions: Extensions, candidate: string, onlyRecordFailures: boolean, state: ModuleResolutionState, considerPackageJson = true) {
22102210
const packageInfo = considerPackageJson ? getPackageJsonInfo(candidate, onlyRecordFailures, state) : undefined;
2211-
const packageJsonContent = packageInfo && packageInfo.contents.packageJsonContent;
2212-
const versionPaths = packageInfo && getVersionPathsOfPackageJsonInfo(packageInfo, state);
2213-
return withPackageId(packageInfo, loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFailures, state, packageJsonContent, versionPaths), state);
2211+
return withPackageId(packageInfo, loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFailures, state, packageInfo), state);
22142212
}
22152213

22162214
/** @internal */
@@ -2243,8 +2241,7 @@ export function getEntrypointsFromPackageJsonInfo(
22432241
packageJsonInfo.packageDirectory,
22442242
/*onlyRecordFailures*/ false,
22452243
loadPackageJsonMainState,
2246-
packageJsonInfo.contents.packageJsonContent,
2247-
getVersionPathsOfPackageJsonInfo(packageJsonInfo, loadPackageJsonMainState),
2244+
packageJsonInfo,
22482245
);
22492246
entrypoints = append(entrypoints, mainResolution?.path);
22502247

@@ -2481,15 +2478,16 @@ function getPackageJsonInfo(packageDirectory: string, onlyRecordFailures: boolea
24812478
}
24822479
}
24832480

2484-
function loadNodeModuleFromDirectoryWorker(extensions: Extensions, candidate: string, onlyRecordFailures: boolean, state: ModuleResolutionState, jsonContent: PackageJsonPathFields | undefined, versionPaths: VersionPaths | undefined): PathAndExtension | undefined {
2481+
function loadNodeModuleFromDirectoryWorker(extensions: Extensions, candidate: string, onlyRecordFailures: boolean, state: ModuleResolutionState, packageJson: PackageJsonInfo | undefined): PathAndExtension | undefined {
2482+
const versionPaths = packageJson && getVersionPathsOfPackageJsonInfo(packageJson, state);
24852483
let packageFile: string | undefined;
2486-
if (jsonContent) {
2484+
if (packageJson && arePathsEqual(packageJson?.packageDirectory, candidate, state.host)) {
24872485
if (state.isConfigLookup) {
2488-
packageFile = readPackageJsonTSConfigField(jsonContent, candidate, state);
2486+
packageFile = readPackageJsonTSConfigField(packageJson.contents.packageJsonContent, packageJson.packageDirectory, state);
24892487
}
24902488
else {
2491-
packageFile = extensions & Extensions.Declaration && readPackageJsonTypesFields(jsonContent, candidate, state) ||
2492-
extensions & (Extensions.ImplementationFiles | Extensions.Declaration) && readPackageJsonMainField(jsonContent, candidate, state) ||
2489+
packageFile = extensions & Extensions.Declaration && readPackageJsonTypesFields(packageJson.contents.packageJsonContent, packageJson.packageDirectory, state) ||
2490+
extensions & (Extensions.ImplementationFiles | Extensions.Declaration) && readPackageJsonMainField(packageJson.contents.packageJsonContent, packageJson.packageDirectory, state) ||
24932491
undefined;
24942492
}
24952493
}
@@ -2510,7 +2508,7 @@ function loadNodeModuleFromDirectoryWorker(extensions: Extensions, candidate: st
25102508
const features = state.features;
25112509
const candidateIsFromPackageJsonField = state.candidateIsFromPackageJsonField;
25122510
state.candidateIsFromPackageJsonField = true;
2513-
if (jsonContent?.type !== "module") {
2511+
if (packageJson?.contents.packageJsonContent.type !== "module") {
25142512
state.features &= ~NodeResolutionFeatures.EsmMode;
25152513
}
25162514
const result = nodeLoadModuleByRelativeName(expandedExtensions, candidate, onlyRecordFailures, state, /*considerPackageJson*/ false);
@@ -3100,8 +3098,7 @@ function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, modu
31003098
candidate,
31013099
!nodeModulesDirectoryExists,
31023100
state,
3103-
packageInfo.contents.packageJsonContent,
3104-
getVersionPathsOfPackageJsonInfo(packageInfo, state),
3101+
packageInfo,
31053102
);
31063103
return withPackageId(packageInfo, fromDirectory, state);
31073104
}
@@ -3113,8 +3110,7 @@ function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, modu
31133110
candidate,
31143111
onlyRecordFailures,
31153112
state,
3116-
packageInfo && packageInfo.contents.packageJsonContent,
3117-
packageInfo && getVersionPathsOfPackageJsonInfo(packageInfo, state),
3113+
packageInfo,
31183114
);
31193115
if (
31203116
!pathAndExtension && packageInfo

tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot.trace.json

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,6 @@
99
"File '/node_modules/foo/bar.ts' does not exist.",
1010
"File '/node_modules/foo/bar.tsx' does not exist.",
1111
"File '/node_modules/foo/bar.d.ts' does not exist.",
12-
"'package.json' does not have a 'typings' field.",
13-
"'package.json' has 'types' field 'types.d.ts' that references '/node_modules/foo/bar/types.d.ts'.",
14-
"File '/node_modules/foo/bar/types.d.ts' does not exist.",
15-
"Loading module as file / folder, candidate module location '/node_modules/foo/bar/types.d.ts', target file types: TypeScript, Declaration.",
16-
"File name '/node_modules/foo/bar/types.d.ts' has a '.d.ts' extension - stripping it.",
17-
"File '/node_modules/foo/bar/types.ts' does not exist.",
18-
"File '/node_modules/foo/bar/types.tsx' does not exist.",
19-
"File '/node_modules/foo/bar/types.d.ts' does not exist.",
20-
"File '/node_modules/foo/bar/types.d.ts.ts' does not exist.",
21-
"File '/node_modules/foo/bar/types.d.ts.tsx' does not exist.",
22-
"File '/node_modules/foo/bar/types.d.ts.d.ts' does not exist.",
23-
"Directory '/node_modules/foo/bar/types.d.ts' does not exist, skipping all lookups in it.",
2412
"File '/node_modules/foo/bar/index.ts' does not exist.",
2513
"File '/node_modules/foo/bar/index.tsx' does not exist.",
2614
"File '/node_modules/foo/bar/index.d.ts' does not exist.",
@@ -31,7 +19,6 @@
3119
"File '/node_modules/foo/package.json' exists according to earlier cached lookups.",
3220
"File '/node_modules/foo/bar.js' does not exist.",
3321
"File '/node_modules/foo/bar.jsx' does not exist.",
34-
"'package.json' does not have a 'main' field.",
3522
"File '/node_modules/foo/bar/index.js' exists - use it as a name resolution result.",
3623
"'package.json' does not have a 'peerDependencies' field.",
3724
"Resolution of non-relative name failed; trying with '--moduleResolution bundler' to see if project may need configuration update.",
@@ -42,18 +29,6 @@
4229
"File '/node_modules/foo/bar.ts' does not exist.",
4330
"File '/node_modules/foo/bar.tsx' does not exist.",
4431
"File '/node_modules/foo/bar.d.ts' does not exist.",
45-
"'package.json' does not have a 'typings' field.",
46-
"'package.json' has 'types' field 'types.d.ts' that references '/node_modules/foo/bar/types.d.ts'.",
47-
"File '/node_modules/foo/bar/types.d.ts' does not exist.",
48-
"Loading module as file / folder, candidate module location '/node_modules/foo/bar/types.d.ts', target file types: TypeScript, Declaration.",
49-
"File name '/node_modules/foo/bar/types.d.ts' has a '.d.ts' extension - stripping it.",
50-
"File '/node_modules/foo/bar/types.ts' does not exist.",
51-
"File '/node_modules/foo/bar/types.tsx' does not exist.",
52-
"File '/node_modules/foo/bar/types.d.ts' does not exist.",
53-
"File '/node_modules/foo/bar/types.d.ts.ts' does not exist.",
54-
"File '/node_modules/foo/bar/types.d.ts.tsx' does not exist.",
55-
"File '/node_modules/foo/bar/types.d.ts.d.ts' does not exist.",
56-
"Directory '/node_modules/foo/bar/types.d.ts' does not exist, skipping all lookups in it.",
5732
"File '/node_modules/foo/bar/index.ts' does not exist.",
5833
"File '/node_modules/foo/bar/index.tsx' does not exist.",
5934
"File '/node_modules/foo/bar/index.d.ts' does not exist.",

tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_fakeScopedPackage.trace.json

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,6 @@
99
"File '/node_modules/foo/@bar.ts' does not exist.",
1010
"File '/node_modules/foo/@bar.tsx' does not exist.",
1111
"File '/node_modules/foo/@bar.d.ts' does not exist.",
12-
"'package.json' does not have a 'typings' field.",
13-
"'package.json' has 'types' field 'types.d.ts' that references '/node_modules/foo/@bar/types.d.ts'.",
14-
"File '/node_modules/foo/@bar/types.d.ts' does not exist.",
15-
"Loading module as file / folder, candidate module location '/node_modules/foo/@bar/types.d.ts', target file types: TypeScript, Declaration.",
16-
"File name '/node_modules/foo/@bar/types.d.ts' has a '.d.ts' extension - stripping it.",
17-
"File '/node_modules/foo/@bar/types.ts' does not exist.",
18-
"File '/node_modules/foo/@bar/types.tsx' does not exist.",
19-
"File '/node_modules/foo/@bar/types.d.ts' does not exist.",
20-
"File '/node_modules/foo/@bar/types.d.ts.ts' does not exist.",
21-
"File '/node_modules/foo/@bar/types.d.ts.tsx' does not exist.",
22-
"File '/node_modules/foo/@bar/types.d.ts.d.ts' does not exist.",
23-
"Directory '/node_modules/foo/@bar/types.d.ts' does not exist, skipping all lookups in it.",
2412
"File '/node_modules/foo/@bar/index.ts' does not exist.",
2513
"File '/node_modules/foo/@bar/index.tsx' does not exist.",
2614
"File '/node_modules/foo/@bar/index.d.ts' does not exist.",
@@ -31,7 +19,6 @@
3119
"File '/node_modules/foo/package.json' exists according to earlier cached lookups.",
3220
"File '/node_modules/foo/@bar.js' does not exist.",
3321
"File '/node_modules/foo/@bar.jsx' does not exist.",
34-
"'package.json' does not have a 'main' field.",
3522
"File '/node_modules/foo/@bar/index.js' exists - use it as a name resolution result.",
3623
"'package.json' does not have a 'peerDependencies' field.",
3724
"Resolution of non-relative name failed; trying with '--moduleResolution bundler' to see if project may need configuration update.",
@@ -42,18 +29,6 @@
4229
"File '/node_modules/foo/@bar.ts' does not exist.",
4330
"File '/node_modules/foo/@bar.tsx' does not exist.",
4431
"File '/node_modules/foo/@bar.d.ts' does not exist.",
45-
"'package.json' does not have a 'typings' field.",
46-
"'package.json' has 'types' field 'types.d.ts' that references '/node_modules/foo/@bar/types.d.ts'.",
47-
"File '/node_modules/foo/@bar/types.d.ts' does not exist.",
48-
"Loading module as file / folder, candidate module location '/node_modules/foo/@bar/types.d.ts', target file types: TypeScript, Declaration.",
49-
"File name '/node_modules/foo/@bar/types.d.ts' has a '.d.ts' extension - stripping it.",
50-
"File '/node_modules/foo/@bar/types.ts' does not exist.",
51-
"File '/node_modules/foo/@bar/types.tsx' does not exist.",
52-
"File '/node_modules/foo/@bar/types.d.ts' does not exist.",
53-
"File '/node_modules/foo/@bar/types.d.ts.ts' does not exist.",
54-
"File '/node_modules/foo/@bar/types.d.ts.tsx' does not exist.",
55-
"File '/node_modules/foo/@bar/types.d.ts.d.ts' does not exist.",
56-
"Directory '/node_modules/foo/@bar/types.d.ts' does not exist, skipping all lookups in it.",
5732
"File '/node_modules/foo/@bar/index.ts' does not exist.",
5833
"File '/node_modules/foo/@bar/index.tsx' does not exist.",
5934
"File '/node_modules/foo/@bar/index.d.ts' does not exist.",

tests/baselines/reference/typesVersions.ambientModules.trace.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
"File '/.src/node_modules/ext/ts3.1/other.ts' does not exist.",
3232
"File '/.src/node_modules/ext/ts3.1/other.tsx' does not exist.",
3333
"File '/.src/node_modules/ext/ts3.1/other.d.ts' does not exist.",
34-
"'package.json' does not have a 'typings' field.",
35-
"'package.json' has 'types' field 'index' that references '/.src/node_modules/ext/ts3.1/other/index'.",
3634
"'package.json' has a 'typesVersions' entry '>=3.1.0-0' that matches compiler version '3.1.0-dev', looking for a pattern to match module name 'index'.",
3735
"Module name 'index', matched pattern '*'.",
3836
"Trying substitution 'ts3.1/*', candidate module location: 'ts3.1/index'.",
@@ -47,7 +45,6 @@
4745
"Trying substitution 'ts3.1/*', candidate module location: 'ts3.1/other'.",
4846
"File '/.src/node_modules/ext/ts3.1/other.js' does not exist.",
4947
"File '/.src/node_modules/ext/ts3.1/other.jsx' does not exist.",
50-
"'package.json' does not have a 'main' field.",
5148
"'package.json' has a 'typesVersions' entry '>=3.1.0-0' that matches compiler version '3.1.0-dev', looking for a pattern to match module name 'index'.",
5249
"Module name 'index', matched pattern '*'.",
5350
"Trying substitution 'ts3.1/*', candidate module location: 'ts3.1/index'.",
@@ -63,8 +60,6 @@
6360
"File '/.src/node_modules/ext/ts3.1/other.ts' does not exist.",
6461
"File '/.src/node_modules/ext/ts3.1/other.tsx' does not exist.",
6562
"File '/.src/node_modules/ext/ts3.1/other.d.ts' does not exist.",
66-
"'package.json' does not have a 'typings' field.",
67-
"'package.json' has 'types' field 'index' that references '/.src/node_modules/ext/ts3.1/other/index'.",
6863
"'package.json' has a 'typesVersions' entry '>=3.1.0-0' that matches compiler version '3.1.0-dev', looking for a pattern to match module name 'index'.",
6964
"Module name 'index', matched pattern '*'.",
7065
"Trying substitution 'ts3.1/*', candidate module location: 'ts3.1/index'.",

tests/baselines/reference/typesVersionsDeclarationEmit.ambient.trace.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
"File '/.src/node_modules/ext/ts3.1/other.ts' does not exist.",
3232
"File '/.src/node_modules/ext/ts3.1/other.tsx' does not exist.",
3333
"File '/.src/node_modules/ext/ts3.1/other.d.ts' does not exist.",
34-
"'package.json' does not have a 'typings' field.",
35-
"'package.json' has 'types' field 'index' that references '/.src/node_modules/ext/ts3.1/other/index'.",
3634
"'package.json' has a 'typesVersions' entry '>=3.1.0-0' that matches compiler version '3.1.0-dev', looking for a pattern to match module name 'index'.",
3735
"Module name 'index', matched pattern '*'.",
3836
"Trying substitution 'ts3.1/*', candidate module location: 'ts3.1/index'.",
@@ -47,7 +45,6 @@
4745
"Trying substitution 'ts3.1/*', candidate module location: 'ts3.1/other'.",
4846
"File '/.src/node_modules/ext/ts3.1/other.js' does not exist.",
4947
"File '/.src/node_modules/ext/ts3.1/other.jsx' does not exist.",
50-
"'package.json' does not have a 'main' field.",
5148
"'package.json' has a 'typesVersions' entry '>=3.1.0-0' that matches compiler version '3.1.0-dev', looking for a pattern to match module name 'index'.",
5249
"Module name 'index', matched pattern '*'.",
5350
"Trying substitution 'ts3.1/*', candidate module location: 'ts3.1/index'.",
@@ -63,8 +60,6 @@
6360
"File '/.src/node_modules/ext/ts3.1/other.ts' does not exist.",
6461
"File '/.src/node_modules/ext/ts3.1/other.tsx' does not exist.",
6562
"File '/.src/node_modules/ext/ts3.1/other.d.ts' does not exist.",
66-
"'package.json' does not have a 'typings' field.",
67-
"'package.json' has 'types' field 'index' that references '/.src/node_modules/ext/ts3.1/other/index'.",
6863
"'package.json' has a 'typesVersions' entry '>=3.1.0-0' that matches compiler version '3.1.0-dev', looking for a pattern to match module name 'index'.",
6964
"Module name 'index', matched pattern '*'.",
7065
"Trying substitution 'ts3.1/*', candidate module location: 'ts3.1/index'.",

0 commit comments

Comments
 (0)