8000 Compilation of Js Files by sheetalkamat · Pull Request #5345 · microsoft/TypeScript · GitHub
[go: up one dir, main page]

Skip to content

Compilation of Js Files #5345

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 72 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
0a67ac3
Add .js as supported extension
sheetalkamat Sep 9, 2015
74a3f67
Emit the diagnostics for javascript file instead of doing semantic check
sheetalkamat Sep 9, 2015
279018d
Baseline updates
sheetalkamat Sep 9, 2015
e9688dd
Allow the js files to emit output
sheetalkamat Sep 9, 2015
fad0db2
Report error if output file is among the input files
sheetalkamat Sep 10, 2015
d3dfd2a
Add test cases for simple js file compilations
sheetalkamat Sep 10, 2015
1dc3414
Javascript files will emit declarations too so get declaration diagno…
sheetalkamat Sep 10, 2015
63de162
Let harness to name file even when single unit data specified but th…
sheetalkamat Sep 10, 2015
57e17d2
Test cases for different typescript syntax not supported errors durin…
sheetalkamat Sep 10, 2015
7e30827
Test for rest parameters(copied from language service tests)
sheetalkamat Sep 10, 2015
2252354
Verify syntax error in js file are reported
sheetalkamat Sep 10, 2015
3107bbb
Let tsconfig to pick up js files
sheetalkamat Sep 10, 2015
885babc
Merge branch 'master' into tscJsFiles
sheetalkamat Sep 14, 2015
60f295f
Cleanup of options of project runner
sheetalkamat Sep 14, 2015
8da3bd2
Project testcase to run tsconfig file
sheetalkamat Sep 15, 2015
8aeff92
Add tests when same named .ts and .js file exist with tsconfig file s…
sheetalkamat Sep 16, 2015
bc48c7c
Merge branch 'master' into tscJsFiles
sheetalkamat Sep 16, 2015
9daf635
Verify and fix scenario when .js and .ts files with same name are pre…
sheetalkamat Sep 16, 2015
70d3de4
When same named .d.ts and .js files are present and tscconfig contain…
sheetalkamat Sep 16, 2015
0f73c16
When folder contains .d.ts as well as .js of same name and tsconfig d…
sheetalkamat Sep 16, 2015
dbb2772
Tests when the .ts and .js files are mixed in compilation with tsccon…
sheetalkamat Sep 16, 2015
14b6082
Tests when the .ts and .js files are mixed in compilation with tsccon…
sheetalkamat Sep 16, 2015
2860435
Do not emit javascript files
sheetalkamat Sep 16, 2015
68c65cd
Test case when one of the input file is output file name
sheetalkamat Sep 16, 2015
fce9f32
When tsconfig file doesnt contain file names, consume .js files of di…
sheetalkamat Sep 16, 2015
e32c920
Corrected scenario names in the test cases
sheetalkamat Sep 16, 2015
60e15b2
Report error when emitting declarations if the reference is to .js file
sheetalkamat Sep 16, 2015
400b353
Merge branch 'master' into tscJsFiles
sheetalkamat Sep 18, 2015
c30104e
Add option --jsExtensions to handle extensions to treat as javascript
sheetalkamat Sep 21, 2015
1df341b
Merge branch 'master' into tscJsFilesxt
sheetalkamat Sep 21, 2015
7f09c81
Syntax changes if the extensions to treat as javascript change
sheetalkamat Sep 22, 2015
607564f
Parse all the javascript files with JSX grammer
sheetalkamat Sep 22, 2015
e044d3e
Merge branch 'master' into tscJsFiles
sheetalkamat Sep 22, 2015
0fe282e
Update the type assertion errors to jsx syntax error as we are treati…
sheetalkamat Sep 22, 2015
ce652dc
Fixing few code review comments
sheetalkamat Oct 5, 2015
460c597
Changes in harness to emit expected and actual
sheetalkamat Oct 5, 2015
108f856
Remove tsconfig files of failing testcases
sheetalkamat Oct 5, 2015
b3e4f8e
Create new tscconfig files for the failing testcases
sheetalkamat Oct 5, 2015
db9faf6
Temp change to investigate test failure
sheetalkamat Oct 5, 2015
938c533
Remove the failing testcases
sheetalkamat Oct 5, 2015
567d71c
Add new test cases
sheetalkamat Oct 5, 2015
756052a
Removing console logs that were for debugging
sheetalkamat Oct 5, 2015
b580c55
Merge branch 'master' into tscJsFiles
sheetalkamat Oct 5, 2015
17fca98
Fix tslint error
sheetalkamat Oct 6, 2015
242eb8b
Taken feedback into account and simplified the getFileNames logic to …
sheetalkamat Oct 6, 2015
f7b7204
Remove extension for emitting output should remove any of supported e…
sheetalkamat Oct 8, 2015
2d083f7
Use compilation options to get extensions to remove to get module name
sheetalkamat Oct 8, 2015
2c3c321
Merge branch 'master' into tscJsFiles
sheetalkamat Oct 8, 2015
5e14edb
Verify the emit file name is unique and doesnt overwrite input file
sheetalkamat Oct 12, 2015
a87dae1
Verify that when emit blocking error occurs rest of the emit occurs a…
sheetalkamat Oct 12, 2015
6882035
Verify if one or more files are emitting into same output file we pro…
sheetalkamat Oct 12, 2015
f28fbfd
Merge branch 'master' into tscJsFiles
sheetalkamat Oct 12, 2015
286fb3e
Fix the lint error
sheetalkamat Oct 12, 2015
b38a81b
Emit enabled for JS files
sheetalkamat Oct 12, 2015
d4d6e48
Adding test case for scenario in which error reported depends on orde…
sheetalkamat Oct 12, 2015
9f96f47
Added scenario when duplicate function implementation is reported
sheetalkamat Oct 12, 2015
11b270f
Add testcase - generating declaration file results in more errors in …
sheetalkamat Oct 12, 2015
8176354
Fix the duplicate function implementation error that depended on orde…
sheetalkamat Oct 14, 2015
5aa7086
Use ts.indexOf instead of Array.indexOf method
sheetalkamat Oct 15, 2015
1ae1464
Test cases for let declaration and its use order
sheetalkamat Oct 15, 2015
acf7de7
Merge branch 'master' into tscJsFiles
sheetalkamat Oct 15, 2015
0496bfe
Merge branch 'master' into tscJsFiles
sheetalkamat Oct 19, 2015
a571bcb
Merge branch 'javaScriptModules' into tscJsFiles
sheetalkamat Oct 19, 2015
fe63067
Refactoring to fix build issues
sheetalkamat Oct 19, 2015
87b5618
Dont emit declaration file if there are errors in the source file
sheetalkamat Oct 20, 2015
0dc1a27
Tests update for emitting declarations if no errors
sheetalkamat Oct 20, 2015
16becda
Do not emit declarations file if we reported error about inaccessible…
sheetalkamat Oct 20, 2015
34706df
Check source map files are being overwritten
sheetalkamat Oct 20, 2015
89a313e
Populate if emit was skipped correctly as part of emit result
sheetalkamat Oct 20, 2015
e4110c3
Some test cases to verify that declaration file overwrite is reported…
sheetalkamat Oct 20, 2015
a7b08dd
Test cases to verify that declaration file is not emitted if any of t…
sheetalkamat Oct 20, 2015
6024266
Some tests to cover transpilation of different syntax
sheetalkamat Oct 21, 2015
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
Prev Previous commit
Next Next commit
Add option --jsExtensions to handle extensions to treat as javascript
- Command line now takes --jsExtension multiple times or comma separated list of extensions
- tsconfig accepts array of extension strings
  • Loading branch information
