apex-code-coverage-transformer 1.2.0 → 1.3.1
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
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/apex-code-coverage-transformer) [](https://npmjs.org/package/apex-code-coverage-transformer) [](https://raw.githubusercontent.com/mcarvin8/apex-code-coverage-transformer/main/LICENSE.md)
|
|
4
4
|
|
|
5
|
-
The `apex-code-coverage-transformer` is a simple plugin to transform the
|
|
5
|
+
The `apex-code-coverage-transformer` is a simple Salesforce CLI plugin to transform the Apex Code Coverage JSON file into Generic Test Coverage Format (XML). This format is accepted by static code analysis tools like SonarQube.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
This plugin supports code coverage metrics created for Apex Classes, Apex Triggers, and Flows (if flows are deployed as active in your org).
|
|
8
|
+
|
|
9
|
+
To create the code coverage JSON during a Salesforce CLI deployment/validation, append `--coverage-formatters json --results-dir coverage` to the `sf project deploy` command:
|
|
8
10
|
|
|
9
11
|
```
|
|
10
12
|
sf project deploy validate -x manifest/package.xml -l RunSpecifiedTests -t {testclasses} --verbose --coverage-formatters json --results-dir coverage
|
|
@@ -14,7 +16,7 @@ This will create a coverage JSON in this relative path - `coverage/coverage/cove
|
|
|
14
16
|
|
|
15
17
|
This JSON isn't accepted by SonarQube automatically and needs to be converted using this plugin.
|
|
16
18
|
|
|
17
|
-
Note
|
|
19
|
+
**Note**: This has been tested and confirmed on code which meets 100% coverage.
|
|
18
20
|
|
|
19
21
|
## Install
|
|
20
22
|
|
|
@@ -200,6 +202,79 @@ A JSON created by the Salesforce CLI :
|
|
|
200
202
|
"81": { "start": { "line": 81, "column": 0 }, "end": { "line": 81, "column": 0 } },
|
|
201
203
|
"82": { "start": { "line": 82, "column": 0 }, "end": { "line": 82, "column": 0 } }
|
|
202
204
|
}
|
|
205
|
+
},
|
|
206
|
+
"no-map/Get_Info": {
|
|
207
|
+
"fnMap": {},
|
|
208
|
+
"branchMap": {},
|
|
209
|
+
"path": "no-map/Get_Info",
|
|
210
|
+
"f": {},
|
|
211
|
+
"b": {},
|
|
212
|
+
"s": {
|
|
213
|
+
"52": 0,
|
|
214
|
+
"53": 0,
|
|
215
|
+
"54": 1,
|
|
216
|
+
"55": 1,
|
|
217
|
+
"56": 1,
|
|
218
|
+
"57": 1,
|
|
219
|
+
"58": 1,
|
|
220
|
+
"59": 0,
|
|
221
|
+
"60": 0,
|
|
222
|
+
"61": 1,
|
|
223
|
+
"62": 1,
|
|
224
|
+
"63": 1,
|
|
225
|
+
"64": 1,
|
|
226
|
+
"65": 1,
|
|
227
|
+
"66": 1,
|
|
228
|
+
"67": 1,
|
|
229
|
+
"68": 1,
|
|
230
|
+
"69": 1,
|
|
231
|
+
"70": 1,
|
|
232
|
+
"71": 1,
|
|
233
|
+
"72": 1,
|
|
234
|
+
"73": 1,
|
|
235
|
+
"74": 1,
|
|
236
|
+
"75": 1,
|
|
237
|
+
"76": 1,
|
|
238
|
+
"77": 1,
|
|
239
|
+
"78": 1,
|
|
240
|
+
"79": 1,
|
|
241
|
+
"80": 1,
|
|
242
|
+
"81": 1,
|
|
243
|
+
"82": 1
|
|
244
|
+
},
|
|
245
|
+
"statementMap": {
|
|
246
|
+
"52": { "start": { "line": 52, "column": 0 }, "end": { "line": 52, "column": 0 } },
|
|
247
|
+
"53": { "start": { "line": 53, "column": 0 }, "end": { "line": 53, "column": 0 } },
|
|
248
|
+
"54": { "start": { "line": 54, "column": 0 }, "end": { "line": 54, "column": 0 } },
|
|
249
|
+
"55": { "start": { "line": 55, "column": 0 }, "end": { "line": 55, "column": 0 } },
|
|
250
|
+
"56": { "start": { "line": 56, "column": 0 }, "end": { "line": 56, "column": 0 } },
|
|
251
|
+
"57": { "start": { "line": 57, "column": 0 }, "end": { "line": 57, "column": 0 } },
|
|
252
|
+
"58": { "start": { "line": 58, "column": 0 }, "end": { "line": 58, "column": 0 } },
|
|
253
|
+
"59": { "start": { "line": 59, "column": 0 }, "end": { "line": 59, "column": 0 } },
|
|
254
|
+
"60": { "start": { "line": 60, "column": 0 }, "end": { "line": 60, "column": 0 } },
|
|
255
|
+
"61": { "start": { "line": 61, "column": 0 }, "end": { "line": 61, "column": 0 } },
|
|
256
|
+
"62": { "start": { "line": 62, "column": 0 }, "end": { "line": 62, "column": 0 } },
|
|
257
|
+
"63": { "start": { "line": 63, "column": 0 }, "end": { "line": 63, "column": 0 } },
|
|
258
|
+
"64": { "start": { "line": 64, "column": 0 }, "end": { "line": 64, "column": 0 } },
|
|
259
|
+
"65": { "start": { "line": 65, "column": 0 }, "end": { "line": 65, "column": 0 } },
|
|
260
|
+
"66": { "start": { "line": 66, "column": 0 }, "end": { "line": 66, "column": 0 } },
|
|
261
|
+
"67": { "start": { "line": 67, "column": 0 }, "end": { "line": 67, "column": 0 } },
|
|
262
|
+
"68": { "start": { "line": 68, "column": 0 }, "end": { "line": 68, "column": 0 } },
|
|
263
|
+
"69": { "start": { "line": 69, "column": 0 }, "end": { "line": 69, "column": 0 } },
|
|
264
|
+
"70": { "start": { "line": 70, "column": 0 }, "end": { "line": 70, "column": 0 } },
|
|
265
|
+
"71": { "start": { "line": 71, "column": 0 }, "end": { "line": 71, "column": 0 } },
|
|
266
|
+
"72": { "start": { "line": 72, "column": 0 }, "end": { "line": 72, "column": 0 } },
|
|
267
|
+
"73": { "start": { "line": 73, "column": 0 }, "end": { "line": 73, "column": 0 } },
|
|
268
|
+
"74": { "start": { "line": 74, "column": 0 }, "end": { "line": 74, "column": 0 } },
|
|
269
|
+
"75": { "start": { "line": 75, "column": 0 }, "end": { "line": 75, "column": 0 } },
|
|
270
|
+
"76": { "start": { "line": 76, "column": 0 }, "end": { "line": 76, "column": 0 } },
|
|
271
|
+
"77": { "start": { "line": 77, "column": 0 }, "end": { "line": 77, "column": 0 } },
|
|
272
|
+
"78": { "start": { "line": 78, "column": 0 }, "end": { "line": 78, "column": 0 } },
|
|
273
|
+
"79": { "start": { "line": 79, "column": 0 }, "end": { "line": 79, "column": 0 } },
|
|
274
|
+
"80": { "start": { "line": 80, "column": 0 }, "end": { "line": 80, "column": 0 } },
|
|
275
|
+
"81": { "start": { "line": 81, "column": 0 }, "end": { "line": 81, "column": 0 } },
|
|
276
|
+
"82": { "start": { "line": 82, "column": 0 }, "end": { "line": 82, "column": 0 } }
|
|
277
|
+
}
|
|
203
278
|
}
|
|
204
279
|
}
|
|
205
280
|
```
|
|
@@ -221,5 +296,11 @@ will be converted to:
|
|
|
221
296
|
<lineToCover lineNumber="59" covered="false"/>
|
|
222
297
|
<lineToCover lineNumber="60" covered="false"/>
|
|
223
298
|
</file>
|
|
299
|
+
<file path="force-app/main/default/flows/Get_Info.flow-meta.xml">
|
|
300
|
+
<lineToCover lineNumber="52" covered="false"/>
|
|
301
|
+
<lineToCover lineNumber="53" covered="false"/>
|
|
302
|
+
<lineToCover lineNumber="59" covered="false"/>
|
|
303
|
+
<lineToCover lineNumber="60" covered="false"/>
|
|
304
|
+
</file>
|
|
224
305
|
</coverage>
|
|
225
306
|
```
|
|
@@ -10,10 +10,11 @@ export default class TransformerTransform extends SfCommand {
|
|
|
10
10
|
static description = messages.getMessage('description');
|
|
11
11
|
static examples = messages.getMessages('examples');
|
|
12
12
|
static flags = {
|
|
13
|
-
'dx-directory': Flags.
|
|
13
|
+
'dx-directory': Flags.directory({
|
|
14
14
|
summary: messages.getMessage('flags.dx-directory.summary'),
|
|
15
15
|
char: 'd',
|
|
16
16
|
required: true,
|
|
17
|
+
exists: true,
|
|
17
18
|
default: 'force-app/main/default',
|
|
18
19
|
}),
|
|
19
20
|
'coverage-json': Flags.file({
|
|
@@ -60,16 +61,21 @@ export default class TransformerTransform extends SfCommand {
|
|
|
60
61
|
function findFilePath(className, dxDirectory) {
|
|
61
62
|
const relativeClassPath = `${dxDirectory}/classes/${className}.cls`;
|
|
62
63
|
const relativeTriggerPath = `${dxDirectory}/triggers/${className}.trigger`;
|
|
64
|
+
const relativeFlowPath = `${dxDirectory}/flows/${className}.flow-meta.xml`;
|
|
63
65
|
const absoluteClassPath = path.resolve(relativeClassPath);
|
|
64
66
|
const absoluteTriggerPath = path.resolve(relativeTriggerPath);
|
|
67
|
+
const absoluteFlowPath = path.resolve(relativeFlowPath);
|
|
65
68
|
if (fs.existsSync(absoluteClassPath)) {
|
|
66
69
|
return relativeClassPath;
|
|
67
70
|
}
|
|
68
71
|
else if (fs.existsSync(absoluteTriggerPath)) {
|
|
69
72
|
return relativeTriggerPath;
|
|
70
73
|
}
|
|
74
|
+
else if (fs.existsSync(absoluteFlowPath)) {
|
|
75
|
+
return relativeFlowPath;
|
|
76
|
+
}
|
|
71
77
|
else {
|
|
72
|
-
throw Error(`The file name ${className} was not found in the classes or
|
|
78
|
+
throw Error(`The file name ${className} was not found in the classes, triggers, or flows directory.`);
|
|
73
79
|
}
|
|
74
80
|
}
|
|
75
81
|
function convertToGenericTestReport(data, dxDirectory) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/commands/apex-code-coverage/transformer/transform.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,gCAAgC,EAAE,uBAAuB,CAAC,CAAC;AAMlG,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,SAAqC;IAC9E,MAAM,CAAU,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,CAAU,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,CAAU,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE5D,MAAM,CAAU,KAAK,GAAG;QAC7B,cAAc,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/commands/apex-code-coverage/transformer/transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ This plugin will convert the JSON file created by the Salesforce CLI during Apex
|
|
|
8
8
|
|
|
9
9
|
# examples
|
|
10
10
|
|
|
11
|
-
- `sf apex-code-coverage transformer transform --json "path-to-cli-coverage.json"`
|
|
11
|
+
- `sf apex-code-coverage transformer transform --coverage-json "path-to-cli-coverage.json"`
|
|
12
12
|
|
|
13
13
|
# flags.dx-directory.summary
|
|
14
14
|
|
package/oclif.manifest.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"args": {},
|
|
6
6
|
"description": "This plugin will convert the JSON file created by the Salesforce CLI during Apex deployments",
|
|
7
7
|
"examples": [
|
|
8
|
-
"`sf apex-code-coverage transformer transform --json \"path-to-cli-coverage.json\"`"
|
|
8
|
+
"`sf apex-code-coverage transformer transform --coverage-json \"path-to-cli-coverage.json\"`"
|
|
9
9
|
],
|
|
10
10
|
"flags": {
|
|
11
11
|
"json": {
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
]
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
|
-
"version": "1.
|
|
76
|
+
"version": "1.3.1"
|
|
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.
|
|
4
|
+
"version": "1.3.1",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@oclif/core": "^3.18.1",
|
|
7
7
|
"@salesforce/core": "^6.4.7",
|
|
@@ -45,7 +45,8 @@
|
|
|
45
45
|
"sfdx",
|
|
46
46
|
"sfdx-plugin",
|
|
47
47
|
"xml",
|
|
48
|
-
"json"
|
|
48
|
+
"json",
|
|
49
|
+
"sonarqube"
|
|
49
50
|
],
|
|
50
51
|
"license": "MIT",
|
|
51
52
|
"oclif": {
|
|
@@ -182,5 +183,12 @@
|
|
|
182
183
|
},
|
|
183
184
|
"exports": "./lib/index.js",
|
|
184
185
|
"type": "module",
|
|
185
|
-
"author": "Matt Carvin"
|
|
186
|
+
"author": "Matt Carvin",
|
|
187
|
+
"repository": {
|
|
188
|
+
"type": "git",
|
|
189
|
+
"url": "git+https://github.com/mcarvin8/apex-code-coverage-transformer.git"
|
|
190
|
+
},
|
|
191
|
+
"bugs": {
|
|
192
|
+
"url": "https://github.com/mcarvin8/apex-code-coverage-transformer/issues"
|
|
193
|
+
}
|
|
186
194
|
}
|