1
1
import { normalize } from 'pathe' ;
2
2
import { glob , isDynamicPattern } from 'tinyglobby' ;
3
- import type { TestFileResult } from '../types' ;
3
+ import type { RstestContext , TestFileResult } from '../types' ;
4
4
import type {
5
5
CoverageMap ,
6
6
CoverageOptions ,
@@ -45,11 +45,15 @@ const getIncludedFiles = async (
45
45
} ;
46
46
47
47
export async function generateCoverage (
48
- coverage : CoverageOptions ,
49
- rootPath : string ,
48
+ context : RstestContext ,
50
49
results : TestFileResult [ ] ,
51
50
coverageProvider : CoverageProvider ,
52
51
) : Promise < void > {
52
+ const {
53
+ rootPath,
54
+ normalizedConfig : { coverage } ,
55
+ projects,
56
+ } = context ;
53
57
try {
54
58
const finalCoverageMap = coverageProvider . createCoverageMap ( ) ;
55
59
@@ -61,24 +65,46 @@ export async function generateCoverage(
61
65
}
62
66
63
67
if ( coverage . include ?. length ) {
64
- const allFiles = await getIncludedFiles ( coverage , rootPath ) ;
68
+ const coveredFiles = finalCoverageMap . files ( ) ;
65
69
66
- // should be better to filter files before swc coverage is processed
67
- finalCoverageMap . filter ( ( file ) => allFiles . includes ( normalize ( file ) ) ) ;
70
+ let isTimeout = false ;
68
71
69
- const coveredFiles = finalCoverageMap . files ( ) ;
72
+ const timeoutId = setTimeout ( ( ) => {
73
+ isTimeout = true ;
74
+ logger . info ( 'Generating coverage for untested files...' ) ;
75
+ } , 1000 ) ;
76
+
77
+ const allFiles = (
78
+ await Promise . all (
79
+ projects . map ( async ( p ) => {
80
+ const includedFiles = await getIncludedFiles ( coverage , p . rootPath ) ;
81
+
82
+ const uncoveredFiles = includedFiles . filter (
83
+ ( file ) => ! coveredFiles . includes ( normalize ( file ) ) ,
84
+ ) ;
70
85
71
- const uncoveredFiles = allFiles . filter (
72
- ( file ) => ! coveredFiles . includes ( normalize ( file ) ) ,
73
- ) ;
86
+ if ( uncoveredFiles . length ) {
87
+ await generateCoverageForUntestedFiles (
88
+ p . environmentName ,
89
+ uncoveredFiles ,
90
+ finalCoverageMap ,
91
+ coverageProvider ,
92
+ ) ;
93
+ }
74
94
75
- if ( uncoveredFiles . length ) {
76
- await generateCoverageForUntestedFiles (
77
- uncoveredFiles ,
78
- finalCoverageMap ,
79
- coverageProvider ,
80
- ) ;
95
+ return includedFiles ;
96
+ } ) ,
97
+ )
98
+ ) . flat ( ) ;
99
+
100
+ clearTimeout ( timeoutId ) ;
101
+
102
+ if ( isTimeout ) {
103
+ logger . info ( 'Coverage for untested files generated.' ) ;
81
104
}
105
+
106
+ // should be better to filter files before swc coverage is processed
107
+ finalCoverageMap . filter ( ( file ) => allFiles . includes ( normalize ( file ) ) ) ;
82
108
}
83
109
84
110
// Generate coverage reports
@@ -104,21 +130,22 @@ export async function generateCoverage(
104
130
}
105
131
106
132
async function generateCoverageForUntestedFiles (
133
+ environmentName : string ,
107
134
uncoveredFiles : string [ ] ,
108
135
coverageMap : CoverageMap ,
109
136
coverageProvider : CoverageProvider ,
110
137
) : Promise < void > {
111
- logger . debug ( 'Generating coverage for untested files...' ) ;
112
-
113
138
if ( ! coverageProvider . generateCoverageForUntestedFiles ) {
114
139
logger . warn (
115
140
'Current coverage provider does not support generating coverage for untested files.' ,
116
141
) ;
117
142
return ;
118
143
}
119
144
120
- const coverages =
121
- await coverageProvider . generateCoverageForUntestedFiles ( uncoveredFiles ) ;
145
+ const coverages = await coverageProvider . generateCoverageForUntestedFiles ( {
146
+ environmentName,
147
+ files : uncoveredFiles ,
148
+ } ) ;
122
149
123
150
coverages . forEach ( ( coverageData ) => {
124
151
coverageMap . addFileCoverage ( coverageData ) ;
0 commit comments