Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 2 additions & 20 deletions src/compiler/moduleNameResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
forEachAncestorDirectory,
formatMessage,
getAllowImportingTsExtensions,
getAllowJSCompilerOption,

Check warning on line 40 in src/compiler/moduleNameResolver.ts

View workflow job for this annotation

GitHub Actions / lint

'getAllowJSCompilerOption' is defined but never used. Allowed unused vars must match /^(_+$|_[^_])/u
getAnyExtensionFromPath,
getBaseFileName,
GetCanonicalFileName,
Expand Down Expand Up @@ -2586,26 +2586,7 @@
}
const trailingParts = parts.slice(nameParts.length);
const subpath = !length(trailingParts) ? "." : `.${directorySeparator}${trailingParts.join(directorySeparator)}`;
// Maybe TODO: splitting extensions into two priorities should be unnecessary, except
// https://github.com/microsoft/TypeScript/issues/50762 makes the behavior different.
// As long as that bug exists, we need to do two passes here in self-name loading
// in order to be consistent with (non-self) library-name loading in
// `loadModuleFromNearestNodeModulesDirectoryWorker`, which uses two passes in order
// to prioritize `@types` packages higher up the directory tree over untyped
// implementation packages. See the selfNameModuleAugmentation.ts test for why this
// matters.
//
// However, there's an exception. If the user has `allowJs` and `declaration`, we need
// to ensure that self-name imports of their own package can resolve back to their
// input JS files via `tryLoadInputFileForPath` at a higher priority than their output
// declaration files, so we need to do a single pass with all extensions for that case.
if (getAllowJSCompilerOption(state.compilerOptions) && !pathContainsNodeModules(directory)) {
return loadModuleFromExports(scope, extensions, subpath, state, cache, redirectedReference);
}
const priorityExtensions = extensions & (Extensions.TypeScript | Extensions.Declaration);
const secondaryExtensions = extensions & ~(Extensions.TypeScript | Extensions.Declaration);
return loadModuleFromExports(scope, priorityExtensions, subpath, state, cache, redirectedReference)
|| loadModuleFromExports(scope, secondaryExtensions, subpath, state, cache, redirectedReference);
return loadModuleFromExports(scope, extensions, subpath, state, cache, redirectedReference);
}

function loadModuleFromExports(scope: PackageJsonInfo, extensions: Extensions, subpath: string, state: ModuleResolutionState, cache: ModuleResolutionCache | undefined, redirectedReference: ResolvedProjectReference | undefined): SearchResult<Resolved> {
Expand Down Expand Up @@ -2818,6 +2799,7 @@
}
else {
traceIfEnabled(state, Diagnostics.Failed_to_resolve_under_condition_0, condition);
return { value: undefined };
}
}
else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,35 @@
"File '/node_modules/dep/dist/index.mts' does not exist.",
"File '/node_modules/dep/dist/index.d.mts' does not exist.",
"Failed to resolve under condition 'import'.",
"Saw non-matching condition 'require'.",
"Matched 'exports' condition 'types'.",
"Using 'exports' subpath '.' with target './dist/index.d.ts'.",
"File '/node_modules/dep/dist/index.d.ts' exists - use it as a name resolution result.",
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
"Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.",
"File '/node_modules/dep/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Matched 'exports' condition 'import'.",
"Using 'exports' subpath '.' with target './dist/index.mjs'.",
"File name '/node_modules/dep/dist/index.mjs' has a '.mjs' extension - stripping it.",
"File '/node_modules/dep/dist/index.mjs' exists - use it as a name resolution result.",
"'package.json' does not have a 'peerDependencies' field.",
"Resolved under condition 'types'.",
"Resolved under condition 'import'.",
"Exiting conditional exports.",
"Resolving real path for '/node_modules/dep/dist/index.d.ts', result '/node_modules/dep/dist/index.d.ts'.",
"======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.d.ts' with Package ID 'dep/dist/[email protected]'. ========",
"Resolution of non-relative name failed; trying with modern Node resolution features disabled to see if npm library needs configuration update.",
"File '/package.json' does not exist according to earlier cached lookups.",
"Loading module 'dep' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"File '/node_modules/dep/package.json' exists according to earlier cached lookups.",
"File '/node_modules/dep.ts' does not exist.",
"File '/node_modules/dep.tsx' does not exist.",
"File '/node_modules/dep.d.ts' does not exist.",
"'package.json' does not have a 'typesVersions' field.",
"'package.json' does not have a 'typings' field.",
"'package.json' does not have a 'types' field.",
"'package.json' does not have a 'main' field.",
"File '/node_modules/dep/index.ts' does not exist.",
"File '/node_modules/dep/index.tsx' does not exist.",
"File '/node_modules/dep/index.d.ts' does not exist.",
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
"Resolving real path for '/node_modules/dep/dist/index.mjs', result '/node_modules/dep/dist/index.mjs'.",
"======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.mjs' with Package ID 'dep/dist/[email protected]'. ========",
"======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module '@typescript/lib-es5' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,4 @@ error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolut
export {};

