generated from actions/typescript-action
-
Notifications
You must be signed in to change notification settings - Fork 10
/
reader.ts
93 lines (83 loc) · 2.34 KB
/
reader.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import * as fs from 'fs'
import * as parser from 'xml2js'
import {
Report,
Counter,
Coverage,
ChangedFile,
ChangedFilesCoverage,
ChangedFileWithCoverage,
CounterType
} from './types.d'
export const parseReport = async (path: string): Promise<Report | null> => {
const reportXml = await fs.promises.readFile(path.trim(), 'utf-8')
return parser.parseStringPromise(reportXml)
}
export const getCoverageFromCounters = (
counters: Counter[],
counterType: CounterType
): Coverage | null => {
const lineCounter = counters.find(
counter => counter['$'].type === counterType
)?.['$']
if (!lineCounter) return null
const missed = parseFloat(lineCounter.missed)
const covered = parseFloat(lineCounter.covered)
return {
missed,
covered,
percentage: parseFloat(((covered / (covered + missed)) * 100).toFixed(2))
}
}
export const getOverallCoverage = (
report: Report,
counterType: CounterType
): Coverage | null => {
if (!report.report?.counter) return null
return getCoverageFromCounters(report.report.counter, counterType)
}
export const getFileCoverage = (
report: Report,
files: ChangedFile[],
counterType: CounterType
): ChangedFilesCoverage => {
const filesWithCoverage = files.reduce<ChangedFileWithCoverage[]>(
(acc, file) => {
report.report?.package?.map(item => {
const packageName = item['$'].name
const sourceFile = item.sourcefile.find(sf => {
const sourceFileName = sf['$'].name
return file.filePath.endsWith(`${packageName}/${sourceFileName}`)
})
if (sourceFile?.counter) {
const coverage = getCoverageFromCounters(
sourceFile.counter,
counterType
)
if (coverage) acc.push({...file, ...coverage})
}
})
return acc
},
[]
)
return {
files: filesWithCoverage,
percentage: getTotalPercentage(filesWithCoverage) ?? 100
}
}
export const getTotalPercentage = (
files: ChangedFileWithCoverage[]
): number | null => {
if (files.length === 0) return null
const result = files.reduce<{missed: number; covered: number}>(
(acc, file) => ({
missed: acc.missed + file.missed,
covered: acc.covered + file.covered
}),
{missed: 0, covered: 0}
)
return parseFloat(
((result.covered / (result.covered + result.missed)) * 100).toFixed(2)
)
}