diff --git a/src/compiler/tsbuild.ts b/src/compiler/tsbuild.ts index aea85d1fb17..1924be4df89 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -1788,31 +1788,25 @@ namespace ts { let reportQueue = true; let successfulProjects = 0; - let errorProjects = 0; while (true) { const invalidatedProject = getNextInvalidatedProject(state, buildOrder, reportQueue); if (!invalidatedProject) break; reportQueue = false; invalidatedProject.done(cancellationToken); - if (state.diagnostics.has(invalidatedProject.projectPath)) { - errorProjects++; - } - else { - successfulProjects++; - } + if (!state.diagnostics.has(invalidatedProject.projectPath)) successfulProjects++; } disableCache(state); reportErrorSummary(state, buildOrder); startWatching(state, buildOrder); - return isCircularBuildOrder(buildOrder) ? - ExitStatus.ProjectReferenceCycle_OutputsSkupped : - errorProjects ? - successfulProjects ? - ExitStatus.DiagnosticsPresent_OutputsGenerated : - ExitStatus.DiagnosticsPresent_OutputsSkipped : - ExitStatus.Success; + return isCircularBuildOrder(buildOrder) + ? ExitStatus.ProjectReferenceCycle_OutputsSkipped + : !buildOrder.some(p => state.diagnostics.has(toResolvedConfigFilePath(state, p))) + ? ExitStatus.Success + : successfulProjects + ? ExitStatus.DiagnosticsPresent_OutputsGenerated + : ExitStatus.DiagnosticsPresent_OutputsSkipped; } function clean(state: SolutionBuilderState, project?: string, onlyReferences?: boolean) { @@ -1821,7 +1815,7 @@ namespace ts { if (isCircularBuildOrder(buildOrder)) { reportErrors(state, buildOrder.circularDiagnostics); - return ExitStatus.ProjectReferenceCycle_OutputsSkupped; + return ExitStatus.ProjectReferenceCycle_OutputsSkipped; } const { options, host } = state; diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 5615568bb1f..b444eda7844 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3261,6 +3261,9 @@ namespace ts { InvalidProject_OutputsSkipped = 3, // When build is skipped because project references form cycle + ProjectReferenceCycle_OutputsSkipped = 4, + + /** @deprecated Use ProjectReferenceCycle_OutputsSkipped instead. */ ProjectReferenceCycle_OutputsSkupped = 4, } diff --git a/src/testRunner/tsconfig.json b/src/testRunner/tsconfig.json index 295fe93f031..6eec3a90221 100644 --- a/src/testRunner/tsconfig.json +++ b/src/testRunner/tsconfig.json @@ -99,6 +99,7 @@ "unittests/tsbuild/demo.ts", "unittests/tsbuild/emitDeclarationOnly.ts", "unittests/tsbuild/emptyFiles.ts", + "unittests/tsbuild/exitCodeOnBogusFile.ts", "unittests/tsbuild/graphOrdering.ts", "unittests/tsbuild/inferredTypeFromTransitiveModule.ts", "unittests/tsbuild/javascriptProjectEmit.ts", diff --git a/src/testRunner/unittests/tsbuild/demo.ts b/src/testRunner/unittests/tsbuild/demo.ts index c8a597368ff..c6055549485 100644 --- a/src/testRunner/unittests/tsbuild/demo.ts +++ b/src/testRunner/unittests/tsbuild/demo.ts @@ -88,7 +88,7 @@ namespace ts { } ]` ), - expectedExitStatus: ExitStatus.ProjectReferenceCycle_OutputsSkupped, + expectedExitStatus: ExitStatus.ProjectReferenceCycle_OutputsSkipped, expectedDiagnostics: () => [ getExpectedDiagnosticForProjectsInBuild("src/animals/tsconfig.json", "src/zoo/tsconfig.json", "src/core/tsconfig.json", "src/tsconfig.json"), errorDiagnostic([ diff --git a/src/testRunner/unittests/tsbuild/exitCodeOnBogusFile.ts b/src/testRunner/unittests/tsbuild/exitCodeOnBogusFile.ts new file mode 100644 index 00000000000..09821d76e5e --- /dev/null +++ b/src/testRunner/unittests/tsbuild/exitCodeOnBogusFile.ts @@ -0,0 +1,11 @@ +namespace ts { + // https://github.com/microsoft/TypeScript/issues/33849 + describe("unittests:: tsbuild:: exitCodeOnBogusFile:: test exit code", () => { + verifyTsc({ + scenario: "exitCodeOnBogusFile", + subScenario: `test exit code`, + fs: () => loadProjectFromFiles({}, symbolLibContent), + commandLineArgs: ["-b", "bogus.json"] + }); + }); +} diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index e79ddd53445..2649699aa04 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -1964,6 +1964,8 @@ declare namespace ts { DiagnosticsPresent_OutputsSkipped = 1, DiagnosticsPresent_OutputsGenerated = 2, InvalidProject_OutputsSkipped = 3, + ProjectReferenceCycle_OutputsSkipped = 4, + /** @deprecated Use ProjectReferenceCycle_OutputsSkipped instead. */ ProjectReferenceCycle_OutputsSkupped = 4 } export interface EmitResult { diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index cac4c281dd1..9d1ffdf5e57 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -1964,6 +1964,8 @@ declare namespace ts { DiagnosticsPresent_OutputsSkipped = 1, DiagnosticsPresent_OutputsGenerated = 2, InvalidProject_OutputsSkipped = 3, + ProjectReferenceCycle_OutputsSkipped = 4, + /** @deprecated Use ProjectReferenceCycle_OutputsSkipped instead. */ ProjectReferenceCycle_OutputsSkupped = 4 } export interface EmitResult { diff --git a/tests/baselines/reference/tsbuild/exitCodeOnBogusFile/initial-build/test-exit-code.js b/tests/baselines/reference/tsbuild/exitCodeOnBogusFile/initial-build/test-exit-code.js new file mode 100644 index 00000000000..5009763f757 --- /dev/null +++ b/tests/baselines/reference/tsbuild/exitCodeOnBogusFile/initial-build/test-exit-code.js @@ -0,0 +1,6 @@ +//// [/lib/initial-buildOutput.txt] +/lib/tsc -b bogus.json +error TS6053: File '/bogus.json' not found. +exitCode:: 1 + +