apex-code-coverage-transformer 1.5.0 → 1.6.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.
package/README.md CHANGED
@@ -16,7 +16,7 @@ This will create a coverage JSON in this relative path - `coverage/coverage/cove
16
16
 
17
17
  This JSON isn't accepted by SonarQube automatically and needs to be converted using this plugin.
18
18
 
19
- **Note**: This has been tested and confirmed on code which meets 100% coverage.
19
+ **Disclaimer**: Due to existing bugs with how the Salesforce CLI reports `covered` lines (see [5511](https://github.com/forcedotcom/salesforcedx-vscode/issues/5511) and [1568](https://github.com/forcedotcom/cli/issues/1568)), to add support for `covered` lines in this plugin, I had to add a function to re-number out-of-range `covered` lines the CLI may report (ex: line 100 in a 98-line Apex Class is reported back as `covered` by the Salesforce CLI deploy command). Once Salesforce updates the API to correctly return `covered` lines in the deploy command, this function will be removed.
20
20
 
21
21
  ## Install
22
22
 
@@ -65,18 +65,99 @@ This [code coverage JSON file](https://raw.githubusercontent.com/mcarvin8/apex-c
65
65
  <lineToCover lineNumber="53" covered="false"/>
66
66
  <lineToCover lineNumber="59" covered="false"/>
67
67
  <lineToCover lineNumber="60" covered="false"/>
68
+ <lineToCover lineNumber="1" covered="true"/>
69
+ <lineToCover lineNumber="2" covered="true"/>
70
+ <lineToCover lineNumber="3" covered="true"/>
71
+ <lineToCover lineNumber="4" covered="true"/>
72
+ <lineToCover lineNumber="5" covered="true"/>
73
+ <lineToCover lineNumber="6" covered="true"/>
74
+ <lineToCover lineNumber="7" covered="true"/>
75
+ <lineToCover lineNumber="8" covered="true"/>
76
+ <lineToCover lineNumber="9" covered="true"/>
77
+ <lineToCover lineNumber="10" covered="true"/>
78
+ <lineToCover lineNumber="11" covered="true"/>
79
+ <lineToCover lineNumber="12" covered="true"/>
80
+ <lineToCover lineNumber="13" covered="true"/>
81
+ <lineToCover lineNumber="14" covered="true"/>
82
+ <lineToCover lineNumber="15" covered="true"/>
83
+ <lineToCover lineNumber="16" covered="true"/>
84
+ <lineToCover lineNumber="17" covered="true"/>
85
+ <lineToCover lineNumber="18" covered="true"/>
86
+ <lineToCover lineNumber="19" covered="true"/>
87
+ <lineToCover lineNumber="20" covered="true"/>
88
+ <lineToCover lineNumber="21" covered="true"/>
89
+ <lineToCover lineNumber="22" covered="true"/>
90
+ <lineToCover lineNumber="23" covered="true"/>
91
+ <lineToCover lineNumber="24" covered="true"/>
92
+ <lineToCover lineNumber="25" covered="true"/>
93
+ <lineToCover lineNumber="26" covered="true"/>
94
+ <lineToCover lineNumber="27" covered="true"/>
68
95
  </file>
69
96
  <file path="force-app\main\default\classes\AccountProfile.cls">
70
97
  <lineToCover lineNumber="52" covered="false"/>
71
98
  <lineToCover lineNumber="53" covered="false"/>
72
99
  <lineToCover lineNumber="59" covered="false"/>
73
100
  <lineToCover lineNumber="60" covered="false"/>
101
+ <lineToCover lineNumber="54" covered="true"/>
102
+ <lineToCover lineNumber="55" covered="true"/>
103
+ <lineToCover lineNumber="56" covered="true"/>
104
+ <lineToCover lineNumber="57" covered="true"/>
105
+ <lineToCover lineNumber="58" covered="true"/>
106
+ <lineToCover lineNumber="61" covered="true"/>
107
+ <lineToCover lineNumber="62" covered="true"/>
108
+ <lineToCover lineNumber="63" covered="true"/>
109
+ <lineToCover lineNumber="64" covered="true"/>
110
+ <lineToCover lineNumber="65" covered="true"/>
111
+ <lineToCover lineNumber="66" covered="true"/>
112
+ <lineToCover lineNumber="67" covered="true"/>
113
+ <lineToCover lineNumber="68" covered="true"/>
114
+ <lineToCover lineNumber="69" covered="true"/>
115
+ <lineToCover lineNumber="70" covered="true"/>
116
+ <lineToCover lineNumber="71" covered="true"/>
117
+ <lineToCover lineNumber="72" covered="true"/>
118
+ <lineToCover lineNumber="1" covered="true"/>
119
+ <lineToCover lineNumber="2" covered="true"/>
120
+ <lineToCover lineNumber="3" covered="true"/>
121
+ <lineToCover lineNumber="4" covered="true"/>
122
+ <lineToCover lineNumber="5" covered="true"/>
123
+ <lineToCover lineNumber="6" covered="true"/>
124
+ <lineToCover lineNumber="7" covered="true"/>
125
+ <lineToCover lineNumber="8" covered="true"/>
126
+ <lineToCover lineNumber="9" covered="true"/>
127
+ <lineToCover lineNumber="10" covered="true"/>
74
128
  </file>
75
- <file path="force-app\main\default\flows\Get_Info.flow-meta.xml">
129
+ <file path="packaged\flows\Get_Info.flow-meta.xml">
76
130
  <lineToCover lineNumber="52" covered="false"/>
77
131
  <lineToCover lineNumber="53" covered="false"/>
78
132
  <lineToCover lineNumber="59" covered="false"/>
79
133
  <lineToCover lineNumber="60" covered="false"/>
134
+ <lineToCover lineNumber="54" covered="true"/>
135
+ <lineToCover lineNumber="55" covered="true"/>
136
+ <lineToCover lineNumber="56" covered="true"/>
137
+ <lineToCover lineNumber="57" covered="true"/>
138
+ <lineToCover lineNumber="58" covered="true"/>
139
+ <lineToCover lineNumber="61" covered="true"/>
140
+ <lineToCover lineNumber="62" covered="true"/>
141
+ <lineToCover lineNumber="63" covered="true"/>
142
+ <lineToCover lineNumber="64" covered="true"/>
143
+ <lineToCover lineNumber="65" covered="true"/>
144
+ <lineToCover lineNumber="66" covered="true"/>
145
+ <lineToCover lineNumber="67" covered="true"/>
146
+ <lineToCover lineNumber="68" covered="true"/>
147
+ <lineToCover lineNumber="69" covered="true"/>
148
+ <lineToCover lineNumber="70" covered="true"/>
149
+ <lineToCover lineNumber="71" covered="true"/>
150
+ <lineToCover lineNumber="72" covered="true"/>
151
+ <lineToCover lineNumber="73" covered="true"/>
152
+ <lineToCover lineNumber="74" covered="true"/>
153
+ <lineToCover lineNumber="75" covered="true"/>
154
+ <lineToCover lineNumber="76" covered="true"/>
155
+ <lineToCover lineNumber="77" covered="true"/>
156
+ <lineToCover lineNumber="78" covered="true"/>
157
+ <lineToCover lineNumber="79" covered="true"/>
158
+ <lineToCover lineNumber="80" covered="true"/>
159
+ <lineToCover lineNumber="81" covered="true"/>
160
+ <lineToCover lineNumber="82" covered="true"/>
80
161
  </file>
81
162
  </coverage>
82
163
  ```
