From f25575e5fee318b9d41e172b6c61afc40f3c2dbd Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Thu, 10 Oct 2019 15:50:32 -0400 Subject: [PATCH 1/3] Typofix: `..._OutputsSkupped` -> `..._OutputsSkipped` --- src/compiler/tsbuild.ts | 4 ++-- src/compiler/types.ts | 3 +++ src/testRunner/unittests/tsbuild/demo.ts | 2 +- tests/baselines/reference/api/tsserverlibrary.d.ts | 2 ++ tests/baselines/reference/api/typescript.d.ts | 2 ++ 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/compiler/tsbuild.ts b/src/compiler/tsbuild.ts index aea85d1fb17..aa379c0004d 100644 --- a/src/compiler/tsbuild.ts +++ b/src/compiler/tsbuild.ts @@ -1807,7 +1807,7 @@ namespace ts { startWatching(state, buildOrder); return isCircularBuildOrder(buildOrder) ? - ExitStatus.ProjectReferenceCycle_OutputsSkupped : + ExitStatus.ProjectReferenceCycle_OutputsSkipped : errorProjects ? successfulProjects ? ExitStatus.DiagnosticsPresent_OutputsGenerated : @@ -1821,7 +1821,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 9053bbc1126..a08ab819f3b 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3259,6 +3259,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/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/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 { From cd34808a148804dd03fadae24587f08ae92d5b0d Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Thu, 10 Oct 2019 18:53:10 -0400 Subject: [PATCH 2/3] Fixes missing error exit code when a bogus input file is specified Fixes #33849. --- src/compiler/tsbuild.ts | 22 ++++++++-------------- src/testRunner/unittests/tsbuild/demo.ts | 20 ++++++++++++++++++-- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/compiler/tsbuild.ts b/src/compiler/tsbuild.ts index aa379c0004d..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_OutputsSkipped : - 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) { diff --git a/src/testRunner/unittests/tsbuild/demo.ts b/src/testRunner/unittests/tsbuild/demo.ts index c6055549485..3b1d6d548cf 100644 --- a/src/testRunner/unittests/tsbuild/demo.ts +++ b/src/testRunner/unittests/tsbuild/demo.ts @@ -39,17 +39,19 @@ namespace ts { interface VerifyBuild { modifyDiskLayout: (fs: vfs.FileSystem) => void; + tsconfigs?: readonly string[]; expectedExitStatus: ExitStatus; expectedDiagnostics: (fs: vfs.FileSystem) => fakes.ExpectedDiagnostic[]; expectedOutputs: readonly string[]; notExpectedOutputs: readonly string[]; } - function verifyBuild({ modifyDiskLayout, expectedExitStatus, expectedDiagnostics, expectedOutputs, notExpectedOutputs }: VerifyBuild) { + function verifyBuild({ modifyDiskLayout, tsconfigs = ["/src/tsconfig.json"], + expectedExitStatus, expectedDiagnostics, expectedOutputs, notExpectedOutputs }: VerifyBuild) { const fs = projFs.shadow(); const host = fakes.SolutionBuilderHost.create(fs); modifyDiskLayout(fs); - const builder = createSolutionBuilder(host, ["/src/tsconfig.json"], { verbose: true }); + const builder = createSolutionBuilder(host, tsconfigs, { verbose: true }); const exitStatus = builder.build(); assert.equal(exitStatus, expectedExitStatus); host.assertDiagnosticMessages(...expectedDiagnostics(fs)); @@ -156,5 +158,19 @@ namespace ts { notExpectedOutputs: [...coreOutputs(), ...animalOutputs(), ...zooOutputs()] }); }); + + it("returns an error exit in case of a bogus file", () => { + verifyBuild({ + modifyDiskLayout: noop, + tsconfigs: ["bogus.json"], + expectedExitStatus: ExitStatus.DiagnosticsPresent_OutputsSkipped, + expectedDiagnostics: _ => [ + getExpectedDiagnosticForProjectsInBuild("bogus.json"), + errorDiagnostic([Diagnostics.File_0_not_found, "/bogus.json"]), + ], + expectedOutputs: emptyArray, + notExpectedOutputs: [...coreOutputs(), ...animalOutputs(), ...zooOutputs()] + }); + }); }); } From 730a52bf824f139f4b9eac08b19258d487505a4e Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Mon, 14 Oct 2019 18:12:40 -0400 Subject: [PATCH 3/3] Better format for the exit code test --- src/testRunner/tsconfig.json | 1 + src/testRunner/unittests/tsbuild/demo.ts | 20 ++----------------- .../unittests/tsbuild/exitCodeOnBogusFile.ts | 11 ++++++++++ .../initial-build/test-exit-code.js | 6 ++++++ 4 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 src/testRunner/unittests/tsbuild/exitCodeOnBogusFile.ts create mode 100644 tests/baselines/reference/tsbuild/exitCodeOnBogusFile/initial-build/test-exit-code.js diff --git a/src/testRunner/tsconfig.json b/src/testRunner/tsconfig.json index 27a7712a2b1..79ddfc36a65 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 3b1d6d548cf..c6055549485 100644 --- a/src/testRunner/unittests/tsbuild/demo.ts +++ b/src/testRunner/unittests/tsbuild/demo.ts @@ -39,19 +39,17 @@ namespace ts { interface VerifyBuild { modifyDiskLayout: (fs: vfs.FileSystem) => void; - tsconfigs?: readonly string[]; expectedExitStatus: ExitStatus; expectedDiagnostics: (fs: vfs.FileSystem) => fakes.ExpectedDiagnostic[]; expectedOutputs: readonly string[]; notExpectedOutputs: readonly string[]; } - function verifyBuild({ modifyDiskLayout, tsconfigs = ["/src/tsconfig.json"], - expectedExitStatus, expectedDiagnostics, expectedOutputs, notExpectedOutputs }: VerifyBuild) { + function verifyBuild({ modifyDiskLayout, expectedExitStatus, expectedDiagnostics, expectedOutputs, notExpectedOutputs }: VerifyBuild) { const fs = projFs.shadow(); const host = fakes.SolutionBuilderHost.create(fs); modifyDiskLayout(fs); - const builder = createSolutionBuilder(host, tsconfigs, { verbose: true }); + const builder = createSolutionBuilder(host, ["/src/tsconfig.json"], { verbose: true }); const exitStatus = builder.build(); assert.equal(exitStatus, expectedExitStatus); host.assertDiagnosticMessages(...expectedDiagnostics(fs)); @@ -158,19 +156,5 @@ namespace ts { notExpectedOutputs: [...coreOutputs(), ...animalOutputs(), ...zooOutputs()] }); }); - - it("returns an error exit in case of a bogus file", () => { - verifyBuild({ - modifyDiskLayout: noop, - tsconfigs: ["bogus.json"], - expectedExitStatus: ExitStatus.DiagnosticsPresent_OutputsSkipped, - expectedDiagnostics: _ => [ - getExpectedDiagnosticForProjectsInBuild("bogus.json"), - errorDiagnostic([Diagnostics.File_0_not_found, "/bogus.json"]), - ], - expectedOutputs: emptyArray, - notExpectedOutputs: [...coreOutputs(), ...animalOutputs(), ...zooOutputs()] - }); - }); }); } 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/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 + +