8000 Try file if matched pattern specifies the extension instead of all th… · typescript-bot/TypeScript@d36df0d · GitHub
[go: up one dir, main page]

Skip to content

Commit d36df0d

Browse files
authored
Try file if matched pattern specifies the extension instead of all the time (microsoft#42246)
* Test case for path mapping with extension * Try file if matched pattern specifies the extension instead of all the time Fixes microsoft#39743
1 parent 055f363 commit d36df0d

16 files changed

+384
-7
lines changed

src/compiler/moduleNameResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1377,7 +1377,7 @@ namespace ts {
13771377
trace(state.host, Diagnostics.Trying_substitution_0_candidate_module_location_Colon_1, subst, path);
13781378
}
13791379
// A path mapping may have an extension, in contrast to an import, which should omit it.
1380-
const extension = tryGetExtensionFromPath(candidate);
1380+
const extension = tryGetExtensionFromPath(subst);
13811381
if (extension !== undefined) {
13821382
const path = tryFile(candidate, onlyRecordFailures, state);
13831383
if (path !== undefined) {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
error TS6504: File '/node_modules/foo/lib/test.js' is a JavaScript file. Did you mean to enable the 'allowJs' option?
2+
The file is in the program because:
3+
Root file specified for compilation
4+
error TS6504: File '/relative.js' is a JavaScript file. Did you mean to enable the 'allowJs' option?
5+
The file is in the program because:
6+
Matched by include pattern '**/*' in '/tsconfig.json'
7+
8+
9+
!!! error TS6504: File '/node_modules/foo/lib/test.js' is a JavaScript file. Did you mean to enable the 'allowJs' option?
10+
!!! error TS6504: The file is in the program because:
11+
!!! error TS6504: Root file specified for compilation
12+
!!! error TS6504: File '/relative.js' is a JavaScript file. Did you mean to enable the 'allowJs' option?
13+
!!! error TS6504: The file is in the program because:
14+
!!! error TS6504: Matched by include pattern '**/*' in '/tsconfig.json'
15+
==== /tsconfig.json (0 errors) ====
16+
{
17+
"compilerOptions": {
18+
"outDir": "lib",
19+
"target": "ES6",
20+
"module": "ES6",
21+
"baseUrl": "/",
22+
"moduleResolution": "Node",
23+
"noImplicitAny": true,
24+
"traceResolution": true,
25+
"paths": {
26+
"foo/*": ["node_modules/foo/lib/*"]
27+
}
28+
}
29+
}
30+
31+
==== /node_modules/foo/lib/test.js (0 errors) ====
32+
export function test() {
33+
console.log("test");
34+
}
35+
36+
==== /node_modules/foo/lib/test.d.ts (0 errors) ====
37+
export declare function test(): void;
38+
39+
==== /relative.js (0 errors) ====
40+
export function relative() {
41+
console.log("test");
42+
}
43+
44+
==== /relative.d.ts (0 errors) ====
45+
export declare function relative(): void;
46+
47+
48+
==== /test.ts (0 errors) ====
49+
import { test } from "foo/test.js";
50+
import { test as test2 } from "foo/test";
51+
import { relative } from "./relative.js";
52+
import { relative as relative2 } from "./relative";
53+
54+
55+
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//// [tests/cases/compiler/moduleResolutionWithExtensions_withPaths.ts] ////
2+
3+
//// [test.js]
4+
export function test() {
5+
console.log("test");
6+
}
7+
8+
//// [test.d.ts]
9+
export declare function test(): void;
10+
11+
//// [relative.js]
12+
export function relative() {
13+
console.log("test");
14+
}
15+
16+
//// [relative.d.ts]
17+
export declare function relative(): void;
18+
19+
20+
//// [test.ts]
21+
import { test } from "foo/test.js";
22+
import { test as test2 } from "foo/test";
23+
import { relative } from "./relative.js";
24+
import { relative as relative2 } from "./relative";
25+
26+
27+
28+
29+
//// [test.js]
30+
export {};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
=== /node_modules/foo/lib/test.d.ts ===
2+
export declare function test(): void;
3+
>test : Symbol(test, Decl(test.d.ts, 0, 0))
4+
5+
=== /relative.d.ts ===
6+
export declare function relative(): void;
7+
>relative : Symbol(relative, Decl(relative.d.ts, 0, 0))
8+
9+
10+
=== /test.ts ===
11+
import { test } from "foo/test.js";
12+
>test : Symbol(test, Decl(test.ts, 0, 8))
13+
14+
import { test as test2 } from "foo/test";
15+
>test : Symbol(test, Decl(test.d.ts, 0, 0))
16+
>test2 : Symbol(test2, Decl(test.ts, 1, 8))
17+
18+
import { relative } from "./relative.js";
19+
>relative : Symbol(relative, Decl(test.ts, 2, 8))
20+
21+
import { relative as relative2 } from "./relative";
22+
>relative : Symbol(relative, Decl(relative.d.ts, 0, 0))
23+
>relative2 : Symbol(relative2, Decl(test.ts, 3, 8))
24+
25+
26+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
[
2+
"======== Resolving module 'foo/test.js' from '/test.ts'. ========",
3+
"Explicitly specified module resolution kind: 'NodeJs'.",
4+
"'baseUrl' option is set to '/', using this value to resolve non-relative module name 'foo/test.js'.",
5+
"'paths' option is specified, looking for a pattern to match module name 'foo/test.js'.",
6+
"Module name 'foo/test.js', matched pattern 'foo/*'.",
7+
"Trying substitution 'node_modules/foo/lib/*', candidate module location: 'node_modules/foo/lib/test.js'.",
8+
"Loading module as file / folder, candidate module location '/node_modules/foo/lib/test.js', target file type 'TypeScript'.",
9+
"File '/node_modules/foo/lib/test.js.ts' does not exist.",
10+
"File '/node_modules/foo/lib/test.js.tsx' does not exist.",
11+
"File '/node_modules/foo/lib/test.js.d.ts' does not exist.",
12+
"File name '/node_modules/foo/lib/test.js' has a '.js' extension - stripping it.",
13+
"File '/node_modules/foo/lib/test.ts' does not exist.",
14+
"File '/node_modules/foo/lib/test.tsx' does not exist.",
15+
"File '/node_modules/foo/lib/test.d.ts' exist - use it as a name resolution result.",
16+
"File '/node_modules/foo/package.json' does not exist.",
17+
"======== Module name 'foo/test.js' was successfully resolved to '/node_modules/foo/lib/test.d.ts'. ========",
18+
"======== Resolving module 'foo/test' from '/test.ts'. ========",
19+
"Explicitly specified module resolution kind: 'NodeJs'.",
20+
"'baseUrl' option is set to '/', using this value to resolve non-relative module name 'foo/test'.",
21+
"'paths' option is specified, looking for a pattern to match module name 'foo/test'.",
22+
"Module name 'foo/test', matched pattern 'foo/*'.",
23+
"Trying substitution 'node_modules/foo/lib/*', candidate module location: 'node_modules/foo/lib/test'.",
24+
"Loading module as file / folder, candidate module location '/node_modules/foo/lib/test', target file type 'TypeScript'.",
25+
"File '/node_modules/foo/lib/test.ts' does not exist.",
26+
"File '/node_modules/foo/lib/test.tsx' does not exist.",
27+
"File '/node_modules/foo/lib/test.d.ts' exist - use it as a name resolution result.",
28+
"File '/node_modules/foo/package.json' does not exist.",
29+
"======== Module name 'foo/test' was successfully resolved to '/node_modules/foo/lib/test.d.ts'. ========",
30+
"======== Resolving module './relative.js' from '/test.ts'. ========",
31+
"Explicitly specified module resolution kind: 'NodeJs'.",
32+
"Loading module as file / folder, candidate module location '/relative.js', target file type 'TypeScript'.",
33+
"File '/relative.js.ts' does not exist.",
34+
"File '/relative.js.tsx' does not exist.",
35+
"File '/relative.js.d.ts' does not exist.",
36+
"File name '/relative.js' has a '.js' extension - stripping it.",
37+
"File '/relative.ts' does not exist.",
38+
"File '/relative.tsx' does not exist.",
39+
"File '/relative.d.ts' exist - use it as a name resolution result.",
40+
"======== Module name './relative.js' was successfully resolved to '/relative.d.ts'. ========",
41+
"======== Resolving module './relative' from '/test.ts'. ========",
42+
"Explicitly specified module resolution kind: 'NodeJs'.",
43+
"Loading module as file / folder, candidate module location '/relative', target file type 'TypeScript'.",
44+
"File '/relative.ts' does not exist.",
45+
"File '/relative.tsx' does not exist.",
46+
"File '/relative.d.ts' exist - use it as a name resolution result.",
47+
"======== Module name './relative' was successfully resolved to '/relative.d.ts'. ========"
48+
]
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
=== /node_modules/foo/lib/test.d.ts ===
2+
export declare function test(): void;
3+
>test : () => void
4+
5+
=== /relative.d.ts ===
6+
export declare function relative(): void;
7+
>relative : () => void
8+
9+
10+
=== /test.ts ===
11+
import { test } from "foo/test.js";
12+
>test : () => void
13+
14+
import { test as test2 } from "foo/test";
15+
>test : () => void
16+
>test2 : () => void
17+
18+
import { relative } from "./relative.js";
19+
>relative : () => void
20+
21+
import { relative as relative2 } from "./relative";
22+
>relative : () => void
23+
>relative2 : () => void
24+
25+
26+

tests/baselines/reference/pathMappingBasedModuleResolution_withExtensionInName.trace.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
"'paths' option is specified, looking for a pattern to match module name 'zone.js'.",
66
"Module name 'zone.js', matched pattern '*'.",
77
"Trying substitution 'foo/*', candidate module location: 'foo/zone.js'.",
8-
"File '/foo/zone.js' does not exist.",
98
"Loading module as file / folder, candidate module location '/foo/zone.js', target file type 'TypeScript'.",
109
"File '/foo/zone.js.ts' does not exist.",
1110
"File '/foo/zone.js.tsx' does not exist.",
@@ -25,7 +24,6 @@
2524
"'paths' option is specified, looking for a pattern to match module name 'zone.tsx'.",
2625
"Module name 'zone.tsx', matched pattern '*'.",
2726
"Trying substitution 'foo/*', candidate module location: 'foo/zone.tsx'.",
28-
"File '/foo/zone.tsx' does not exist.",
2927
"Loading module as file / folder, candidate module location '/foo/zone.tsx', target file type 'TypeScript'.",
3028
"File '/foo/zone.tsx.ts' does not exist.",
3129
"File '/foo/zone.tsx.tsx' does not exist.",

tests/baselines/reference/pathMappingBasedModuleResolution_withExtension_MapedToNodeModules.trace.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,37 @@
55
"'paths' option is specified, looking for a pattern to match module name 'foo/bar/foobar.js'.",
66
"Module name 'foo/bar/foobar.js', matched pattern '*'.",
77
"Trying substitution 'node_modules/*', candidate module location: 'node_modules/foo/bar/foobar.js'.",
8+
"Loading module as file / folder, candidate module location '/node_modules/foo/bar/foobar.js', target file type 'TypeScript'.",
9+
"File '/node_modules/foo/bar/foobar.js.ts' does not exist.",
10+
"File '/node_modules/foo/bar/foobar.js.tsx' does not exist.",
11+
"File '/node_modules/foo/bar/foobar.js.d.ts' does not exist.",
12+
"File name '/node_modules/foo/bar/foobar.js' has a '.js' extension - stripping it.",
13+
"File '/node_modules/foo/bar/foobar.ts' does not exist.",
14+
"File '/node_modules/foo/bar/foobar.tsx' does not exist.",
15+
"File '/node_modules/foo/bar/foobar.d.ts' does not exist.",
16+
"Directory '/node_modules/foo/bar/foobar.js' does not exist, skipping all lookups in it.",
17+
"Trying substitution 'src/types', candidate module location: 'src/types'.",
18+
"Loading module as file / folder, candidate module location '/src/types', target file type 'TypeScript'.",
19+
"Loading module 'foo/bar/foobar.js' from 'node_modules' folder, target file type 'TypeScript'.",
20+
"File '/node_modules/foo/package.json' does not exist.",
21+
"File '/node_modules/foo/bar/foobar.js.ts' does not exist.",
22+
"File '/node_modules/foo/bar/foobar.js.tsx' does not exist.",
23+
"File '/node_modules/foo/bar/foobar.js.d.ts' does not exist.",
24+
"File name '/node_modules/foo/bar/foobar.js' has a '.js' extension - stripping it.",
25+
"File '/node_modules/foo/bar/foobar.ts' does not exist.",
26+
"File '/node_modules/foo/bar/foobar.tsx' does not exist.",
27+
"File '/node_modules/foo/bar/foobar.d.ts' does not exist.",
28+
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
29+
"File name '/node_modules/@types/foo/bar/foobar.js' has a '.js' extension - stripping it.",
30+
"'baseUrl' option is set to '/', using this value to resolve non-relative module name 'foo/bar/foobar.js'.",
31+
"'paths' option is specified, looking for a pattern to match module name 'foo/bar/foobar.js'.",
32+
"Module name 'foo/bar/foobar.js', matched pattern '*'.",
33+
"Trying substitution 'node_modules/*', candidate module location: 'node_modules/foo/bar/foobar.js'.",
34+
"Loading module as file / folder, candidate module location '/node_modules/foo/bar/foobar.js', target file type 'JavaScript'.",
35+
"File '/node_modules/foo/bar/foobar.js.js' does not exist.",
36+
"File '/node_modules/foo/bar/foobar.js.jsx' does not exist.",
37+
"File name '/node_modules/foo/bar/foobar.js' has a '.js' extension - stripping it.",
838
"File '/node_modules/foo/bar/foobar.js' exist - use it as a name resolution result.",
39+
"File '/node_modules/foo/package.json' does not exist.",
940
"======== Module name 'foo/bar/foobar.js' was successfully resolved to '/node_modules/foo/bar/foobar.js'. ========"
1041
]

tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.errors.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/a.ts(1,20): error TS7042: Module 'foo/bar/foobar.json' was resolved to '/node_modules/foo/bar/foobar.json', but '--resolveJsonModule' is not used.
1+
/a.ts(1,20): error TS2732: Cannot find module 'foo/bar/foobar.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.
22

33

44
==== /tsconfig.json (0 errors) ====
@@ -16,7 +16,7 @@
1616
==== /a.ts (1 errors) ====
1717
import foobar from "foo/bar/foobar.json";
1818
~~~~~~~~~~~~~~~~~~~~~
19-
!!! error TS7042: Module 'foo/bar/foobar.json' was resolved to '/node_modules/foo/bar/foobar.json', but '--resolveJsonModule' is not used.
19+
!!! error TS2732: Cannot find module 'foo/bar/foobar.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.
2020

2121
==== /node_modules/foo/bar/foobar.json (0 errors) ====
2222
{ "a": 10 }

tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.trace.json

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,32 @@
55
"'paths' option is specified, looking for a pattern to match module name 'foo/bar/foobar.json'.",
66
"Module name 'foo/bar/foobar.json', matched pattern '*'.",
77
"Trying substitution 'node_modules/*', candidate module location: 'node_modules/foo/bar/foobar.json'.",
8-
"File '/node_modules/foo/bar/foobar.json' exist - use it as a name resolution result.",
9-
"======== Module name 'foo/bar/foobar.json' was successfully resolved to '/node_modules/foo/bar/foobar.json'. ========"
8+
"Loading module as file / folder, candidate module location '/node_modules/foo/bar/foobar.json', target file type 'TypeScript'.",
9+
"File '/node_modules/foo/bar/foobar.json.ts' does not exist.",
10+
"File '/node_modules/foo/bar/foobar.json.tsx' does not exist.",
11+
"File '/node_modules/foo/bar/foobar.json.d.ts' does not exist.",
12+
"Directory '/node_modules/foo/bar/foobar.json' does not exist, skipping all lookups in it.",
13+
"Trying substitution 'src/types', candidate module location: 'src/types'.",
14+
"Loading module as file / folder, candidate module location '/src/types', target file type 'TypeScript'.",
15+
"Loading module 'foo/bar/foobar.json' from 'node_modules' folder, target file type 'TypeScript'.",
16+
"File '/node_modules/foo/package.json' does not exist.",
17+
"File '/node_modules/foo/bar/foobar.json.ts' does not exist.",
18+
"File '/node_modules/foo/bar/foobar.json.tsx' does not exist.",
19+
"File '/node_modules/foo/bar/foobar.json.d.ts' does not exist.",
20+
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
21+
"'baseUrl' option is set to '/', using this value to resolve non-relative module name 'foo/bar/foobar.json'.",
22+
"'paths' option is specified, looking for a pattern to match module name 'foo/bar/foobar.json'.",
23+
"Module name 'foo/bar/foobar.json', matched pattern '*'.",
24+
"Trying substitution 'node_modules/*', candidate module location: 'node_modules/foo/bar/foobar.json'.",
25+
"Loading module as file / folder, candidate module location '/node_modules/foo/bar/foobar.json', target file type 'JavaScript'.",
26+
"File '/node_modules/foo/bar/foobar.json.js' does not exist.",
27+
"File '/node_modules/foo/bar/foobar.json.jsx' does not exist.",
28+
"Directory '/node_modules/foo/bar/foobar.json' does not exist, skipping all lookups in it.",
29+
"Trying substitution 'src/types', candidate module location: 'src/types'.",
30+
"Loading module as file / folder, candidate module location '/src/types', target file type 'JavaScript'.",
31+
"Loading module 'foo/bar/foobar.json' from 'node_modules' folder, target file type 'JavaScript'.",
32+
"File '/node_modules/foo/package.json' does not exist.",
33+
"File '/node_modules/foo/bar/foobar.json.js' does not exist.",
34+
"File '/node_modules/foo/bar/foobar.json.jsx' does not exist.",
35+
"======== Module name 'foo/bar/foobar.json' was not resolved. ========"
1036
]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//// [tests/cases/compiler/requireOfJsonFile_PathMapping.ts] ////
2+
3+
//// [foobar.json]
4+
{ "a": 10 }
5+
6+
//// [a.ts]
7+
import foobar from "foo/bar/foobar.json";
8+
9+
10+
//// [/bin/a.js]
11+
"use strict";
12+
exports.__esModule = true;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
=== /a.ts ===
2+
import foobar from "foo/bar/foobar.json";
3+
>foobar : Symbol(foobar, Decl(a.ts, 0, 6))
4+
5+
=== /node_modules/foo/bar/foobar.json ===
6+
{ "a": 10 }
7+
>"a" : Symbol("a", Decl(foobar.json, 0, 1))
8+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
[
2+
"======== Resolving module 'foo/bar/foobar.json' from '/a.ts'. ========",
3+
"Module resolution kind is not specified, using 'NodeJs'.",
4+
"'baseUrl' option is set to '/', using this value to resolve non-relative module name 'foo/bar/foobar.json'.",
5+
"'paths' option is specified, looking for a pattern to match module name 'foo/bar/foobar.json'.",
6+
"Module name 'foo/bar/foobar.json', matched pattern '*'.",
7+
"Trying substitution 'node_modules/*', candidate module location: 'node_modules/foo/bar/foobar.json'.",
8+
"Loading module as file / folder, candidate module location '/node_modules/foo/bar/foobar.json', target file type 'TypeScript'.",
9+
"File '/node_modules/foo/bar/foobar.json.ts' does not exist.",
10+
"File '/node_modules/foo/bar/foobar.json.tsx' does not exist.",
11+
"File '/node_modules/foo/bar/foobar.json.d.ts' does not exist.",
12+
"Directory '/node_modules/foo/bar/foobar.json' does not exist, skipping all lookups in it.",
13+
"Trying substitution 'src/types', candidate module location: 'src/types'.",
14+
"Loading module as file / folder, candidate module location '/src/types', target file type 'TypeScript'.",
15+
"Loading module 'foo/bar/foobar.json' from 'node_modules' folder, target file type 'TypeScript'.",
16+
"File '/node_modules/foo/package.json' does not exist.",
17+
"File '/node_modules/foo/bar/foobar.json.ts' does not exist.",
18+
"File '/node_modules/foo/bar/foobar.json.tsx' does not exist.",
19+
"File '/node_modules/foo/bar/foobar.json.d.ts' does not exist.",
20+
"Directory '/node_modules/@types' does not exist, skipping all lookups in it.",
21+
"'baseUrl' option is set to '/', using this value to resolve non-relative module name 'foo/bar/foobar.json'.",
22+
"'paths' option is specified, looking for a pattern to match module name 'foo/bar/foobar.json'.",
23+
"Module name 'foo/bar/foobar.json', matched pattern '*'.",
24+
"Trying substitution 'node_modules/*', candidate module location: 'node_modules/foo/bar/foobar.json'.",
25+
"Loading module as file / folder, candidate module location '/node_modules/foo/bar/foobar.json', target file type 'JavaScript'.",
26+
"File '/node_modules/foo/bar/foobar.json.js' does not exist.",
27+
"File '/node_modules/foo/bar/foobar.json.jsx' does not exist.",
28+
"Directory '/node_modules/foo/bar/foobar.json' does not exist, skipping all lookups in it.",
29+
"Trying substitution 'src/types', candidate module location: 'src/types'.",
30+
"Loading module as file / folder, candidate module location '/src/types', target file type 'JavaScript'.",
31+
"Loading module 'foo/bar/foobar.json' from 'node_modules' folder, target file type 'JavaScript'.",
32+
"File '/node_modules/foo/package.json' does not exist.",
33+
"File '/node_modules/foo/bar/foobar.json.js' does not exist.",
34+
"File '/node_modules/foo/bar/foobar.json.jsx' does not exist.",
35+
"'baseUrl' option is set to '/', using this value to resolve non-relative module name 'foo/bar/foobar.json'.",
36+
"'paths' option is specified, looking for a pattern to match module name 'foo/bar/foobar.json'.",
37+
"Module name 'foo/bar/foobar.json', matched pattern '*'.",
38+
"Trying substitution 'node_modules/*', candidate module location: 'node_modules/foo/bar/foobar.json'.",
39+
"Loading module as file / folder, candidate module location '/node_modules/foo/bar/foobar.json', target file type 'Json'.",
40+
"File '/node_modules/foo/bar/foobar.json' exist - use it as a name resolution result.",
41+
"File '/node_modules/foo/package.json' does not exist.",
42+
"======== Module name 'foo/bar/foobar.json' was successfully resolved to '/node_modules/foo/bar/foobar.json'. ========"
43+
]

0 commit comments

Comments
 (0)
0