@@ -2,7 +2,7 @@ import { existsSync, readFile } from "fs";
22import { Coverage , CoverageCollection } from "./coverage-info" ;
33
44type MetricsMap = {
5- [ key : string ] : ( item : Coverage , args : string ) => void ;
5+ [ key : string ] : ( item : Coverage , value : string ) => void ;
66} ;
77
88/**
@@ -34,41 +34,43 @@ function createCoverageItem(): Coverage {
3434 * @description This object maps lcov metrics to a handler function.
3535 */
3636const 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 ;
4839 } ,
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 ;
5942 } ,
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 } ) ;
7274 } ,
7375} ;
7476
@@ -78,25 +80,32 @@ const metricsMap: MetricsMap = {
7880 * @returns A CoverageCollection
7981 */
8082function parseFile ( str : string ) : CoverageCollection {
81- let data : CoverageCollection = [ ] ;
82- let item : Coverage = createCoverageItem ( ) ;
83+ const data : CoverageCollection = [ ] ;
8384 const lines = str . split ( "\n" ) ;
85+ let item = createCoverageItem ( ) ;
8486
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 ( ":" ) ;
9092
91- if ( item && metrics ) {
93+ if ( metrics ) {
9294 const handler = metricsMap [ metrics . toUpperCase ( ) ] ;
9395 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+ }
95102 }
96103 }
97104
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+ }
100109 item = createCoverageItem ( ) ;
101110 }
102111 }
0 commit comments