From 8814f6da48dbec9101e0ea45bb4d8152bd39dbf9 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Mon, 20 Mar 2023 13:26:04 -0700 Subject: [PATCH] Report error if commanline only option is specified in tsconfig (#53397) --- src/compiler/commandLineParser.ts | 23 ++++++++++++------- src/compiler/diagnosticMessages.json | 4 ++++ .../unittests/config/tsconfigParsing.ts | 11 +++++++++ ...ine option is in tsconfig with json api.js | 14 +++++++++++ ... is in tsconfig with jsonSourceFile api.js | 17 ++++++++++++++ .../telemetry/does-not-expose-paths.js | 5 ++-- 6 files changed, 63 insertions(+), 11 deletions(-) create mode 100644 tests/baselines/reference/config/tsconfigParsing/generates errors when commandline option is in tsconfig with json api.js create mode 100644 tests/baselines/reference/config/tsconfigParsing/generates errors when commandline option is in tsconfig with jsonSourceFile api.js diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 0b3e7897f7e..3ca170193e0 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -3170,6 +3170,7 @@ function getExtendsConfigPathOrArray( basePath: string, configFileName: string | undefined, errors: Diagnostic[], + propertyAssignment?: PropertyAssignment, valueExpression?: Expression, sourceFile?: JsonSourceFile, ) { @@ -3200,12 +3201,12 @@ function getExtendsConfigPathOrArray( )); } else { - convertJsonOption(extendsOptionDeclaration.element, value, basePath, errors, (valueExpression as ArrayLiteralExpression | undefined)?.elements[index], sourceFile); + convertJsonOption(extendsOptionDeclaration.element, value, basePath, errors, propertyAssignment, (valueExpression as ArrayLiteralExpression | undefined)?.elements[index], sourceFile); } } } else { - convertJsonOption(extendsOptionDeclaration, value, basePath, errors, valueExpression, sourceFile); + convertJsonOption(extendsOptionDeclaration, value, basePath, errors, propertyAssignment, valueExpression, sourceFile); } return extendedConfigPath; } @@ -3248,7 +3249,7 @@ function parseOwnConfigOfJsonSourceFile( option: CommandLineOption | undefined, ) { // Ensure value is verified except for extends which is handled in its own way for error reporting - if (option && option !== extendsOptionDeclaration) value = convertJsonOption(option, value, basePath, errors, propertyAssignment.initializer, sourceFile); + if (option && option !== extendsOptionDeclaration) value = convertJsonOption(option, value, basePath, errors, propertyAssignment, propertyAssignment.initializer, sourceFile); if (parentOption?.name) { if (option) { let currentOption; @@ -3275,7 +3276,7 @@ function parseOwnConfigOfJsonSourceFile( } else if (parentOption === rootOptions) { if (option === extendsOptionDeclaration) { - extendedConfigPath = getExtendsConfigPathOrArray(value, host, basePath, configFileName, errors, propertyAssignment.initializer, sourceFile); + extendedConfigPath = getExtendsConfigPathOrArray(value, host, basePath, configFileName, errors, propertyAssignment, propertyAssignment.initializer, sourceFile); } else if (!option) { if (keyText === "excludes") { @@ -3458,18 +3459,23 @@ export function convertJsonOption( value: any, basePath: string, errors: Diagnostic[], + propertyAssignment?: PropertyAssignment, valueExpression?: Expression, sourceFile?: TsConfigSourceFile, ): CompilerOptionsValue { + if (opt.isCommandLineOnly) { + errors.push(createDiagnosticForNodeInSourceFileOrCompilerDiagnostic(sourceFile, propertyAssignment?.name, Diagnostics.Option_0_can_only_be_specified_on_command_line, opt.name)); + return undefined; + } if (isCompilerOptionsValue(opt, value)) { const optType = opt.type; if ((optType === "list") && isArray(value)) { - return convertJsonOptionOfListType(opt, value, basePath, errors, valueExpression as ArrayLiteralExpression | undefined, sourceFile); + return convertJsonOptionOfListType(opt, value, basePath, errors, propertyAssignment, valueExpression as ArrayLiteralExpression | undefined, sourceFile); } else if (optType === "listOrElement") { return isArray(value) ? - convertJsonOptionOfListType(opt, value, basePath, errors, valueExpression as ArrayLiteralExpression | undefined, sourceFile) : - convertJsonOption(opt.element, value, basePath, errors, valueExpression, sourceFile); + convertJsonOptionOfListType(opt, value, basePath, errors, propertyAssignment, valueExpression as ArrayLiteralExpression | undefined, sourceFile) : + convertJsonOption(opt.element, value, basePath, errors, propertyAssignment, valueExpression, sourceFile); } else if (!isString(opt.type)) { return convertJsonOptionOfCustomType(opt as CommandLineOptionOfCustomType, value as string, errors, valueExpression, sourceFile); @@ -3530,10 +3536,11 @@ function convertJsonOptionOfListType( values: readonly any[], basePath: string, errors: Diagnostic[], + propertyAssignment: PropertyAssignment | undefined, valueExpression: ArrayLiteralExpression | undefined, sourceFile: TsConfigSourceFile | undefined, ): any[] { - return filter(map(values, (v, index) => convertJsonOption(option.element, v, basePath, errors, valueExpression?.elements[index], sourceFile)), v => option.listPreserveFalsyValues ? true : !!v); + return filter(map(values, (v, index) => convertJsonOption(option.element, v, basePath, errors, propertyAssignment, valueExpression?.elements[index], sourceFile)), v => option.listPreserveFalsyValues ? true : !!v); } /** diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 31252f5f819..f2211ff8a53 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -5270,6 +5270,10 @@ "category": "Message", "code": 6265 }, + "Option '{0}' can only be specified on command line.": { + "category": "Error", + "code": 6266 + }, "Directory '{0}' has no containing package.json scope. Imports will not resolve.": { "category": "Message", diff --git a/src/testRunner/unittests/config/tsconfigParsing.ts b/src/testRunner/unittests/config/tsconfigParsing.ts index 136fbb3a0b0..ee32fe5b58d 100644 --- a/src/testRunner/unittests/config/tsconfigParsing.ts +++ b/src/testRunner/unittests/config/tsconfigParsing.ts @@ -342,6 +342,17 @@ describe("unittests:: config:: tsconfigParsing:: parseConfigFileTextToJson", () allFileList: ["/apath/a.ts"], }]); + baselinedParsed("generates errors when commandline option is in tsconfig", () => [{ + jsonText: JSON.stringify({ + compilerOptions: { + help: true, + } + }), + configFileName: "/apath/tsconfig.json", + basePath: "tests/cases/unittests", + allFileList: ["/apath/a.ts"], + }]); + function baselineWildcards(subScenario: string, scenario: () => { configFileName: string, jsonText: string, basePath: string }[]) { baselineParseConfig({ scenario: "tsconfigParsing", diff --git a/tests/baselines/reference/config/tsconfigParsing/generates errors when commandline option is in tsconfig with json api.js b/tests/baselines/reference/config/tsconfigParsing/generates errors when commandline option is in tsconfig with json api.js new file mode 100644 index 00000000000..1da683b04b8 --- /dev/null +++ b/tests/baselines/reference/config/tsconfigParsing/generates errors when commandline option is in tsconfig with json api.js @@ -0,0 +1,14 @@ +Fs:: +//// [/apath/a.ts] + + +//// [/apath/tsconfig.json] +{"compilerOptions":{"help":true}} + + +configFileName:: /apath/tsconfig.json +FileNames:: +/apath/a.ts +Errors:: +error TS6266: Option 'help' can only be specified on command line. + diff --git a/tests/baselines/reference/config/tsconfigParsing/generates errors when commandline option is in tsconfig with jsonSourceFile api.js b/tests/baselines/reference/config/tsconfigParsing/generates errors when commandline option is in tsconfig with jsonSourceFile api.js new file mode 100644 index 00000000000..0b796635dbf --- /dev/null +++ b/tests/baselines/reference/config/tsconfigParsing/generates errors when commandline option is in tsconfig with jsonSourceFile api.js @@ -0,0 +1,17 @@ +Fs:: +//// [/apath/a.ts] + + +//// [/apath/tsconfig.json] +{"compilerOptions":{"help":true}} + + +configFileName:: /apath/tsconfig.json +FileNames:: +/apath/a.ts +Errors:: +/apath/tsconfig.json:1:21 - error TS6266: Option 'help' can only be specified on command line. + +1 {"compilerOptions":{"help":true}} +   ~~~~~~ + diff --git a/tests/baselines/reference/tsserver/telemetry/does-not-expose-paths.js b/tests/baselines/reference/tsserver/telemetry/does-not-expose-paths.js index 4e0263546cd..a78223594e0 100644 --- a/tests/baselines/reference/tsserver/telemetry/does-not-expose-paths.js +++ b/tests/baselines/reference/tsserver/telemetry/does-not-expose-paths.js @@ -47,7 +47,6 @@ Info 7 [00:00:14.000] Config: /tsconfig.json : { "out": "hunter2", "reactNamespace": "hunter2", "charset": "hunter2", - "locale": "hunter2", "declarationDir": "/hunter2", "paths": { "*": [ @@ -81,9 +80,9 @@ Info 16 [00:00:23.000] ----------------------------------------------- Info 17 [00:00:24.000] event: {"seq":0,"type":"event","event":"projectLoadingFinish","body":{"projectName":"/tsconfig.json"}} Info 18 [00:00:25.000] event: - {"seq":0,"type":"event","event":"telemetry","body":{"telemetryEventName":"projectInfo","payload":{"projectId":"aace87d7c1572ff43c6978074161b586788b4518c7a9d06c79c03e613b6ce5a3","fileStats":{"js":0,"jsSize":0,"jsx":0,"jsxSize":0,"ts":1,"tsSize":0,"tsx":0,"tsxSize":0,"dts":0,"dtsSize":0,"deferred":0,"deferredSize":0},"compilerOptions":{"project":"","outFile":"","outDir":"","rootDir":"","baseUrl":"","rootDirs":[""],"typeRoots":[""],"types":[""],"sourceRoot":"","mapRoot":"","jsxFactory":"","out":"","reactNamespace":"","charset":"","locale":"","declarationDir":"","paths":"","declaration":true,"lib":["es6","dom"]},"typeAcquisition":{"enable":false,"include":false,"exclude":false},"extends":false,"files":true,"include":false,"exclude":false,"compileOnSave":false,"configFileName":"tsconfig.json","projectType":"configured","languageServiceEnabled":true,"version":"FakeVersion"}}} + {"seq":0,"type":"event","event":"telemetry","body":{"telemetryEventName":"projectInfo","payload":{"projectId":"aace87d7c1572ff43c6978074161b586788b4518c7a9d06c79c03e613b6ce5a3","fileStats":{"js":0,"jsSize":0,"jsx":0,"jsxSize":0,"ts":1,"tsSize":0,"tsx":0,"tsxSize":0,"dts":0,"dtsSize":0,"deferred":0,"deferredSize":0},"compilerOptions":{"project":"","outFile":"","outDir":"","rootDir":"","baseUrl":"","rootDirs":[""],"typeRoots":[""],"types":[""],"sourceRoot":"","mapRoot":"","jsxFactory":"","out":"","reactNamespace":"","charset":"","declarationDir":"","paths":"","declaration":true,"lib":["es6","dom"]},"typeAcquisition":{"enable":false,"include":false,"exclude":false},"extends":false,"files":true,"include":false,"exclude":false,"compileOnSave":false,"configFileName":"tsconfig.json","projectType":"configured","languageServiceEnabled":true,"version":"FakeVersion"}}} Info 19 [00:00:26.000] event: - {"seq":0,"type":"event","event":"configFileDiag","body":{"triggerFile":"/a.ts","configFile":"/tsconfig.json","diagnostics":[{"text":"Cannot find type definition file for 'hunter2'.\n The file is in the program because:\n Entry point of type library 'hunter2' specified in compilerOptions","code":2688,"category":"error","relatedInformation":[{"span":{"start":{"line":1,"offset":172},"end":{"line":1,"offset":181},"file":"/tsconfig.json"},"message":"File is entry point of type library specified here.","category":"message","code":1419}]},{"text":"File '/a/lib/lib.dom.d.ts' not found.\n The file is in the program because:\n Library 'lib.dom.d.ts' specified in compilerOptions","code":6053,"category":"error"},{"text":"File '/a/lib/lib.es2015.d.ts' not found.\n The file is in the program because:\n Library 'lib.es2015.d.ts' specified in compilerOptions","code":6053,"category":"error"},{"text":"File '/a.ts' is not under 'rootDir' '/hunter2'. 'rootDir' is expected to contain all source files.\n The file is in the program because:\n Part of 'files' list in tsconfig.json","code":6059,"category":"error","relatedInformation":[{"span":{"start":{"line":1,"offset":497},"end":{"line":1,"offset":504},"file":"/tsconfig.json"},"message":"File is matched by 'files' list specified here.","category":"message","code":1410}]},{"start":{"line":1,"offset":34},"end":{"line":1,"offset":43},"text":"Option 'out' cannot be specified with option 'outFile'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":183},"end":{"line":1,"offset":195},"text":"Option 'sourceRoot can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided.","code":5051,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":206},"end":{"line":1,"offset":215},"text":"Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.","code":5069,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":226},"end":{"line":1,"offset":238},"text":"Option 'reactNamespace' cannot be specified with option 'jsxFactory'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":249},"end":{"line":1,"offset":254},"text":"Option 'declarationDir' cannot be specified with option 'out'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":249},"end":{"line":1,"offset":254},"text":"Option 'out' cannot be specified with option 'outFile'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":249},"end":{"line":1,"offset":254},"text":"Option 'out' is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption '\"ignoreDeprecations\": \"5.0\"' to silence this error.\n Use 'outFile' instead.","code":5101,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":265},"end":{"line":1,"offset":281},"text":"Option 'reactNamespace' cannot be specified with option 'jsxFactory'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":292},"end":{"line":1,"offset":301},"text":"Option 'charset' is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption '\"ignoreDeprecations\": \"5.0\"' to silence this error.","code":5101,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":331},"end":{"line":1,"offset":347},"text":"Option 'declarationDir' cannot be specified with option 'out'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"text":"Cannot find global type 'Array'.","code":2318,"category":"error"},{"text":"Cannot find global type 'Boolean'.","code":2318,"category":"error"},{"text":"Cannot find global type 'Function'.","code":2318,"category":"error"},{"text":"Cannot find global type 'IArguments'.","code":2318,"category":"error"},{"text":"Cannot find global type 'Number'.","code":2318,"category":"error"},{"text":"Cannot find global type 'Object'.","code":2318,"category":"error"},{"text":"Cannot find global type 'RegExp'.","code":2318,"category":"error"},{"text":"Cannot find global type 'String'.","code":2318,"category":"error"},{"start":{"line":1,"offset":422},"end":{"line":1,"offset":431},"text":"Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'es2021', 'es2022', 'es2023', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'webworker.iterable', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.asyncgenerator', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', 'es2019.object', 'es2019.string', 'es2019.symbol', 'es2019.intl', 'es2020.bigint', 'es2020.date', 'es2020.promise', 'es2020.sharedmemory', 'es2020.string', 'es2020.symbol.wellknown', 'es2020.intl', 'es2020.number', 'es2021.promise', 'es2021.string', 'es2021.weakref', 'es2021.intl', 'es2022.array', 'es2022.error', 'es2022.intl', 'es2022.object', 'es2022.sharedmemory', 'es2022.string', 'es2022.regexp', 'es2023.array', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint', 'esnext.string', 'esnext.promise', 'esnext.weakref', 'decorators', 'decorators.legacy'.","code":6046,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":443},"end":{"line":1,"offset":452},"text":"Compiler option 'checkJs' requires a value of type boolean.","code":5024,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":453},"end":{"line":1,"offset":476},"text":"Unknown compiler option 'unknownCompilerOption'.","code":5023,"category":"error","fileName":"/tsconfig.json"}]}} + {"seq":0,"type":"event","event":"configFileDiag","body":{"triggerFile":"/a.ts","configFile":"/tsconfig.json","diagnostics":[{"text":"Cannot find type definition file for 'hunter2'.\n The file is in the program because:\n Entry point of type library 'hunter2' specified in compilerOptions","code":2688,"category":"error","relatedInformation":[{"span":{"start":{"line":1,"offset":172},"end":{"line":1,"offset":181},"file":"/tsconfig.json"},"message":"File is entry point of type library specified here.","category":"message","code":1419}]},{"text":"File '/a/lib/lib.dom.d.ts' not found.\n The file is in the program because:\n Library 'lib.dom.d.ts' specified in compilerOptions","code":6053,"category":"error"},{"text":"File '/a/lib/lib.es2015.d.ts' not found.\n The file is in the program because:\n Library 'lib.es2015.d.ts' specified in compilerOptions","code":6053,"category":"error"},{"text":"File '/a.ts' is not under 'rootDir' '/hunter2'. 'rootDir' is expected to contain all source files.\n The file is in the program because:\n Part of 'files' list in tsconfig.json","code":6059,"category":"error","relatedInformation":[{"span":{"start":{"line":1,"offset":497},"end":{"line":1,"offset":504},"file":"/tsconfig.json"},"message":"File is matched by 'files' list specified here.","category":"message","code":1410}]},{"start":{"line":1,"offset":34},"end":{"line":1,"offset":43},"text":"Option 'out' cannot be specified with option 'outFile'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":183},"end":{"line":1,"offset":195},"text":"Option 'sourceRoot can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided.","code":5051,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":206},"end":{"line":1,"offset":215},"text":"Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.","code":5069,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":226},"end":{"line":1,"offset":238},"text":"Option 'reactNamespace' cannot be specified with option 'jsxFactory'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":249},"end":{"line":1,"offset":254},"text":"Option 'declarationDir' cannot be specified with option 'out'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":249},"end":{"line":1,"offset":254},"text":"Option 'out' cannot be specified with option 'outFile'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":249},"end":{"line":1,"offset":254},"text":"Option 'out' is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption '\"ignoreDeprecations\": \"5.0\"' to silence this error.\n Use 'outFile' instead.","code":5101,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":265},"end":{"line":1,"offset":281},"text":"Option 'reactNamespace' cannot be specified with option 'jsxFactory'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":292},"end":{"line":1,"offset":301},"text":"Option 'charset' is deprecated and will stop functioning in TypeScript 5.5. Specify compilerOption '\"ignoreDeprecations\": \"5.0\"' to silence this error.","code":5101,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":331},"end":{"line":1,"offset":347},"text":"Option 'declarationDir' cannot be specified with option 'out'.","code":5053,"category":"error","fileName":"/tsconfig.json"},{"text":"Cannot find global type 'Array'.","code":2318,"category":"error"},{"text":"Cannot find global type 'Boolean'.","code":2318,"category":"error"},{"text":"Cannot find global type 'Function'.","code":2318,"category":"error"},{"text":"Cannot find global type 'IArguments'.","code":2318,"category":"error"},{"text":"Cannot find global type 'Number'.","code":2318,"category":"error"},{"text":"Cannot find global type 'Object'.","code":2318,"category":"error"},{"text":"Cannot find global type 'RegExp'.","code":2318,"category":"error"},{"text":"Cannot find global type 'String'.","code":2318,"category":"error"},{"start":{"line":1,"offset":312},"end":{"line":1,"offset":320},"text":"Option 'locale' can only be specified on command line.","code":6266,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":422},"end":{"line":1,"offset":431},"text":"Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'es2021', 'es2022', 'es2023', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'webworker.iterable', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.asyncgenerator', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', 'es2019.object', 'es2019.string', 'es2019.symbol', 'es2019.intl', 'es2020.bigint', 'es2020.date', 'es2020.promise', 'es2020.sharedmemory', 'es2020.string', 'es2020.symbol.wellknown', 'es2020.intl', 'es2020.number', 'es2021.promise', 'es2021.string', 'es2021.weakref', 'es2021.intl', 'es2022.array', 'es2022.error', 'es2022.intl', 'es2022.object', 'es2022.sharedmemory', 'es2022.string', 'es2022.regexp', 'es2023.array', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint', 'esnext.string', 'esnext.promise', 'esnext.weakref', 'decorators', 'decorators.legacy'.","code":6046,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":443},"end":{"line":1,"offset":452},"text":"Compiler option 'checkJs' requires a value of type boolean.","code":5024,"category":"error","fileName":"/tsconfig.json"},{"start":{"line":1,"offset":453},"end":{"line":1,"offset":476},"text":"Unknown compiler option 'unknownCompilerOption'.","code":5023,"category":"error","fileName":"/tsconfig.json"}]}} Info 20 [00:00:27.000] Project '/tsconfig.json' (Configured) Info 20 [00:00:28.000] Files (1)