==== /index.mts (0 errors) ====
import {} from "dep";
// Should be an untyped resolution to dep/dist/index.mjs,
// but the first search is only for TS files, and when
// there's no dist/index.d.mts, it continues looking for
// matching conditions and resolves via `types`.

import {} from "dep";
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,29 @@
"File '/node_modules/dep/dist/index.mts' does not exist.",
"File '/node_modules/dep/dist/index.d.mts' does not exist.",
"Failed to resolve under condition 'import'.",
"Saw non-matching condition 'require'.",
"Matched 'exports' condition 'types'.",
"Using 'exports' subpath '.' with target './dist/index.d.ts'.",
"File '/node_modules/dep/dist/index.d.ts' exists - use it as a name resolution result.",
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
"Searching all ancestor node_modules directories for fallback extensions: JavaScript.",
"File '/node_modules/dep/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Matched 'exports' condition 'import'.",
"Using 'exports' subpath '.' with target './dist/index.mjs'.",
"File name '/node_modules/dep/dist/index.mjs' has a '.mjs' extension - stripping it.",
"File '/node_modules/dep/dist/index.mjs' exists - use it as a name resolution result.",
"'package.json' does not have a 'peerDependencies' field.",
"Resolved under condition 'types'.",
"Resolved under condition 'import'.",
"Exiting conditional exports.",
"Resolving real path for '/node_modules/dep/dist/index.d.ts', result '/node_modules/dep/dist/index.d.ts'.",
"======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.d.ts' with Package ID 'dep/dist/[email protected]'. ========",
"Resolution of non-relative name failed; trying with modern Node resolution features disabled to see if npm library needs configuration update.",
"File '/package.json' does not exist according to earlier cached lookups.",
"Loading module 'dep' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"File '/node_modules/dep/package.json' exists according to earlier cached lookups.",
"'package.json' does not have a 'typesVersions' field.",
"'package.json' does not have a 'typings' field.",
"'package.json' does not have a 'types' field.",
"'package.json' does not have a 'main' field.",
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
"Resolving real path for '/node_modules/dep/dist/index.mjs', result '/node_modules/dep/dist/index.mjs'.",
"======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.mjs' with Package ID 'dep/dist/[email protected]'. ========",
"File '/.ts/package.json' does not exist.",
"File '/package.json' does not exist according to earlier cached lookups.",
"======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,4 @@ error TS5110: Option 'module' must be set to 'NodeNext' when option 'moduleResol
export {};

==== /index.mts (0 errors) ====
import {} from "dep";
// Should be an untyped resolution to dep/dist/index.mjs,
// but the first search is only for TS files, and when
// there's no dist/index.d.mts, it continues looking for
// matching conditions and resolves via `types`.

