diff --git a/package-lock.json b/package-lock.json index b17b38a..102d751 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@melt-ui/svelte": "^0.86.6", "@oddbird/popover-polyfill": "^0.6.1", "@projectwallace/css-analyzer": "^7.6.0", - "@projectwallace/css-code-coverage": "^0.4.1", + "@projectwallace/css-code-coverage": "^0.5.0", "@projectwallace/css-code-quality": "^3.0.2", "@projectwallace/css-design-tokens": "^0.6.0", "@projectwallace/css-layer-tree": "^2.0.0", @@ -1364,9 +1364,9 @@ } }, "node_modules/@projectwallace/css-code-coverage": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@projectwallace/css-code-coverage/-/css-code-coverage-0.4.1.tgz", - "integrity": "sha512-vnPx+mdu1njoGNfvV5hxKxTsqC84R5bicr+RAQoyPj/8JeAx8kNvNTGP9OFG2TE4q85yPA8ao0dfY+XPxY79bw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@projectwallace/css-code-coverage/-/css-code-coverage-0.5.0.tgz", + "integrity": "sha512-RFFrqOKieEzERNM7gyONOyHULnbe6LgeW73bwlfEJYfQMF/g4BcnOctFA3d3rGqIMC+sojJAPTwylmUempXgMA==", "license": "EUPL-1.2", "dependencies": { "@projectwallace/format-css": "^2.1.1", diff --git a/package.json b/package.json index e8ac260..6b3fbf6 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@melt-ui/svelte": "^0.86.6", "@oddbird/popover-polyfill": "^0.6.1", "@projectwallace/css-analyzer": "^7.6.0", - "@projectwallace/css-code-coverage": "^0.4.1", + "@projectwallace/css-code-coverage": "^0.5.0", "@projectwallace/css-code-quality": "^3.0.2", "@projectwallace/css-design-tokens": "^0.6.0", "@projectwallace/css-layer-tree": "^2.0.0", diff --git a/src/lib/components/coverage/Coverage.svelte b/src/lib/components/coverage/Coverage.svelte index c447300..0a2e3f4 100644 --- a/src/lib/components/coverage/Coverage.svelte +++ b/src/lib/components/coverage/Coverage.svelte @@ -6,7 +6,7 @@ import Panel from '$components/Panel.svelte' import Meter from '$components/Meter.svelte' import Pre from '$components/Pre.svelte' - import { calculate_coverage, type Coverage } from '@projectwallace/css-code-coverage' + import { calculate_coverage, type Coverage, type CoverageResult } from '@projectwallace/css-code-coverage' import Empty from '$components/Empty.svelte' import Table from '$components/Table.svelte' import { string_sort } from '$lib/string-sort' @@ -21,15 +21,15 @@ elements: { root, item } } = create_keyboard_list() let selected_index = $state(0) + let calculated: CoverageResult | undefined = $state(undefined) - function parse_html(html: string) { - let parser = new DOMParser() - return parser.parseFromString(html, 'text/html') - } - - let calculated = $derived(calculate_coverage(browser_coverage, parse_html)) + // @ts-expect-error This is very unconventional, maybe fix later with async svelte support + $effect(async () => { + calculated = await calculate_coverage(browser_coverage) + }) let max_lines = $derived.by(() => { + if (!calculated) return 0 let max = 0 for (let sheet of calculated.coverage_per_stylesheet) { if (sheet.total_lines > max) { @@ -43,17 +43,23 @@ selected_index = active_index } - let sort_by = $state<'bytes' | 'coverage' | 'name' | 'lines' | undefined>(undefined) + type SortBy = 'bytes' | 'coverage' | 'name' | 'lines' + + let sort_by = $state(undefined) let sort_direction = $state<'asc' | 'desc'>('asc') let sorted_items = $derived.by(() => { + if (!calculated) return new Uint8Array() + let item_indexes = Uint8Array.from({ length: calculated.coverage_per_stylesheet.length }, (_, i) => i) + if (sort_by === undefined) { return item_indexes } + return item_indexes.sort((_a, _b) => { - let a = calculated.coverage_per_stylesheet[_a] - let b = calculated.coverage_per_stylesheet[_b] + let a = calculated!.coverage_per_stylesheet[_a] + let b = calculated!.coverage_per_stylesheet[_b] if (sort_by === 'bytes') { return sort_direction === 'asc' ? a.total_bytes - b.total_bytes : b.total_bytes - a.total_bytes @@ -85,8 +91,8 @@ }) -{#snippet sorted_th(name: 'bytes' | 'coverage' | 'name' | 'lines', label: string)} - {@const sort_by_attr = sort_by === name ? (sort_direction === 'asc' ? 'ascending' : 'descending') : undefined} +{#snippet sorted_th(sort: SortBy | undefined, name: SortBy, label: string)} + {@const sort_by_attr = sort === name ? (sort_direction === 'asc' ? 'ascending' : 'descending') : undefined}