sheetalkamat committed Sep 21, 2015
commit c30104e3b6e19a902d977ce19f0f58a5770e6fa1
217 changes: 142 additions & 75 deletions src/compiler/commandLineParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,11 @@ namespace ts {
error: Diagnostics.Argument_for_moduleResolution_option_must_be_node_or_classic,
},
{
name: "consumeJsFiles",
type: "boolean",
name: "jsExtensions",
type: "string[]",
description: Diagnostics.Specifies_extensions_to_treat_as_javascript_file_To_specify_multiple_extensions_either_use_this_option_multiple_times_or_provide_comma_separated_list,
paramType: Diagnostics.EXTENSION_S,
error: Diagnostics.Argument_for_jsExtensions_option_must_be_either_extension_or_comma_separated_list_of_extensions,
}
];

Expand Down Expand Up @@ -309,31 +312,23 @@ namespace ts {
if (hasProperty(optionNameMap, s)) {
let opt = optionNameMap[s];

// Check to see if no argument was provided (e.g. "--locale" is the last command-line argument).
if (!args[i] && opt.type !== "boolean") {
errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_expects_an_argument, opt.name));
if (opt.type === "boolean") {
// This needs to be treated specially since it doesnt accept argument
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

doesn't accept an argument

options[opt.name] = true;
}
else {
// Check to see if no argument was provided (e.g. "--locale" is the last command-line argument).
if (!args[i]) {
errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_expects_an_argument, opt.name));
}

