monocart-coverage-reports 2.11.0 → 2.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,14 +5,14 @@ const { ZipFile } = require('../packages/monocart-coverage-vendor.js');
5
5
  const { mergeIstanbulDataList } = require('../istanbul/istanbul.js');
6
6
  const { mergeV8DataList } = require('../v8/v8.js');
7
7
 
8
- const getMergedData = (type, dataList) => {
8
+ const getMergedData = (type, dataList, options) => {
9
9
  if (type === 'istanbul') {
10
- return mergeIstanbulDataList(dataList);
10
+ return mergeIstanbulDataList(dataList, options);
11
11
  }
12
- return mergeV8DataList(dataList);
12
+ return mergeV8DataList(dataList, options);
13
13
  };
14
14
 
15
- const mergeReport = async (rawDir, rawParent) => {
15
+ const mergeReport = async (rawDir, options) => {
16
16
  const coverageFiles = fs.readdirSync(rawDir).filter((n) => n.endsWith('.json') && n.startsWith('coverage-'));
17
17
  // console.log(coverageFiles);
18
18
 
@@ -29,7 +29,7 @@ const mergeReport = async (rawDir, rawParent) => {
29
29
  Util.rmSync(jsonPath);
30
30
  }
31
31
 
32
- const mergedData = await getMergedData(type, dataList);
32
+ const mergedData = await getMergedData(type, dataList, options);
33
33
 
34
34
  const dataId = Util.uid();
35
35
  const results = {
@@ -99,7 +99,7 @@ const rawReport = async (reportData, reportOptions, options) => {
99
99
 
100
100
  // merge
101
101
  if (rawOptions.merge) {
102
- await mergeReport(rawDir, rawParent);
102
+ await mergeReport(rawDir, options);
103
103
  }
104
104
 
105
105
  // zip
@@ -0,0 +1,9 @@
1
+ const v8 = require('node:v8');
2
+ const vm = require('node:vm');
3
+
4
+ if (typeof global.gc !== 'function') {
5
+ v8.setFlagsFromString('--expose_gc');
6
+ global.gc = vm.runInNewContext('gc');
7
+ }
8
+
9
+ module.exports = global.gc;
package/lib/utils/util.js CHANGED
@@ -3,6 +3,7 @@ const { writeFile, readFile } = require('fs/promises');
3
3
  const path = require('path');
4
4
  const os = require('os');
5
5
  const crypto = require('crypto');
6
+
6
7
  const EC = require('eight-colors');
7
8
  const CG = require('console-grid');
8
9
  const acornWalk = require('acorn-walk');
@@ -12,6 +13,7 @@ const request = require('./request.js');
12
13
  const version = require('../../package.json').version;
13
14
  const markdownGrid = require('./markdown.js');
14
15
  const { mergeV8Coverage } = require('./merge/merge.js');
16
+ const gc = require('./gc.js');
15
17
 
16
18
  const {
17
19
  findUpSync, supportsColor, minimatch
@@ -37,6 +39,10 @@ const Util = {
37
39
  markdownGrid,
38
40
  mergeV8Coverage,
39
41
 
42
+ forceGC: () => {
43
+ gc();
44
+ },
45
+
40
46
  relativePath: function(p, root) {
41
47
  p = `${p}`;
42
48
  root = `${root || Util.root}`;
@@ -863,8 +869,28 @@ const Util = {
863
869
  console.log(`[MCR] ${message} before ${lengthBefore} => after ${lengthAfter}`);
864
870
  },
865
871
 
872
+ setGC: (threshold) => {
873
+ if (!Util.isNum(threshold)) {
874
+ threshold = 1024;
875
+ }
876
+ Util.gcThreshold = threshold;
877
+ },
878
+
879
+ getMemory: () => {
880
+ const { heapUsed } = process.memoryUsage();
881
+ const memory = parseFloat((heapUsed / 1024 ** 2).toFixed(1));
882
+ return memory;
883
+ },
884
+
866
885
  // time is debug level, fix the log info, for checking snapshot
867
886
  logTime: (message, time_start) => {
887
+
888
+ // memory gc
889
+ let memory = Util.getMemory();
890
+ if (Util.gcThreshold && Util.gcThreshold < memory) {
891
+ Util.forceGC();
892
+ }
893
+
868
894
  if (Util.loggingLevel < Util.loggingLevels.debug && !process.env.MCR_LOG_TIME) {
869
895
  return;
870
896
  }
@@ -872,9 +898,7 @@ const Util = {
872
898
  const durationH = Util.TF(duration);
873
899
  const ls = [`[MCR] ${message}`];
874
900
 
875
- // memory
876
- const { heapUsed } = process.memoryUsage();
877
- const memory = parseFloat((heapUsed / 1024 ** 2).toFixed(1));
901
+ memory = Util.getMemory();
878
902
  ls.push(` (memory: ${memory}MB)`);
879
903
 
880
904
  // time
package/lib/v8/v8.js CHANGED
@@ -164,7 +164,7 @@ const mergeCssRanges = (itemList) => {
164
164
  // ranges: [ {start, end} ]
165
165
  const ranges = dedupeFlatRanges(concatRanges);
166
166
 
167
- resolve(ranges || []);
167
+ resolve(ranges);
168
168
  });
169
169
  };
170
170
 
@@ -173,14 +173,19 @@ const mergeJsFunctions = async (itemList) => {
173
173
  return res.functions;
174
174
  };
175
175
 
176
- const mergeV8DataList = async (dataList) => {
177
- let allList = [];
178
- dataList.forEach((d) => {
179
- allList = allList.concat(d.data);
180
- });
176
+ const mergeV8DataList = async (dataList, options) => {
177
+ const allList = dataList.map((d) => d.data).flat();
181
178
 
182
- // remove empty items
183
- const coverageList = allList.filter((it) => !it.empty);
179
+ // separate coverage and empty items
180
+ const coverageList = [];
181
+ const allEmptyList = [];
182
+ allList.forEach((it) => {
183
+ if (it.empty) {
184
+ allEmptyList.push(it);
185
+ } else {
186
+ coverageList.push(it);
187
+ }
188
+ });
184
189
 
185
190
  // connect all functions and ranges
186
191
  const itemMap = {};
@@ -215,7 +220,7 @@ const mergeV8DataList = async (dataList) => {
215
220
 
216
221
  // first time filter for empty, (not for sources)
217
222
  // empty and not in item map
218
- const emptyList = allList.filter((it) => it.empty).filter((it) => {
223
+ const emptyList = allEmptyList.filter((it) => {
219
224
  if (itemMap[it.id]) {
220
225
  return false;
221
226
  }
@@ -225,16 +230,15 @@ const mergeV8DataList = async (dataList) => {
225
230
  return true;
226
231
  });
227
232
 
228
- // empty list + merged list
229
- const mergedList = emptyList.concat(Object.values(itemMap));
230
-
233
+ // merged list + empty list
234
+ const mergedList = Object.values(itemMap).concat(emptyList);
231
235
 
232
236
  return mergedList;
233
237
  };
234
238
 
235
239
  const mergeV8Coverage = async (dataList, sourceCache, options) => {
236
240
 
237
- const mergedList = await mergeV8DataList(dataList);
241
+ const mergedList = await mergeV8DataList(dataList, options);
238
242
 
239
243
  // try to load coverage and source by id
240
244
  for (const entry of mergedList) {
@@ -254,6 +258,9 @@ const mergeV8Coverage = async (dataList, sourceCache, options) => {
254
258
 
255
259
  }
256
260
 
261
+ // GC
262
+ sourceCache.clear();
263
+
257
264
  return mergedList;
258
265
  };
259
266
 
@@ -301,7 +308,7 @@ const saveV8Report = async (v8list, options, istanbulReportPath) => {
301
308
  } else {
302
309
  outputs[reportName] = await customReport(reportName, reportData, reportOptions, options);
303
310
  }
304
- Util.logTime(`┌ [generate] saved report: ${reportName}`, t1);
311
+ Util.logTime(`${EC.magenta('├')} [generate] saved report: ${reportName}`, t1);
305
312
  }
306
313
  }
307
314
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monocart-coverage-reports",
3
- "version": "2.11.0",
3
+ "version": "2.11.2",
4
4
  "description": "A code coverage tool to generate native V8 reports or Istanbul reports.",
5
5
  "main": "./lib/index.js",
6
6
  "bin": {
@@ -59,7 +59,7 @@
59
59
  "dev": "npx sf d app",
60
60
  "open": "node ./scripts/open.js",
61
61
  "eol": "git rm -rf --cached . && git reset --hard HEAD",
62
- "patch": "npm version patch && npm run build && npm run test && npm publish",
62
+ "patch": "npm run build && npm run test && npx sf publish patch -r",
63
63
  "beta": "npm version prerelease --preid=beta && npm run build && npm run test && npm publish --tag beta"
64
64
  },
65
65
  "workspaces": [
@@ -75,7 +75,7 @@
75
75
  "url": "git+https://github.com/cenfun/monocart-coverage-reports.git"
76
76
  },
77
77
  "dependencies": {
78
- "acorn": "^8.12.1",
78
+ "acorn": "^8.14.0",
79
79
  "acorn-loose": "^8.4.0",
80
80
  "acorn-walk": "^8.3.4",
81
81
  "commander": "^12.1.0",
@@ -95,10 +95,10 @@
95
95
  "convert-source-map": "^2.0.0",
96
96
  "diff-sequences": "^29.6.3",
97
97
  "esbuild": "^0.24.0",
98
- "eslint": "~9.11.1",
98
+ "eslint": "~9.14.0",
99
99
  "eslint-config-plus": "^2.0.2",
100
100
  "eslint-plugin-html": "^8.1.2",
101
- "eslint-plugin-vue": "^9.28.0",
101
+ "eslint-plugin-vue": "^9.30.0",
102
102
  "find-up": "^7.0.0",
103
103
  "minimatch": "^9.0.5",
104
104
  "monocart-code-viewer": "^1.1.4",
@@ -106,13 +106,13 @@
106
106
  "node-stream-zip": "^1.15.0",
107
107
  "postcss": "^8.4.47",
108
108
  "starfall-cli": "^2.0.20",
109
- "stylelint": "^16.9.0",
109
+ "stylelint": "^16.10.0",
110
110
  "stylelint-config-plus": "^1.1.3",
111
111
  "supports-color": "^9.4.0",
112
- "tsx": "^4.19.1",
112
+ "tsx": "^4.19.2",
113
113
  "turbogrid": "^3.2.0",
114
114
  "vine-ui": "^3.1.16",
115
115
  "ws": "^8.18.0",
116
- "yazl": "^2.5.1"
116
+ "yazl": "^3.2.1"
117
117
  }
118
118
  }