1 | 'use strict'
|
2 |
|
3 | const { join } = require('path')
|
4 | const { writeFile } = require('fs').promises
|
5 | const { generateCoverageReport } = require('./coverage')
|
6 | const { filename, allocPromise } = require('./tools')
|
7 | const { fork } = require('child_process')
|
8 | const { getOutput } = require('./output')
|
9 |
|
10 | async 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 |
|
19 | async function save (job) {
|
20 | await serialize(job, 'job', job)
|
21 | }
|
22 |
|
23 | function 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 |
|
31 | module.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 | }
|