@@ -2,7 +2,7 @@ import { existsSync, readFile } from "fs";
2
2
import { Coverage , CoverageCollection } from "./coverage-info" ;
3
3
4
4
type MetricsMap = {
5
- [ key : string ] : ( item : Coverage , args : string ) => void ;
5
+ [ key : string ] : ( item : Coverage , value : string ) => void ;
6
6
} ;
7
7
8
8
/**
@@ -34,41 +34,43 @@ function createCoverageItem(): Coverage {
34
34
* @description This object maps lcov metrics to a handler function.
35
35
*/
36
36
const metricsMap : MetricsMap = {
37
- TN : ( item : Coverage , args : string ) => ( item . title = args . trim ( ) ) ,
38
- SF : ( item : Coverage , args : string ) => ( item . file = args . trim ( ) ) ,
39
- LF : ( item : Coverage , args : string ) =>
40
- ( item . lines . found = Number ( args . trim ( ) ) ) ,
41
- LH : ( item : Coverage , args : string ) => ( item . lines . hit = Number ( args . trim ( ) ) ) ,
42
- DA : ( item : Coverage , args : string ) => {
43
- const details = args . split ( "," ) ;
44
- item . lines . details . push ( {
45
- line : Number ( details [ 0 ] ) ,
46
- hit : Number ( details [ 1 ] ) ,
47
- } ) ;
37
+ TN : ( item , val ) => {
38
+ item . title = val ;
48
39
} ,
49
- FNF : ( item : Coverage , args : string ) =>
50
- ( item . functions . found = Number ( args . trim ( ) ) ) ,
51
- FNH : ( item : Coverage , args : string ) =>
52
- ( item . functions . hit = Number ( args . trim ( ) ) ) ,
53
- FNDA : ( item : Coverage , args : string ) => {
54
- const details = args . split ( "," ) ;
55
- item . functions . details . push ( {
56
- line : Number ( details [ 0 ] ) ,
57
- name : details [ 1 ] ,
58
- } ) ;
40
+ SF : ( item , val ) => {
41
+ item . file = val ;
59
42
} ,
60
- BRF : ( item : Coverage , args : string ) =>
61
- ( item . branches . found = Number ( args . trim ( ) ) ) ,
62
- BRH : ( item : Coverage , args : string ) =>
63
- ( item . branches . hit = Number ( args . trim ( ) ) ) ,
64
- BRDA : ( item : Coverage , args : string ) => {
65
- const details = args . split ( "," ) ;
66
- item . branches . details . push ( {
67
- line : Number ( details [ 0 ] ) ,
68
- block : Number ( details [ 1 ] ) ,
69
- branch : Number ( details [ 2 ] ) ,
70
- hit : details [ 3 ] === "-" ? 0 : Number ( details [ 3 ] ) ,
71
- } ) ;
43
+ LF : ( item , val ) => {
44
+ item . lines . found = Number ( val ) ;
45
+ } ,
46
+ LH : ( item , val ) => {
47
+ item . lines . hit = Number ( val ) ;
48
+ } ,
49
+ DA : ( item , val ) => {
50
+ const [ line , hit , ..._ ] = val . split ( "," ) . map ( ( v ) => Number ( v ) ) ;
51
+ item . lines . details . push ( { line, hit } ) ;
52
+ } ,
53
+ FNF : ( item , val ) => {
54
+ item . functions . found = Number ( val ) ;
55
+ } ,
56
+ FNH : ( item , val ) => {
57
+ item . functions . hit = Number ( val ) ;
58
+ } ,
59
+ FNDA : ( item , val ) => {
60
+ const [ line , name , ..._ ] = val . split ( "," ) ;
61
+ item . functions . details . push ( { line : Number ( line ) , name } ) ;
62
+ } ,
63
+ BRF : ( item , val ) => {
64
+ item . branches . found = Number ( val ) ;
65
+ } ,
66
+ BRH : ( item , val ) => {
67
+ item . branches . hit = Number ( val ) ;
68
+ } ,
69
+ BRDA : ( item , val ) => {
70
+ const [ line , block , branch , hit , ..._ ] = val
71
+ . split ( "," )
72
+ . map ( ( v ) => ( v === "-" ? 0 : Number ( v ) ) ) ;
73
+ item . branches . details . push ( { line, block, branch, hit } ) ;
72
74
} ,
73
75
} ;
74
76
@@ -78,25 +80,32 @@ const metricsMap: MetricsMap = {
78
80
* @returns A CoverageCollection
79
81
*/
80
82
function parseFile ( str : string ) : CoverageCollection {
81
- let data : CoverageCollection = [ ] ;
82
- let item : Coverage = createCoverageItem ( ) ;
83
+ const data : CoverageCollection = [ ] ;
83
84
const lines = str . split ( "\n" ) ;
85
+ let item = createCoverageItem ( ) ;
84
86
85
- for ( let line of lines ) {
86
- line = line . trim ( ) ;
87
- const allparts = line . split ( ":" ) ;
88
- const metrics = allparts . shift ( ) ;
89
- const args = allparts . join ( ":" ) ;
87
+ for ( const line of lines ) {
88
+ const trimmedLine = line . trim ( ) ;
89
+ const allParts = trimmedLine . split ( ":" ) ;
90
+ const metrics = allParts [ 0 ] ;
91
+ const args = allParts . slice ( 1 ) . join ( ":" ) ;
90
92
91
- if ( item && metrics ) {
93
+ if ( metrics ) {
92
94
const handler = metricsMap [ metrics . toUpperCase ( ) ] ;
93
95
if ( handler ) {
94
- handler ( item , args ) ;
96
+ try {
97
+ handler ( item , args . trim ( ) ) ;
98
+ } catch ( e ) {
99
+ console . error ( `Error parsing line: ${ line } ` ) ;
100
+ console . error ( e ) ;
101
+ }
95
102
}
96
103
}
97
104
98
- if ( line . indexOf ( "end_of_record" ) > - 1 ) {
99
- item && data . push ( item ) ;
105
+ if ( trimmedLine . includes ( "end_of_record" ) ) {
106
+ if ( item ) {
107
+ data . push ( item ) ;
108
+ }
100
109
item = createCoverageItem ( ) ;
101
110
}
102
111
}
0 commit comments