fintory/flow-cov

View on GitHub
lib/collectFlowCoverage.js

Summary

Maintainability
A
0 mins
Test Coverage
const flow = require('flow-bin')
const ProgressBar = require('progress')
const Promise = require('bluebird')
const { execFileSync } = require('child_process')
const { genCheckFlowStatus } = require('flow-annotation-check')

let bar

const handleFile = async (config, filePath) => {
  try {
    const { flowArgs = [] } = config
    const cov = execFileSync(flow, ['coverage', filePath, '--json', ...flowArgs], {
      env: process.env,
    }).toString()
    const file = filePath.replace(`${process.cwd()}`, '.')
    const { expressions } = JSON.parse(cov)
    const locs = expressions.uncovered_count + expressions.covered_count
    const coveragePercentage = (expressions.covered_count / locs) * 100
    const status = await genCheckFlowStatus(flow, filePath)
    const satisfied = locs === 0 || coveragePercentage >= config.threshold

    if (bar && !process.env.SILENT) bar.tick()

    return {
      file,
      status,
      satisfied,
      locs,
      annotated: status.indexOf('no') === 0,
      coverage: locs === 0 ? 100 : coveragePercentage,
      ...expressions,
    }
  } catch (err) {
    throw err
  }
}

module.exports = async function collectFlowCoverage(config, files) {
  if (!process.env.SILENT) {
    bar = new ProgressBar(':current/:total [:bar]', { total: files.length, clear: true })
  }

  return Promise.map(files, file => handleFile(config, file), {
    concurrency: config.concurrency,
  })
}