1 | const glob = require('glob');
|
2 | const isRenderer = require('is-electron-renderer');
|
3 | const {
|
4 | readFileSync
|
5 | } = require('fs');
|
6 | const {
|
7 | assign,
|
8 | each,
|
9 | forIn,
|
10 | isArray
|
11 | } = require('macaca-utils');
|
12 | const {
|
13 | Reporter,
|
14 | Instrumenter,
|
15 | Collector,
|
16 | hook
|
17 | } = require('@antv/istanbul');
|
18 |
|
19 | class 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() {
|
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 |
|
90 | module.exports = Coverage;
|