Skip to content

Commit f6cf510

Browse files
authoredOct 14, 2022
Add more tracing to node16/nodenext resolution (#51168)
* Add more tracing to node16/nodenext resolution * Update baselines after diagnostic change * Trace non-matching conditions
1 parent 83c5581 commit f6cf510

21 files changed

+1789
-638
lines changed
 

‎src/compiler/diagnosticMessages.json

+16
Original file line numberDiff line numberDiff line change
@@ -5414,6 +5414,22 @@
54145414
"category": "Message",
54155415
"code": 6401
54165416
},
5417+
"Resolving in {0} mode with conditions {1}.": {
5418+
"category": "Message",
5419+
"code": 6402
5420+
},
5421+
"Matched '{0}' condition '{1}'.": {
5422+
"category": "Message",
5423+
"code": 6403
5424+
},
5425+
"Using '{0}' subpath '{1}' with target '{2}'.": {
5426+
"category": "Message",
5427+
"code": 6404
5428+
},
5429+
"Saw non-matching condition '{0}'.": {
5430+
"category": "Message",
5431+
"code": 6405
5432+
},
54175433

54185434
"The expected type comes from property '{0}' which is declared here on type '{1}'": {
54195435
"category": "Message",

‎src/compiler/moduleNameResolver.ts

+35-11
Original file line numberDiff line numberDiff line change
@@ -1372,6 +1372,10 @@ namespace ts {
13721372
reportDiagnostic: diag => void diagnostics.push(diag),
13731373
};
13741374

1375+
if (traceEnabled && getEmitModuleResolutionKind(compilerOptions) >= ModuleResolutionKind.Node16 && getEmitModuleResolutionKind(compilerOptions) <= ModuleResolutionKind.NodeNext) {
1376+
trace(host, Diagnostics.Resolving_in_0_mode_with_conditions_1, features & NodeResolutionFeatures.EsmMode ? "ESM" : "CJS", conditions.map(c => `'${c}'`).join(", "));
1377+
}
1378+
13751379
const result = forEach(extensions, ext => tryResolve(ext));
13761380
return createResolvedModuleWithFailedLookupLocations(
13771381
result?.value?.resolved,
@@ -2032,7 +2036,7 @@ namespace ts {
20322036
}
20332037
if (mainExport) {
20342038
const loadModuleFromTargetImportOrExport = getLoadModuleFromTargetImportOrExport(extensions, state, cache, redirectedReference, subpath, scope, /*isImports*/ false);
2035-
return loadModuleFromTargetImportOrExport(mainExport, "", /*pattern*/ false);
2039+
return loadModuleFromTargetImportOrExport(mainExport, "", /*pattern*/ false, ".");
20362040
}
20372041
}
20382042
else if (allKeysStartWithDot(scope.contents.packageJsonContent.exports as MapLike<unknown>)) {
@@ -2111,25 +2115,25 @@ namespace ts {
21112115

21122116
if (!endsWith(moduleName, directorySeparator) && moduleName.indexOf("*") === -1 && hasProperty(lookupTable, moduleName)) {
21132117
const target = (lookupTable as {[idx: string]: unknown})[moduleName];
2114-
return loadModuleFromTargetImportOrExport(target, /*subpath*/ "", /*pattern*/ false);
2118+
return loadModuleFromTargetImportOrExport(target, /*subpath*/ "", /*pattern*/ false, moduleName);
21152119
}
21162120
const expandingKeys = sort(filter(getOwnKeys(lookupTable as MapLike<unknown>), k => k.indexOf("*") !== -1 || endsWith(k, "/")), comparePatternKeys);
21172121
for (const potentialTarget of expandingKeys) {
21182122
if (state.features & NodeResolutionFeatures.ExportsPatternTrailers && matchesPatternWithTrailer(potentialTarget, moduleName)) {
21192123
const target = (lookupTable as {[idx: string]: unknown})[potentialTarget];
21202124
const starPos = potentialTarget.indexOf("*");
21212125
const subpath = moduleName.substring(potentialTarget.substring(0, starPos).length, moduleName.length - (potentialTarget.length - 1 - starPos));
2122-
return loadModuleFromTargetImportOrExport(target, subpath, /*pattern*/ true);
2126+
return loadModuleFromTargetImportOrExport(target, subpath, /*pattern*/ true, potentialTarget);
21232127
}
21242128
else if (endsWith(potentialTarget, "*") && startsWith(moduleName, potentialTarget.substring(0, potentialTarget.length - 1))) {
21252129
const target = (lookupTable as {[idx: string]: unknown})[potentialTarget];
21262130
const subpath = moduleName.substring(potentialTarget.length - 1);
2127-
return loadModuleFromTargetImportOrExport(target, subpath, /*pattern*/ true);
2131+
return loadModuleFromTargetImportOrExport(target, subpath, /*pattern*/ true, potentialTarget);
21282132
}
21292133
else if (startsWith(moduleName, potentialTarget)) {
21302134
const target = (lookupTable as {[idx: string]: unknown})[potentialTarget];
21312135
const subpath = moduleName.substring(potentialTarget.length);
2132-
return loadModuleFromTargetImportOrExport(target, subpath, /*pattern*/ false);
2136+
return loadModuleFromTargetImportOrExport(target, subpath, /*pattern*/ false, potentialTarget);
21332137
}
21342138
}
21352139

@@ -2146,7 +2150,7 @@ namespace ts {
21462150
*/
21472151
function getLoadModuleFromTargetImportOrExport(extensions: Extensions, state: ModuleResolutionState, cache: ModuleResolutionCache | undefined, redirectedReference: ResolvedProjectReference | undefined, moduleName: string, scope: PackageJsonInfo, isImports: boolean) {
21482152
return loadModuleFromTargetImportOrExport;
2149-
function loadModuleFromTargetImportOrExport(target: unknown, subpath: string, pattern: boolean): SearchResult<Resolved> | undefined {
2153+
function loadModuleFromTargetImportOrExport(target: unknown, subpath: string, pattern: boolean, key: string): SearchResult<Resolved> | undefined {
21502154
if (typeof target === "string") {
21512155
if (!pattern && subpath.length > 0 && !endsWith(target, "/")) {
21522156
if (state.traceEnabled) {
@@ -2157,6 +2161,8 @@ namespace ts {
21572161
if (!startsWith(target, "./")) {
21582162
if (isImports && !startsWith(target, "../") && !startsWith(target, "/") && !isRootedDiskPath(target)) {
21592163
const combinedLookup = pattern ? target.replace(/\*/g, subpath) : target + subpath;
2164+
traceIfEnabled(state, Diagnostics.Using_0_subpath_1_with_target_2, "imports", key, combinedLookup);
2165+
traceIfEnabled(state, Diagnostics.Resolving_module_0_from_1, combinedLookup, scope.packageDirectory + "/");
21602166
const result = nodeModuleNameResolverWorker(state.features, combinedLookup, scope.packageDirectory + "/", state.compilerOptions, state.host, cache, [extensions], redirectedReference);
21612167
return toSearchResult(result.resolvedModule ? { path: result.resolvedModule.resolvedFileName, extension: result.resolvedModule.extension, packageId: result.resolvedModule.packageId, originalPath: result.resolvedModule.originalPath } : undefined);
21622168
}
@@ -2183,21 +2189,33 @@ namespace ts {
21832189
}
21842190
return toSearchResult(/*value*/ undefined);
21852191
}
2192+
2193+
if (state.traceEnabled) {
2194+
trace(state.host,
2195+
Diagnostics.Using_0_subpath_1_with_target_2,
2196+
isImports ? "imports" : "exports",
2197+
key,
2198+
pattern ? target.replace(/\*/g, subpath) : target + subpath);
2199+
}
21862200
const finalPath = toAbsolutePath(pattern ? resolvedTarget.replace(/\*/g, subpath) : resolvedTarget + subpath);
21872201
const inputLink = tryLoadInputFileForPath(finalPath, subpath, combinePaths(scope.packageDirectory, "package.json"), isImports);
21882202
if (inputLink) return inputLink;
21892203
return toSearchResult(withPackageId(scope, loadJSOrExactTSFileName(extensions, finalPath, /*onlyRecordFailures*/ false, state)));
21902204
}
21912205
else if (typeof target === "object" && target !== null) { // eslint-disable-line no-null/no-null
21922206
if (!Array.isArray(target)) {
2193-
for (const key of getOwnKeys(target as MapLike<unknown>)) {
2194-
if (key === "default" || state.conditions.indexOf(key) >= 0 || isApplicableVersionedTypesKey(state.conditions, key)) {
2195-
const subTarget = (target as MapLike<unknown>)[key];
2196-
const result = loadModuleFromTargetImportOrExport(subTarget, subpath, pattern);
2207+
for (const condition of getOwnKeys(target as MapLike<unknown>)) {
2208+
if (condition === "default" || state.conditions.indexOf(condition) >= 0 || isApplicableVersionedTypesKey(state.conditions, condition)) {
2209+
traceIfEnabled(state, Diagnostics.Matched_0_condition_1, isImports ? "imports" : "exports", condition);
2210+
const subTarget = (target as MapLike<unknown>)[condition];
2211+
const result = loadModuleFromTargetImportOrExport(subTarget, subpath, pattern, key);
21972212
if (result) {
21982213
return result;
21992214
}
22002215
}
2216+
else {
2217+
traceIfEnabled(state, Diagnostics.Saw_non_matching_condition_0, condition);
2218+
}
22012219
}
22022220
return undefined;
22032221
}
@@ -2209,7 +2227,7 @@ namespace ts {
22092227
return toSearchResult(/*value*/ undefined);
22102228
}
22112229
for (const elem of target) {
2212-
const result = loadModuleFromTargetImportOrExport(elem, subpath, pattern);
2230+
const result = loadModuleFromTargetImportOrExport(elem, subpath, pattern, key);
22132231
if (result) {
22142232
return result;
22152233
}
@@ -2685,4 +2703,10 @@ namespace ts {
26852703
function toSearchResult<T>(value: T | undefined): SearchResult<T> {
26862704
return value !== undefined ? { value } : undefined;
26872705
}
2706+
2707+
function traceIfEnabled(state: ModuleResolutionState, diagnostic: DiagnosticMessage, ...args: string[]) {
2708+
if (state.traceEnabled) {
2709+
trace(state.host, diagnostic, ...args);
2710+
}
2711+
}
26882712
}

0 commit comments

Comments
 (0)