From 8da1c39afe22ac3047de05c39c8b27297f45ac7d Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Mon, 17 Aug 2026 22:37:06 +1000 Subject: [PATCH 1/4] test: define removed baseline file reporting --- src/reporter.test.ts | 26 ++++++++++++++++++++++++++ src/types.ts | 4 ++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/reporter.test.ts b/src/reporter.test.ts index 252854c..2a3a963 100644 --- a/src/reporter.test.ts +++ b/src/reporter.test.ts @@ -73,6 +73,32 @@ describe('generateReport', () => { ]); }); + it('reports a removed low-coverage file behind an overall improvement', () => { + const removedFile = makeResult().files[0]; + removedFile.file = 'removed.ts'; + removedFile.coverage = 0; + const keptFile = { ...makeResult().files[0], file: 'kept.ts', coverage: 100 }; + const oldResult = makeResult({ files: [removedFile, keptFile], coverage: 50 }); + saveBaseline(oldResult, BASELINE_FILE); + + const newResult = makeResult({ files: [keptFile], coverage: 100 }); + const json = JSON.parse(generateReport(newResult, { + format: 'json', + compareBaseline: BASELINE_FILE, + }).output); + const text = generateReport(newResult, { compareBaseline: BASELINE_FILE }).output; + + expect(json.comparison.coverageDelta).toBe(50); + expect(json.comparison.files).toEqual([ + { + file: 'removed.ts', + coverageBefore: 0, + status: 'removed', + }, + ]); + expect(text).toContain('removed.ts: removed (0.0%)'); + }); + it('returns exit code 0 when above min coverage', () => { const result = makeResult(); const { exitCode } = generateReport(result, { minCoverage: 70 }); diff --git a/src/types.ts b/src/types.ts index 74165a2..d5e82aa 100644 --- a/src/types.ts +++ b/src/types.ts @@ -92,8 +92,8 @@ export interface BaselineComparison { files: Array<{ file: string; coverageBefore?: number; - coverageCurrent: number; + coverageCurrent?: number; coverageDelta?: number; - status: 'changed' | 'new'; + status: 'changed' | 'new' | 'removed'; }>; } From 495f9a94918de8977423ffc0b72ea92b90836460 Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Mon, 17 Aug 2026 22:37:39 +1000 Subject: [PATCH 2/4] fix: include removed files in baseline comparisons --- src/reporter.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/reporter.ts b/src/reporter.ts index 7b50806..0a05cdd 100644 --- a/src/reporter.ts +++ b/src/reporter.ts @@ -103,7 +103,11 @@ export function compareWithBaseline(result: ProjectResult, baseline: Baseline, c } if (file.status === 'new') { - lines.push(` ${file.file}: ${pc.yellow('new')} (${file.coverageCurrent.toFixed(1)}%)`); + lines.push(` ${file.file}: ${pc.yellow('new')} (${file.coverageCurrent!.toFixed(1)}%)`); + } + + if (file.status === 'removed') { + lines.push(` ${file.file}: ${pc.yellow('removed')} (${file.coverageBefore!.toFixed(1)}%)`); } } @@ -276,6 +280,8 @@ export function getBaselineComparison( continue; } + baselineMap.delete(filePath); + const coverageDelta = round(f.coverage - prev.coverage); if (coverageDelta !== 0) { files.push({ @@ -288,6 +294,14 @@ export function getBaselineComparison( } } + for (const [filePath, prev] of baselineMap) { + files.push({ + file: filePath, + coverageBefore: prev.coverage, + status: 'removed', + }); + } + return { baselineTimestamp: baseline.timestamp, coverageBefore: baseline.coverage, From 0f4d6845bb8930c55d85c9cf0163e2ab36387ecb Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Mon, 17 Aug 2026 22:37:51 +1000 Subject: [PATCH 3/4] docs: explain removed baseline file entries --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a1ffc33..e0d8e3a 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,11 @@ typegap --baseline coverage.json typegap --compare coverage.json ``` +Baseline comparisons report changed and new files, plus files that were present +in the saved baseline but are absent from the current scan. Removed files retain +their previous coverage in both text and JSON output, so deleting a low-coverage +file cannot appear as an unexplained overall improvement. + The global install points at the checkout, so rebuild after pulling changes. When the first npm release is available, `npm install --global typegap` will become the registry installation path; it is not supported today. From 497b763fd7c427d9e2d40c8868af050f69a03439 Mon Sep 17 00:00:00 2001 From: Roger Chappel Date: Mon, 17 Aug 2026 22:47:02 +1000 Subject: [PATCH 4/4] test: allow ANSI formatting in removed file assertion --- src/reporter.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reporter.test.ts b/src/reporter.test.ts index 2a3a963..c54bd9b 100644 --- a/src/reporter.test.ts +++ b/src/reporter.test.ts @@ -96,7 +96,7 @@ describe('generateReport', () => { status: 'removed', }, ]); - expect(text).toContain('removed.ts: removed (0.0%)'); + expect(text).toMatch(/removed\.ts:.*removed.*\(0\.0%\)/); }); it('returns exit code 0 when above min coverage', () => {