@@ -1,4 +1,5 @@
1
1
  'use strict';
2
+ import { getTotalLines } from './getTotalLines.js';
2
3
  import { findFilePath } from './findFilePath.js';
3
4
  export async function convertToGenericCoverageReport(data, dxConfigFile) {
4
5
  let xml = '<?xml version="1.0"?>\n<coverage version="1">\n';
@@ -11,15 +12,34 @@ export async function convertToGenericCoverageReport(data, dxConfigFile) {
11
12
  if (filePath === undefined) {
12
13
  throw Error(`The file name ${formattedFileName} was not found in any package directory.`);
13
14
  }
15
+ // Extract the "uncovered lines" from the JSON data
16
+ const uncoveredLines = Object.keys(fileInfo.s)
17
+ .filter(lineNumber => fileInfo.s[lineNumber] === 0)
18
+ .map(Number);
19
+ const coveredLines = Object.keys(fileInfo.s)
20
+ .filter(lineNumber => fileInfo.s[lineNumber] === 1)
21
+ .map(Number);
22
+ const randomLines = [];
23
+ const totalLines = getTotalLines(filePath);
14
24
  xml += `\t<file path="${filePath}">\n`;
15
- for (const lineNumber in fileInfo.s) {
16
- if (!Object.hasOwn(fileInfo.s, lineNumber))
17
- continue;
18
- const count = fileInfo.s[lineNumber];
19
- const covered = count > 0 ? 'true' : 'false';
20
- // only add uncovered lines
21
- if (covered === 'false')
22
- xml += `\t\t<lineToCover lineNumber="${lineNumber}" covered="${covered}"/>\n`;
25
+ for (const uncoveredLine of uncoveredLines) {
26
+ xml += `\t\t<lineToCover lineNumber="${uncoveredLine}" covered="false"/>\n`;
27
+ }
28
+ for (const coveredLine of coveredLines) {
29
+ if (coveredLine > totalLines) {
30
+ for (let randomLineNumber = 1; randomLineNumber <= totalLines; randomLineNumber++) {
31
+ if (!uncoveredLines.includes(randomLineNumber) &&
32
+ !coveredLines.includes(randomLineNumber) &&
33
+ !randomLines.includes(randomLineNumber)) {
34
+ xml += `\t\t<lineToCover lineNumber="${randomLineNumber}" covered="true"/>\n`;
35
+ randomLines.push(randomLineNumber);
36
+ break;
37
+ }
38
+ }
39
+ }
40
+ else {
41
+ xml += `\t\t<lineToCover lineNumber="${coveredLine}" covered="true"/>\n`;
42
+ }
23
43
  }
24
44
  xml += '\t</file>\n';
25
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"convertToGenericCoverageReport.js","sourceRoot":"","sources":["../../src/helpers/convertToGenericCoverageReport.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAIb,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,IAAkB,EAAE,YAAoB;IAC3F,IAAI,GAAG,GAAG,iDAAiD,CAAC;IAE5D,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,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QACrE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,KAAK,CAAC,iBAAiB,iBAAiB,0CAA0C,CAAC,CAAC;QAC5F,CAAC;QACD,GAAG,IAAI,iBAAiB,QAAQ,MAAM,CAAC;QAEvC,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC;gBAAE,SAAS;YACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,2BAA2B;YAC3B,IAAI,OAAO,KAAK,OAAO;gBAAE,GAAG,IAAI,gCAAgC,UAAU,cAAc,OAAO,OAAO,CAAC;QACzG,CAAC;QACD,GAAG,IAAI,aAAa,CAAC;IACvB,CAAC;IACD,GAAG,IAAI,aAAa,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"convertToGenericCoverageReport.js","sourceRoot":"","sources":["../../src/helpers/convertToGenericCoverageReport.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAIb,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,IAAkB,EAAE,YAAoB;IAC3F,IAAI,GAAG,GAAG,iDAAiD,CAAC;IAE5D,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,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QACrE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,KAAK,CAAC,iBAAiB,iBAAiB,0CAA0C,CAAC,CAAC;QAC5F,CAAC;QACD,mDAAmD;QACnD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;aAC3C,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAClD,GAAG,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;aACzC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAClD,GAAG,CAAC,MAAM,CAAC,CAAC;QACf,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QAE3C,GAAG,IAAI,iBAAiB,QAAQ,MAAM,CAAC;QAEvC,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,GAAG,IAAI,gCAAgC,aAAa,uBAAuB,CAAC;QAC9E,CAAC;QAED,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,WAAW,GAAG,UAAU,EAAE,CAAC;gBAC7B,KAAK,IAAI,gBAAgB,GAAG,CAAC,EAAE,gBAAgB,IAAI,UAAU,EAAE,gBAAgB,EAAE,EAAE,CAAC;oBAClF,IACE,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC;wBAC1C,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC;wBACxC,CAAC,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACvC,CAAC;wBACD,GAAG,IAAI,gCAAgC,gBAAgB,sBAAsB,CAAC;wBAC9E,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;wBACnC,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,IAAI,gCAAgC,WAAW,sBAAsB,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,GAAG,IAAI,aAAa,CAAC;IACvB,CAAC;IACD,GAAG,IAAI,aAAa,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function getTotalLines(filePath: string): number;
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+ import * as fs from 'node:fs';
3
+ export function getTotalLines(filePath) {
4
+ const fileContent = fs.readFileSync(filePath, 'utf8');
5
+ return fileContent.split(/\r\n|\r|\n/).length;
6
+ }
7
+ //# sourceMappingURL=getTotalLines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTotalLines.js","sourceRoot":"","sources":["../../src/helpers/getTotalLines.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;AAChD,CAAC"}
@@ -73,5 +73,5 @@
73
73
  ]
74
74
  }
75
75
  },
76
- "version": "1.5.0"
76
+ "version": "1.6.0"
77
77
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "apex-code-coverage-transformer",
3
3
  "description": "Transforms the Apex Code Coverage JSON into the Generic Test Data Report.",
4
- "version": "1.5.0",
4
+ "version": "1.6.0",
5
5
  "dependencies": {
6
6
  "@oclif/core": "^3.18.1",
7
7
  "@salesforce/core": "^6.4.7",