apex-code-coverage-transformer 2.2.1 → 2.4.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 (37) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +194 -13
  3. package/lib/commands/acc-transformer/transform.d.ts +1 -0
  4. package/lib/commands/acc-transformer/transform.js +12 -2
  5. package/lib/commands/acc-transformer/transform.js.map +1 -1
  6. package/lib/helpers/constants.d.ts +1 -0
  7. package/lib/helpers/constants.js +2 -0
  8. package/lib/helpers/constants.js.map +1 -0
  9. package/lib/helpers/generateXml.d.ts +2 -0
  10. package/lib/helpers/generateXml.js +14 -0
  11. package/lib/helpers/generateXml.js.map +1 -0
  12. package/lib/helpers/initializeCoverageObject.d.ts +5 -0
  13. package/lib/helpers/initializeCoverageObject.js +68 -0
  14. package/lib/helpers/initializeCoverageObject.js.map +1 -0
  15. package/lib/helpers/setCoveredLinesClover.d.ts +2 -0
  16. package/lib/helpers/setCoveredLinesClover.js +43 -0
  17. package/lib/helpers/setCoveredLinesClover.js.map +1 -0
  18. package/lib/helpers/setCoveredLinesCobertura.d.ts +2 -0
  19. package/lib/helpers/setCoveredLinesCobertura.js +34 -0
  20. package/lib/helpers/setCoveredLinesCobertura.js.map +1 -0
  21. package/lib/helpers/setCoveredLinesSonar.d.ts +2 -0
  22. package/lib/helpers/{setCoveredLines.js → setCoveredLinesSonar.js} +2 -2
  23. package/lib/helpers/setCoveredLinesSonar.js.map +1 -0
  24. package/lib/helpers/transformDeployCoverageReport.d.ts +1 -1
  25. package/lib/helpers/transformDeployCoverageReport.js +88 -16
  26. package/lib/helpers/transformDeployCoverageReport.js.map +1 -1
  27. package/lib/helpers/transformTestCoverageReport.d.ts +1 -1
  28. package/lib/helpers/transformTestCoverageReport.js +97 -20
  29. package/lib/helpers/transformTestCoverageReport.js.map +1 -1
  30. package/lib/helpers/types.d.ts +96 -6
  31. package/lib/hooks/postrun.js +3 -0
  32. package/lib/hooks/postrun.js.map +1 -1
  33. package/messages/transformer.transform.md +11 -5
  34. package/oclif.manifest.json +23 -6
  35. package/package.json +11 -3
  36. package/lib/helpers/setCoveredLines.d.ts +0 -2
  37. package/lib/helpers/setCoveredLines.js.map +0 -1
@@ -1,15 +1,21 @@
1
1
  'use strict';
2
- /* eslint-disable no-await-in-loop */
3
- import { create } from 'xmlbuilder2';
4
2
  import { getPackageDirectories } from './getPackageDirectories.js';
5
3
  import { findFilePath } from './findFilePath.js';
6
- import { setCoveredLines } from './setCoveredLines.js';
4
+ import { setCoveredLinesSonar } from './setCoveredLinesSonar.js';
5
+ import { setCoveredLinesCobertura } from './setCoveredLinesCobertura.js';
6
+ import { setCoveredLinesClover } from './setCoveredLinesClover.js';
7
7
  import { normalizePathToUnix } from './normalizePathToUnix.js';
