@code-pushup/coverage-plugin 0.56.0 → 0.58.0

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.
Files changed (41) hide show
  1. package/package.json +9 -7
  2. package/src/bin.js +6 -0
  3. package/src/bin.js.map +1 -0
  4. package/src/index.d.ts +3 -3
  5. package/src/index.js +4 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/config.js +54 -0
  8. package/src/lib/config.js.map +1 -0
  9. package/src/lib/coverage-plugin.d.ts +1 -1
  10. package/src/lib/coverage-plugin.js +57 -0
  11. package/src/lib/coverage-plugin.js.map +1 -0
  12. package/src/lib/nx/coverage-paths.d.ts +1 -1
  13. package/src/lib/nx/coverage-paths.js +94 -0
  14. package/src/lib/nx/coverage-paths.js.map +1 -0
  15. package/src/lib/runner/constants.d.ts +0 -3
  16. package/src/lib/runner/constants.js +2 -0
  17. package/src/lib/runner/constants.js.map +1 -0
  18. package/src/lib/runner/index.d.ts +3 -3
  19. package/src/lib/runner/index.js +47 -0
  20. package/src/lib/runner/index.js.map +1 -0
  21. package/src/lib/runner/lcov/lcov-runner.d.ts +1 -1
  22. package/src/lib/runner/lcov/lcov-runner.js +90 -0
  23. package/src/lib/runner/lcov/lcov-runner.js.map +1 -0
  24. package/src/lib/runner/lcov/merge-lcov.js +103 -0
  25. package/src/lib/runner/lcov/merge-lcov.js.map +1 -0
  26. package/src/lib/runner/lcov/parse-lcov.js +5 -0
  27. package/src/lib/runner/lcov/parse-lcov.js.map +1 -0
  28. package/src/lib/runner/lcov/transform.d.ts +2 -2
  29. package/src/lib/runner/lcov/transform.js +111 -0
  30. package/src/lib/runner/lcov/transform.js.map +1 -0
  31. package/src/lib/runner/lcov/types.d.ts +1 -1
  32. package/src/lib/runner/lcov/types.js +2 -0
  33. package/src/lib/runner/lcov/types.js.map +1 -0
  34. package/src/lib/runner/lcov/utils.d.ts +1 -1
  35. package/src/lib/runner/lcov/utils.js +25 -0
  36. package/src/lib/runner/lcov/utils.js.map +1 -0
  37. package/src/lib/utils.d.ts +1 -1
  38. package/src/lib/utils.js +22 -0
  39. package/src/lib/utils.js.map +1 -0
  40. package/bin.js +0 -1236
  41. package/index.js +0 -1065
