monocart-coverage-reports 2.12.0 → 2.12.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.
- package/README.md +12 -0
- package/README.zh-Hans.md +12 -0
- package/lib/converter/ast.js +4 -0
- package/lib/converter/converter.js +76 -24
- package/lib/converter/find-original-range.js +2 -2
- package/lib/packages/monocart-coverage-assets.js +1 -1
- package/lib/packages/monocart-coverage-vendor.js +12 -12
- package/lib/utils/util.js +7 -1
- package/package.json +117 -117
package/README.md
CHANGED
|
@@ -724,6 +724,18 @@ if (platform === 'linux') {
|
|
|
724
724
|
console.log('hello linux');
|
|
725
725
|
}
|
|
726
726
|
```
|
|
727
|
+
- Compatible with [c8 coverage](https://github.com/bcoe/c8/?tab=readme-ov-file#ignoring-all-lines-until-told) or [nodejs coverage](https://nodejs.org/docs/latest/api/test.html#collecting-code-coverage) syntax
|
|
728
|
+
```js
|
|
729
|
+
/* c8 ignore start */
|
|
730
|
+
function uncovered() {
|
|
731
|
+
}
|
|
732
|
+
/* c8 ignore stop */
|
|
733
|
+
|
|
734
|
+
/* node:coverage disable */
|
|
735
|
+
function uncovered() {
|
|
736
|
+
}
|
|
737
|
+
/* node:coverage enable */
|
|
738
|
+
```
|
|
727
739
|
|
|
728
740
|
## Multiprocessing Support
|
|
729
741
|
> The data will be added to `[outputDir]/.cache`, After the generation of the report, this data will be removed unless debugging has been enabled or a raw report has been used, see [Debug for Coverage and Sourcemap](#debug-for-coverage-and-sourcemap)
|
package/README.zh-Hans.md
CHANGED
|
@@ -727,6 +727,18 @@ if (platform === 'linux') {
|
|
|
727
727
|
console.log('hello linux');
|
|
728
728
|
}
|
|
729
729
|
```
|
|
730
|
+
- 兼容支持 [c8 coverage](https://github.com/bcoe/c8/?tab=readme-ov-file#ignoring-all-lines-until-told) 或 [nodejs coverage](https://nodejs.org/docs/latest/api/test.html#collecting-code-coverage) 的语法格式
|
|
731
|
+
```js
|
|
732
|
+
/* c8 ignore start */
|
|
733
|
+
function uncovered() {
|
|
734
|
+
}
|
|
735
|
+
/* c8 ignore stop */
|
|
736
|
+
|
|
737
|
+
/* node:coverage disable */
|
|
738
|
+
function uncovered() {
|
|
739
|
+
}
|
|
740
|
+
/* node:coverage enable */
|
|
741
|
+
```
|
|
730
742
|
|
|
731
743
|
## Multiprocessing Support
|
|
732
744
|
> 多进程支持可以很好的解决异步并行的情况。所有的覆盖率数据会保存到`[outputDir]/.cache`,在报告生成之后,这些缓存数据会被清除。除非开启了[调试模式](#debug-for-coverage-and-sourcemap),或者使用了`raw`报告
|
package/lib/converter/ast.js
CHANGED
|
@@ -281,6 +281,10 @@ const addAtRule = (item, coverageList, coveredRanges, empty) => {
|
|
|
281
281
|
|
|
282
282
|
const addCssRules = (list, coverageList, coveredRanges, empty) => {
|
|
283
283
|
|
|
284
|
+
if (!Util.isList(list)) {
|
|
285
|
+
return 0;
|
|
286
|
+
}
|
|
287
|
+
|
|
284
288
|
let count = 0;
|
|
285
289
|
|
|
286
290
|
// line and line is 1-base
|
|
@@ -869,6 +869,12 @@ const decodeSourceMappings = (state, originalDecodedMap) => {
|
|
|
869
869
|
|
|
870
870
|
const allDecodedMappings = [];
|
|
871
871
|
decodedList.forEach((segments, generatedLine) => {
|
|
872
|
+
|
|
873
|
+
if (!segments.length) {
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
// line segments
|
|
872
878
|
const lastIndex = segments.length - 1;
|
|
873
879
|
segments.forEach((segment, i) => {
|
|
874
880
|
|
|
@@ -881,12 +887,17 @@ const decodeSourceMappings = (state, originalDecodedMap) => {
|
|
|
881
887
|
// the segment length could be 1, 4 or 5
|
|
882
888
|
|
|
883
889
|
if (typeof sourceIndex === 'undefined') {
|
|
890
|
+
// console.log('============================ sourceIndex undefined');
|
|
891
|
+
// console.log(segment);
|
|
884
892
|
return;
|
|
885
893
|
}
|
|
886
894
|
|
|
895
|
+
// 1-base
|
|
896
|
+
const generatedSN = generatedLine + 1;
|
|
897
|
+
|
|
887
898
|
const generatedOffset = generatedLocator.locationToOffset({
|
|
888
899
|
// 1-base
|
|
889
|
-
line:
|
|
900
|
+
line: generatedSN,
|
|
890
901
|
column: generatedColumn
|
|
891
902
|
});
|
|
892
903
|
|
|
@@ -910,15 +921,49 @@ const decodeSourceMappings = (state, originalDecodedMap) => {
|
|
|
910
921
|
}
|
|
911
922
|
|
|
912
923
|
allDecodedMappings.push(info);
|
|
913
|
-
|
|
914
924
|
originalDecodedMap.get(sourceIndex).push(info);
|
|
915
925
|
|
|
926
|
+
// calculate line end column
|
|
927
|
+
if (!info.last) {
|
|
928
|
+
return;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
const lineItem = generatedLocator.getLine(generatedSN);
|
|
932
|
+
if (!lineItem) {
|
|
933
|
+
// console.log('============================== not found line item');
|
|
934
|
+
return;
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
// console.log(generatedSN, generatedColumn, lineItem.length, lineItem.text);
|
|
938
|
+
|
|
939
|
+
if (generatedColumn >= lineItem.length) {
|
|
940
|
+
return;
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
const endColumn = {
|
|
944
|
+
generatedOffset: generatedOffset + (lineItem.length - generatedColumn),
|
|
945
|
+
generatedLine,
|
|
946
|
+
generatedColumn: lineItem.length,
|
|
947
|
+
|
|
948
|
+
end: true,
|
|
949
|
+
|
|
950
|
+
sourceIndex,
|
|
951
|
+
originalLine,
|
|
952
|
+
originalColumn,
|
|
953
|
+
nameIndex
|
|
954
|
+
};
|
|
955
|
+
|
|
956
|
+
// console.log(generatedSN, generatedColumn, info, endColumn);
|
|
957
|
+
|
|
958
|
+
allDecodedMappings.push(endColumn);
|
|
959
|
+
originalDecodedMap.get(sourceIndex).push(endColumn);
|
|
960
|
+
|
|
916
961
|
});
|
|
917
962
|
|
|
918
963
|
|
|
919
964
|
});
|
|
920
965
|
|
|
921
|
-
// defaults to sort by generated offset,
|
|
966
|
+
// defaults to sort by generated offset, no need sort
|
|
922
967
|
// allDecodedMappings.sort((a, b) => {
|
|
923
968
|
// return a.generatedOffset - b.generatedOffset;
|
|
924
969
|
// });
|
|
@@ -934,6 +979,19 @@ const getOriginalDecodedMappings = (originalDecodedMap, sourceIndex, locator) =>
|
|
|
934
979
|
return [];
|
|
935
980
|
}
|
|
936
981
|
|
|
982
|
+
// calculate line end column
|
|
983
|
+
decodedMappings.forEach((item) => {
|
|
984
|
+
if (!item.end) {
|
|
985
|
+
return;
|
|
986
|
+
}
|
|
987
|
+
const originalSN = item.originalLine + 1;
|
|
988
|
+
const lineItem = locator.getLine(originalSN);
|
|
989
|
+
// console.log(originalSN, item.originalColumn, lineItem.length, lineItem.text);
|
|
990
|
+
if (lineItem) {
|
|
991
|
+
item.originalColumn = lineItem.length;
|
|
992
|
+
}
|
|
993
|
+
});
|
|
994
|
+
|
|
937
995
|
// sort by original line/column
|
|
938
996
|
decodedMappings.sort((a, b) => {
|
|
939
997
|
if (a.originalLine === b.originalLine) {
|
|
@@ -1173,16 +1231,10 @@ const filterCoverageList = (item) => {
|
|
|
1173
1231
|
// the inline sourcemap could be removed
|
|
1174
1232
|
const maxOffset = source.length;
|
|
1175
1233
|
|
|
1176
|
-
const
|
|
1177
|
-
root: true,
|
|
1178
|
-
ranges: [{
|
|
1179
|
-
startOffset: minOffset,
|
|
1180
|
-
endOffset: maxOffset,
|
|
1181
|
-
count: 1
|
|
1182
|
-
}]
|
|
1183
|
-
};
|
|
1234
|
+
const wrapperList = [];
|
|
1184
1235
|
|
|
1185
1236
|
const coverageList = functions.filter((block) => {
|
|
1237
|
+
|
|
1186
1238
|
const { ranges } = block;
|
|
1187
1239
|
|
|
1188
1240
|
// first one is function coverage info
|
|
@@ -1192,31 +1244,31 @@ const filterCoverageList = (item) => {
|
|
|
1192
1244
|
return true;
|
|
1193
1245
|
}
|
|
1194
1246
|
|
|
1195
|
-
|
|
1196
|
-
const len = ranges.length;
|
|
1197
|
-
if (len > 1) {
|
|
1198
|
-
for (let i = 1; i < len; i++) {
|
|
1199
|
-
const range = ranges[i];
|
|
1200
|
-
if (range.startOffset >= minOffset && range.endOffset <= maxOffset) {
|
|
1201
|
-
rootFunctionInfo.ranges.push(range);
|
|
1202
|
-
}
|
|
1203
|
-
}
|
|
1204
|
-
}
|
|
1247
|
+
wrapperList.push(block);
|
|
1205
1248
|
|
|
1206
1249
|
return false;
|
|
1207
1250
|
});
|
|
1208
1251
|
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1252
|
+
if (wrapperList.length) {
|
|
1253
|
+
const rootBlock = wrapperList.pop();
|
|
1254
|
+
rootBlock.root = true;
|
|
1255
|
+
coverageList.unshift(rootBlock);
|
|
1212
1256
|
}
|
|
1213
1257
|
|
|
1258
|
+
// if (item.sourcePath.includes('PlaceB.tsx')) {
|
|
1259
|
+
// console.log(coverageList);
|
|
1260
|
+
// }
|
|
1261
|
+
|
|
1214
1262
|
return coverageList;
|
|
1215
1263
|
};
|
|
1216
1264
|
|
|
1217
1265
|
const initJsCoverageList = (item) => {
|
|
1218
1266
|
const coverageList = filterCoverageList(item);
|
|
1219
1267
|
|
|
1268
|
+
// if (item.sourcePath.includes('PlaceB.tsx')) {
|
|
1269
|
+
// console.log(coverageList[0]);
|
|
1270
|
+
// }
|
|
1271
|
+
|
|
1220
1272
|
// function could be covered even it is defined after an uncovered return, see case closures.js
|
|
1221
1273
|
// fix uncovered range if there are covered ranges in uncovered range
|
|
1222
1274
|
|
|
@@ -565,9 +565,9 @@ const getFixedOriginalStart = (start, mappings, state, cache, options) => {
|
|
|
565
565
|
};
|
|
566
566
|
}
|
|
567
567
|
|
|
568
|
-
// skip last mapping
|
|
568
|
+
// skip last and end column mapping
|
|
569
569
|
let startNextLine = false;
|
|
570
|
-
if (m1.last) {
|
|
570
|
+
if (m1.end || m1.last) {
|
|
571
571
|
const locStart = state.locator.offsetToLocation(start);
|
|
572
572
|
// 1-base
|
|
573
573
|
const lineIndex = locStart.line - 1;
|