monocart-coverage-reports
Version:
A code coverage tool to generate native V8 reports or Istanbul reports.
124 lines (92 loc) • 2.67 kB
JavaScript
/**
* The ranges are first ordered by ascending `startOffset` and then by descending `endOffset`.
* This corresponds to a pre-order tree traversal.
*/
const sortRanges = (ranges) => {
ranges.sort((a, b) => {
if (a.start === b.start) {
return b.end - a.end;
}
return a.start - b.start;
});
};
const filterRanges = (ranges) => {
// remove start = end
return ranges.filter((range) => range.start < range.end);
};
// apply directly to css ranges
const dedupeFlatRanges = (ranges) => {
ranges = filterRanges(ranges);
if (ranges.length < 2) {
return ranges;
}
sortRanges(ranges);
ranges.reduce((prevRange, range) => {
// same start
if (range.start === prevRange.start) {
range.dedupe = true;
// equal prev
if (range.end === prevRange.end) {
return prevRange;
}
// less than prev end after new sort
return prevRange;
}
// already in the range
if (range.end <= prevRange.end) {
range.dedupe = true;
return prevRange;
}
// collected, update the end
if (range.start <= prevRange.end) {
range.dedupe = true;
prevRange.end = range.end;
return prevRange;
}
return range;
});
ranges = ranges.filter((it) => !it.dedupe);
return ranges;
};
const mergeRangesWith = (ranges, comparer, handler) => {
// ranges format
// { start: 0, end: 6, ... }
ranges = filterRanges(ranges);
if (ranges.length < 2) {
return ranges;
}
sortRanges(ranges);
let hasDedupe = false;
// merge count for same range
ranges.reduce((lastRange, range) => {
if (comparer(lastRange, range)) {
range.dedupe = true;
handler(lastRange, range);
hasDedupe = true;
return lastRange;
}
return range;
});
if (hasDedupe) {
// console.log(ranges);
ranges = ranges.filter((it) => !it.dedupe);
}
// console.log('ranges length after', ranges.length);
return ranges;
};
// apply to js count ranges
const dedupeCountRanges = (ranges) => {
const comparer = (lastRange, range) => {
return lastRange.start === range.start && lastRange.end === range.end;
};
const handler = (lastRange, range) => {
lastRange.count += range.count;
};
return mergeRangesWith(ranges, comparer, handler);
};
module.exports = {
sortRanges,
dedupeFlatRanges,
mergeRangesWith,
dedupeCountRanges
};