UNPKG

1.89 kBJavaScriptView Raw
1'use strict'
2
3const { join } = require('path')
4const { writeFile } = require('fs').promises
5const { generateCoverageReport } = require('./coverage')
6const { filename, allocPromise } = require('./tools')
7const { fork } = require('child_process')
8const { getOutput } = require('./output')
9
10async function serialize (job, filename, json) {
11 await writeFile(join(job.reportDir, `${filename}.js`), `module.exports = ${JSON.stringify(json, (key, value) => {
12 if (value && value instanceof RegExp) {
13 return value.toString()
14 }
15 return value
16 }, 2)}`)
17}
18
19async function save (job) {
20 await serialize(job, 'job', job)
21}
22
23function generateTextReport (job) {
24 const { promise, resolve } = allocPromise()
25 const childProcess = fork(join(__dirname, 'defaults/text-report.js'), [job.reportDir, process.stdout.columns || ''], { stdio: 'pipe' })
26 getOutput(job).monitor(childProcess, true)
27 childProcess.on('close', resolve)
28 return promise
29}
30
31module.exports = {
32 save,
33
34 async generate (job) {
35 const output = getOutput(job)
36 job.end = new Date()
37 job.failed = !!job.failed
38 job.status = 'Generating reports'
39 job.testPageHashes = job.testPageUrls.map(url => filename(url))
40 await save(job)
41 await generateTextReport(job)
42 const promises = job.reportGenerator.map(generator => {
43 const { promise, resolve } = allocPromise()
44 const childProcess = fork(generator, [job.reportDir], { stdio: 'pipe' })
45 const buffers = output.monitor(childProcess, false)
46 childProcess.on('close', exitCode => {
47 if (exitCode !== 0) {
48 output.reportGeneratorFailed(generator, exitCode, buffers)
49 }
50 resolve()
51 })
52 return promise
53 })
54 promises.push(generateCoverageReport(job).catch(e => {
55 output.genericError(e)
56 job.failed = true
57 }))
58 await Promise.all(promises)
59 job.status = 'Done'
60 }
61}