Skip to content

Commit 3fcd1b5

Browse files
authored
Refactor module resolution Extensions, fix lookup priorities (#51471)
* Refactor `Extensions`, fix lookup priorities * Update baselines * Clean up * Temporarily apply same fix to `node` for testing * Revert ancestor node_modules lookups back to two passes * Revert "Temporarily apply same fix to `node` for testing" This reverts commit 4014f30. * Update baselines * Add new test for node_modules searching behavior * Update new baseline
1 parent 53ef2fc commit 3fcd1b5

File tree

144 files changed

+1760
-1605
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

144 files changed

+1760
-1605
lines changed

src/compiler/diagnosticMessages.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4547,7 +4547,7 @@
45474547
"category": "Message",
45484548
"code": 6094
45494549
},
4550-
"Loading module as file / folder, candidate module location '{0}', target file type '{1}'.": {
4550+
"Loading module as file / folder, candidate module location '{0}', target file types: {1}.": {
45514551
"category": "Message",
45524552
"code": 6095
45534553
},
@@ -4559,7 +4559,7 @@
45594559
"category": "Message",
45604560
"code": 6097
45614561
},
4562-
"Loading module '{0}' from 'node_modules' folder, target file type '{1}'.": {
4562+
"Loading module '{0}' from 'node_modules' folder, target file types: {1}.": {
45634563
"category": "Message",
45644564
"code": 6098
45654565
},

src/compiler/moduleNameResolver.ts

Lines changed: 171 additions & 152 deletions
Large diffs are not rendered by default.

src/compiler/utilities.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7776,6 +7776,8 @@ const allSupportedExtensions: readonly Extension[][] = [[Extension.Ts, Extension
77767776
const allSupportedExtensionsWithJson: readonly Extension[][] = [...allSupportedExtensions, [Extension.Json]];
77777777
/** @internal */
77787778
export const supportedDeclarationExtensions: readonly Extension[] = [Extension.Dts, Extension.Dcts, Extension.Dmts];
7779+
/** @internal */
7780+
export const supportedTSImplementationExtensions: readonly Extension[] = [Extension.Ts, Extension.Cts, Extension.Mts, Extension.Tsx];
77797781

77807782
/** @internal */
77817783
export function getSupportedExtensions(options?: CompilerOptions): readonly Extension[][];

src/testRunner/unittests/reuseProgramStructure.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ describe("unittests:: Reuse program structure:: General", () => {
274274
[
275275
"======== Resolving module 'a' from 'file1.ts'. ========",
276276
"Explicitly specified module resolution kind: 'NodeJs'.",
277-
"Loading module 'a' from 'node_modules' folder, target file type 'TypeScript'.",
277+
"Loading module 'a' from 'node_modules' folder, target file types: TypeScript, Declaration.",
278278
"File 'node_modules/a/package.json' does not exist.",
279279
"File 'node_modules/a.ts' does not exist.",
280280
"File 'node_modules/a.tsx' does not exist.",
@@ -285,7 +285,7 @@ describe("unittests:: Reuse program structure:: General", () => {
285285
"File 'node_modules/@types/a/package.json' does not exist.",
286286
"File 'node_modules/@types/a.d.ts' does not exist.",
287287
"File 'node_modules/@types/a/index.d.ts' does not exist.",
288-
"Loading module 'a' from 'node_modules' folder, target file type 'JavaScript'.",
288+
"Loading module 'a' from 'node_modules' folder, target file types: JavaScript.",
289289
"File 'node_modules/a/package.json' does not exist according to earlier cached lookups.",
290290
"File 'node_modules/a.js' does not exist.",
291291
"File 'node_modules/a.jsx' does not exist.",
@@ -307,7 +307,7 @@ describe("unittests:: Reuse program structure:: General", () => {
307307
[
308308
"======== Resolving module 'a' from 'file1.ts'. ========",
309309
"Explicitly specified module resolution kind: 'NodeJs'.",
310-
"Loading module 'a' from 'node_modules' folder, target file type 'TypeScript'.",
310+
"Loading module 'a' from 'node_modules' folder, target file types: TypeScript, Declaration.",
311311
"File 'node_modules/a/package.json' does not exist.",
312312
"File 'node_modules/a.ts' does not exist.",
313313
"File 'node_modules/a.tsx' does not exist.",

tests/baselines/reference/cachedModuleResolution1.trace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
"======== Resolving module 'foo' from '/a/b/c/d/e/app.ts'. ========",
33
"Explicitly specified module resolution kind: 'NodeJs'.",
4-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
4+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
55
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
66
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
77
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
@@ -12,7 +12,7 @@
1212
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========",
1313
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
1414
"Explicitly specified module resolution kind: 'NodeJs'.",
15-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
15+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
1616
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
1717
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========"
1818
]

tests/baselines/reference/cachedModuleResolution2.trace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
33
"Explicitly specified module resolution kind: 'NodeJs'.",
4-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
4+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
55
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
66
"File '/a/b/node_modules/foo.ts' does not exist.",
77
"File '/a/b/node_modules/foo.tsx' does not exist.",
@@ -10,7 +10,7 @@
1010
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========",
1111
"======== Resolving module 'foo' from '/a/b/c/d/e/app.ts'. ========",
1212
"Explicitly specified module resolution kind: 'NodeJs'.",
13-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
13+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
1414
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
1515
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
1616
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",

tests/baselines/reference/cachedModuleResolution5.trace.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
"======== Resolving module 'foo' from '/a/b/c/d/e/app.ts'. ========",
33
"Explicitly specified module resolution kind: 'NodeJs'.",
4-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
4+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
55
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
66
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
77
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
@@ -12,7 +12,7 @@
1212
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========",
1313
"======== Resolving module 'foo' from '/a/b/lib.ts'. ========",
1414
"Explicitly specified module resolution kind: 'NodeJs'.",
15-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
15+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
1616
"Resolution for module 'foo' was found in cache from location '/a/b'.",
1717
"======== Module name 'foo' was successfully resolved to '/a/b/node_modules/foo.d.ts'. ========"
1818
]
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
[
22
"======== Resolving module 'foo' from '/a/b/c/d/e/app.ts'. ========",
33
"Explicitly specified module resolution kind: 'NodeJs'.",
4-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
4+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
55
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
66
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
77
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
88
"Directory '/a/b/node_modules' does not exist, skipping all lookups in it.",
99
"Directory '/a/node_modules' does not exist, skipping all lookups in it.",
1010
"Directory '/node_modules' does not exist, skipping all lookups in it.",
11-
"Loading module 'foo' from 'node_modules' folder, target file type 'JavaScript'.",
11+
"Loading module 'foo' from 'node_modules' folder, target file types: JavaScript.",
1212
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
1313
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
1414
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
@@ -18,7 +18,7 @@
1818
"======== Module name 'foo' was not resolved. ========",
1919
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
2020
"Explicitly specified module resolution kind: 'NodeJs'.",
21-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
21+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
2222
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",
2323
"======== Module name 'foo' was not resolved. ========"
2424
]

tests/baselines/reference/cachedModuleResolution7.trace.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
[
22
"======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========",
33
"Explicitly specified module resolution kind: 'NodeJs'.",
4-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
4+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
55
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
66
"Directory '/a/b/node_modules' does not exist, skipping all lookups in it.",
77
"Directory '/a/node_modules' does not exist, skipping all lookups in it.",
88
"Directory '/node_modules' does not exist, skipping all lookups in it.",
9-
"Loading module 'foo' from 'node_modules' folder, target file type 'JavaScript'.",
9+
"Loading module 'foo' from 'node_modules' folder, target file types: JavaScript.",
1010
"Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.",
1111
"Directory '/a/b/node_modules' does not exist, skipping all lookups in it.",
1212
"Directory '/a/node_modules' does not exist, skipping all lookups in it.",
1313
"Directory '/node_modules' does not exist, skipping all lookups in it.",
1414
"======== Module name 'foo' was not resolved. ========",
1515
"======== Resolving module 'foo' from '/a/b/c/d/e/app.ts'. ========",
1616
"Explicitly specified module resolution kind: 'NodeJs'.",
17-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
17+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
1818
"Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.",
1919
"Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.",
2020
"Resolution for module 'foo' was found in cache from location '/a/b/c'.",

tests/baselines/reference/duplicatePackage_relativeImportWithinPackage.trace.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
"======== Resolving module 'foo/use' from '/index.ts'. ========",
33
"Module resolution kind is not specified, using 'NodeJs'.",
4-
"Loading module 'foo/use' from 'node_modules' folder, target file type 'TypeScript'.",
4+
"Loading module 'foo/use' from 'node_modules' folder, target file types: TypeScript, Declaration.",
55
"Found 'package.json' at '/node_modules/foo/package.json'.",
66
"'package.json' does not have a 'typesVersions' field.",
77
"File '/node_modules/foo/use.ts' does not exist.",
@@ -11,7 +11,7 @@
1111
"======== Module name 'foo/use' was successfully resolved to '/node_modules/foo/use.d.ts' with Package ID 'foo/use.d.ts@1.2.3'. ========",
1212
"======== Resolving module 'a' from '/index.ts'. ========",
1313
"Module resolution kind is not specified, using 'NodeJs'.",
14-
"Loading module 'a' from 'node_modules' folder, target file type 'TypeScript'.",
14+
"Loading module 'a' from 'node_modules' folder, target file types: TypeScript, Declaration.",
1515
"File '/node_modules/a/package.json' does not exist.",
1616
"File '/node_modules/a.ts' does not exist.",
1717
"File '/node_modules/a.tsx' does not exist.",
@@ -23,15 +23,15 @@
2323
"======== Module name 'a' was successfully resolved to '/node_modules/a/index.d.ts'. ========",
2424
"======== Resolving module './index' from '/node_modules/foo/use.d.ts'. ========",
2525
"Module resolution kind is not specified, using 'NodeJs'.",
26-
"Loading module as file / folder, candidate module location '/node_modules/foo/index', target file type 'TypeScript'.",
26+
"Loading module as file / folder, candidate module location '/node_modules/foo/index', target file types: TypeScript, Declaration.",
2727
"File '/node_modules/foo/index.ts' does not exist.",
2828
"File '/node_modules/foo/index.tsx' does not exist.",
2929
"File '/node_modules/foo/index.d.ts' exist - use it as a name resolution result.",
3030
"File '/node_modules/foo/package.json' exists according to earlier cached lookups.",
3131
"======== Module name './index' was successfully resolved to '/node_modules/foo/index.d.ts' with Package ID 'foo/index.d.ts@1.2.3'. ========",
3232
"======== Resolving module 'foo' from '/node_modules/a/index.d.ts'. ========",
3333
"Module resolution kind is not specified, using 'NodeJs'.",
34-
"Loading module 'foo' from 'node_modules' folder, target file type 'TypeScript'.",
34+
"Loading module 'foo' from 'node_modules' folder, target file types: TypeScript, Declaration.",
3535
"Found 'package.json' at '/node_modules/a/node_modules/foo/package.json'.",
3636
"'package.json' does not have a 'typesVersions' field.",
3737
"File '/node_modules/a/node_modules/foo.ts' does not exist.",

tests/baselines/reference/duplicatePackage_relativeImportWithinPackage_scoped.trace.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[
22
"======== Resolving module '@foo/bar/use' from '/index.ts'. ========",
33
"Module resolution kind is not specified, using 'NodeJs'.",
4-
"Loading module '@foo/bar/use' from 'node_modules' folder, target file type 'TypeScript'.",
4+
"Loading module '@foo/bar/use' from 'node_modules' folder, target file types: TypeScript, Declaration.",
55
"Found 'package.json' at '/node_modules/@foo/bar/package.json'.",
66
"'package.json' does not have a 'typesVersions' field.",
77
"File '/node_modules/@foo/bar/use.ts' does not exist.",
@@ -11,7 +11,7 @@
1111
"======== Module name '@foo/bar/use' was successfully resolved to '/node_modules/@foo/bar/use.d.ts' with Package ID '@foo/bar/use.d.ts@1.2.3'. ========",
1212
"======== Resolving module 'a' from '/index.ts'. ========",
1313
"Module resolution kind is not specified, using 'NodeJs'.",
14-
"Loading module 'a' from 'node_modules' folder, target file type 'TypeScript'.",
14+
"Loading module 'a' from 'node_modules' folder, target file types: TypeScript, Declaration.",
1515
"File '/node_modules/a/package.json' does not exist.",
1616
"File '/node_modules/a.ts' does not exist.",
1717
"File '/node_modules/a.tsx' does not exist.",
@@ -23,15 +23,15 @@
2323
"======== Module name 'a' was successfully resolved to '/node_modules/a/index.d.ts'. ========",
2424
"======== Resolving module './index' from '/node_modules/@foo/bar/use.d.ts'. ========",
2525
"Module resolution kind is not specified, using 'NodeJs'.",
26-
"Loading module as file / folder, candidate module location '/node_modules/@foo/bar/index', target file type 'TypeScript'.",
26+
"Loading module as file / folder, candidate module location '/node_modules/@foo/bar/index', target file types: TypeScript, Declaration.",
2727
"File '/node_modules/@foo/bar/index.ts' does not exist.",
2828
"File '/node_modules/@foo/bar/index.tsx' does not exist.",
2929
"File '/node_modules/@foo/bar/index.d.ts' exist - use it as a name resolution result.",
3030
"File '/node_modules/@foo/bar/package.json' exists according to earlier cached lookups.",
3131
"======== Module name './index' was successfully resolved to '/node_modules/@foo/bar/index.d.ts' with Package ID '@foo/bar/index.d.ts@1.2.3'. ========",
3232
"======== Resolving module '@foo/bar' from '/node_modules/a/index.d.ts'. ========",
3333
"Module resolution kind is not specified, using 'NodeJs'.",
34-
"Loading module '@foo/bar' from 'node_modules' folder, target file type 'TypeScript'.",
34+
"Loading module '@foo/bar' from 'node_modules' folder, target file types: TypeScript, Declaration.",
3535
"Found 'package.json' at '/node_modules/a/node_modules/@foo/bar/package.json'.",
3636
"'package.json' does not have a 'typesVersions' field.",
3737
"File '/node_modules/a/node_modules/@foo/bar.ts' does not exist.",
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== /project/a.js ===
2+
3+
export default "a.js";
4+
5+
=== /project/a.js.js ===
6+
7+
export default "a.js.js";
8+
9+
=== /project/dir/index.ts ===
10+
11+
export default "dir/index.ts";
12+
13+
=== /project/dir.js ===
14+
15+
export default "dir.js";
16+
17+
=== /project/b.ts ===
18+
import a from "./a.js";
19+
>a : Symbol(a, Decl(b.ts, 0, 6))
20+
21+
import dir from "./dir";
22+
>dir : Symbol(dir, Decl(b.ts, 1, 6))
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== /project/a.js ===
2+
3+
export default "a.js";
4+
5+
=== /project/a.js.js ===
6+
7+
export default "a.js.js";
8+
9+
=== /project/dir/index.ts ===
10+
11+
export default "dir/index.ts";
12+
13+
=== /project/dir.js ===
14+
15+
export default "dir.js";
16+
17+
=== /project/b.ts ===
18+
import a from "./a.js";
19+
>a : "a.js"
20+
21+
import dir from "./dir";
22+
>dir : "dir.js"
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== /project/a.js ===
2+
3+
export default "a.js";
4+
5+
=== /project/a.js.js ===
6+
7+
export default "a.js.js";
8+
9+
=== /project/dir/index.ts ===
10+
11+
export default "dir/index.ts";
12+
13+
=== /project/dir.js ===
14+
15+
export default "dir.js";
16+
17+
=== /project/b.ts ===
18+
import a from "./a.js";
19+
>a : Symbol(a, Decl(b.ts, 0, 6))
20+
21+
import dir from "./dir";
22+
>dir : Symbol(dir, Decl(b.ts, 1, 6))
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== /project/a.js ===
2+
3+
export default "a.js";
4+
5+
=== /project/a.js.js ===
6+
7+
export default "a.js.js";
8+
9+
=== /project/dir/index.ts ===
10+
11+
export default "dir/index.ts";
12+
13+
=== /project/dir.js ===
14+
15+
export default "dir.js";
16+
17+
=== /project/b.ts ===
18+
import a from "./a.js";
19+
>a : "a.js"
20+
21+
import dir from "./dir";
22+
>dir : "dir/index.ts"
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== /project/a.js ===
2+
3+
export default "a.js";
4+
5+
=== /project/a.js.js ===
6+
7+
export default "a.js.js";
8+
9+
=== /project/dir/index.ts ===
10+
11+
export default "dir/index.ts";
12+
13+
=== /project/dir.js ===
14+
15+
export default "dir.js";
16+
17+
=== /project/b.ts ===
18+
import a from "./a.js";
19+
>a : Symbol(a, Decl(b.ts, 0, 6))
20+
21+
import dir from "./dir";
22+
>dir : Symbol(dir, Decl(b.ts, 1, 6))
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== /project/a.js ===
2+
3+
export default "a.js";
4+
5+
=== /project/a.js.js ===
6+
7+
export default "a.js.js";
8+
9+
=== /project/dir/index.ts ===
10+
11+
export default "dir/index.ts";
12+
13+
=== /project/dir.js ===
14+
15+
export default "dir.js";
16+
17+
=== /project/b.ts ===
18+
import a from "./a.js";
19+
>a : "a.js"
20+
21+
import dir from "./dir";
22+
>dir : "dir.js"
23+

0 commit comments

Comments
 (0)