diff --git a/README.md b/README.md index 83e8687..e991947 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ let coverage = await page.coverage.stopCSSCoverage() // Now we can process it import { calculate_coverage } from '@projectwallace/css-code-coverage' -let report = await calculcate_coverage(coverage) +let report = calculcate_coverage(coverage) ``` ### Browser devtools diff --git a/package-lock.json b/package-lock.json index a859519..0936a94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,6 @@ "@playwright/test": "^1.56.0", "@types/node": "^24.8.1", "c8": "^10.1.3", - "linkedom": "^0.18.12", "oxlint": "^1.22.0", "publint": "^0.3.14", "tsdown": "^0.15.8", @@ -750,13 +749,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -963,23 +955,6 @@ "node": ">= 8" } }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/css-tree": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", @@ -993,26 +968,6 @@ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true, - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1048,65 +1003,6 @@ "node": ">=0.3.1" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, "node_modules/dts-resolver": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-2.1.2.tgz", @@ -1152,19 +1048,6 @@ "node": ">=14" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -1304,46 +1187,6 @@ "dev": true, "license": "MIT" }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1459,31 +1302,6 @@ "node": ">=6" } }, - "node_modules/linkedom": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.18.12.tgz", - "integrity": "sha512-jalJsOwIKuQJSeTvsgzPe9iJzyfVaEJiEXl+25EkKevsULHvMJzpNqwvj1jOESWdmgKDiXObyjOYwlUqG7wo1Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "css-select": "^5.1.0", - "cssom": "^0.5.0", - "html-escaper": "^3.0.3", - "htmlparser2": "^10.0.0", - "uhyphen": "^0.2.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "canvas": ">= 2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1572,19 +1390,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "node_modules/oxlint": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.22.0.tgz", @@ -2274,13 +2079,6 @@ "node": ">=14.17" } }, - "node_modules/uhyphen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.2.0.tgz", - "integrity": "sha512-qz3o9CHXmJJPGBdqzab7qAYuW8kQGKNEuoHFYrBwV6hWIMcpAmxDLXojcHfFr9US1Pe6zUswEIJIbLI610fuqA==", - "dev": true, - "license": "ISC" - }, "node_modules/unconfig": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.3.3.tgz", diff --git a/package.json b/package.json index 24251c2..d4f1bad 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,6 @@ "@playwright/test": "^1.56.0", "@types/node": "^24.8.1", "c8": "^10.1.3", - "linkedom": "^0.18.12", "oxlint": "^1.22.0", "publint": "^0.3.14", "tsdown": "^0.15.8", diff --git a/src/lib/filter-entries.test.ts b/src/lib/filter-entries.test.ts index 5bb6ed4..78ffafc 100644 --- a/src/lib/filter-entries.test.ts +++ b/src/lib/filter-entries.test.ts @@ -1,7 +1,7 @@ import { test, expect } from '@playwright/test' import { filter_coverage } from './filter-entries.js' -test('filters out JS files', async () => { +test('filters out JS files', () => { let entries = [ { url: 'http://example.com/script.js', @@ -9,10 +9,10 @@ test('filters out JS files', async () => { ranges: [{ start: 0, end: 25 }], }, ] - expect(await filter_coverage(entries)).toEqual([]) + expect(filter_coverage(entries)).toEqual([]) }) -test('keeps files with CSS extension', async () => { +test('keeps files with CSS extension', () => { let entries = [ { url: 'http://example.com/styles.css', @@ -20,10 +20,10 @@ test('keeps files with CSS extension', async () => { ranges: [{ start: 0, end: 13 }], }, ] - expect(await filter_coverage(entries)).toEqual(entries) + expect(filter_coverage(entries)).toEqual(entries) }) -test('keeps extension-less URL with HTML text', async () => { +test('keeps extension-less URL with HTML text', () => { let entries = [ { url: 'http://example.com', @@ -38,10 +38,10 @@ test('keeps extension-less URL with HTML text', async () => { ranges: [{ start: 0, end: 13 }], // ranges are remapped }, ] - expect(await filter_coverage(entries)).toEqual(expected) + expect(filter_coverage(entries)).toEqual(expected) }) -test('keeps extension-less URL with CSS text (running coverage in vite dev mode)', async () => { +test('keeps extension-less URL with CSS text (running coverage in vite dev mode)', () => { let entries = [ { url: 'http://example.com', @@ -49,5 +49,5 @@ test('keeps extension-less URL with CSS text (running coverage in vite dev mode) ranges: [{ start: 0, end: 13 }], }, ] - expect(await filter_coverage(entries)).toEqual(entries) + expect(filter_coverage(entries)).toEqual(entries) }) diff --git a/src/lib/filter-entries.ts b/src/lib/filter-entries.ts index f38c2e9..ca9ea82 100644 --- a/src/lib/filter-entries.ts +++ b/src/lib/filter-entries.ts @@ -6,7 +6,7 @@ function is_html(text: string): boolean { return /<\/?(html|body|head|div|span|script|style)/i.test(text) } -export async function filter_coverage(coverage: Coverage[]): Promise { +export function filter_coverage(coverage: Coverage[]): Coverage[] { let result = [] for (let entry of coverage) { @@ -20,7 +20,7 @@ export async function filter_coverage(coverage: Coverage[]): Promise } if (is_html(entry.text)) { - let { css, ranges } = await remap_html(entry.text, entry.ranges) + let { css, ranges } = remap_html(entry.text, entry.ranges) result.push({ url: entry.url, text: css, diff --git a/src/lib/html-parser.test.ts b/src/lib/html-parser.test.ts new file mode 100644 index 0000000..bd04d9b --- /dev/null +++ b/src/lib/html-parser.test.ts @@ -0,0 +1,45 @@ +import { test, expect } from '@playwright/test' +import { DOMParser, type Element } from './html-parser' + +let parse: (html: string) => Element[] + +test.beforeAll(() => { + parse = function (html: string) { + return new DOMParser().parseFromString(`${html}`, 'text/html').querySelectorAll('style') + } +}) + +test('finds nothing if there is no ')).toEqual([{ textContent: '.css{}' }]) +}) + +test('finds multiple + + + +

