Skip to content

Commit 4dc6028

Browse files
authored
Fix #11650 add an error message for no source files parsing a tsconfig.json (#11743)
* Fix #11650 add an error message for no source files parsing a tsconfig.json * Use the file name in error message * Use constants * Review comments: change message text
1 parent a8db813 commit 4dc6028

File tree

4 files changed

+148
-25
lines changed

4 files changed

+148
-25
lines changed

src/compiler/commandLineParser.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,9 @@ namespace ts {
912912
if (hasProperty(json, "files")) {
913913
if (isArray(json["files"])) {
914914
fileNames = <string[]>json["files"];
915+
if (fileNames.length === 0) {
916+
errors.push(createCompilerDiagnostic(Diagnostics.The_files_list_in_config_file_0_is_empty, configFileName || "tsconfig.json"));
917+
}
915918
}
916919
else {
917920
errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_requires_a_value_of_type_1, "files", "Array"));
@@ -954,7 +957,18 @@ namespace ts {
954957
includeSpecs = ["**/*"];
955958
}
956959

957-
return matchFileNames(fileNames, includeSpecs, excludeSpecs, basePath, options, host, errors);
960+
const result = matchFileNames(fileNames, includeSpecs, excludeSpecs, basePath, options, host, errors);
961+
962+
if (result.fileNames.length === 0 && !hasProperty(json, "files") && resolutionStack.length === 0) {
963+
errors.push(
964+
createCompilerDiagnostic(
965+
Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
966+
configFileName || "tsconfig.json",
967+
JSON.stringify(includeSpecs || []),
968+
JSON.stringify(excludeSpecs || [])));
969+
}
970+
971+
return result;
958972
}
959973
}
960974

