From da982fe4c416ea17ecf10594456a50eeeed66f3c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 17 Mar 2026 20:37:18 +0000 Subject: [PATCH] fix(chunkify): correct trailing chunk boundary condition The condition `offset !== text.length - 1` incorrectly skipped the trailing uncovered chunk when exactly one byte remained, silently dropping the last byte. Changed to `offset < text.length`. https://claude.ai/code/session_01CyibEZDpRhyvg4fw3edy1Z --- src/lib/chunkify.test.ts | 33 +++++++++++++++++++++++++++++++++ src/lib/chunkify.ts | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/lib/chunkify.test.ts b/src/lib/chunkify.test.ts index 3de5bb4..31e7b4f 100644 --- a/src/lib/chunkify.test.ts +++ b/src/lib/chunkify.test.ts @@ -103,3 +103,36 @@ test('creates a single chunk when none is covered', () => { ], } satisfies ChunkedCoverage) }) + +test('includes a trailing uncovered chunk when the last byte is not covered', () => { + // text length = 4; range covers first 3 bytes, leaving the last byte uncovered + let coverage = { + text: 'abcd', + ranges: [{ start: 0, end: 3 }], + url: 'https://example.com', + } + let result = chunkify(coverage) + delete coverage.ranges + expect(result).toEqual({ + ...coverage, + chunks: [ + { start_offset: 0, end_offset: 3, is_covered: true }, + { start_offset: 3, end_offset: 4, is_covered: false }, + ], + } satisfies ChunkedCoverage) +}) + +test('does not emit a spurious empty chunk when the last byte is covered', () => { + // range covers the full text — no trailing chunk should appear + let coverage = { + text: 'abcd', + ranges: [{ start: 0, end: 4 }], + url: 'https://example.com', + } + let result = chunkify(coverage) + delete coverage.ranges + expect(result).toEqual({ + ...coverage, + chunks: [{ start_offset: 0, end_offset: 4, is_covered: true }], + } satisfies ChunkedCoverage) +}) diff --git a/src/lib/chunkify.ts b/src/lib/chunkify.ts index d1466c9..e1d918e 100644 --- a/src/lib/chunkify.ts +++ b/src/lib/chunkify.ts @@ -78,7 +78,7 @@ export function chunkify(stylesheet: Coverage): ChunkedCoverage { } // fill up last chunk if necessary: - if (offset !== stylesheet.text.length - 1) { + if (offset < stylesheet.text.length) { chunks.push({ start_offset: offset, end_offset: stylesheet.text.length,