-
Notifications
You must be signed in to change notification settings - Fork 311
/
Coverage.ts
89 lines (72 loc) · 2.28 KB
/
Coverage.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
import {
CoverageMap,
CoverageMapData,
createCoverageMap
} from 'istanbul-lib-coverage';
import { createContext, summarizers, Watermarks } from 'istanbul-lib-report';
import { create, ReportType } from 'istanbul-reports';
import Reporter, { createEventHandler, ReporterProperties } from './Reporter';
import Node, { NodeEvents } from '../executors/Node';
export { ReportType };
const eventHandler = createEventHandler<NodeEvents>();
export default abstract class Coverage extends Reporter
implements CoverageProperties {
abstract readonly reportType: ReportType;
readonly executor!: Node;
filename?: string;
directory?: string;
watermarks?: Watermarks;
constructor(executor: Node, options: CoverageOptions = {}) {
super(executor, options);
if (options.filename) {
this.filename = options.filename;
}
if (options.directory) {
this.directory = options.directory;
}
if (options.watermarks) {
this.watermarks = options.watermarks;
}
}
getReporterOptions(): { [key: string]: any } {
return {
file: this.filename
};
}
createCoverageReport(type: ReportType, data: CoverageMapData | CoverageMap) {
let map: CoverageMap;
if (isCoverageMap(data)) {
map = data;
} else {
map = createCoverageMap(data);
}
const transformed = this.executor.sourceMapStore.transformCoverage(map);
const context = createContext({
dir: this.directory,
sourceFinder: transformed.sourceFinder,
watermarks: this.watermarks
});
const tree = summarizers.pkg(transformed.map);
const report = create(type, this.getReporterOptions());
tree.visit(report, context);
}
@eventHandler()
runEnd(): void {
const map = this.executor.coverageMap;
if (map.files().length > 0) {
this.createCoverageReport(this.reportType, map);
}
}
}
export interface CoverageProperties extends ReporterProperties {
/** A filename to write coverage data to */
filename?: string;
/** A direcotry to write coverage data to */
directory?: string;
/** Watermarks used to check coverage */
watermarks?: Watermarks;
}
export type CoverageOptions = Partial<CoverageProperties>;
function isCoverageMap(value: any): value is CoverageMap {
return value != null && typeof value.files === 'function';
}