src/compiler/diagnosticMessages.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3077,6 +3077,7 @@
30773077
"category": "Error",
30783078
"code": 17010
30793079
},
3080+
30803081
"Circularity detected while resolving configuration: {0}": {
30813082
"category": "Error",
30823083
"code": 18000
@@ -3085,6 +3086,15 @@
30853086
"category": "Error",
30863087
"code": 18001
30873088
},
3089+
"The 'files' list in config file '{0}' is empty.": {
3090+
"category": "Error",
3091+
"code": 18002
3092+
},
3093+
"No inputs were found in config file '{0}'. Specified 'include' paths were '{1}' and 'exclude' paths were '{2}'.": {
3094+
"category": "Error",
3095+
"code": 18003
3096+
},
3097+
30883098
"Add missing 'super()' call.": {
30893099
"category": "Message",
30903100
"code": 90001

src/harness/unittests/matchFiles.ts

Lines changed: 56 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace ts {
55
const caseInsensitiveBasePath = "c:/dev/";
6+
const caseInsensitiveTsconfigPath = "c:/dev/tsconfig.json";
67
const caseInsensitiveHost = new Utils.MockParseConfigHost(caseInsensitiveBasePath, /*useCaseSensitiveFileNames*/ false, [
78
"c:/dev/a.ts",
89
"c:/dev/a.d.ts",
@@ -88,6 +89,8 @@ namespace ts {
8889
"c:/dev/g.min.js/.g/g.ts"
8990
]);
9091

92+
const defaultExcludes = ["node_modules", "bower_components", "jspm_packages"];
93+
9194
describe("matchFiles", () => {
9295
describe("with literal file list", () => {
9396
it("without exclusions", () => {
@@ -189,11 +192,14 @@ namespace ts {
189192
};
190193
const expected: ts.ParsedCommandLine = {
191194
options: {},
192-
errors: [],
195+
errors: [
196+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
197+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(defaultExcludes))
198+
],
193199
fileNames: [],
194200
wildcardDirectories: {},
195201
};
196-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
202+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
197203
assert.deepEqual(actual.fileNames, expected.fileNames);
198204
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
199205
assert.deepEqual(actual.errors, expected.errors);
@@ -207,11 +213,14 @@ namespace ts {
207213
};
208214
const expected: ts.ParsedCommandLine = {
209215
options: {},
210-
errors: [],
216+
errors: [
217+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
218+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(defaultExcludes))
219+
],
211220
fileNames: [],
212221
wildcardDirectories: {},
213222
};
214-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
223+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
215224
assert.deepEqual(actual.fileNames, expected.fileNames);
216225
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
217226
assert.deepEqual(actual.errors, expected.errors);
@@ -551,13 +560,16 @@ namespace ts {
551560
};
552561
const expected: ts.ParsedCommandLine = {
553562
options: {},
554-
errors: [],
563+
errors: [
564+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
565+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(defaultExcludes))
566+
],
555567
fileNames: [],
556568
wildcardDirectories: {
557569
"c:/dev": ts.WatchDirectoryFlags.Recursive
558570
},
559571
};
560-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
572+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
561573
assert.deepEqual(actual.fileNames, expected.fileNames);
562574
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
563575
assert.deepEqual(actual.errors, expected.errors);
@@ -619,7 +631,7 @@ namespace ts {
619631
it("with common package folders and no exclusions", () => {
620632
const json = {
621633
include: [
622-
"**/a.ts"
634+
"**/a.ts"
623635
]
624636
};
625637
const expected: ts.ParsedCommandLine = {
@@ -701,13 +713,16 @@ namespace ts {
701713
options: {
702714
allowJs: false
703715
},
704-
errors: [],
716+
errors: [
717+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
718+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(defaultExcludes))
719+
],
705720
fileNames: [],
706721
wildcardDirectories: {
707722
"c:/dev/js": ts.WatchDirectoryFlags.None
708723
}
709724
};
710-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
725+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
711726
assert.deepEqual(actual.fileNames, expected.fileNames);
712727
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
713728
assert.deepEqual(actual.errors, expected.errors);
@@ -828,11 +843,14 @@ namespace ts {
828843
};
829844
const expected: ts.ParsedCommandLine = {
830845
options: {},
831-
errors: [],
846+
errors: [
847+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
848+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(json.exclude))]
849+
,
832850
fileNames: [],
833851
wildcardDirectories: {}
834852
};
835-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
853+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
836854
assert.deepEqual(actual.fileNames, expected.fileNames);
837855
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
838856
assert.deepEqual(actual.errors, expected.errors);
@@ -1030,12 +1048,14 @@ namespace ts {
10301048
const expected: ts.ParsedCommandLine = {
10311049
options: {},
10321050
errors: [
1033-
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, "**")
1051+
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, "**"),
1052+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
1053+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(defaultExcludes))
10341054
],
10351055
fileNames: [],
10361056
wildcardDirectories: {}
10371057
};
1038-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
1058+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
10391059
assert.deepEqual(actual.fileNames, expected.fileNames);
10401060
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
10411061
assert.deepEqual(actual.errors, expected.errors);
@@ -1051,11 +1071,14 @@ namespace ts {
10511071
};
10521072
const expected: ts.ParsedCommandLine = {
10531073
options: {},
1054-
errors: [],
1074+
errors: [
1075+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
1076+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(json.exclude))
1077+
],
10551078
fileNames: [],
10561079
wildcardDirectories: {}
10571080
};
1058-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
1081+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
10591082
assert.deepEqual(actual.fileNames, expected.fileNames);
10601083
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
10611084
assert.deepEqual(actual.errors, expected.errors);
@@ -1071,12 +1094,14 @@ namespace ts {
10711094
const expected: ts.ParsedCommandLine = {
10721095
options: {},
10731096
errors: [
1074-
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_multiple_recursive_directory_wildcards_Asterisk_Asterisk_Colon_0, "**/x/**/*")
1097+
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_multiple_recursive_directory_wildcards_Asterisk_Asterisk_Colon_0, "**/x/**/*"),
1098+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
1099+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(defaultExcludes))
10751100
],
10761101
fileNames: [],
10771102
wildcardDirectories: {}
10781103
};
1079-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
1104+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
10801105
assert.deepEqual(actual.fileNames, expected.fileNames);
10811106
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
10821107
assert.deepEqual(actual.errors, expected.errors);
@@ -1122,12 +1147,14 @@ namespace ts {
11221147
const expected: ts.ParsedCommandLine = {
11231148
options: {},
11241149
errors: [
1125-
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, "**/../*")
1150+
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, "**/../*"),
1151+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
1152+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(defaultExcludes))
11261153
],
11271154
fileNames: [],
11281155
wildcardDirectories: {}
11291156
};
1130-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
1157+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
11311158
assert.deepEqual(actual.fileNames, expected.fileNames);
11321159
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
11331160
assert.deepEqual(actual.errors, expected.errors);
@@ -1142,12 +1169,14 @@ namespace ts {
11421169
const expected: ts.ParsedCommandLine = {
11431170
options: {},
11441171
errors: [
1145-
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, "**/y/../*")
1172+
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, "**/y/../*"),
1173+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
1174+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(defaultExcludes))
11461175
],
11471176
fileNames: [],
11481177
wildcardDirectories: {}
11491178
};
1150-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath);
1179+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
11511180
assert.deepEqual(actual.fileNames, expected.fileNames);
11521181
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
11531182
assert.deepEqual(actual.errors, expected.errors);
@@ -1195,7 +1224,7 @@ namespace ts {
11951224
const expected: ts.ParsedCommandLine = {
11961225
options: {},
11971226
errors: [
1198-
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, "**/y/..")
1227+
ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, "**/y/..")
11991228
],
12001229
fileNames: [
12011230
"c:/dev/a.ts",
@@ -1320,11 +1349,14 @@ namespace ts {
13201349
};
13211350
const expected: ts.ParsedCommandLine = {
13221351
options: {},
1323-
errors: [],
1352+
errors: [
1353+
ts.createCompilerDiagnostic(ts.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
1354+
caseInsensitiveTsconfigPath, JSON.stringify(json.include), JSON.stringify(json.exclude))
1355+
],
13241356
fileNames: [],
13251357
wildcardDirectories: {}
13261358
};
1327-
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveDottedFoldersHost, caseInsensitiveBasePath);
1359+
const actual = ts.parseJsonConfigFileContent(json, caseInsensitiveDottedFoldersHost, caseInsensitiveBasePath, undefined, caseInsensitiveTsconfigPath);
13281360
assert.deepEqual(actual.fileNames, expected.fileNames);
13291361
assert.deepEqual(actual.wildcardDirectories, expected.wildcardDirectories);
13301362
assert.deepEqual(actual.errors, expected.errors);

0 commit comments

Comments
 (0)