@@ -0,0 +1,111 @@
1
+ import { toNumberPrecision, toOrdinal } from '@code-pushup/utils';
2
+ import { INVALID_FUNCTION_NAME } from '../constants.js';
3
+ import { calculateCoverage, mergeConsecutiveNumbers } from './utils.js';
4
+ export function lcovReportToFunctionStat(record) {
5
+ const validRecord = removeEmptyReport(record);
6
+ return {
7
+ totalFound: validRecord.functions.found,
8
+ totalHit: validRecord.functions.hit,
9
+ issues: validRecord.functions.hit < validRecord.functions.found
10
+ ? validRecord.functions.details
11
+ .filter(detail => !detail.hit)
12
+ .map((detail) => ({
13
+ message: `Function ${detail.name} is not called in any test case.`,
14
+ severity: 'error',
15
+ source: {
16
+ file: validRecord.file,
17
+ position: { startLine: detail.line },
18
+ },
19
+ }))
20
+ : [],
21
+ };
22
+ }
23
+ function removeEmptyReport(record) {
24
+ const validFunctions = record.functions.details.filter(detail => detail.name !== INVALID_FUNCTION_NAME);
25
+ if (validFunctions.length === record.functions.found) {
26
+ return record;
27
+ }
28
+ return {
29
+ ...record,
30
+ functions: {
31
+ details: validFunctions,
32
+ found: validFunctions.length,
33
+ hit: validFunctions.reduce((acc, fn) => acc + (fn.hit != null && fn.hit > 0 ? 1 : 0), 0),
34
+ },
35
+ };
36
+ }
37
+ export function lcovReportToLineStat(record) {
38
+ const missingCoverage = record.lines.hit < record.lines.found;
39
+ const lines = missingCoverage
40
+ ? record.lines.details
41
+ .filter(detail => !detail.hit)
42
+ .map(detail => detail.line)
43
+ : [];
44
+ const linePositions = mergeConsecutiveNumbers(lines);
45
+ return {
46
+ totalFound: record.lines.found,
47
+ totalHit: record.lines.hit,
48
+ issues: missingCoverage
49
+ ? linePositions.map((linePosition) => {
50
+ const lineReference = linePosition.end == null
51
+ ? `Line ${linePosition.start} is`
52
+ : `Lines ${linePosition.start}-${linePosition.end} are`;
53
+ return {
54
+ message: `${lineReference} not covered in any test case.`,
55
+ severity: 'warning',
56
+ source: {
57
+ file: record.file,
58
+ position: {
59
+ startLine: linePosition.start,
60
+ endLine: linePosition.end,
61
+ },
62
+ },
63
+ };
64
+ })
65
+ : [],
66
+ };
67
+ }
68
+ export function lcovReportToBranchStat(record) {
69
+ return {
70
+ totalFound: record.branches.found,
71
+ totalHit: record.branches.hit,
72
+ issues: record.branches.hit < record.branches.found
73
+ ? record.branches.details
74
+ .filter(detail => !detail.taken)
75
+ .map((detail) => ({
76
+ message: `${toOrdinal(detail.branch + 1)} branch is not taken in any test case.`,
77
+ severity: 'error',
78
+ source: {
79
+ file: record.file,
80
+ position: { startLine: detail.line },
81
+ },
82
+ }))
83
+ : [],
84
+ };
85
+ }
86
+ export const recordToStatFunctionMapper = {
87
+ branch: lcovReportToBranchStat,
88
+ line: lcovReportToLineStat,
89
+ function: lcovReportToFunctionStat,
90
+ };
91
+ /**
92
+ *
93
+ * @param stat code coverage result for a given type
94
+ * @param coverageType code coverage type
95
+ * @returns Result of complete code ccoverage data coverted to AuditOutput
96
+ */
97
+ export function lcovCoverageToAuditOutput(stat, coverageType) {
98
+ const coverage = calculateCoverage(stat.totalHit, stat.totalFound);
99
+ const MAX_DECIMAL_PLACES = 4;
100
+ const coveragePercentage = coverage * 100;
101
+ return {
102
+ slug: `${coverageType}-coverage`,
103
+ score: toNumberPrecision(coverage, MAX_DECIMAL_PLACES),
104
+ value: coveragePercentage,
105
+ displayValue: `${toNumberPrecision(coveragePercentage, 1)} %`,
106
+ details: {
107
+ issues: stat.issues,
108
+ },
109
+ };
110
+ }
111
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-coverage/src/lib/runner/lcov/transform.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Issue } from '@code-pushup/models';
2
- import type { CoverageType } from '../../config';
2
+ import type { CoverageType } from '../../config.js';
3
3
  export type LCOVStat = {
4
4
  totalFound: number;
5
5
  totalHit: number;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-coverage/src/lib/runner/lcov/types.ts"],"names":[],"mappings":""}
@@ -1,4 +1,4 @@
1
- import type { NumberRange } from './types';
1
+ import type { NumberRange } from './types.js';
2
2
  /**
3
3
  * This function calculates coverage as ratio of tested entities vs total
4
4
  * @param hit how many entities were executed in at least one test
@@ -0,0 +1,25 @@
1
+ /**
2
+ * This function calculates coverage as ratio of tested entities vs total
3
+ * @param hit how many entities were executed in at least one test
4
+ * @param found how many entities were found overall
5
+ * @returns coverage between 0 and 1
6
+ */
7
+ export function calculateCoverage(hit, found) {
8
+ return found > 0 ? hit / found : 1;
9
+ }
10
+ export function mergeConsecutiveNumbers(numberArr) {
11
+ return numberArr
12
+ .toSorted((a, b) => a - b)
13
+ .reduce((acc, currValue) => {
14
+ const prevValue = acc.at(-1);
15
+ if (prevValue != null &&
16
+ (prevValue.start === currValue - 1 || prevValue.end === currValue - 1)) {
17
+ return [
18
+ ...acc.slice(0, -1),
19
+ { start: prevValue.start, end: currValue },
20
+ ];
21
+ }
22
+ return [...acc, { start: currValue }];
23
+ }, []);
24
+ }
25
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../../packages/plugin-coverage/src/lib/runner/lcov/utils.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,KAAa;IAC1D,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAmB;IACzD,OAAO,SAAS;SACb,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;SACzB,MAAM,CAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;QACxC,MAAM,SAAS,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IACE,SAAS,IAAI,IAAI;YACjB,CAAC,SAAS,CAAC,KAAK,KAAK,SAAS,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,GAAG,CAAC,CAAC,EACtE,CAAC;YACD,OAAO;gBACL,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE;aAC3C,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACxC,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { AuditOutputs } from '@code-pushup/models';
2
- import type { CoverageType } from './config';
2
+ import type { CoverageType } from './config.js';
3
3
  export declare const coverageDescription: Record<CoverageType, string>;
4
4
  /**
5
5
  * Since more code coverage does not necessarily mean better score, this optional override allows for defining custom coverage goals.
@@ -0,0 +1,22 @@
1
+ export const coverageDescription = {
2
+ branch: 'Measures how many branches were executed after conditional statements in at least one test.',
3
+ line: 'Measures how many lines of code were executed in at least one test.',
4
+ function: 'Measures how many functions were called in at least one test.',
5
+ };
6
+ /**
7
+ * Since more code coverage does not necessarily mean better score, this optional override allows for defining custom coverage goals.
8
+ * @param outputs original results
9
+ * @param threshold threshold above which the score is to be 1
10
+ * @returns Outputs with overriden score (not value) to 1 if it reached a defined threshold.
11
+ */
12
+ export function applyMaxScoreAboveThreshold(outputs, threshold) {
13
+ return outputs.map(output => output.score >= threshold ? { ...output, score: 1 } : output);
14
+ }
15
+ export const coverageTypeWeightMapper = {
16
+ /* eslint-disable @typescript-eslint/no-magic-numbers */
17
+ function: 6,
18
+ branch: 3,
19
+ line: 1,
20
+ /* eslint-enable @typescript-eslint/no-magic-numbers */
21
+ };
22
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../packages/plugin-coverage/src/lib/utils.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAiC;IAC/D,MAAM,EACJ,6FAA6F;IAC/F,IAAI,EAAE,qEAAqE;IAC3E,QAAQ,EAAE,+DAA+D;CAC1E,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAqB,EACrB,SAAiB;IAEjB,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAC1B,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAC7D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAiC;IACpE,wDAAwD;IACxD,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,uDAAuD;CACxD,CAAC"}