import {} from "dep";
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,29 @@
"File '/node_modules/dep/dist/index.mts' does not exist.",
"File '/node_modules/dep/dist/index.d.mts' does not exist.",
"Failed to resolve under condition 'import'.",
"Saw non-matching condition 'require'.",
"Matched 'exports' condition 'types'.",
"Using 'exports' subpath '.' with target './dist/index.d.ts'.",
"File '/node_modules/dep/dist/index.d.ts' exists - use it as a name resolution result.",
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
"Searching all ancestor node_modules directories for fallback extensions: JavaScript.",
"File '/node_modules/dep/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Matched 'exports' condition 'import'.",
"Using 'exports' subpath '.' with target './dist/index.mjs'.",
"File name '/node_modules/dep/dist/index.mjs' has a '.mjs' extension - stripping it.",
"File '/node_modules/dep/dist/index.mjs' exists - use it as a name resolution result.",
"'package.json' does not have a 'peerDependencies' field.",
"Resolved under condition 'types'.",
"Resolved under condition 'import'.",
"Exiting conditional exports.",
"Resolving real path for '/node_modules/dep/dist/index.d.ts', result '/node_modules/dep/dist/index.d.ts'.",
"======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.d.ts' with Package ID 'dep/dist/[email protected]'. ========",
"Resolution of non-relative name failed; trying with modern Node resolution features disabled to see if npm library needs configuration update.",
"File '/package.json' does not exist according to earlier cached lookups.",
"Loading module 'dep' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"File '/node_modules/dep/package.json' exists according to earlier cached lookups.",
"'package.json' does not have a 'typesVersions' field.",
"'package.json' does not have a 'typings' field.",
"'package.json' does not have a 'types' field.",
"'package.json' does not have a 'main' field.",
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
"Resolving real path for '/node_modules/dep/dist/index.mjs', result '/node_modules/dep/dist/index.mjs'.",
"======== Module name 'dep' was successfully resolved to '/node_modules/dep/dist/index.mjs' with Package ID 'dep/dist/[email protected]'. ========",
"File '/.ts/package.json' does not exist.",
"File '/package.json' does not exist according to earlier cached lookups.",
"======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
"File '/node_modules/foo/index.mts' does not exist.",
"File '/node_modules/foo/index.d.mts' does not exist.",
"Failed to resolve under condition 'import'.",
"Saw non-matching condition 'require'.",
"Exiting conditional exports.",
"File '/node_modules/@types/foo.d.ts' does not exist.",
"Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.",
"File '/node_modules/foo/package.json' exists according to earlier cached lookups.",
Expand Down Expand Up @@ -56,8 +54,6 @@
"File '/node_modules/bar/index.mts' does not exist.",
"File '/node_modules/bar/index.d.mts' does not exist.",
"Failed to resolve under condition 'import'.",
"Saw non-matching condition 'require'.",
"Exiting conditional exports.",
"File '/node_modules/@types/bar/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Saw non-matching condition 'require'.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
"File '/node_modules/foo/index.mts' does not exist.",
"File '/node_modules/foo/index.d.mts' does not exist.",
"Failed to resolve under condition 'import'.",
"Saw non-matching condition 'require'.",
"Exiting conditional exports.",
"Searching all ancestor node_modules directories for fallback extensions: JavaScript.",
"File '/node_modules/foo/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
Expand Down Expand Up @@ -52,8 +50,6 @@
"File '/node_modules/bar/index.mts' does not exist.",
"File '/node_modules/bar/index.d.mts' does not exist.",
"Failed to resolve under condition 'import'.",
"Saw non-matching condition 'require'.",
"Exiting conditional exports.",
"File '/node_modules/@types/bar/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Saw non-matching condition 'require'.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
=== /node_modules/acorn-walk/dist/walk.d.ts ===
export {};
declare module 'acorn-walk' {
>'acorn-walk' : Symbol("/node_modules/acorn-walk/dist/walk", Decl(walk.d.ts, 0, 0), Decl(walk.d.ts, 0, 10))
>'acorn-walk' : Symbol("/node_modules/acorn-walk/dist/walk", Decl(walk.mjs, 0, 0), Decl(walk.d.ts, 0, 10))

export function simple(node: any, visitors: any, base?: any, state?: any): any;
>simple : Symbol(simple, Decl(walk.d.ts, 1, 29))
Expand Down
46 changes: 26 additions & 20 deletions tests/baselines/reference/selfNameModuleAugmentation.trace.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,11 @@
"File name '/node_modules/acorn-walk/dist/walk.mjs' has a '.mjs' extension - stripping it.",
"File '/node_modules/acorn-walk/dist/walk.mts' does not exist.",
"File '/node_modules/acorn-walk/dist/walk.d.mts' does not exist.",
"Failed to resolve under condition 'import'.",
"Saw non-matching condition 'require'.",
"Matched 'exports' condition 'default'.",
"Using 'exports' subpath '.' with target './dist/walk.js'.",
"File name '/node_modules/acorn-walk/dist/walk.js' has a '.js' extension - stripping it.",
"File '/node_modules/acorn-walk/dist/walk.ts' does not exist.",
"File '/node_modules/acorn-walk/dist/walk.tsx' does not exist.",
"File '/node_modules/acorn-walk/dist/walk.d.ts' exists - use it as a name resolution result.",
"File '/node_modules/acorn-walk/dist/walk.mjs' exists - use it as a name resolution result.",
"'package.json' does not have a 'peerDependencies' field.",
"Resolved under condition 'default'.",
"Resolved under condition 'import'.",
"Exiting conditional exports.",
"======== Module name 'acorn-walk' was successfully resolved to '/node_modules/acorn-walk/dist/walk.d.ts' with Package ID 'acorn-walk/dist/walk.d.ts@8.2.0'. ========",
"======== Module name 'acorn-walk' was successfully resolved to '/node_modules/acorn-walk/dist/walk.mjs' with Package ID 'acorn-walk/dist/walk.mjs@8.2.0'. ========",
"======== Resolving module 'acorn-walk' from '/index.ts'. ========",
"Explicitly specified module resolution kind: 'Bundler'.",
"Resolving in CJS mode with conditions 'import', 'types'.",
Expand All @@ -38,17 +31,30 @@
"File '/node_modules/acorn-walk/dist/walk.mts' does not exist.",
"File '/node_modules/acorn-walk/dist/walk.d.mts' does not exist.",
"Failed to resolve under condition 'import'.",
"Saw non-matching condition 'require'.",
"Matched 'exports' condition 'default'.",
"Using 'exports' subpath '.' with target './dist/walk.js'.",
"File name '/node_modules/acorn-walk/dist/walk.js' has a '.js' extension - stripping it.",
"File '/node_modules/acorn-walk/dist/walk.ts' does not exist.",
"File '/node_modules/acorn-walk/dist/walk.tsx' does not exist.",
"File '/node_modules/acorn-walk/dist/walk.d.ts' exists - use it as a name resolution result.",
"Resolved under condition 'default'.",
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
"Searching all ancestor node_modules directories for fallback extensions: JavaScript, JSON.",
"File '/node_modules/acorn-walk/package.json' exists according to earlier cached lookups.",
"Entering conditional exports.",
"Matched 'exports' condition 'import'.",
"Using 'exports' subpath '.' with target './dist/walk.mjs'.",
"File name '/node_modules/acorn-walk/dist/walk.mjs' has a '.mjs' extension - stripping it.",
"File '/node_modules/acorn-walk/dist/walk.mjs' exists - use it as a name resolution result.",
"Resolved under condition 'import'.",
"Exiting conditional exports.",
"Resolving real path for '/node_modules/acorn-walk/dist/walk.d.ts', result '/node_modules/acorn-walk/dist/walk.d.ts'.",
"======== Module name 'acorn-walk' was successfully resolved to '/node_modules/acorn-walk/dist/walk.d.ts' with Package ID 'acorn-walk/dist/[email protected]'. ========",
"Resolution of non-relative name failed; trying with modern Node resolution features disabled to see if npm library needs configuration update.",
"File '/package.json' does not exist according to earlier cached lookups.",
"Loading module 'acorn-walk' from 'node_modules' folder, target file types: TypeScript, Declaration.",
"Searching all ancestor node_modules directories for preferred extensions: TypeScript, Declaration.",
"File '/node_modules/acorn-walk/package.json' exists according to earlier cached lookups.",
"File '/node_modules/acorn-walk.ts' does not exist.",
"File '/node_modules/acorn-walk.tsx' does not exist.",
"File '/node_modules/acorn-walk.d.ts' does not exist.",
"'package.json' does not have a 'typesVersions' field.",
"'package.json' does not have a 'typings' field.",
"'package.json' has 'types' field 'dist/walk.d.ts' that references '/node_modules/acorn-walk/dist/walk.d.ts'.",
"File '/node_modules/acorn-walk/dist/walk.d.ts' exists - use it as a name resolution result.",
"Resolving real path for '/node_modules/acorn-walk/dist/walk.mjs', result '/node_modules/acorn-walk/dist/walk.mjs'.",
"======== Module name 'acorn-walk' was successfully resolved to '/node_modules/acorn-walk/dist/walk.mjs' with Package ID 'acorn-walk/dist/[email protected]'. ========",
"======== Resolving module '@typescript/lib-es5' from '/.src/__lib_node_modules_lookup_lib.es5.d.ts__.ts'. ========",
"Explicitly specified module resolution kind: 'Node10'.",
"Loading module '@typescript/lib-es5' from 'node_modules' folder, target file types: TypeScript, Declaration.",
Expand Down
Loading
Loading