8
- export async function transformDeployCoverageReport(data) {
9
- const coverageObj = { coverage: { '@version': '1', file: [] } };
8
+ import { generateXml } from './generateXml.js';
9
+ import { formatOptions } from './constants.js';
10
+ import { initializeCoverageObject } from './initializeCoverageObject.js';
11
+ export async function transformDeployCoverageReport(data, format) {
12
+ if (!formatOptions.includes(format)) {
13
+ throw new Error(`Unsupported format: ${format}`);
14
+ }
10
15
  const warnings = [];
11
16
  let filesProcessed = 0;
12
17
  const { repoRoot, packageDirectories } = await getPackageDirectories();
18
+ const { coverageObj, packageObj } = initializeCoverageObject(format);
13
19
  for (const fileName in data) {
14
20
  if (!Object.hasOwn(data, fileName))
15
21
  continue;
@@ -26,19 +32,85 @@ export async function transformDeployCoverageReport(data) {
26
32
  const coveredLines = Object.keys(fileInfo.s)
27
33
  .filter((lineNumber) => fileInfo.s[lineNumber] === 1)
28
34
  .map(Number);
29
- const fileObj = {
30
- '@path': normalizePathToUnix(relativeFilePath),
31
- lineToCover: uncoveredLines.map((lineNumber) => ({
32
- '@lineNumber': lineNumber,
33
- '@covered': 'false',
34
- })),
35
- };
36
- // this function is only needed until Salesforce fixes the API to correctly return covered lines
37
- await setCoveredLines(coveredLines, uncoveredLines, repoRoot, relativeFilePath, fileObj);
35
+ if (format === 'sonar') {
36
+ await handleSonarFormat(relativeFilePath, uncoveredLines, coveredLines, repoRoot, coverageObj);
37
+ }
38
+ else if (format === 'cobertura') {
39
+ await handleCoberturaFormat(relativeFilePath, formattedFileName, uncoveredLines, coveredLines, repoRoot, coverageObj, packageObj);
40
+ }
41
+ else {
42
+ await handleCloverFormat(relativeFilePath, formattedFileName, uncoveredLines, coveredLines, repoRoot, coverageObj);
43
+ }
38
44
  filesProcessed++;
39
- coverageObj.coverage.file.push(fileObj);
40
45
  }
41
- const xml = create(coverageObj).end({ prettyPrint: true, indent: ' ' });
46
+ const xml = generateXml(coverageObj, format);
42
47
  return { xml, warnings, filesProcessed };
43
48
  }
49
+ async function handleSonarFormat(filePath, uncoveredLines, coveredLines, repoRoot, coverageObj) {
50
+ const fileObj = {
51
+ '@path': normalizePathToUnix(filePath),
52
+ lineToCover: uncoveredLines.map((lineNumber) => ({
53
+ '@lineNumber': lineNumber,
54
+ '@covered': 'false',
55
+ })),
56
+ };
57
+ await setCoveredLinesSonar(coveredLines, uncoveredLines, repoRoot, filePath, fileObj);
58
+ coverageObj.coverage.file.push(fileObj);
59
+ }
60
+ async function handleCoberturaFormat(filePath, fileName, uncoveredLines, coveredLines, repoRoot, coverageObj, packageObj) {
61
+ const classObj = {
62
+ '@name': fileName,
63
+ '@filename': normalizePathToUnix(filePath),
64
+ '@line-rate': (coveredLines.length / (coveredLines.length + uncoveredLines.length)).toFixed(4),
65
+ '@branch-rate': '1',
66
+ methods: {},
67
+ lines: {
68
+ line: [
69
+ ...uncoveredLines.map((lineNumber) => ({
70
+ '@number': lineNumber,
71
+ '@hits': 0,
72
+ '@branch': 'false',
73
+ })),
74
+ ],
75
+ },
76
+ };
77
+ await setCoveredLinesCobertura(coveredLines, uncoveredLines, repoRoot, filePath, classObj);
78
+ coverageObj.coverage['@lines-valid'] += uncoveredLines.length + coveredLines.length;
79
+ coverageObj.coverage['@lines-covered'] += coveredLines.length;
80
+ packageObj.classes.class.push(classObj);
81
+ packageObj['@line-rate'] = Number((coverageObj.coverage['@lines-covered'] / coverageObj.coverage['@lines-valid']).toFixed(4));
82
+ coverageObj.coverage['@line-rate'] = packageObj['@line-rate'];
83
+ }
84
+ async function handleCloverFormat(filePath, fileName, uncoveredLines, coveredLines, repoRoot, coverageObj) {
85
+ const cloverFile = {
86
+ '@name': fileName,
87
+ '@path': normalizePathToUnix(filePath),
88
+ metrics: {
89
+ '@statements': uncoveredLines.length + coveredLines.length,
90
+ '@coveredstatements': coveredLines.length,
91
+ '@conditionals': 0,
92
+ '@coveredconditionals': 0,
93
+ '@methods': 0,
94
+ '@coveredmethods': 0,
95
+ },
96
+ line: [
97
+ ...uncoveredLines.map((lineNumber) => ({
98
+ '@num': lineNumber,
99
+ '@count': 0,
100
+ '@type': 'stmt',
101
+ })),
102
+ ],
103
+ };
104
+ await setCoveredLinesClover(coveredLines, uncoveredLines, repoRoot, filePath, cloverFile);
105
+ coverageObj.coverage.project.file.push(cloverFile);
106
+ const projectMetrics = coverageObj.coverage.project.metrics;
107
+ projectMetrics['@statements'] += uncoveredLines.length + coveredLines.length;
108
+ projectMetrics['@coveredstatements'] += coveredLines.length;
109
+ projectMetrics['@elements'] += uncoveredLines.length + coveredLines.length;
110
+ projectMetrics['@coveredelements'] += coveredLines.length;
111
+ projectMetrics['@files'] += 1;
112
+ projectMetrics['@classes'] += 1;
113
+ projectMetrics['@loc'] += uncoveredLines.length + coveredLines.length;
114
+ projectMetrics['@ncloc'] += uncoveredLines.length + coveredLines.length;
115
+ }
44
116
  //# sourceMappingURL=transformDeployCoverageReport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transformDeployCoverageReport.js","sourceRoot":"","sources":["../../src/helpers/transformDeployCoverageReport.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,qCAAqC;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,IAAwB;IAExB,MAAM,WAAW,GAAmB,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;IAChF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,cAAc,GAAW,CAAC,CAAC;IAC/B,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAEvE,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;YAAE,SAAS;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC7F,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,iBAAiB,0CAA0C,CAAC,CAAC;YAC5F,SAAS;QACX,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;aAC3C,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aACpD,GAAG,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;aACzC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aACpD,GAAG,CAAC,MAAM,CAAC,CAAC;QAEf,MAAM,OAAO,GAAe;YAC1B,OAAO,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;YAC9C,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,UAAkB,EAAE,EAAE,CAAC,CAAC;gBACvD,aAAa,EAAE,UAAU;gBACzB,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC;SACJ,CAAC;QAEF,gGAAgG;QAChG,MAAM,eAAe,CAAC,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACzF,cAAc,EAAE,CAAC;QACjB,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"transformDeployCoverageReport.js","sourceRoot":"","sources":["../../src/helpers/transformDeployCoverageReport.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { TestCoverageData } from './types.js';
2
- export declare function transformTestCoverageReport(testCoverageData: TestCoverageData[]): Promise<{
2
+ export declare function transformTestCoverageReport(testCoverageData: TestCoverageData[], format: string): Promise<{
3
3
  xml: string;
4
4
  warnings: string[];
5
5
  filesProcessed: number;
@@ -1,43 +1,120 @@
1
1
  'use strict';
2
- /* eslint-disable no-await-in-loop */
3
- import { create } from 'xmlbuilder2';
4
2
  import { getPackageDirectories } from './getPackageDirectories.js';
5
3
  import { findFilePath } from './findFilePath.js';
6
4
  import { normalizePathToUnix } from './normalizePathToUnix.js';
7
- export async function transformTestCoverageReport(testCoverageData) {
8
- const coverageObj = { coverage: { '@version': '1', file: [] } };
5
+ import { generateXml } from './generateXml.js';
6
+ import { formatOptions } from './constants.js';
7
+ import { initializeCoverageObject } from './initializeCoverageObject.js';
8
+ export async function transformTestCoverageReport(testCoverageData, format) {
9
+ if (!formatOptions.includes(format)) {
10
+ throw new Error(`Unsupported format: ${format}`);
11
+ }
9
12
  const warnings = [];
10
13
  let filesProcessed = 0;
11
14
  const { repoRoot, packageDirectories } = await getPackageDirectories();
12
- if (!Array.isArray(testCoverageData)) {
13
- testCoverageData = [testCoverageData];
15
+ const { coverageObj, packageObj } = initializeCoverageObject(format);
16
+ let coverageData = testCoverageData;
17
+ if (!Array.isArray(coverageData)) {
18
+ coverageData = [coverageData];
14
19
  }
15
- for (const data of testCoverageData) {
20
+ for (const data of coverageData) {
16
21
  const name = data?.name;
17
22
  const lines = data?.lines;
18
- if (!name || !lines) {
23
+ if (!name || !lines)
19
24
  continue;
20
- }
21
25
  const formattedFileName = name.replace(/no-map[\\/]+/, '');
22
26
  const relativeFilePath = await findFilePath(formattedFileName, packageDirectories, repoRoot);
23
27
  if (relativeFilePath === undefined) {
24
28
  warnings.push(`The file name ${formattedFileName} was not found in any package directory.`);
25
29
  continue;
26
30
  }
27
- const fileObj = {
28
- '@path': normalizePathToUnix(relativeFilePath),
29
- lineToCover: [],
30
- };
31
- for (const [lineNumber, isCovered] of Object.entries(lines)) {
32
- fileObj.lineToCover.push({
33
- '@lineNumber': Number(lineNumber),
34
- '@covered': `${isCovered === 1}`,
35
- });
31
+ const uncoveredLines = Object.entries(lines)
32
+ .filter(([, isCovered]) => isCovered === 0)
33
+ .map(([lineNumber]) => Number(lineNumber));
34
+ const coveredLines = Object.entries(lines)
35
+ .filter(([, isCovered]) => isCovered === 1)
36
+ .map(([lineNumber]) => Number(lineNumber));
37
+ if (format === 'sonar') {
38
+ handleSonarFormat(relativeFilePath, lines, coverageObj);
39
+ }
40
+ else if (format === 'cobertura') {
41
+ handleCoberturaFormat(relativeFilePath, formattedFileName, lines, uncoveredLines, coveredLines, coverageObj, packageObj);
42
+ }
43
+ else {
44
+ handleCloverFormat(relativeFilePath, formattedFileName, lines, uncoveredLines, coveredLines, coverageObj);
36
45
  }
37
46
  filesProcessed++;
38
- coverageObj.coverage.file.push(fileObj);
39
47
  }
40
- const xml = create(coverageObj).end({ prettyPrint: true, indent: ' ' });
48
+ const xml = generateXml(coverageObj, format);
41
49
  return { xml, warnings, filesProcessed };
42
50
  }
51
+ function handleSonarFormat(filePath, lines, coverageObj) {
52
+ const fileObj = {
53
+ '@path': normalizePathToUnix(filePath),
54
+ lineToCover: [],
55
+ };
56
+ for (const [lineNumber, isCovered] of Object.entries(lines)) {
57
+ fileObj.lineToCover.push({
58
+ '@lineNumber': Number(lineNumber),
59
+ '@covered': `${isCovered === 1}`,
60
+ });
61
+ }
62
+ coverageObj.coverage.file.push(fileObj);
63
+ }
64
+ function handleCoberturaFormat(filePath, fileName, lines, uncoveredLines, coveredLines, coverageObj, packageObj) {
65
+ const classObj = {
66
+ '@name': fileName,
67
+ '@filename': normalizePathToUnix(filePath),
68
+ '@line-rate': (coveredLines.length / (coveredLines.length + uncoveredLines.length)).toFixed(4),
69
+ '@branch-rate': '1',
70
+ methods: {},
71
+ lines: {
72
+ line: [],
73
+ },
74
+ };
75
+ for (const [lineNumber, isCovered] of Object.entries(lines)) {
76
+ classObj.lines.line.push({
77
+ '@number': Number(lineNumber),
78
+ '@hits': isCovered === 1 ? 1 : 0,
79
+ '@branch': 'false',
80
+ });
81
+ }
82
+ coverageObj.coverage['@lines-valid'] += uncoveredLines.length + coveredLines.length;
83
+ coverageObj.coverage['@lines-covered'] += coveredLines.length;
84
+ packageObj.classes.class.push(classObj);
85
+ packageObj['@line-rate'] = Number((coverageObj.coverage['@lines-covered'] / coverageObj.coverage['@lines-valid']).toFixed(4));
86
+ coverageObj.coverage['@line-rate'] = packageObj['@line-rate'];
87
+ }
88
+ function handleCloverFormat(filePath, fileName, lines, uncoveredLines, coveredLines, coverageObj) {
89
+ const cloverFile = {
90
+ '@name': fileName,
91
+ '@path': normalizePathToUnix(filePath),
92
+ metrics: {
93
+ '@statements': uncoveredLines.length + coveredLines.length,
94
+ '@coveredstatements': coveredLines.length,
95
+ '@conditionals': 0,
96
+ '@coveredconditionals': 0,
97
+ '@methods': 0,
98
+ '@coveredmethods': 0,
99
+ },
100
+ line: [],
101
+ };
102
+ for (const [lineNumber, isCovered] of Object.entries(lines)) {
103
+ cloverFile.line.push({
104
+ '@num': Number(lineNumber),
105
+ '@count': isCovered === 1 ? 1 : 0,
106
+ '@type': 'stmt',
107
+ });
108
+ }
109
+ coverageObj.coverage.project.file.push(cloverFile);
110
+ const projectMetrics = coverageObj.coverage.project.metrics;
111
+ projectMetrics['@statements'] += uncoveredLines.length + coveredLines.length;
112
+ projectMetrics['@coveredstatements'] += coveredLines.length;
113
+ projectMetrics['@elements'] += uncoveredLines.length + coveredLines.length;
114
+ projectMetrics['@coveredelements'] += coveredLines.length;
115
+ projectMetrics['@files'] += 1;
116
+ projectMetrics['@classes'] += 1;
117
+ projectMetrics['@loc'] += uncoveredLines.length + coveredLines.length;
118
+ projectMetrics['@ncloc'] += uncoveredLines.length + coveredLines.length;
119
+ }
43
120
  //# sourceMappingURL=transformTestCoverageReport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transformTestCoverageReport.js","sourceRoot":"","sources":["../../src/helpers/transformTestCoverageReport.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,qCAAqC;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,gBAAoC;IAEpC,MAAM,WAAW,GAAmB,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;IAChF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,cAAc,GAAW,CAAC,CAAC;IAC/B,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAEvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,gBAAgB,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC;QAE1B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,SAAS;QACX,CAAC;QACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC7F,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,iBAAiB,0CAA0C,CAAC,CAAC;YAC5F,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAe;YAC1B,OAAO,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;YAC9C,WAAW,EAAE,EAAE;SAChB,CAAC;QAEF,KAAK,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvB,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC;gBACjC,UAAU,EAAE,GAAG,SAAS,KAAK,CAAC,EAAE;aACjC,CAAC,CAAC;QACL,CAAC;QACD,cAAc,EAAE,CAAC;QACjB,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"transformTestCoverageReport.js","sourceRoot":"","sources":["../../src/helpers/transformTestCoverageReport.ts"],"names":[],"mappings":"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"}
@@ -34,23 +34,113 @@ export type SfdxProject = {
34
34
  path: string;
35
35
  }>;
36
36
  };
37
- type LineToCover = {
37
+ type SonarLine = {
38
38
  '@lineNumber': number;
39
39
  '@covered': string;
40
40
  };
41
- export type FileObject = {
41
+ export type SonarClass = {
42
42
  '@path': string;
43
- lineToCover: LineToCover[];
43
+ lineToCover: SonarLine[];
44
44
  };
45
- export type CoverageObject = {
45
+ export type SonarCoverageObject = {
46
46
  coverage: {
47
- file: FileObject[];
47
+ file: SonarClass[];
48
48
  '@version': string;
49
49
  };
50
50
  };
51
- export type ConfigFile = {
51
+ export type HookFile = {
52
52
  deployCoverageJsonPath: string;
53
53
  testCoverageJsonPath: string;
54
54
  coverageXmlPath: string;
55
+ format: string;
56
+ };
57
+ export type CoberturaLine = {
58
+ '@number': number;
59
+ '@hits': number;
60
+ '@branch': string;
61
+ };
62
+ export type CoberturaClass = {
63
+ '@name': string;
64
+ '@filename': string;
65
+ '@line-rate': string;
66
+ '@branch-rate': string;
67
+ methods: Record<string, never>;
68
+ lines: {
69
+ line: CoberturaLine[];
70
+ };
71
+ };
72
+ export type CoberturaPackage = {
73
+ '@name': string;
74
+ '@line-rate': number;
75
+ '@branch-rate': number;
76
+ classes: {
77
+ class: CoberturaClass[];
78
+ };
79
+ };
80
+ export type CoberturaCoverageObject = {
81
+ coverage: {
82
+ '@lines-valid': number;
83
+ '@lines-covered': number;
84
+ '@line-rate': number;
85
+ '@branches-valid': number;
86
+ '@branches-covered': number;
87
+ '@branch-rate': number | string;
88
+ '@timestamp': number;
89
+ '@complexity': number;
90
+ '@version': string;
91
+ sources: {
92
+ source: string[];
93
+ };
94
+ packages: {
95
+ package: CoberturaPackage[];
96
+ };
97
+ };
98
+ };
99
+ export type CloverLine = {
100
+ '@num': number;
101
+ '@count': number;
102
+ '@type': string;
103
+ };
104
+ export type CloverFile = {
105
+ '@name': string;
106
+ '@path': string;
107
+ metrics: {
108
+ '@statements': number;
109
+ '@coveredstatements': number;
110
+ '@conditionals': number;
111
+ '@coveredconditionals': number;
112
+ '@methods': number;
113
+ '@coveredmethods': number;
114
+ };
115
+ line: CloverLine[];
116
+ };
117
+ export type CloverProjectMetrics = {
118
+ '@statements': number;
119
+ '@coveredstatements': number;
120
+ '@conditionals': number;
121
+ '@coveredconditionals': number;
122
+ '@methods': number;
123
+ '@coveredmethods': number;
124
+ '@elements': number;
125
+ '@coveredelements': number;
126
+ '@complexity': number;
127
+ '@loc': number;
128
+ '@ncloc': number;
129
+ '@packages': number;
130
+ '@files': number;
131
+ '@classes': number;
132
+ };
133
+ export type CloverProject = {
134
+ '@timestamp': number;
135
+ '@name': string;
136
+ metrics: CloverProjectMetrics;
137
+ file: CloverFile[];
138
+ };
139
+ export type CloverCoverageObject = {
140
+ coverage: {
141
+ '@generated': number;
142
+ '@clover': string;
143
+ project: CloverProject;
144
+ };
55
145
  };
56
146
  export {};
@@ -30,6 +30,7 @@ export const postrun = async function (options) {
30
30
  return;
31
31
  }
32
32
  const coverageXml = configFile.coverageXmlPath || 'coverage.xml';
33
+ const coverageFormat = configFile.format || 'sonar';
33
34
  if (commandType === 'deploy') {
34
35
  coverageJson = configFile.deployCoverageJsonPath || '.';
35
36
  }
@@ -49,6 +50,8 @@ export const postrun = async function (options) {
49
50
  commandArgs.push(coverageJsonPath);
50
51
  commandArgs.push('--xml');
51
52
  commandArgs.push(coverageXmlPath);
53
+ commandArgs.push('--format');
54
+ commandArgs.push(coverageFormat);
52
55
  await TransformerTransform.run(commandArgs);
53
56
  };
54
57
  //# sourceMappingURL=postrun.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postrun.js","sourceRoot":"","sources":["../../src/hooks/postrun.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,oBAAoB,MAAM,0CAA0C,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,MAAM,OAAO,GAAoB,KAAK,WAAW,OAAO;IAC7D,IAAI,WAAmB,CAAC;IACxB,IAAI,YAAoB,CAAC;IACzB,IACE,CAAC,yBAAyB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAC5G,OAAO,CAAC,OAAO,CAAC,EAAE,CACnB,EACD,CAAC;QACD,WAAW,GAAG,QAAQ,CAAC;IACzB,CAAC;SAAM,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3E,WAAW,GAAG,MAAM,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO;IACT,CAAC;IACD,IAAI,UAAsB,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,qCAAqC,CAAC,CAAC;IAE5E,IAAI,CAAC;QACH,MAAM,UAAU,GAAW,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/D,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAe,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAW,UAAU,CAAC,eAAe,IAAI,cAAc,CAAC;IAEzE,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7B,YAAY,GAAG,UAAU,CAAC,sBAAsB,IAAI,GAAG,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,UAAU,CAAC,oBAAoB,IAAI,GAAG,CAAC;IACxD,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACpC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClC,MAAM,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC9C,CAAC,CAAC"}
1
+ {"version":3,"file":"postrun.js","sourceRoot":"","sources":["../../src/hooks/postrun.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,oBAAoB,MAAM,0CAA0C,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAC,MAAM,OAAO,GAAoB,KAAK,WAAW,OAAO;IAC7D,IAAI,WAAmB,CAAC;IACxB,IAAI,YAAoB,CAAC;IACzB,IACE,CAAC,yBAAyB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAC5G,OAAO,CAAC,OAAO,CAAC,EAAE,CACnB,EACD,CAAC;QACD,WAAW,GAAG,QAAQ,CAAC;IACzB,CAAC;SAAM,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3E,WAAW,GAAG,MAAM,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO;IACT,CAAC;IACD,IAAI,UAAoB,CAAC;IACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,qCAAqC,CAAC,CAAC;IAE5E,IAAI,CAAC;QACH,MAAM,UAAU,GAAW,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/D,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAa,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAW,UAAU,CAAC,eAAe,IAAI,cAAc,CAAC;IACzE,MAAM,cAAc,GAAW,UAAU,CAAC,MAAM,IAAI,OAAO,CAAC;IAE5D,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7B,YAAY,GAAG,UAAU,CAAC,sBAAsB,IAAI,GAAG,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,UAAU,CAAC,oBAAoB,IAAI,GAAG,CAAC;IACxD,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACpC,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACnC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACjC,MAAM,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC9C,CAAC,CAAC"}
@@ -1,19 +1,25 @@
1
1
  # summary
2
2
 
3
- Transforms the Code Coverage JSON into the Generic Test Coverage Format (XML).
3
+ Transforms the Code Coverage JSON into SonarQube, Clover, or Cobertura format.
4
4
 
5
5
  # description
6
6
 
7
- This plugin will convert the code coverage JSON file created by the Salesforce CLI during Apex deployments and test runs into an XML accepted by tools like SonarQube.
7
+ Transform the Apex code coverage JSON file created by the Salesforce CLI deploy and test command into SonarQube, Clover, or Cobertura format.
8
8
 
9
9
  # examples
10
10
 
11
- - `sf acc-transformer transform -j "coverage.json" -x "coverage.xml"`
11
+ - `sf acc-transformer transform -j "coverage.json" -x "coverage.xml" -f "sonar"`
12
+ - `sf acc-transformer transform -j "coverage.json" -x "coverage.xml" -f "cobertura"`
13
+ - `sf acc-transformer transform -j "coverage.json" -x "coverage.xml" -f "clover"`
12
14
 
13
15
  # flags.coverage-json.summary
14
16
 
15
- Path to the code coverage JSON file created by the Salesforce CLI deployment or test command.
17
+ Path to the code coverage JSON file created by the Salesforce CLI deploy or test command.
16
18
 
17
19
  # flags.xml.summary
18
20
 
19
- Path to code coverage XML file that will be created by this plugin.
21
+ Path to the code coverage XML file that will be created by this plugin.
22
+
23
+ # flags.format.summary
24
+
25
+ Output format for the coverage report.
@@ -3,9 +3,11 @@
3
3
  "acc-transformer:transform": {
4
4
  "aliases": [],
5
5
  "args": {},
6
- "description": "This plugin will convert the code coverage JSON file created by the Salesforce CLI during Apex deployments and test runs into an XML accepted by tools like SonarQube.",
6
+ "description": "Transform the Apex code coverage JSON file created by the Salesforce CLI deploy and test command into SonarQube, Clover, or Cobertura format.",
7
7
  "examples": [
8
- "`sf acc-transformer transform -j \"coverage.json\" -x \"coverage.xml\"`"
8
+ "`sf acc-transformer transform -j \"coverage.json\" -x \"coverage.xml\" -f \"sonar\"`",
9
+ "`sf acc-transformer transform -j \"coverage.json\" -x \"coverage.xml\" -f \"cobertura\"`",
10
+ "`sf acc-transformer transform -j \"coverage.json\" -x \"coverage.xml\" -f \"clover\"`"
9
11
  ],
10
12
  "flags": {
11
13
  "json": {
@@ -27,7 +29,7 @@
27
29
  "char": "j",
28
30
  "name": "coverage-json",
29
31
  "required": true,
30
- "summary": "Path to the code coverage JSON file created by the Salesforce CLI deployment or test command.",
32
+ "summary": "Path to the code coverage JSON file created by the Salesforce CLI deploy or test command.",
31
33
  "hasDynamicHelp": false,
32
34
  "multiple": false,
33
35
  "type": "option"
@@ -36,11 +38,26 @@
36
38
  "char": "x",
37
39
  "name": "xml",
38
40
  "required": true,
39
- "summary": "Path to code coverage XML file that will be created by this plugin.",
41
+ "summary": "Path to the code coverage XML file that will be created by this plugin.",
40
42
  "default": "coverage.xml",
41
43
  "hasDynamicHelp": false,
42
44
  "multiple": false,
43
45
  "type": "option"
46
+ },
47
+ "format": {
48
+ "char": "f",
49
+ "name": "format",
50
+ "required": true,
51
+ "summary": "Output format for the coverage report.",
52
+ "default": "sonar",
53
+ "hasDynamicHelp": false,
54
+ "multiple": false,
55
+ "options": [
56
+ "sonar",
57
+ "cobertura",
58
+ "clover"
59
+ ],
60
+ "type": "option"
44
61
  }
45
62
  },
46
63
  "hasDynamicHelp": false,
@@ -50,7 +67,7 @@
50
67
  "pluginName": "apex-code-coverage-transformer",
51
68
  "pluginType": "core",
52
69
  "strict": true,
53
- "summary": "Transforms the Code Coverage JSON into the Generic Test Coverage Format (XML).",
70
+ "summary": "Transforms the Code Coverage JSON into SonarQube, Clover, or Cobertura format.",
54
71
  "enableJsonFlag": true,
55
72
  "isESM": true,
56
73
  "relativePath": [
@@ -66,5 +83,5 @@
66
83
  ]
67
84
  }
68
85
  },
69
- "version": "2.2.1"
86
+ "version": "2.4.0"
70
87
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "apex-code-coverage-transformer",
3
- "description": "Transforms the Apex code coverage JSON created during Salesforce deployments and test runs into the Generic Test Coverage Format (XML) for SonarQube.",
4
- "version": "2.2.1",
3
+ "description": "Transforms the Apex code coverage JSON created during Salesforce deployments and test runs into SonarQube, Clover, or Cobertura format.",
4
+ "version": "2.4.0",
5
5
  "dependencies": {
6
6
  "@oclif/core": "^4.0.37",
7
7
  "@salesforce/core": "^8.8.0",
@@ -45,7 +45,15 @@
45
45
  "sonarqube",
46
46
  "apex",
47
47
  "coverage",
48
- "git"
48
+ "git",
49
+ "cobertura",
50
+ "clover",
51
+ "converter",
52
+ "transformer",
53
+ "code",
54
+ "quality",
55
+ "validation",
56
+ "deployment"
49
57
  ],
50
58
  "license": "MIT",
51
59
  "oclif": {
@@ -1,2 +0,0 @@
1
- import { FileObject } from './types.js';
2
- export declare function setCoveredLines(coveredLines: number[], uncoveredLines: number[], repoRoot: string, filePath: string, fileObj: FileObject): Promise<void>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"setCoveredLines.js","sourceRoot":"","sources":["../../src/helpers/setCoveredLines.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAsB,EACtB,cAAwB,EACxB,QAAgB,EAChB,QAAgB,EAChB,OAAmB;IAEnB,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,WAAW,GAAG,UAAU,EAAE,CAAC;YAC7B,KAAK,IAAI,gBAAgB,GAAG,CAAC,EAAE,gBAAgB,IAAI,UAAU,EAAE,gBAAgB,EAAE,EAAE,CAAC;gBAClF,IACE,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC;oBAC1C,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC;oBACxC,CAAC,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACvC,CAAC;oBACD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;wBACvB,aAAa,EAAE,gBAAgB;wBAC/B,UAAU,EAAE,MAAM;qBACnB,CAAC,CAAC;oBACH,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBACnC,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvB,aAAa,EAAE,WAAW;gBAC1B,UAAU,EAAE,MAAM;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC"}