Skip to content

Commit 018c197

Browse files
committed
feat: add coverage chunks per stylesheet
1 parent 9a1349b commit 018c197

File tree

2 files changed

+95
-1
lines changed

2 files changed

+95
-1
lines changed

src/index.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,64 @@ test.describe('from coverage data downloaded directly from the browser as JSON',
195195
]),
196196
)
197197
})
198+
199+
test('calculates chunks', () => {
200+
let result = calculate_coverage(coverage, html_parser)
201+
expect(result.coverage_per_stylesheet.at(0)?.chunks).toEqual([
202+
{ start_line: 1, is_covered: true, end_line: 4, total_lines: 4 },
203+
{ start_line: 4, is_covered: false, end_line: 8, total_lines: 5 },
204+
{ start_line: 8, is_covered: true, end_line: 10, total_lines: 3 },
205+
{ start_line: 10, is_covered: false, end_line: 11, total_lines: 2 },
206+
{ start_line: 11, is_covered: true, end_line: 14, total_lines: 4 },
207+
])
208+
})
209+
210+
test('calculates chunks for fully covered file', () => {
211+
let result = calculate_coverage(
212+
[
213+
{
214+
url: 'https://example.com',
215+
ranges: [
216+
{
217+
start: 0,
218+
end: 19,
219+
},
220+
],
221+
text: 'h1 { color: blue; }',
222+
},
223+
],
224+
html_parser,
225+
)
226+
expect(result.coverage_per_stylesheet.at(0)?.chunks).toEqual([
227+
{
228+
start_line: 1,
229+
is_covered: true,
230+
end_line: 3,
231+
total_lines: 3,
232+
},
233+
])
234+
})
235+
236+
test('calculates chunks for fully uncovered file', () => {
237+
let result = calculate_coverage(
238+
[
239+
{
240+
url: 'https://example.com',
241+
ranges: [],
242+
text: 'h1 { color: blue; }',
243+
},
244+
],
245+
html_parser,
246+
)
247+
expect(result.coverage_per_stylesheet.at(0)?.chunks).toEqual([
248+
{
249+
start_line: 1,
250+
is_covered: false,
251+
end_line: 3,
252+
total_lines: 3,
253+
},
254+
])
255+
})
198256
})
199257

200258
test('handles empty input', () => {

src/index.ts

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ export type StylesheetCoverage = CoverageData & {
2020
text: string
2121
ranges: Range[]
2222
line_coverage: Uint8Array
23+
chunks: {
24+
is_covered: boolean
25+
start_line: number
26+
end_line: number
27+
total_lines: number
28+
}[]
2329
}
2430

2531
export type CoverageResult = CoverageData & {
@@ -117,6 +123,36 @@ export function calculate_coverage(coverage: Coverage[], parse_html?: Parser): C
117123
offset = next_offset
118124
}
119125

126+
// Create "chunks" of covered/uncovered lines for easier rendering later on
127+
let chunks = [
128+
{
129+
start_line: 1,
130+
is_covered: line_coverage[0] === 1,
131+
end_line: 0,
132+
total_lines: 0,
133+
},
134+
]
135+
136+
for (let index = 0; index < line_coverage.length; index++) {
137+
let is_covered = line_coverage[index]
138+
if (index > 0 && is_covered !== line_coverage[index - 1]) {
139+
let last_chunk = chunks.at(-1)!
140+
last_chunk.end_line = index
141+
last_chunk.total_lines = index - last_chunk.start_line + 1
142+
143+
chunks.push({
144+
start_line: index,
145+
is_covered: is_covered === 1,
146+
end_line: index,
147+
total_lines: 0,
148+
})
149+
}
150+
}
151+
152+
let last_chunk = chunks.at(-1)!
153+
last_chunk.total_lines = line_coverage.length - last_chunk.start_line + 1
154+
last_chunk.end_line = line_coverage.length
155+
120156
return {
121157
url,
122158
text,
@@ -130,7 +166,7 @@ export function calculate_coverage(coverage: Coverage[], parse_html?: Parser): C
130166
total_lines: total_file_lines,
131167
covered_lines: file_lines_covered,
132168
uncovered_lines: total_file_lines - file_lines_covered,
133-
// TODO: { is_covered: boolean, start_offset: number, start_line: number, end_offset: number, end_line: number }[]
169+
chunks,
134170
}
135171
})
136172

0 commit comments

Comments
 (0)