1
1
import { normalize } from 'pathe' ;
2
- import { glob } from 'tinyglobby' ;
2
+ import { glob , isDynamicPattern } from 'tinyglobby' ;
3
3
import type { TestFileResult } from '../types' ;
4
4
import type {
5
5
CoverageMap ,
@@ -8,6 +8,42 @@ import type {
8
8
} from '../types/coverage' ;
9
9
import { logger } from '../utils' ;
10
10
11
+ const getIncludedFiles = async (
12
+ coverage : CoverageOptions ,
13
+ rootPath : string ,
14
+ ) : Promise < string [ ] > => {
15
+ // fix issue with glob not working correctly when exclude path was not in the cwd
16
+ const ignoredPatterns = coverage . exclude ?. filter (
17
+ ( item ) =>
18
+ isDynamicPattern ( item ) ||
19
+ item . startsWith ( rootPath ) ||
20
+ item . startsWith ( './' ) ,
21
+ ) ;
22
+ const allFiles = await glob ( coverage . include ! , {
23
+ cwd : rootPath ,
24
+ absolute : true ,
25
+ onlyFiles : true ,
26
+ ignore : ignoredPatterns ,
27
+ dot : true ,
28
+ expandDirectories : false ,
29
+ } ) ;
30
+
31
+ // 'a.ts' should match 'src/a.ts'
32
+ if ( ignoredPatterns ?. length !== coverage . exclude ?. length ) {
33
+ const excludes = coverage . exclude ! . filter (
34
+ ( item ) =>
35
+ ! isDynamicPattern ( item ) &&
36
+ ! item . startsWith ( rootPath ) &&
37
+ ! item . startsWith ( './' ) ,
38
+ ) ;
39
+ return allFiles . filter ( ( file ) => {
40
+ return ! excludes . some ( ( exclude ) => file . includes ( exclude ) ) ;
41
+ } ) ;
42
+ }
43
+
44
+ return allFiles ;
45
+ } ;
46
+
11
47
export async function generateCoverage (
12
48
coverage : CoverageOptions ,
13
49
rootPath : string ,
@@ -25,13 +61,7 @@ export async function generateCoverage(
25
61
}
26
62
27
63
if ( coverage . include ?. length ) {
28
- const allFiles = await glob ( coverage . include , {
29
- cwd : rootPath ,
30
- absolute : true ,
31
- ignore : coverage . exclude ,
32
- dot : true ,
33
- expandDirectories : false ,
34
- } ) ;
64
+ const allFiles = await getIncludedFiles ( coverage , rootPath ) ;
35
65
36
66
// should be better to filter files before swc coverage is processed
37
67
finalCoverageMap . filter ( ( file ) => allFiles . includes ( normalize ( file ) ) ) ;
@@ -80,6 +110,13 @@ async function generateCoverageForUntestedFiles(
80
110
) : Promise < void > {
81
111
logger . debug ( 'Generating coverage for untested files...' ) ;
82
112
113
+ if ( ! coverageProvider . generateCoverageForUntestedFiles ) {
114
+ logger . warn (
115
+ 'Current coverage provider does not support generating coverage for untested files.' ,
116
+ ) ;
117
+ return ;
118
+ }
119
+
83
120
const coverages =
84
121
await coverageProvider . generateCoverageForUntestedFiles ( uncoveredFiles ) ;
85
122
0 commit comments