Skip to content

Instantly share code, notes, and snippets.

@jmfrancois
Created March 14, 2024 08:25
Show Gist options
  • Save jmfrancois/9b9d59ed57e8a6269683b1e8a99f83a2 to your computer and use it in GitHub Desktop.
Save jmfrancois/9b9d59ed57e8a6269683b1e8a99f83a2 to your computer and use it in GitHub Desktop.
ts-node utilities for frontend
#!/usr/bin/env ts-node
import * as fs from 'fs'
import * as path from 'path'
import * as glob from 'glob'
const CWD = process.cwd()
// describe coverage-final.json file
type Statement = {
start: {
line: number
column: number
}
end: {
line: number
column: number
}
}
type FnMap = {
name: string
decl: Statement
line: number
}
type BranchMap = {
loc: Statement
line: number
type: string
locations: Statement[]
}
type CoverageFile = {
path: string
statementMap: Record<string, Statement>
fnMap: Record<string, FnMap>
branchMap: Record<string, BranchMap>
s: Record<string, number>
f: Record<string, number>
b: Record<string, number>
_coverageSchema: string
hash: string
}
type CoverageFinal = Record<string, CoverageFile>
function mergeAllReportInTheMonoRepo(): CoverageFinal {
// do not take root coverage files
const coveragePattern = path.join(__dirname, '..', '*', '*', 'coverage', 'coverage-final.json')
const coverageFiles = glob.sync(coveragePattern, {
ignore: ['**/node_modules/**'],
})
const coverages: CoverageFinal[] = []
coverageFiles.forEach(function (file) {
const coverage = JSON.parse(fs.readFileSync(file, 'utf8')) as CoverageFinal
coverages.push(coverage)
})
return coverages.reduce(function (acc, coverage) {
Object.keys(coverage).forEach(function (key) {
if (acc[key]) {
console.log(`Key ${key} already exists in the merged report`)
process.exit(1)
}
acc[key] = coverage[key]
})
return acc
}, {} as CoverageFinal)
}
/**
* "statementMap": { "0": { "start": { "line": 1, "column": 0 }, "end": { "line": 70, "column": 1 } } },
* "s" show how many times each statement has been executed. If the value is 0, it means that the statement has never been executed; a value of 1 or more means that the statement has been executed at least once.
* To compute the coverage percentage, we use this formula: (total number of executed statements / total number of statements) * 100.
*/
function logCoverage(mergedReport: CoverageFinal) {
const coverages = Object.keys(mergedReport).map((key) => {
const report = mergedReport[key]
const totalStatements = Object.keys(report.s).length
const executedStatements = Object.values(report.s).filter((value) => value > 0).length
const coverage = (executedStatements / totalStatements) * 100
if (isNaN(coverage)) {
console.error('Coverage is NaN on', key)
return 0
}
return coverage
})
const average =
coverages.reduce((acc, value) => {
if (isNaN(value)) {
return acc
}
return acc + value
}, 0) / coverages.length
console.log(`MonoRepo All files | ${average}%`)
}
const ALL_REPORTS = mergeAllReportInTheMonoRepo()
logCoverage(ALL_REPORTS)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment