@@ -218,58 +218,77 @@ var CoverageReporter = function (rootConfig, helper, logger, emitter) {
218218 coverageMap . merge ( result . coverage )
219219 }
220220
221- this . onRunComplete = async function ( browsers , results ) {
222- const checkedCoverage = { }
223-
224- for ( const reporterConfig of reporters ) {
225- await Promise . all ( browsers . map ( async ( browser ) => {
226- const coverageMap = coverageMaps [ browser . id ]
227- if ( ! coverageMap ) {
228- return
229- }
221+ let checkedCoverage = { }
222+ let promiseComplete = null
223+
224+ this . executeReport = async function ( reporterConfig , browser ) {
225+ const results = { exitCode : 0 }
226+ const coverageMap = coverageMaps [ browser . id ]
227+ if ( ! coverageMap ) {
228+ return
229+ }
230230
231- const mainDir = reporterConfig . dir || config . dir
232- const subDir = reporterConfig . subdir || config . subdir
233- const outputPath = generateOutputPath ( basePath , browser . name , mainDir , subDir )
234- const remappedCoverageMap = await sourceMapStore . transformCoverage ( coverageMap )
235-
236- const options = helper . merge ( config , reporterConfig , {
237- dir : outputPath ,
238- subdir : '' ,
239- browser : browser ,
240- emitter : emitter ,
241- coverageMap : remappedCoverageMap
242- } )
243-
244- // If config.check is defined, check coverage levels for each browser
245- if ( hasOwnProperty . call ( config , 'check' ) && ! checkedCoverage [ browser . id ] ) {
246- checkedCoverage [ browser . id ] = true
247- var coverageFailed = checkCoverage ( browser , remappedCoverageMap )
248- if ( coverageFailed && results ) {
249- results . exitCode = 1
250- }
251- }
231+ const mainDir = reporterConfig . dir || config . dir
232+ const subDir = reporterConfig . subdir || config . subdir
233+ const outputPath = generateOutputPath ( basePath , browser . name , mainDir , subDir )
234+ const remappedCoverageMap = await sourceMapStore . transformCoverage ( coverageMap )
235+
236+ const options = helper . merge ( config , reporterConfig , {
237+ dir : outputPath ,
238+ subdir : '' ,
239+ browser : browser ,
240+ emitter : emitter ,
241+ coverageMap : remappedCoverageMap
242+ } )
252243
253- const context = istanbulLibReport . createContext ( options )
254- const report = reports . create ( reporterConfig . type || 'html' , options )
244+ // If config.check is defined, check coverage levels for each browser
245+ if ( hasOwnProperty . call ( config , 'check' ) && ! checkedCoverage [ browser . id ] ) {
246+ checkedCoverage [ browser . id ] = true
247+ var coverageFailed = checkCoverage ( browser , remappedCoverageMap )
248+ if ( coverageFailed && results ) {
249+ results . exitCode = 1
250+ }
251+ }
255252
256- // // If reporting to console or in-memory skip directory creation
257- const toDisk = ! reporterConfig . type || ! reporterConfig . type . match ( / ^ ( t e x t | t e x t - s u m m a r y | i n - m e m o r y ) $ / )
253+ const context = istanbulLibReport . createContext ( options )
254+ const report = reports . create ( reporterConfig . type || 'html' , options )
258255
259- if ( ! toDisk && reporterConfig . file === undefined ) {
260- report . execute ( context )
261- return
262- }
256+ // // If reporting to console or in-memory skip directory creation
257+ const toDisk = ! reporterConfig . type || ! reporterConfig . type . match ( / ^ ( t e x t | t e x t - s u m m a r y | i n - m e m o r y ) $ / )
263258
264- helper . mkdirIfNotExists ( outputPath , function ( ) {
265- log . debug ( 'Writing coverage to %s' , outputPath )
266- report . execute ( context )
267- } )
268- } ) )
259+ if ( ! toDisk && reporterConfig . file === undefined ) {
260+ report . execute ( context )
261+ return
269262 }
263+
264+ helper . mkdirIfNotExists ( outputPath , function ( ) {
265+ log . debug ( 'Writing coverage to %s' , outputPath )
266+ report . execute ( context )
267+ } )
268+ return results
270269 }
271270
272- this . onExit = function ( done ) {
271+ this . onRunComplete = function ( browsers ) {
272+ checkedCoverage = { }
273+ let results = { exitCode : 0 }
274+
275+ const promiseCollection = reporters . map ( reporterConfig =>
276+ Promise . all ( browsers . map ( async ( browser ) => {
277+ const res = await this . executeReport ( reporterConfig , browser )
278+ if ( res && res . exitCode === 1 ) {
279+ results = res
280+ }
281+ } ) ) )
282+ promiseComplete = Promise . all ( promiseCollection ) . then ( ( ) => results )
283+ return promiseComplete
284+ }
285+
286+ this . onExit = async function ( done ) {
287+ const results = await promiseComplete
288+ if ( results && results . exitCode === 1 ) {
289+ done ( results . exitCode )
290+ return
291+ }
273292 if ( typeof config . _onExit === 'function' ) {
274293 config . _onExit ( done )
275294 } else {
0 commit comments