From 2c42d42a79c4293696c86cbab36de57630fc5e0f Mon Sep 17 00:00:00 2001 From: Bart Veneman Date: Sat, 18 Oct 2025 20:40:51 +0200 Subject: [PATCH 1/2] add a bunch of tests --- src/decuplicate.ts | 2 +- src/filter-entries.ts | 1 - src/kitchen-sink.test.ts | 42 ++++++++++++++++++++++++++++++++++++++ src/parse-coverage.test.ts | 9 ++------ src/parse-coverage.ts | 4 ++-- src/prettify.test.ts | 18 ++++++++++++++++ src/prettify.ts | 14 ------------- 7 files changed, 65 insertions(+), 25 deletions(-) create mode 100644 src/kitchen-sink.test.ts diff --git a/src/decuplicate.ts b/src/decuplicate.ts index d24a5aa..a2764b9 100644 --- a/src/decuplicate.ts +++ b/src/decuplicate.ts @@ -10,7 +10,7 @@ export function deduplicate_entries(entries: Coverage[]): Map() for (let entry of entries) { - let text = entry.text || '' + let text = entry.text if (checked_stylesheets.has(text)) { let sheet = checked_stylesheets.get(text)! let ranges = sheet.ranges diff --git a/src/filter-entries.ts b/src/filter-entries.ts index 99b543e..27e4cc1 100644 --- a/src/filter-entries.ts +++ b/src/filter-entries.ts @@ -11,7 +11,6 @@ export function filter_coverage(coverage: Coverage[], parse_html?: Parser): Cove let result = [] for (let entry of coverage) { - if (!entry.text) continue let extension = ext(entry.url).toLowerCase() if (extension === 'js') continue diff --git a/src/kitchen-sink.test.ts b/src/kitchen-sink.test.ts new file mode 100644 index 0000000..30ead17 --- /dev/null +++ b/src/kitchen-sink.test.ts @@ -0,0 +1,42 @@ +import { test, expect } from '@playwright/test' +import { calculate_coverage } from '.' +import { DOMParser } from 'linkedom' + +function parse_html(html: string) { + return new DOMParser().parseFromString(html, 'text/html') +} + +test('proejctw wallace Container', () => { + const coverage = [ + { + url: 'http://localhost:4173/_app/immutable/assets/Container.n-2BXq6O.css', + text: '.container.svelte-1ginl5v{margin-inline:auto;padding-inline:var(--space-2)}@media (min-width: 44rem){.container.svelte-1ginl5v{padding-inline:var(--space-4)}}@media (min-width: 66rem){.container.svelte-1ginl5v{padding-inline:var(--space-8)}}.size-auto.svelte-1ginl5v{max-width:120rem}.size-sm.svelte-1ginl5v{max-width:28rem}.size-md.svelte-1ginl5v{max-width:32rem}.size-lg.svelte-1ginl5v{max-width:36rem}.size-xl.svelte-1ginl5v{max-width:48rem}.size-2xl.svelte-1ginl5v{max-width:64rem}.size-3xl.svelte-1ginl5v{max-width:80rem}\n', + ranges: [ + { start: 0, end: 75 }, + { start: 82, end: 157 }, + { start: 165, end: 240 }, + { start: 241, end: 284 }, + { start: 485, end: 526 }, + ], + }, + ] + let result = calculate_coverage(coverage, parse_html) + let sheet = result.coverage_per_stylesheet.at(0)! + + expect.soft(sheet.total_lines).toBe(44) + expect.soft(sheet.chunks).toHaveLength(3) + + let [chunk1, chunk2, chunk3] = sheet.chunks + + expect.soft(chunk1?.start_line).toEqual(1) + expect.soft(chunk1?.end_line).toEqual(21) + expect.soft(chunk1?.total_lines).toEqual(21) + + expect.soft(chunk2?.start_line).toEqual(22) + expect.soft(chunk2?.end_line).toEqual(40) + expect.soft(chunk2?.total_lines).toEqual(19) + + expect.soft(chunk3?.start_line).toEqual(41) + expect.soft(chunk3?.end_line).toEqual(44) + expect.soft(chunk3?.total_lines).toEqual(4) +}) diff --git a/src/parse-coverage.test.ts b/src/parse-coverage.test.ts index 9c4a5fa..457953e 100644 --- a/src/parse-coverage.test.ts +++ b/src/parse-coverage.test.ts @@ -23,7 +23,7 @@ test('parses valid JSON', () => { ]) }) -test('allows entries without text', () => { +test('does not allow entries without text', () => { let input = ` [ { @@ -35,12 +35,7 @@ test('allows entries without text', () => { ] ` let result = parse_coverage(input) - expect(result).toEqual([ - { - url: 'example.com', - ranges: [{ start: 0, end: 13 }], - }, - ]) + expect(result).toEqual([]) }) test('returns empty array for invalid JSON', () => { diff --git a/src/parse-coverage.ts b/src/parse-coverage.ts index 7e27d50..989f30c 100644 --- a/src/parse-coverage.ts +++ b/src/parse-coverage.ts @@ -7,13 +7,13 @@ export type Range = { export type Coverage = { url: string - text?: string + text: string ranges: Range[] } let CoverageSchema = v.array( v.object({ - text: v.optional(v.string()), + text: v.string(), url: v.string(), ranges: v.array( v.object({ diff --git a/src/prettify.test.ts b/src/prettify.test.ts index d2aa237..5f2e8a7 100644 --- a/src/prettify.test.ts +++ b/src/prettify.test.ts @@ -54,3 +54,21 @@ test('atrule prettification', () => { ] expect(prettify(entries)).toEqual(prettified) }) + +test('prettify url()', () => { + let entries = [ + { + url: 'example.com', + text: `a{ background-image: "example.com/test.gif"; background-image: url('example.com/test.jpg'); background-image: url("example.com/test.png"); }`, + ranges: [{ start: 0, end: 140 }], + }, + ] + let prettified = [ + { + url: 'example.com', + text: `a {\n\tbackground-image: "example.com/test.gif";\n\tbackground-image: url("example.com/test.jpg");\n\tbackground-image: url("example.com/test.png");\n}`, + ranges: [{ start: 0, end: 151 - 7 }], + }, + ] + expect(prettify(entries)).toEqual(prettified) +}) diff --git a/src/prettify.ts b/src/prettify.ts index ab988eb..9f752ac 100644 --- a/src/prettify.ts +++ b/src/prettify.ts @@ -5,9 +5,6 @@ import { tokenize, tokenTypes } from 'css-tree/tokenizer' export function prettify(coverage: Coverage[]): Coverage[] { return coverage.map(({ url, text, ranges }) => { - if (!text) { - return { url, text, ranges } - } let formatted = format(text) let irrelevant_tokens: Set = new Set([ tokenTypes.EOF, @@ -40,11 +37,6 @@ export function prettify(coverage: Coverage[]): Coverage[] { if (irrelevant_tokens.has(type)) return index++ - // format-css changes the Url token to a Function,String,RightParenthesis token sequence - if (type === tokenTypes.Url) { - index += 2 - } - let range_index = is_in_range(start, end) if (range_index !== -1) { ext_ranges[range_index]!.tokens.push(index) @@ -57,12 +49,6 @@ export function prettify(coverage: Coverage[]): Coverage[] { tokenize(formatted, (type, start, end) => { if (irrelevant_tokens.has(type)) return index++ - - // format-css changes the Url token to a Function,String,RightParenthesis token sequence - if (type === tokenTypes.Url) { - index += 2 - } - new_tokens.set(index, { start, end }) }) From 14fa4f3fe5b0ba9dacacb7e5c778fb89bd2e9747 Mon Sep 17 00:00:00 2001 From: Bart Veneman Date: Sat, 18 Oct 2025 21:00:43 +0200 Subject: [PATCH 2/2] tweaks --- src/decuplicate.ts | 2 +- src/index.test.ts | 4 ++-- src/parse-coverage.ts | 35 +++++++++++++---------------------- 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/decuplicate.ts b/src/decuplicate.ts index a2764b9..bd788fd 100644 --- a/src/decuplicate.ts +++ b/src/decuplicate.ts @@ -6,7 +6,7 @@ import type { Coverage, Range } from './parse-coverage.ts' * - if a duplicate stylesheet enters the room, we add it's ranges to the existing stylesheet's ranges * - only bytes of deduplicated stylesheets are counted */ -export function deduplicate_entries(entries: Coverage[]): Map, Pick> { +export function deduplicate_entries(entries: Coverage[]): Map> { let checked_stylesheets = new Map() for (let entry of entries) { diff --git a/src/index.test.ts b/src/index.test.ts index 232174a..3d74b01 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -29,7 +29,7 @@ test.describe('from