apex-code-coverage-transformer 2.20.0 → 2.22.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/CHANGELOG.md +15 -0
- package/README.md +36 -16
- package/lib/commands/acc-transformer/transform.d.ts +1 -0
- package/lib/commands/acc-transformer/transform.js +7 -0
- package/lib/commands/acc-transformer/transform.js.map +1 -1
- package/lib/hooks/finally.js +31 -32
- package/lib/hooks/finally.js.map +1 -1
- package/lib/transformers/coverageTransformer.d.ts +1 -0
- package/lib/transformers/coverageTransformer.js +8 -0
- package/lib/transformers/coverageTransformer.js.map +1 -1
- package/lib/utils/setCoveredLines.js +3 -0
- package/lib/utils/setCoveredLines.js.map +1 -1
- package/lib/utils/types.d.ts +4 -0
- package/messages/transformer.transform.md +4 -0
- package/oclif.manifest.json +10 -1
- package/package.json +8 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,21 @@
|
|
|
5
5
|
|
|
6
6
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
7
7
|
|
|
8
|
+
## [2.22.0](https://github.com/mcarvin8/apex-code-coverage-transformer/compare/v2.21.0...v2.22.0) (2026-06-12)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* add --exclude-pattern flag to filter files from coverage report ([#304](https://github.com/mcarvin8/apex-code-coverage-transformer/issues/304)) ([559c29e](https://github.com/mcarvin8/apex-code-coverage-transformer/commit/559c29ea007752a49f51b0e2c1933d732991fb46))
|
|
14
|
+
* expose min-coverage and max-annotations in hook config ([#302](https://github.com/mcarvin8/apex-code-coverage-transformer/issues/302)) ([310de46](https://github.com/mcarvin8/apex-code-coverage-transformer/commit/310de46343ca50ced5e39e250fc3014be0ed4c9c))
|
|
15
|
+
|
|
16
|
+
## [2.21.0](https://github.com/mcarvin8/apex-code-coverage-transformer/compare/v2.20.0...v2.21.0) (2026-06-02)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
* log out-of-range covered line remappings at debug level ([#300](https://github.com/mcarvin8/apex-code-coverage-transformer/issues/300)) ([e812869](https://github.com/mcarvin8/apex-code-coverage-transformer/commit/e812869eff4290af8d3e519ea59fd754475ac325))
|
|
22
|
+
|
|
8
23
|
## [2.20.0](https://github.com/mcarvin8/apex-code-coverage-transformer/compare/v2.19.2...v2.20.0) (2026-05-29)
|
|
9
24
|
|
|
10
25
|
|
package/README.md
CHANGED
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
[](https://raw.githubusercontent.com/mcarvin8/apex-code-coverage-transformer/main/LICENSE.md)
|
|
6
6
|
[](https://qlty.sh/gh/mcarvin8/projects/apex-code-coverage-transformer)
|
|
7
7
|
[](https://codecov.io/gh/mcarvin8/apex-code-coverage-transformer)
|
|
8
|
+
[](https://dashboard.stryker-mutator.io/reports/github.com/mcarvin8/apex-code-coverage-transformer/main)
|
|
8
9
|
|
|
9
|
-
A Salesforce CLI plugin that converts Apex code coverage JSON (from deploy or test runs) into formats used by SonarQube, Codecov, GitHub, GitLab, Azure DevOps, Bitbucket, and other tools
|
|
10
|
-
|
|
11
|
-
It also produces presentation-ready output for pull-request reviews: a Markdown summary for PR/MR comments and CI job summaries, and GitHub Actions workflow command annotations that surface uncovered lines inline on the PR diff. The GitHub Actions output pairs with the Apex code quality annotations from [sf-cat](https://www.npmjs.com/package/sf-cat), so a single PR can show coverage gaps and quality findings side-by-side.
|
|
10
|
+
A Salesforce CLI plugin that converts Apex code coverage JSON (from deploy or test runs) into formats used by SonarQube, Codecov, GitHub, GitLab, Azure DevOps, Bitbucket, and other tools, keeping coverage visible across pull requests, CI/CD pipelines, and code quality platforms.
|
|
12
11
|
|
|
13
12
|
> Missing an output format via `--format`? Open an [issue](https://github.com/mcarvin8/apex-code-coverage-transformer/issues) or submit a [pull request](https://github.com/mcarvin8/apex-code-coverage-transformer/blob/main/CONTRIBUTING.md).
|
|
14
13
|
|
|
@@ -112,7 +111,7 @@ Works with [sfdx-hardis](https://github.com/hardisgroupcom/sfdx-hardis):
|
|
|
112
111
|
|
|
113
112
|
```
|
|
114
113
|
USAGE
|
|
115
|
-
$ sf acc-transformer transform -j <value> [-r <value>] [-f <value>] [-i <value>]
|
|
114
|
+
$ sf acc-transformer transform -j <value> [-r <value>] [-f <value>] [-i <value>] [-e <value>]
|
|
116
115
|
[--min-coverage <value>] [--max-annotations <value>] [--json]
|
|
117
116
|
|
|
118
117
|
FLAGS
|
|
@@ -121,6 +120,8 @@ FLAGS
|
|
|
121
120
|
-f, --format=<value> Output format (repeat for multiple). Default: sonar.
|
|
122
121
|
Multiple formats append to filename, e.g. coverage-sonar.xml.
|
|
123
122
|
-i, --ignore-package-directory=<value> Package directory to ignore (as in sfdx-project.json). Repeatable.
|
|
123
|
+
-e, --exclude-pattern=<value> Glob pattern for file paths to exclude from the report. Matched against
|
|
124
|
+
the relative path from the repo root. Repeatable.
|
|
124
125
|
--min-coverage=<value> Minimum required line coverage percentage (0–100). Exits with an error
|
|
125
126
|
if overall coverage is below this value. Reports are written first.
|
|
126
127
|
--max-annotations=<value> Maximum ::warning annotations emitted by --format github-actions.
|
|
@@ -245,11 +246,7 @@ The `github-actions` format emits one [`::warning`](https://docs.github.com/en/a
|
|
|
245
246
|
run: cat coverage.txt
|
|
246
247
|
```
|
|
247
248
|
|
|
248
|
-
Pairs with [`sf-cat`](https://www.
|
|
249
|
-
|
|
250
|
-
```bash
|
|
251
|
-
sf acc-transformer transform -j "coverage/test-result-codecoverage.json" -f "markdown" -f "github-actions" -f "sonar"
|
|
252
|
-
```
|
|
249
|
+
Pairs with [`sf-cat`](https://www.github.com/mcarvin8/sf-cat) for code quality annotations on the same diff if you use Salesforce Code Analyzer.
|
|
253
250
|
|
|
254
251
|
### GitLab CI
|
|
255
252
|
|
|
@@ -300,13 +297,16 @@ Create `.apexcodecovtransformer.config.json` in the project root to transform co
|
|
|
300
297
|
|
|
301
298
|
Sample configs: [Salesforce CLI](https://raw.githubusercontent.com/mcarvin8/apex-code-coverage-transformer/main/defaults/salesforce-cli/.apexcodecovtransformer.config.json), [SFDX Hardis](https://raw.githubusercontent.com/mcarvin8/apex-code-coverage-transformer/main/defaults/sfdx-hardis/.apexcodecovtransformer.config.json).
|
|
302
299
|
|
|
303
|
-
| Key | Required | Description
|
|
304
|
-
| -------------------------- | ---------- |
|
|
305
|
-
| `deployCoverageJsonPath` | For deploy | Path to deploy coverage JSON.
|
|
306
|
-
| `testCoverageJsonPath` | For test | Path to test coverage JSON.
|
|
307
|
-
| `outputReportPath` | No | Output path (default: `coverage.[xml/info/json]` by format).
|
|
308
|
-
| `format` | No | Format(s), comma-separated (default: `sonar`).
|
|
309
|
-
| `ignorePackageDirectories` | No | Comma-separated package directories to ignore.
|
|
300
|
+
| Key | Required | Description |
|
|
301
|
+
| -------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
302
|
+
| `deployCoverageJsonPath` | For deploy | Path to deploy coverage JSON. |
|
|
303
|
+
| `testCoverageJsonPath` | For test | Path to test coverage JSON. |
|
|
304
|
+
| `outputReportPath` | No | Output path (default: `coverage.[xml/info/json]` by format). |
|
|
305
|
+
| `format` | No | Format(s), comma-separated (default: `sonar`). |
|
|
306
|
+
| `ignorePackageDirectories` | No | Comma-separated package directories to ignore. |
|
|
307
|
+
| `minCoverage` | No | Minimum required line coverage percentage (0–100). Exits with an error if overall coverage is below this threshold. |
|
|
308
|
+
| `maxAnnotations` | No | Maximum `::warning` annotations emitted when `format` includes `github-actions` (default: `50`). |
|
|
309
|
+
| `excludePatterns` | No | Comma-separated glob patterns for file paths to exclude (e.g. `**/*Test*,**/mock/**`). Matched against the relative path from the repo root. |
|
|
310
310
|
|
|
311
311
|
## Troubleshooting
|
|
312
312
|
|
|
@@ -350,6 +350,26 @@ Error (1): ENOENT: no such file or directory: {packageDir}
|
|
|
350
350
|
|
|
351
351
|
**Deploy coverage line numbers** — The Salesforce CLI deploy coverage JSON contains known out-of-range line numbers. This plugin corrects them automatically by re-numbering covered lines; uncovered lines are unaffected. Test-command coverage is unaffected. See [forcedotcom/salesforcedx-vscode#5511](https://github.com/forcedotcom/salesforcedx-vscode/issues/5511) and [forcedotcom/cli#1568](https://github.com/forcedotcom/cli/issues/1568).
|
|
352
352
|
|
|
353
|
+
To see each remapping, set `SF_LOG_LEVEL=debug` before running the command:
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
SF_LOG_LEVEL=debug sf acc-transformer transform -j "coverage/coverage/coverage.json" -r "coverage.xml" -f "sonar"
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
Each remapped line emits a log entry like:
|
|
360
|
+
|
|
361
|
+
```
|
|
362
|
+
Remapping out-of-range covered line 512 to line 47 in force-app/main/default/classes/AccountHandler.cls (file has 98 lines)
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
Logs are written to `~/.sf/sf-YYYY-MM-DD.log` by default. To print them to the terminal as well, set `DEBUG=sf:setCoveredLines`.
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
$ SF_LOG_LEVEL=debug DEBUG=sf:setCoveredLines sf acc-transformer transform -j "coverage/coverage/coverage.json" -r "coverage.xml" -f "sonar"
|
|
369
|
+
The coverage report has been written to: coverage.xml
|
|
370
|
+
[16:10:20.826] DEBUG (sf:setCoveredLines): Remapping out-of-range covered line 190 to line 1 in force-app/main/default/triggers/AccountTrigger.trigger (file has 105 lines)
|
|
371
|
+
```
|
|
372
|
+
|
|
353
373
|
## License
|
|
354
374
|
|
|
355
375
|
[MIT](https://raw.githubusercontent.com/mcarvin8/apex-code-coverage-transformer/main/LICENSE.md)
|
|
@@ -11,6 +11,7 @@ export default class TransformerTransform extends SfCommand<TransformerTransform
|
|
|
11
11
|
'ignore-package-directory': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
12
|
'min-coverage': import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
13
|
'max-annotations': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
'exclude-pattern': import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
15
|
};
|
|
15
16
|
run(): Promise<TransformerTransformResult>;
|
|
16
17
|
}
|
|
@@ -48,6 +48,12 @@ export default class TransformerTransform extends SfCommand {
|
|
|
48
48
|
min: 1,
|
|
49
49
|
default: DEFAULT_MAX_ANNOTATIONS,
|
|
50
50
|
}),
|
|
51
|
+
'exclude-pattern': Flags.string({
|
|
52
|
+
summary: messages.getMessage('flags.exclude-pattern.summary'),
|
|
53
|
+
char: 'e',
|
|
54
|
+
required: false,
|
|
55
|
+
multiple: true,
|
|
56
|
+
}),
|
|
51
57
|
};
|
|
52
58
|
async run() {
|
|
53
59
|
const { flags } = await this.parse(TransformerTransform);
|
|
@@ -55,6 +61,7 @@ export default class TransformerTransform extends SfCommand {
|
|
|
55
61
|
const result = await transformCoverageReport(flags['coverage-json'], flags['output-report'], flags['format'] ?? ['sonar'], flags['ignore-package-directory'] ?? [], {
|
|
56
62
|
minCoverage: flags['min-coverage'],
|
|
57
63
|
maxAnnotations: flags['max-annotations'],
|
|
64
|
+
excludePatterns: flags['exclude-pattern'],
|
|
58
65
|
});
|
|
59
66
|
warnings.push(...result.warnings);
|
|
60
67
|
this.log(`The coverage report has been written to: ${result.finalPaths.join(', ')}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/commands/acc-transformer/transform.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wDAAwD,CAAC;AAEjG,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,gCAAgC,EAAE,uBAAuB,CAAC,CAAC;AAElG,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,SAAqC;IAC9E,MAAM,CAAmB,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,CAAmB,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAC1E,MAAM,CAAmB,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAErE,MAAM,CAAmB,KAAK,GAAG;QACtC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC;YAC1B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,6BAA6B,CAAC;YAC3D,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC;YAC1B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,6BAA6B,CAAC;YAC3D,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,cAAc;SACxB,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,sBAAsB,CAAC;YACpD,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,aAAa;SACvB,CAAC;QACF,0BAA0B,EAAE,KAAK,CAAC,SAAS,CAAC;YAC1C,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,wCAAwC,CAAC;YACtE,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,0DAA0D;QAC1D,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC;YAC5B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,4BAA4B,CAAC;YAC1D,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,GAAG;SACT,CAAC;QACF,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC;YAC/B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,+BAA+B,CAAC;YAC7D,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,CAAC;YACN,OAAO,EAAE,uBAAuB;SACjC,CAAC;KACH,CAAC;IAEK,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAC1C,KAAK,CAAC,eAAe,CAAC,EACtB,KAAK,CAAC,eAAe,CAAC,EACtB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAC5B,KAAK,CAAC,0BAA0B,CAAC,IAAI,EAAE,EACvC;YACE,WAAW,EAAE,KAAK,CAAC,cAAc,CAAC;YAClC,cAAc,EAAE,KAAK,CAAC,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/commands/acc-transformer/transform.ts"],"names":[],"mappings":"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"}
|
package/lib/hooks/finally.js
CHANGED
|
@@ -4,10 +4,37 @@ import { readFile } from 'node:fs/promises';
|
|
|
4
4
|
import { resolve } from 'node:path';
|
|
5
5
|
import TransformerTransform from '../commands/acc-transformer/transform.js';
|
|
6
6
|
import { getRepoRoot } from '../utils/getRepoRoot.js';
|
|
7
|
+
function buildCommandArgs(coverageJsonPath, outputReportPath, configFile) {
|
|
8
|
+
const args = ['--coverage-json', coverageJsonPath, '--output-report', outputReportPath];
|
|
9
|
+
const coverageFormat = configFile.format || 'sonar';
|
|
10
|
+
if (coverageFormat.trim() !== '') {
|
|
11
|
+
for (const format of coverageFormat.split(',')) {
|
|
12
|
+
args.push('--format', format.replace(/,/g, ''));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const ignorePackageDirs = configFile.ignorePackageDirectories || '';
|
|
16
|
+
if (ignorePackageDirs.trim() !== '') {
|
|
17
|
+
for (const dir of ignorePackageDirs.split(',')) {
|
|
18
|
+
args.push('--ignore-package-directory', dir.replace(/,/g, ''));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (configFile.minCoverage !== undefined) {
|
|
22
|
+
args.push('--min-coverage', String(configFile.minCoverage));
|
|
23
|
+
}
|
|
24
|
+
if (configFile.maxAnnotations !== undefined) {
|
|
25
|
+
args.push('--max-annotations', String(configFile.maxAnnotations));
|
|
26
|
+
}
|
|
27
|
+
const excludePatterns = configFile.excludePatterns ?? '';
|
|
28
|
+
if (excludePatterns.trim() !== '') {
|
|
29
|
+
for (const pattern of excludePatterns.split(',')) {
|
|
30
|
+
args.push('--exclude-pattern', pattern.trim());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return args;
|
|
34
|
+
}
|
|
7
35
|
export const hook = async function (options) {
|
|
8
36
|
const commandId = options?.Command?.id ?? '';
|
|
9
37
|
let commandType;
|
|
10
|
-
let coverageJson;
|
|
11
38
|
if ([
|
|
12
39
|
'project:deploy:validate',
|
|
13
40
|
'project:deploy:start',
|
|
@@ -23,11 +50,11 @@ export const hook = async function (options) {
|
|
|
23
50
|
else {
|
|
24
51
|
return;
|
|
25
52
|
}
|
|
26
|
-
let configFile;
|
|
27
53
|
const { repoRoot } = await getRepoRoot();
|
|
28
54
|
if (!repoRoot) {
|
|
29
55
|
return;
|
|
30
56
|
}
|
|
57
|
+
let configFile;
|
|
31
58
|
const configPath = resolve(repoRoot, '.apexcodecovtransformer.config.json');
|
|
32
59
|
try {
|
|
33
60
|
const jsonString = await readFile(configPath, 'utf-8');
|
|
@@ -37,43 +64,15 @@ export const hook = async function (options) {
|
|
|
37
64
|
return;
|
|
38
65
|
}
|
|
39
66
|
const outputReport = configFile.outputReportPath || 'coverage.xml';
|
|
40
|
-
const
|
|
41
|
-
const ignorePackageDirs = configFile.ignorePackageDirectories || '';
|
|
42
|
-
if (commandType === 'deploy') {
|
|
43
|
-
coverageJson = configFile.deployCoverageJsonPath || '.';
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
coverageJson = configFile.testCoverageJsonPath || '.';
|
|
47
|
-
}
|
|
67
|
+
const coverageJson = commandType === 'deploy' ? configFile.deployCoverageJsonPath || '.' : configFile.testCoverageJsonPath || '.';
|
|
48
68
|
if (coverageJson.trim() === '.') {
|
|
49
69
|
return;
|
|
50
70
|
}
|
|
51
71
|
const coverageJsonPath = resolve(coverageJson);
|
|
52
|
-
const outputReportPath = resolve(outputReport);
|
|
53
72
|
if (!existsSync(coverageJsonPath)) {
|
|
54
73
|
return;
|
|
55
74
|
}
|
|
56
|
-
const commandArgs =
|
|
57
|
-
commandArgs.push('--coverage-json');
|
|
58
|
-
commandArgs.push(coverageJsonPath);
|
|
59
|
-
commandArgs.push('--output-report');
|
|
60
|
-
commandArgs.push(outputReportPath);
|
|
61
|
-
if (coverageFormat.trim() !== '') {
|
|
62
|
-
const formatArray = coverageFormat.split(',');
|
|
63
|
-
for (const format of formatArray) {
|
|
64
|
-
const sanitizedFormat = format.replace(/,/g, '');
|
|
65
|
-
commandArgs.push('--format');
|
|
66
|
-
commandArgs.push(sanitizedFormat);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (ignorePackageDirs.trim() !== '') {
|
|
70
|
-
const ignorePackageDirArray = ignorePackageDirs.split(',');
|
|
71
|
-
for (const dirs of ignorePackageDirArray) {
|
|
72
|
-
const sanitizedDir = dirs.replace(/,/g, '');
|
|
73
|
-
commandArgs.push('--ignore-package-directory');
|
|
74
|
-
commandArgs.push(sanitizedDir);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
75
|
+
const commandArgs = buildCommandArgs(coverageJsonPath, resolve(outputReport), configFile);
|
|
77
76
|
await TransformerTransform.run(commandArgs);
|
|
78
77
|
};
|
|
79
78
|
//# sourceMappingURL=finally.js.map
|
package/lib/hooks/finally.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finally.js","sourceRoot":"","sources":["../../src/hooks/finally.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,yBAAyB,CAAC;AAEtD,
|
|
1
|
+
{"version":3,"file":"finally.js","sourceRoot":"","sources":["../../src/hooks/finally.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export type TransformOptions = {
|
|
2
2
|
minCoverage?: number;
|
|
3
3
|
maxAnnotations?: number;
|
|
4
|
+
excludePatterns?: string[];
|
|
4
5
|
};
|
|
5
6
|
export declare function transformCoverageReport(jsonFilePath: string, outputReportPath: string, formats: string[], ignoreDirs: string[], options?: TransformOptions): Promise<{
|
|
6
7
|
finalPaths: string[];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-await-in-loop */
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
import { minimatch } from 'minimatch';
|
|
4
5
|
import { getCoverageHandler } from '../handlers/getHandler.js';
|
|
5
6
|
import { getPackageDirectories } from '../utils/getPackageDirectories.js';
|
|
6
7
|
import { findFilePath } from '../utils/findFilePath.js';
|
|
@@ -32,6 +33,7 @@ export async function transformCoverageReport(jsonFilePath, outputReportPath, fo
|
|
|
32
33
|
concurrencyLimit,
|
|
33
34
|
warnings,
|
|
34
35
|
filePathCache,
|
|
36
|
+
excludePatterns: options?.excludePatterns ?? [],
|
|
35
37
|
};
|
|
36
38
|
let processResult;
|
|
37
39
|
if (commandType === 'DeployCoverageData') {
|
|
@@ -102,6 +104,9 @@ async function processDeployCoverage(data, context) {
|
|
|
102
104
|
context.warnings.push(`The file name ${formattedName} was not found in any package directory.`);
|
|
103
105
|
return;
|
|
104
106
|
}
|
|
107
|
+
if (context.excludePatterns.some((pattern) => minimatch(path, pattern, { matchBase: true }))) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
105
110
|
const setCoveredResult = await setCoveredLines(path, context.repoRoot, fileInfo.s, context.handlers.has('html'));
|
|
106
111
|
const updatedLines = hasSourceContent(setCoveredResult) ? setCoveredResult.updatedLines : setCoveredResult;
|
|
107
112
|
const sourceContent = hasSourceContent(setCoveredResult) ? setCoveredResult.sourceContent : undefined;
|
|
@@ -127,6 +132,9 @@ async function processTestCoverage(data, context) {
|
|
|
127
132
|
context.warnings.push(`The file name ${formattedName} was not found in any package directory.`);
|
|
128
133
|
return;
|
|
129
134
|
}
|
|
135
|
+
if (context.excludePatterns.some((pattern) => minimatch(path, pattern, { matchBase: true }))) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
130
138
|
const counts = countLines(entry.lines);
|
|
131
139
|
totalLines += counts.totalLines;
|
|
132
140
|
coveredLines += counts.coveredLines;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverageTransformer.js","sourceRoot":"","sources":["../../src/transformers/coverageTransformer.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAA8B,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"coverageTransformer.js","sourceRoot":"","sources":["../../src/transformers/coverageTransformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { Logger } from '@salesforce/core';
|
|
3
4
|
import { getTotalLines } from './getTotalLines.js';
|
|
4
5
|
export async function setCoveredLines(filePath, repoRoot, lines, returnSourceContent = false) {
|
|
6
|
+
const logger = await Logger.child('setCoveredLines');
|
|
5
7
|
const result = await getTotalLines(join(repoRoot, filePath), returnSourceContent);
|
|
6
8
|
const totalLines = typeof result === 'number' ? result : result.totalLines;
|
|
7
9
|
const updatedLines = {};
|
|
@@ -12,6 +14,7 @@ export async function setCoveredLines(filePath, repoRoot, lines, returnSourceCon
|
|
|
12
14
|
if (status === 1 && lineNumber > totalLines) {
|
|
13
15
|
for (let randomLine = 1; randomLine <= totalLines; randomLine++) {
|
|
14
16
|
if (!usedLines.has(randomLine)) {
|
|
17
|
+
logger.debug(`Remapping out-of-range covered line ${lineNumber} to line ${randomLine} in ${filePath} (file has ${totalLines} lines)`);
|
|
15
18
|
updatedLines[randomLine.toString()] = status;
|
|
16
19
|
usedLines.add(randomLine);
|
|
17
20
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setCoveredLines.js","sourceRoot":"","sources":["../../src/utils/setCoveredLines.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,QAAgB,EAChB,KAA6B,EAC7B,mBAAmB,GAAG,KAAK;IAE3B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;IAC3E,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAEhH,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEtC,IAAI,MAAM,KAAK,CAAC,IAAI,UAAU,GAAG,UAAU,EAAE,CAAC;YAC5C,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC;gBAChE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC/B,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC;oBAC7C,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBAC1B,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;YAC5B,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,mBAAmB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
1
|
+
{"version":3,"file":"setCoveredLines.js","sourceRoot":"","sources":["../../src/utils/setCoveredLines.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,QAAgB,EAChB,KAA6B,EAC7B,mBAAmB,GAAG,KAAK;IAE3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;IAC3E,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAEhH,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEtC,IAAI,MAAM,KAAK,CAAC,IAAI,UAAU,GAAG,UAAU,EAAE,CAAC;YAC5C,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC;gBAChE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC/B,MAAM,CAAC,KAAK,CACV,uCAAuC,UAAU,YAAY,UAAU,OAAO,QAAQ,cAAc,UAAU,SAAS,CACxH,CAAC;oBACF,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC;oBAC7C,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBAC1B,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;YAC5B,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,mBAAmB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
package/lib/utils/types.d.ts
CHANGED
|
@@ -42,6 +42,7 @@ export type CoverageProcessingContext = {
|
|
|
42
42
|
concurrencyLimit: number;
|
|
43
43
|
warnings: string[];
|
|
44
44
|
filePathCache: Map<string, string>;
|
|
45
|
+
excludePatterns: string[];
|
|
45
46
|
};
|
|
46
47
|
type SonarLine = {
|
|
47
48
|
'@lineNumber': number;
|
|
@@ -63,6 +64,9 @@ export type HookFile = {
|
|
|
63
64
|
outputReportPath: string;
|
|
64
65
|
format: string;
|
|
65
66
|
ignorePackageDirectories: string;
|
|
67
|
+
minCoverage?: number;
|
|
68
|
+
maxAnnotations?: number;
|
|
69
|
+
excludePatterns?: string;
|
|
66
70
|
};
|
|
67
71
|
export type CoberturaLine = {
|
|
68
72
|
'@number': number;
|
|
@@ -39,3 +39,7 @@ Minimum required line coverage percentage (0–100). The command exits with an e
|
|
|
39
39
|
# flags.max-annotations.summary
|
|
40
40
|
|
|
41
41
|
Maximum number of GitHub Actions ::warning annotations to emit when using --format github-actions. Defaults to 50. Annotations beyond this limit are summarised in a ::notice line.
|
|
42
|
+
|
|
43
|
+
# flags.exclude-pattern.summary
|
|
44
|
+
|
|
45
|
+
Glob pattern for file paths to exclude from the coverage report. Matched against the relative path from the repo root (e.g. force-app/main/default/classes/MyClass.cls). Repeat the flag for multiple patterns.
|
package/oclif.manifest.json
CHANGED
|
@@ -96,6 +96,15 @@
|
|
|
96
96
|
"hasDynamicHelp": false,
|
|
97
97
|
"multiple": false,
|
|
98
98
|
"type": "option"
|
|
99
|
+
},
|
|
100
|
+
"exclude-pattern": {
|
|
101
|
+
"char": "e",
|
|
102
|
+
"name": "exclude-pattern",
|
|
103
|
+
"required": false,
|
|
104
|
+
"summary": "Glob pattern for file paths to exclude from the coverage report. Matched against the relative path from the repo root (e.g. force-app/main/default/classes/MyClass.cls). Repeat the flag for multiple patterns.",
|
|
105
|
+
"hasDynamicHelp": false,
|
|
106
|
+
"multiple": true,
|
|
107
|
+
"type": "option"
|
|
99
108
|
}
|
|
100
109
|
},
|
|
101
110
|
"hasDynamicHelp": false,
|
|
@@ -121,5 +130,5 @@
|
|
|
121
130
|
]
|
|
122
131
|
}
|
|
123
132
|
},
|
|
124
|
-
"version": "2.
|
|
133
|
+
"version": "2.22.0"
|
|
125
134
|
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apex-code-coverage-transformer",
|
|
3
3
|
"description": "Transform Salesforce Apex code coverage JSONs into other formats accepted by SonarQube, GitHub, GitLab, Azure, Bitbucket, etc.",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.22.0",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@oclif/core": "4.8.3",
|
|
7
7
|
"@salesforce/core": "8.26.3",
|
|
8
8
|
"@salesforce/sf-plugins-core": "12.2.6",
|
|
9
|
-
"fast-xml-builder": "1.2.0"
|
|
9
|
+
"fast-xml-builder": "1.2.0",
|
|
10
|
+
"minimatch": "10.2.5"
|
|
10
11
|
},
|
|
11
12
|
"devDependencies": {
|
|
12
13
|
"@commitlint/cli": "19.8.1",
|
|
@@ -15,6 +16,8 @@
|
|
|
15
16
|
"@salesforce/cli-plugins-testkit": "5.3.39",
|
|
16
17
|
"@salesforce/dev-config": "4.3.3",
|
|
17
18
|
"@salesforce/prettier-config": "0.0.4",
|
|
19
|
+
"@stryker-mutator/core": "9.6.1",
|
|
20
|
+
"@stryker-mutator/vitest-runner": "9.6.1",
|
|
18
21
|
"@types/node": "20.19.39",
|
|
19
22
|
"@vitest/coverage-v8": "4.1.5",
|
|
20
23
|
"eslint-config-salesforce-typescript": "4.0.1",
|
|
@@ -98,6 +101,9 @@
|
|
|
98
101
|
"prepack": "wireit",
|
|
99
102
|
"prepare": "husky install",
|
|
100
103
|
"test": "wireit",
|
|
104
|
+
"test:compile": "wireit",
|
|
105
|
+
"test:mutation": "stryker run",
|
|
106
|
+
"test:mutation:incremental": "node scripts/incremental-mutation.mjs",
|
|
101
107
|
"test:nuts": "oclif manifest && vitest run --config ./vitest.nut.config.ts",
|
|
102
108
|
"test:only": "wireit",
|
|
103
109
|
"version": "oclif readme"
|