switch (opt.type) {
case "number":
options[opt.name] = parseInt(args[i++]);
break;
case "boolean":
options[opt.name] = true;
break;
case "string":
options[opt.name] = args[i++] || "";
break;
// If not a primitive, the possible types are specified in what is effectively a map of options.
default:
let map = <Map<number>>opt.type;
let key = (args[i++] || "").toLowerCase();
if (hasProperty(map, key)) {
options[opt.name] = map[key];
}
else {
errors.push(createCompilerDiagnostic((<CommandLineOptionOfCustomType>opt).error));
}
let { hasError, value} = parseOption(opt, args[i++], options[opt.name]);
< 4D1F /td> if (hasError) {
errors.push(createCompilerDiagnostic((<CommandLineOptionOfCustomType>opt).error));
}
else {
options[opt.name] = value;
}
}
}
else {
Expand All @@ -345,7 +340,7 @@ namespace ts {
}
}
}

function parseResponseFile(fileName: string) {
let text = readFile ? readFile(fileName) : sys.readFile(fileName);

Expand Down Expand Up @@ -380,6 +375,63 @@ namespace ts {
}
}

function parseMultiValueStringArray(s: string, existingValue: string[]) {
let value: string[] = existingValue || [];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You shouldn't need the type annotation; the right side will be contextually typed by the left side.

let hasError: boolean;
let currentString = "";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can move currentString into the if

if (s) {
for (let i = 0; i < s.length; i++) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This does't account for whitespace; so if I write

tsc foo.js bar.ts --jsExtensions "js, jsx, es"

then I'll get ["js", " jsx", " es"] whereas I would expect ["js", "jsx", "es"].

let ch = s.charCodeAt(i);
if (ch === CharacterCodes.comma) {
pushCurrentStringToResult();
}
else {
currentString += s.charAt(i);
}
}
// push last string
pushCurrentStringToResult();
}
return { value, hasError };

function pushCurrentStringToResult() {
if (currentString) {
value.push(currentString);
currentString = "";
}
else {
hasError = true;
}
}
}

/* @internal */
export function parseOption(option: CommandLineOption, stringValue: string, existingValue: CompilerOptionsValueType) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You might as well just have an initializer for stringValue of "" and do that check once.

let hasError: boolean;
let value: CompilerOptionsValueType;
switch (option.type) {
case "number":
value = parseInt(stringValue);
break;
case "string":
value = stringValue || "";
break;
case "string[]":
return parseMultiValueStringArray(stringValue, <string[]>existingValue);
// If not a primitive, the possible types are specified in what is effectively a map of options.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add "boolean" as a case and Debug.fail("Unexpected '"boolean"'.) on it?

default:
let map = <Map<number>>option.type;
let key = (stringValue || "").toLowerCase();
if (hasProperty(map, key)) {
value = map[key];
}
else {
hasError = true;
}
}
return { hasError, value };
}

