mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-06-18 05:43:11 -05:00
Add additional diagnostic for packages that only resolve under non-exports-respecting modes (#52173)
This commit is contained in:
@@ -212,7 +212,8 @@ function createResolvedModuleWithFailedLookupLocations(
|
||||
failedLookupLocations: string[],
|
||||
affectingLocations: string[],
|
||||
diagnostics: Diagnostic[],
|
||||
resultFromCache: ResolvedModuleWithFailedLookupLocations | undefined
|
||||
resultFromCache: ResolvedModuleWithFailedLookupLocations | undefined,
|
||||
legacyResult?: string,
|
||||
): ResolvedModuleWithFailedLookupLocations {
|
||||
if (resultFromCache) {
|
||||
resultFromCache.failedLookupLocations = updateResolutionField(resultFromCache.failedLookupLocations, failedLookupLocations);
|
||||
@@ -232,6 +233,7 @@ function createResolvedModuleWithFailedLookupLocations(
|
||||
failedLookupLocations: initializeResolutionField(failedLookupLocations),
|
||||
affectingLocations: initializeResolutionField(affectingLocations),
|
||||
resolutionDiagnostics: initializeResolutionField(diagnostics),
|
||||
node10Result: legacyResult,
|
||||
};
|
||||
}
|
||||
function initializeResolutionField<T>(value: T[]): T[] | undefined {
|
||||
@@ -1666,12 +1668,37 @@ function nodeModuleNameResolverWorker(features: NodeResolutionFeatures, moduleNa
|
||||
const priorityExtensions = extensions & (Extensions.TypeScript | Extensions.Declaration);
|
||||
const secondaryExtensions = extensions & ~(Extensions.TypeScript | Extensions.Declaration);
|
||||
result =
|
||||
priorityExtensions && tryResolve(priorityExtensions) ||
|
||||
secondaryExtensions && tryResolve(secondaryExtensions) ||
|
||||
priorityExtensions && tryResolve(priorityExtensions, state) ||
|
||||
secondaryExtensions && tryResolve(secondaryExtensions, state) ||
|
||||
undefined;
|
||||
}
|
||||
else {
|
||||
result = tryResolve(extensions);
|
||||
result = tryResolve(extensions, state);
|
||||
}
|
||||
|
||||
// For non-relative names that resolved to JS but no types in modes that look up an "import" condition in package.json "exports",
|
||||
// try again with "exports" disabled to try to detect if this is likely a configuration error in a dependency's package.json.
|
||||
let legacyResult;
|
||||
if (result?.value?.isExternalLibraryImport
|
||||
&& !isConfigLookup
|
||||
&& extensions & (Extensions.TypeScript | Extensions.Declaration)
|
||||
&& features & NodeResolutionFeatures.Exports
|
||||
&& !isExternalModuleNameRelative(moduleName)
|
||||
&& !extensionIsOk(Extensions.TypeScript | Extensions.Declaration, result.value.resolved.extension)
|
||||
&& conditions.indexOf("import") > -1
|
||||
) {
|
||||
traceIfEnabled(state, Diagnostics.Resolution_of_non_relative_name_failed_trying_with_modern_Node_resolution_features_disabled_to_see_if_npm_library_needs_configuration_update);
|
||||
const diagnosticState = {
|
||||
...state,
|
||||
features: state.features & ~NodeResolutionFeatures.Exports,
|
||||
failedLookupLocations: [],
|
||||
affectingLocations: [],
|
||||
reportDiagnostic: noop,
|
||||
};
|
||||
const diagnosticResult = tryResolve(extensions & (Extensions.TypeScript | Extensions.Declaration), diagnosticState);
|
||||
if (diagnosticResult?.value?.isExternalLibraryImport) {
|
||||
legacyResult = diagnosticResult.value.resolved.path;
|
||||
}
|
||||
}
|
||||
|
||||
return createResolvedModuleWithFailedLookupLocations(
|
||||
@@ -1680,10 +1707,11 @@ function nodeModuleNameResolverWorker(features: NodeResolutionFeatures, moduleNa
|
||||
failedLookupLocations,
|
||||
affectingLocations,
|
||||
diagnostics,
|
||||
state.resultFromCache
|
||||
state.resultFromCache,
|
||||
legacyResult,
|
||||
);
|
||||
|
||||
function tryResolve(extensions: Extensions): SearchResult<{ resolved: Resolved, isExternalLibraryImport: boolean }> {
|
||||
function tryResolve(extensions: Extensions, state: ModuleResolutionState): SearchResult<{ resolved: Resolved, isExternalLibraryImport: boolean }> {
|
||||
const loader: ResolutionKindSpecificLoader = (extensions, candidate, onlyRecordFailures, state) => nodeLoadModuleByRelativeName(extensions, candidate, onlyRecordFailures, state, /*considerPackageJson*/ true);
|
||||
const resolved = tryLoadModuleUsingOptionalResolutionSettings(extensions, moduleName, containingDirectory, loader, state);
|
||||
if (resolved) {
|
||||
@@ -2279,7 +2307,7 @@ function resolvedIfExtensionMatches(extensions: Extensions, path: string, resolv
|
||||
}
|
||||
|
||||
/** True if `extension` is one of the supported `extensions`. */
|
||||
function extensionIsOk(extensions: Extensions, extension: Extension): boolean {
|
||||
function extensionIsOk(extensions: Extensions, extension: string): boolean {
|
||||
return extensions & Extensions.JavaScript && (extension === Extension.Js || extension === Extension.Jsx || extension === Extension.Mjs || extension === Extension.Cjs)
|
||||
|| extensions & Extensions.TypeScript && (extension === Extension.Ts || extension === Extension.Tsx || extension === Extension.Mts || extension === Extension.Cts)
|
||||
|| extensions & Extensions.Declaration && (extension === Extension.Dts || extension === Extension.Dmts || extension === Extension.Dcts)
|
||||
|
||||
Reference in New Issue
Block a user