Hello world

+

My text

+ + `), + ).toEqual([{ textContent: '.css1{}' }, { textContent: '.css2{}' }]) +}) + +test('finds style tags with attributes', () => { + expect(parse('')).toEqual([{ textContent: '.css{}' }]) +}) + +test('ignores style tags without end tag', () => { + expect(parse('', start) + if (close === -1) break + let text = html.slice(start + 1, close) + styles.push({ textContent: text }) + pos = close + ''.length + } + return { + querySelectorAll(selector: 'style') { + return styles + }, + } + } +} diff --git a/src/lib/index.test.ts b/src/lib/index.test.ts index 8878007..0df980f 100644 --- a/src/lib/index.test.ts +++ b/src/lib/index.test.ts @@ -26,8 +26,8 @@ test.describe('from ') - let result = await remap_html(html, [{ start: 1, end: 2 }]) + let result = remap_html(html, [{ start: 1, end: 2 }]) expect(result).toEqual({ css: '', ranges: [], }) }) -test('skips white-space-only style block', async () => { +test('skips white-space-only style block', () => { let html = create_html(``) - let result = await remap_html(html, [{ start: 1, end: 2 }]) + let result = remap_html(html, [{ start: 1, end: 2 }]) expect(result).toEqual({ css: '', ranges: [], }) }) -test('remaps a single style block', async () => { +test('remaps a single style block', () => { let css = `h1 { color: red; }` let html = create_html(``, `

Hello world

