UNPKG

1.99 kBJavaScriptView Raw
1const glob = require('glob');
2const isRenderer = require('is-electron-renderer');
3const {
4 readFileSync
5} = require('fs');
6const {
7 assign,
8 each,
9 forIn,
10 isArray
11} = require('macaca-utils');
12const {
13 Reporter,
14 Instrumenter,
15 Collector,
16 hook
17} = require('@antv/istanbul');
18
19class Coverage {
20 constructor(root, pattern) {
21 const me = this;
22 assign(me, {
23 root,
24 pattern,
25 instrumenter: new Instrumenter()
26 });
27 me.transformer = me.instrumenter.instrumentSync.bind(me.instrumenter);
28 me.matched = me._match();
29 if (isRenderer) {
30 me.cov = window.__coverage__ = {};
31 } else {
32 me.cov = global.__coverage__ = {};
33 }
34 hook.hookRequire(me.matched, me.transformer, {});
35 }
36
37
38 _match() {
39 const me = this;
40 const root = me.root;
41 const pattern = me.pattern;
42 const map = {};
43 const fn = function(file) {
44 return map[file];
45 };
46 if (typeof pattern === 'string') {
47 fn.files = glob.sync(pattern, {
48 root,
49 realpath: true
50 });
51 } else if (isArray(pattern)) {
52 fn.files = [];
53 each(pattern, p => {
54 const files = glob.sync(p, {
55 root,
56 realpath: true
57 });
58 fn.files = fn.files.concat(files);
59 });
60 }
61 each(fn.files, file => {
62 map[file] = true;
63 });
64 return fn;
65 }
66
67 report(/* done */) {
68 const me = this;
69 const files = me.matched.files;
70 const cov = me.cov;
71 const instrumenter = me.instrumenter;
72 each(files, file => {
73 if (!cov[file]) {
74 me.transformer(readFileSync(file, 'utf-8'), file);
75 forIn(instrumenter.coverState.s, (value, key) => {
76 instrumenter.coverState.s[key] = 0;
77 });
78 cov[file] = instrumenter.coverState;
79 }
80 });
81
82 const collector = new Collector();
83 collector.add(cov);
84 const reporter = new Reporter();
85 reporter.addAll([ 'lcov' ]);
86 reporter.write(collector, true, () => {});
87 }
88}
89
90module.exports = Coverage;