/**
* Read tsconfig.json file
* @param fileName The path to the config file
Expand Down Expand Up @@ -409,23 +461,57 @@ namespace ts {
}
}

/* @internal */
export function parseJsonCompilerOption(opt: CommandLineOption, jsonValue: any, errors: Diagnostic[]) {
let optType = opt.type;
let expectedType = typeof optType === "string" ? optType : "string";
let hasValidValue = true;
if (typeof jsonValue === expectedType) {
if (typeof optType !== "string") {
let key = jsonValue.toLowerCase();
if (hasProperty(optType, key)) {
jsonValue = optType[key];
}
else {
errors.push(createCompilerDiagnostic((<CommandLineOptionOfCustomType>opt).error));
jsonValue = 0;
}
}
}
// Check if the value asked was string[] and value provided was not string[]
else if (expectedType !== "string[]" ||
typeof jsonValue !== "object" ||
typeof jsonValue.length !== "number" ||
forEach(<string[]>jsonValue, individualValue => typeof individualValue !== "string")) {
// Not expectedType
errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_requires_a_value_of_type_1, opt.name, expectedType));
hasValidValue = false;
}

return {
value: <CompilerOptionsValueType>jsonValue,
hasValidValue
};
}

/**
* Parse the contents of a config file (tsconfig.json).
* @param json The contents of the config file to parse
* @param basePath A root directory to resolve relative path entries in the config
* file to. e.g. outDir
* @param existingOptions optional existing options to extend into
*/
export function parseConfigFile(json: any, host: ParseConfigHost, basePath: string): ParsedCommandLine {
export function parseConfigFile(json: any, host: ParseConfigHost, basePath: string, existingOptions: CompilerOptions = {}): ParsedCommandLine {
let errors: Diagnostic[] = [];

let options = getCompilerOptions();
let options = getCompilerOptions(existingOptions);
return {
options,
fileNames: getFileNames(),
errors
};

function getCompilerOptions(): CompilerOptions {
function getCompilerOptions(existingOptions: CompilerOptions): CompilerOptions {
let options: CompilerOptions = {};
let optionNameMap: Map<CommandLineOption> = {};
forEach(optionDeclarations, option => {
Expand All @@ -436,35 +522,17 @@ namespace ts {
for (let id in jsonOptions) {
if (hasProperty(optionNameMap, id)) {
let opt = optionNameMap[id];
let optType = opt.type;
let value = jsonOptions[id];
let expectedType = typeof optType === "string" ? optType : "string";
if (typeof value === expectedType) {
if (typeof optType !== "string") {
let key = value.toLowerCase();
if (hasProperty(optType, key)) {
value = optType[key];
}
else {
errors.push(createCompilerDiagnostic((<CommandLineOptionOfCustomType>opt).error));
value = 0;
}
}
if (opt.isFilePath) {
value = normalizePath(combinePaths(basePath, value));
}
options[opt.name] = value;
}
else {
errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_requires_a_value_of_type_1, id, expectedType));
let { hasValidValue, value } = parseJsonCompilerOption(opt, jsonOptions[id], errors);
if (hasValidValue) {
options[opt.name] = opt.isFilePath ? normalizePath(combinePaths(basePath, <string>value)) : value;
}
}
else {
errors.push(createCompilerDiagnostic(Diagnostics.Unknown_compiler_option_0, id));
}
}
}
return options;
return extend(existingOptions, options);
}

function getFileNames(): string[] {
Expand All @@ -479,32 +547,31 @@ namespace ts {
}
else {
let exclude = json["exclude"] instanceof Array ? map(<string[]>json["exclude"], normalizeSlashes) : undefined;
let sysFiles = host.readDirectory(basePath, ".ts", exclude).concat(host.readDirectory(basePath, ".tsx", exclude));
if (options.consumeJsFiles) {
sysFiles = sysFiles.concat(host.readDirectory(basePath, ".js", exclude));
}
for (let i = 0; i < sysFiles.length; i++) {
let name = sysFiles[i];
if (fileExtensionIs(name, ".js")) {
let baseName = name.substr(0, name.length - ".js".length);
if (!contains(sysFiles, baseName + ".tsx") && !contains(sysFiles, baseName + ".ts") && !contains(sysFiles, baseName + ".d.ts")) {
fileNames.push(name);
}
}
else if (fileExtensionIs(name, ".d.ts")) {
let baseName = name.substr(0, name.length - ".d.ts".length);
if (!contains(sysFiles, baseName + ".tsx") && !contains(sysFiles, baseName + ".ts")) {
fileNames.push(name);
}
}
else if (fileExtensionIs(name, ".ts")) {
if (!contains(sysFiles, name + "x")) {
fileNames.push(name);
let extensionsToRead = getSupportedExtensions(options);
for (let extensionsIndex = 0; extensionsIndex < extensionsToRead.length; extensionsIndex++) {
let extension = extensionsToRead[extensionsIndex];
let sysFiles = host.readDirectory(basePath, extension, exclude);
for (let i = 0; i < sysFiles.length; i++) {
let fileName = sysFiles[i];
// If this is not the extension of one of the lower priority extension, then only we can use this file name
// This could happen if the extension taking priority is substring of lower priority extension. eg. .ts and .d.ts
let hasLowerPriorityExtension: boolean;
for (let j = extensionsIndex + 1; !hasLowerPriorityExtension && j < extensionsToRead.length; j++) {
hasLowerPriorityExtension = fileExtensionIs(fileName, extensionsToRead[j]);
};
if (!hasLowerPriorityExtension) {
// If the basename + higher priority extensions arent in the filenames, use this file name
let baseName = fileName.substr(0, fileName.length - extension.length - 1);
let hasSameNameHigherPriorityExtensionFile: boolean;
for (let j = 0; !hasSameNameHigherPriorityExtensionFile && j < extensionsIndex; j++) {
hasSameNameHigherPriorityExtensionFile = contains(fileNames, baseName + "." + extensionsToRead[j]);
};

if (!hasSameNameHigherPriorityExtensionFile) {
fileNames.push(fileName);
}
}
}
else {
fileNames.push(name);
}
}
}
return fileNames;
Expand Down
10 changes: 5 additions & 5 deletions src/compiler/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -714,20 +714,20 @@ namespace ts {

export function fileExtensionIs(path: string, extension: string): boolean {
let pathLen = path.length;
let extLen = extension.length;
return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension;
let extLen = extension.length + 1;
return pathLen > extLen && path.substr(pathLen - extLen, extLen) === "." + extension;
}

/**
* List of supported extensions in order of file resolution precedence.
*/
export const supportedExtensions = [".ts", ".tsx", ".d.ts", ".js"];
export const supportedTypeScriptExtensions = ["ts", "tsx", "d.ts"];

const extensionsToRemove = [".d.ts", ".ts", ".js", ".tsx", ".jsx"];
const extensionsToRemove = ["d.ts", "ts", "js", "tsx", "jsx"];
export function removeFileExtension(path: string): string {
for (let ext of extensionsToRemove) {
if (fileExtensionIs(path, ext)) {
return path.substr(0, path.length - ext.length);
return path.substr(0, path.length - ext.length - 1);
}
}
return path;
Expand Down
3 changes: 3 additions & 0 deletions src/compiler/diagnosticInformationMap.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,7 @@ namespace ts {
VERSION: { code: 6036, category: DiagnosticCategory.Message, key: "VERSION" },
LOCATION: { code: 6037, category: DiagnosticCategory.Message, key: "LOCATION" },
DIRECTORY: { code: 6038, category: DiagnosticCategory.Message, key: "DIRECTORY" },
EXTENSION_S: { code: 6039, category: DiagnosticCategory.Message, key: "EXTENSION[S]" },
Compilation_complete_Watching_for_file_changes: { code: 6042, category: DiagnosticCategory.Message, key: "Compilation complete. Watching for file changes." },
Generates_corresponding_map_file: { code: 6043, category: DiagnosticCategory.Message, key: "Generates corresponding '.map' file." },
Compiler_option_0_expects_an_argument: { code: 6044, category: DiagnosticCategory.Error, key: "Compiler option '{0}' expects an argument." },
Expand All @@ -567,6 +568,7 @@ namespace ts {
NEWLINE: { code: 6061, category: DiagnosticCategory.Message, key: "NEWLINE" },
Argument_for_newLine_option_must_be_CRLF_or_LF: { code: 6062, category: DiagnosticCategory.Error, key: "Argument for '--newLine' option must be 'CRLF' or 'LF'." },
Argument_for_moduleResolution_option_must_be_node_or_classic: { code: 6063, category: DiagnosticCategory.Error, key: "Argument for '--moduleResolution' option must be 'node' or 'classic'." },
Argument_for_jsExtensions_option_must_be_either_extension_or_comma_separated_list_of_extensions: { code: 6064, category: DiagnosticCategory.Error, key: "Argument for '--jsExtensions' option must be either extension or comma separated list of extensions." },
Specify_JSX_code_generation_Colon_preserve_or_react: { code: 6080, category: DiagnosticCategory.Message, key: "Specify JSX code generation: 'preserve' or 'react'" },
Argument_for_jsx_must_be_preserve_or_react: { code: 6081, category: DiagnosticCategory.Message, key: "Argument for '--jsx' must be 'preserve' or 'react'." },
Enables_experimental_support_for_ES7_decorators: { code: 6065, category: DiagnosticCategory.Message, key: "Enables experimental support for ES7 decorators." },
Expand All @@ -577,6 +579,7 @@ namespace ts {
Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file: { code: 6070, category: DiagnosticCategory.Message, key: "Initializes a TypeScript project and creates a tsconfig.json file." },
Successfully_created_a_tsconfig_json_file: { code: 6071, category: DiagnosticCategory.Message, key: "Successfully created a tsconfig.json file." },
Suppress_excess_property_checks_for_object_literals: { code: 6072, category: DiagnosticCategory.Message, key: "Suppress excess property checks for object literals." },
Specifies_extensions_to_treat_as_javascript_file_To_specify_multiple_extensions_either_use_this_option_multiple_times_or_provide_comma_separated_list: { code: 6073, category: DiagnosticCategory.Message, key: "Specifies extensions to treat as javascript file. To specify multiple extensions, either use this option multiple times or provide comma separated list." },
Variable_0_implicitly_has_an_1_type: { code: 7005, category: DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." },
Parameter_0_implicitly_has_an_1_type: { code: 7006, category: DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." },
Member_0_implicitly_has_an_1_type: { code: 7008, category: DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." },
Expand Down
12 changes: 12 additions & 0 deletions src/compiler/diagnosticMessages.json
Original file line number Diff line number Diff line change
Expand Up @@ -2174,6 +2174,10 @@
"category": "Message",
"code": 6038
},
"EXTENSION[S]": {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think EXTENSIONS would be fine

"category": "Message",
"code": 6039
},
"Compilation complete. Watching for file changes.": {
"category": "Message",
"code": 6042
Expand Down Expand Up @@ -2258,6 +2262,10 @@
"category": "Error",
"code": 6063
},
"Argument for '--jsExtensions' option must be either extension or comma separated list of extensions.": {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"must be a comma-separated list of extensions."

"category": "Error",
"code": 6064
},

"Specify JSX code generation: 'preserve' or 'react'": {
"category": "Message",
Expand Down Expand Up @@ -2299,6 +2307,10 @@
"category": "Message",
"code": 6072
},
"Specifies extensions to treat as javascript file. To specify multiple extensions, either use this option multiple times or provide comma separated list.": {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"as JavaScript files."

"provide a comma separated list."

"category": "Message",
"code": 6073
},

"Variable '{0}' implicitly has an '{1}' type.": {
"category": "Error",
Expand Down
Loading
0