Skip to content

Commit 829c13e

Browse files
authored
fix: ignore js-like sources (#22)
* fix: ignore js-like sources * clean up
1 parent 15f9f38 commit 829c13e

File tree

3 files changed

+55
-17
lines changed

3 files changed

+55
-17
lines changed

src/lib/filter-entries.test.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { test, expect } from '@playwright/test'
22
import { filter_coverage } from './filter-entries.js'
3+
import { Coverage } from './parse-coverage.js'
34

45
test('filters out JS files', () => {
56
let entries = [
@@ -8,7 +9,7 @@ test('filters out JS files', () => {
89
text: 'console.log("Hello world")',
910
ranges: [{ start: 0, end: 25 }],
1011
},
11-
]
12+
] satisfies Coverage[]
1213
expect(filter_coverage(entries)).toEqual([])
1314
})
1415

@@ -19,7 +20,7 @@ test('keeps files with CSS extension', () => {
1920
text: 'a{color:red}',
2021
ranges: [{ start: 0, end: 13 }],
2122
},
22-
]
23+
] satisfies Coverage[]
2324
expect(filter_coverage(entries)).toEqual(entries)
2425
})
2526

@@ -37,7 +38,7 @@ test('keeps extension-less URL with HTML text', () => {
3738
text: 'a{color:red;}',
3839
ranges: [{ start: 0, end: 13 }], // ranges are remapped
3940
},
40-
]
41+
] satisfies Coverage[]
4142
expect(filter_coverage(entries)).toEqual(expected)
4243
})
4344

@@ -48,6 +49,17 @@ test('keeps extension-less URL with CSS text (running coverage in vite dev mode)
4849
text: 'a{color:red;}',
4950
ranges: [{ start: 0, end: 13 }],
5051
},
51-
]
52+
] satisfies Coverage[]
5253
expect(filter_coverage(entries)).toEqual(entries)
5354
})
55+
56+
test('filters out extension-less JS', () => {
57+
let entries = [
58+
{
59+
url: 'http://example.com',
60+
text: 'var a = 10; console.log(a);',
61+
ranges: [{ start: 0, end: 29 }],
62+
},
63+
] satisfies Coverage[]
64+
expect(filter_coverage(entries)).toEqual([])
65+
})

src/lib/filter-entries.ts

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,26 @@ function is_html(text: string): boolean {
66
return /<\/?(html|body|head|div|span|script|style)/i.test(text)
77
}
88

9+
// Matches: element selectors, class/id selectors, attribute selectors, @rules
10+
const SELECTOR_REGEX = /(@[a-z-]+|\[[^\]]+\]|[a-zA-Z_#.-][a-zA-Z0-9_-]*)\s*\{/
11+
// Check for CSS properties (property: value pattern)
12+
const DECLARATION_REGEX = /^\s*[a-zA-Z-]+\s*:\s*.+;?\s*$/m
13+
14+
function is_css_like(text: string): boolean {
15+
return SELECTOR_REGEX.test(text) || DECLARATION_REGEX.test(text)
16+
}
17+
18+
function is_js_like(text: string): boolean {
19+
try {
20+
// Only parses the input, does not execute it.
21+
// NEVER EXECUTE THIS UNTRUSTED CODE!!!
22+
new Function(text)
23+
return true
24+
} catch {
25+
return false
26+
}
27+
}
28+
929
export function filter_coverage(coverage: Coverage[]): Coverage[] {
1030
let result = []
1131

@@ -29,13 +49,13 @@ export function filter_coverage(coverage: Coverage[]): Coverage[] {
2949
continue
3050
}
3151

32-
// At this point it can only be CSS
33-
// TODO: that's not true, check if it's css-like of js-like
34-
result.push({
35-
url: entry.url,
36-
text: entry.text,
37-
ranges: entry.ranges,
38-
})
52+
if (is_css_like(entry.text) && !is_js_like(entry.text)) {
53+
result.push({
54+
url: entry.url,
55+
text: entry.text,
56+
ranges: entry.ranges,
57+
})
58+
}
3959
}
4060

4161
return result

src/lib/html-parser.test.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,16 @@ test('finds style tags with attributes', () => {
3636
expect(parse('<style data-attr data-testid="yup">.css{}</style>')).toEqual([{ textContent: '.css{}' }])
3737
})
3838

39-
test('ignores style tags without end tag', () => {
40-
expect(parse('<style>.css{}')).toEqual([])
41-
})
42-
43-
test('ignores style tags without closing opening tag', () => {
44-
expect(parse('<style .css{}')).toEqual([])
39+
test.describe('invalid tags', () => {
40+
test('ignores style tags without end tag', () => {
41+
expect(parse('<style>.css{}')).toEqual([])
42+
})
43+
44+
test('ignores style tags without closing opening tag', () => {
45+
expect(parse('<style .css{}')).toEqual([])
46+
})
47+
48+
test('custom element: <style-thing>', () => {
49+
expect(parse('<style-thing>.css{}</style-thing>')).toEqual([])
50+
})
4551
})

0 commit comments

Comments
 (0)