`) let range = { start: html.indexOf(css), end: html.indexOf(css) + css.length } - let result = await remap_html(html, [range]) + let result = remap_html(html, [range]) expect(result).toEqual({ css, ranges: [{ start: 0, end: css.length }], }) }) -test('remaps multiple style blocks', async () => { +test('remaps multiple style blocks', () => { let css_head = `h1 { color: red; }` let css_body = `h2 { font-size: 24px; }` let html = create_html(``, ``) let range_head = { start: html.indexOf(css_head), end: html.indexOf(css_head) + css_head.length } let range_body = { start: html.indexOf(css_body), end: html.indexOf(css_body) + css_body.length } - let result = await remap_html(html, [range_head, range_body]) + let result = remap_html(html, [range_head, range_body]) expect(result).toEqual({ css: css_head + css_body, ranges: [ diff --git a/src/lib/remap-html.ts b/src/lib/remap-html.ts index 72f04b1..1a9c738 100644 --- a/src/lib/remap-html.ts +++ b/src/lib/remap-html.ts @@ -1,22 +1,21 @@ import type { Range } from './parse-coverage.js' -import type { DOMParser as LinkedomParser } from 'linkedom' +import { DOMParser as WallaceDOMParser } from './html-parser.js' -async function get_dom_parser(): Promise { +function get_dom_parser(): DOMParser | WallaceDOMParser { if (typeof window !== 'undefined' && 'DOMParser' in window) { return new window.DOMParser() } - let { DOMParser } = await import('linkedom') - return new DOMParser() as LinkedomParser + return new WallaceDOMParser() } -export async function remap_html(html: string, old_ranges: Range[]) { - let dom_parser = await get_dom_parser() +export function remap_html(html: string, old_ranges: Range[]) { + let dom_parser = get_dom_parser() let doc = dom_parser.parseFromString(html, 'text/html') let combined_css = '' let new_ranges = [] let current_offset = 0 - let style_elements = doc.querySelectorAll('style') as NodeListOf + let style_elements = doc.querySelectorAll('style') for (let style_element of Array.from(style_elements)) { let style_content = style_element.textContent diff --git a/src/lib/test/kitchen-sink.test.ts b/src/lib/test/kitchen-sink.test.ts index 3abc8f8..5c3740c 100644 --- a/src/lib/test/kitchen-sink.test.ts +++ b/src/lib/test/kitchen-sink.test.ts @@ -5,7 +5,7 @@ import { format } from '@projectwallace/format-css' import * as fs from 'node:fs/promises' import * as path from 'node:path' -test('project wallace Container component', async () => { +test('project wallace Container component', () => { // Coverage: // first rule // first MQ @@ -29,7 +29,7 @@ test('project wallace Container component', async () => { }, ] - let result = await calculate_coverage(coverage) + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.at(0)! expect.soft(sheet.total_lines).toBe(44) @@ -72,7 +72,7 @@ test.describe('comment coverage', () => { h1 { color: blue; } ` let coverage = (await generate_coverage(html, { link_css: css })) as Coverage[] - let result = await calculate_coverage(coverage) + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.at(0)! expect( sheet.chunks.map(({ is_covered, start_line, end_line, total_lines }) => ({ is_covered, start_line, end_line, total_lines })), @@ -90,7 +90,7 @@ test.describe('comment coverage', () => { h1 { color: blue; } ` let coverage = (await generate_coverage(html, { link_css: css })) as Coverage[] - let result = await calculate_coverage(coverage) + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.at(0)! expect( sheet.chunks.map(({ is_covered, start_line, end_line, total_lines }) => ({ is_covered, start_line, end_line, total_lines })), @@ -106,7 +106,7 @@ test.describe('comment coverage', () => { /* start comment */ ` let coverage = (await generate_coverage(html, { link_css: css })) as Coverage[] - let result = await calculate_coverage(coverage) + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.at(0)! expect( sheet.chunks.map(({ is_covered, start_line, end_line, total_lines }) => ({ is_covered, start_line, end_line, total_lines })), @@ -124,7 +124,7 @@ test.describe('comment coverage', () => { */ ` let coverage = (await generate_coverage(html, { link_css: css })) as Coverage[] - let result = await calculate_coverage(coverage) + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.at(0)! expect( sheet.chunks.map(({ is_covered, start_line, end_line, total_lines }) => ({ is_covered, start_line, end_line, total_lines })), @@ -161,7 +161,7 @@ test.describe('@rules', () => { a { color: orangered; } ` let coverage = (await generate_coverage(html, { link_css: css })) as Coverage[] - let result = await calculate_coverage(coverage) + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.at(0)! expect(sheet.chunks.map(({ is_covered, start_line, total_lines }) => ({ is_covered, start_line, total_lines }))).toEqual([ @@ -183,7 +183,7 @@ test.describe('@rules', () => { a { color: orangered; } ` let coverage = (await generate_coverage(html, { link_css: css })) as Coverage[] - let result = await calculate_coverage(coverage) + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.at(0)! expect( @@ -211,7 +211,7 @@ test.describe('@rules', () => { `body {\n\t\t\t\t\tcolor: green;\n\t\t\t\t}`, ]) - let result = await calculate_coverage(coverage) + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.at(0)! expect( @@ -237,22 +237,22 @@ test.describe('Wallace mega soverage suite', () => { } }) - test('CopyButton has full coverage', async () => { - let result = await calculate_coverage(coverage) + test('CopyButton has full coverage', () => { + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.find((s) => s.url.includes('CopyButton'))! expect.soft(sheet.line_coverage_ratio).toBe(1) expect.soft(sheet.total_lines).toBe(17) }) - test('Heading has full coverage', async () => { - let result = await calculate_coverage(coverage) + test('Heading has full coverage', () => { + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.find((s) => s.url.includes('Heading'))! expect.soft(sheet.line_coverage_ratio).toBe(1) expect.soft(sheet.total_lines).toBe(37) }) - test('Meter has partial coverage', async () => { - let result = await calculate_coverage(coverage) + test('Meter has partial coverage', () => { + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.find((s) => s.url.includes('Meter'))! expect.soft(sheet.line_coverage_ratio).not.toBe(1) expect.soft(sheet.total_lines).toBe(35) @@ -262,8 +262,8 @@ test.describe('Wallace mega soverage suite', () => { ]) }) - test('Container has partial coverage', async () => { - let result = await calculate_coverage(coverage) + test('Container has partial coverage', () => { + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.find((s) => s.url.includes('Container'))! expect.soft(sheet.line_coverage_ratio).not.toBe(1) expect.soft(sheet.total_lines).toBe(44) @@ -275,8 +275,8 @@ test.describe('Wallace mega soverage suite', () => { ]) }) - test('Markdown has partial coverage', async () => { - let result = await calculate_coverage(coverage) + test('Markdown has partial coverage', () => { + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.find((s) => s.url.includes('Markdown'))! expect.soft(sheet.line_coverage_ratio).not.toBe(1) expect.soft(sheet.total_lines).toBe(202) @@ -288,8 +288,8 @@ test.describe('Wallace mega soverage suite', () => { }) // This was a notoriously difficult one to fix - test('main sheet has partial coverage', async () => { - let result = await calculate_coverage(coverage) + test('main sheet has partial coverage', () => { + let result = calculate_coverage(coverage) let sheet = result.coverage_per_stylesheet.find((s) => s.url.endsWith('0.RC2DzJv0.css'))! expect.soft(sheet.chunks.filter((c) => !c.is_covered).map(({ start_line, end_line }) => ({ start_line, end_line }))).toEqual([ { start_line: 77, end_line: 81 }, // @media print { .nav-list.svelte-1h32yp1