apex-code-coverage-transformer 3.1.12 → 4.0.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 CHANGED
@@ -5,6 +5,17 @@
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
+ ## [4.0.0](https://github.com/mcarvin8/apex-code-coverage-transformer/compare/v3.1.12...v4.0.0) (2026-11-05)
9
+
10
+
11
+ ### ⚠ BREAKING CHANGES
12
+
13
+ * remove deploy coverage line renumbering ([#429](https://github.com/mcarvin8/apex-code-coverage-transformer/issues/429))
14
+
15
+ ### Features
16
+
17
+ * remove deploy coverage line renumbering ([#429](https://github.com/mcarvin8/apex-code-coverage-transformer/issues/429)) ([0c15717](https://github.com/mcarvin8/apex-code-coverage-transformer/commit/0c157176edb7a9e0513f8558960f47bd97558a4a))
18
+
8
19
  ## [3.1.12](https://github.com/mcarvin8/apex-code-coverage-transformer/compare/v3.1.11...v3.1.12) (2026-10-28)
9
20
 
10
21
 
package/README.md CHANGED
@@ -6,11 +6,13 @@
6
6
  [![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://raw.githubusercontent.com/mcarvin8/apex-code-coverage-transformer/main/LICENSE.md)
7
7
  [![codecov](https://codecov.io/gh/mcarvin8/apex-code-coverage-transformer/graph/badge.svg?token=4IQ4NWTPQZ)](https://codecov.io/gh/mcarvin8/apex-code-coverage-transformer)
8
8
  [![Mutation testing badge](https://img.shields.io/endpoint?style=flat&url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2Fmcarvin8%2Fapex-code-coverage-transformer%2Fmain)](https://dashboard.stryker-mutator.io/reports/github.com/mcarvin8/apex-code-coverage-transformer/main)
9
+ <!-- gh-dependents-info-used-by-start -->
10
+ [![Generated by github-dependents-info](https://img.shields.io/static/v1?label=Used%20by&message=2&color=informational&logo=slickpic)](https://github.com/mcarvin8/apex-code-coverage-transformer/blob/main/docs/github-dependents-info.md)<!-- gh-dependents-info-used-by-end -->
9
11
 
10
12
  Transforms (and optionally merges) Apex code coverage JSON from Salesforce deployments 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. Available as a **Salesforce CLI plugin** for any provider, and as a **native GitHub Action** for GitHub Actions users who want to skip installing the CLI.
11
13
 
12
14
  > [!WARNING]
13
- > **Note:** Salesforce deploy command coverage reports contain a known bug where covered lines can be reported beyond the end of a file. This plugin automatically re-numbers those lines to keep deploy coverage accurate. Salesforce API v68.0 is expected to resolve the bug; the fix is kept in place for API v67.0 and earlier. Test-command coverage is unaffected. See [Troubleshooting](#troubleshooting) for details.
15
+ > **v4 breaking change:** v3 and earlier automatically re-numbered deploy command coverage lines that Salesforce reported beyond the end of a file. Salesforce fixed this bug server-side in Winter '27 (API v68.0), regardless of the `--api-version` used on the deploy, so v4 removes the re-numbering and passes deploy coverage lines through exactly as reported. Test-command coverage is unaffected. See [Troubleshooting](#troubleshooting) for details.
14
16
 
15
17
  <details>
16
18
  <summary>Table of Contents</summary>
@@ -128,6 +130,7 @@ Works with [sfdx-hardis](https://github.com/hardisgroupcom/sfdx-hardis):
128
130
 
129
131
  ## Command Reference
130
132
 
133
+ <!-- biome-ignore format: oclif readme writes this list with `*` bullets -->
131
134
  <!-- commands -->
132
135
  * [`sf acc-transformer transform`](#sf-acc-transformer-transform)
133
136
 
@@ -194,7 +197,7 @@ EXAMPLES
194
197
  `sf acc-transformer transform -j "coverage1.json" -j "coverage2.json" -r "coverage.xml" -f "sonar"`
195
198
  ```
196
199
 
197
- _See code: [src/commands/acc-transformer/transform.ts](https://github.com/mcarvin8/apex-code-coverage-transformer/blob/v3.1.12/src/commands/acc-transformer/transform.ts)_
200
+ _See code: [src/commands/acc-transformer/transform.ts](https://github.com/mcarvin8/apex-code-coverage-transformer/blob/v4.0.0/src/commands/acc-transformer/transform.ts)_
198
201
  <!-- commandsstop -->
199
202
 
200
203
  ## Coverage Report Formats
@@ -202,7 +205,7 @@ _See code: [src/commands/acc-transformer/transform.ts](https://github.com/mcarvi
202
205
  Use `-f` / `--format` to choose the output format. Multiple `-f` values produce multiple files with the format in the name (e.g. `coverage-sonar.xml`, `coverage-cobertura.xml`).
203
206
 
204
207
  | Format | Description | Typical use | Example |
205
- |----------------|----------------------------|-----------------------------------------|-----------------------------------------------------------------------------------------|
208
+ | -------------- | -------------------------- | --------------------------------------- | --------------------------------------------------------------------------------------- |
206
209
  | sonar | SonarQube generic coverage | SonarQube, SonarCloud | `sf acc-transformer transform -j "coverage.json" -r "coverage.xml" -f "sonar"` |
207
210
  | cobertura | Cobertura XML | Codecov, Azure, Jenkins, GitLab, GitHub | `sf acc-transformer transform -j "coverage.json" -r "coverage.xml" -f "cobertura"` |
208
211
  | jacoco | JaCoCo XML | Codecov, Jenkins, Maven, Gradle | `sf acc-transformer transform -j "coverage.json" -r "coverage.xml" -f "jacoco"` |
@@ -235,7 +238,7 @@ jobs:
235
238
  - name: Set up Node.js
236
239
  uses: actions/setup-node@v4
237
240
  with:
238
- node-version: '20'
241
+ node-version: "20"
239
242
 
240
243
  - name: Install Salesforce CLI
241
244
  run: npm install -g @salesforce/cli@latest
@@ -407,7 +410,7 @@ jobs:
407
410
  fetch-depth: 0
408
411
  - uses: actions/setup-node@v4
409
412
  with:
410
- node-version: '20'
413
+ node-version: "20"
411
414
  - run: npm install -g @salesforce/cli@latest
412
415
  - run: echo y | sf plugins install apex-code-coverage-transformer
413
416
  - name: Download Suite A coverage
@@ -491,7 +494,7 @@ pool:
491
494
  steps:
492
495
  - task: NodeTool@0
493
496
  inputs:
494
- versionSpec: '20.x'
497
+ versionSpec: "20.x"
495
498
  displayName: Set up Node.js
496
499
 
497
500
  - script: npm install -g @salesforce/cli@latest
@@ -533,7 +536,7 @@ Create `.apexcodecovtransformer.config.json` in the project root to transform co
533
536
  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).
534
537
 
535
538
  | Key | Required | Description |
536
- |----------------------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------|
539
+ | -------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
537
540
  | `deployCoverageJsonPath` | For deploy | Path to deploy coverage JSON. |
538
541
  | `testCoverageJsonPath` | For test | Path to test coverage JSON. |
539
542
  | `outputReportPath` | No | Output path (default: `coverage.[xml/info/json]` by format). |
@@ -589,17 +592,7 @@ Error (1): sfdx-project.json not found in any parent directory.
589
592
  Error (1): ENOENT: no such file or directory: {packageDir}
590
593
  ```
591
594
 
592
- **Deploy coverage line numbers** — Salesforce deploy command coverage reports contain known out-of-range line numbers, regardless of the coverage format requested from the Salesforce CLI. 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).
593
-
594
- Salesforce API v68.0 is expected to resolve the out-of-range line numbers in deploy coverage. The re-numbering logic is kept intact for compatibility with API v67.0 and earlier. It only acts on covered lines beyond the end of a file, so when deploy coverage contains no out-of-range lines, it makes no changes.
595
-
596
- To see each remapping, set `SF_LOG_LEVEL=debug` before running the command - each remapped line prints directly to the terminal:
597
-
598
- ```bash
599
- $ SF_LOG_LEVEL=debug sf acc-transformer transform -j "coverage/coverage/coverage.json" -r "coverage.xml" -f "sonar"
600
- [DEBUG] setCoveredLines: Remapping out-of-range covered line 512 to line 47 in force-app/main/default/classes/AccountHandler.cls (file has 98 lines)
601
- The coverage report has been written to: coverage.xml
602
- ```
595
+ **Deploy coverage line numbers** — Older Salesforce deploy command coverage reports could contain covered lines numbered past the end of a file ([forcedotcom/salesforcedx-vscode#5511](https://github.com/forcedotcom/salesforcedx-vscode/issues/5511), [forcedotcom/cli#1568](https://github.com/forcedotcom/cli/issues/1568)). Salesforce fixed this server-side in Winter '27 (API v68.0), and the fix applies regardless of the `--api-version` requested on the deploy. Versions 3.x and earlier of this plugin re-numbered those lines; starting with v4, deploy coverage lines are passed through as reported by Salesforce. If you still see out-of-range lines in deploy coverage, please [open an issue](https://github.com/mcarvin8/apex-code-coverage-transformer/issues/2).
603
596
 
604
597
  ## Questions or Issues?
605
598
 
@@ -6,7 +6,6 @@ import { getCoverageHandler } from '../handlers/getHandler.js';
6
6
  import { findFilePath } from '../utils/findFilePath.js';
7
7
  import { matchesGlob } from '../utils/globMatcher.js';
8
8
  import { mapLimit } from '../utils/mapLimit.js';
9
- import { setCoveredLines } from '../utils/setCoveredLines.js';
10
9
  export function createHandlers(formats) {
11
10
  const handlers = new Map();
12
11
  for (const format of formats) {
@@ -14,9 +13,6 @@ export function createHandlers(formats) {
14
13
  }
15
14
  return handlers;
16
15
  }
17
- function hasSourceContent(result) {
18
- return typeof result === 'object' && result !== null && 'sourceContent' in result;
19
- }
20
16
  async function readSourceFile(absolutePath) {
21
17
  try {
22
18
  return await readFile(absolutePath, 'utf-8');
@@ -25,6 +21,9 @@ async function readSourceFile(absolutePath) {
25
21
  return undefined;
26
22
  }
27
23
  }
24
+ function loadSourceContent(path, context) {
25
+ return context.handlers.has('html') ? readSourceFile(join(context.repoRoot, path)) : Promise.resolve(undefined);
26
+ }
28
27
  export function countLines(lines) {
29
28
  const totalLines = Object.keys(lines).length;
30
29
  const coveredLines = Object.values(lines).filter((v) => v === 1).length;
@@ -56,18 +55,15 @@ async function processEntries(items, context, getName, resolveLines) {
56
55
  return { processed, totalLines, coveredLines };
57
56
  }
58
57
  export function processDeployCoverage(data, context) {
59
- return processEntries(Object.keys(data), context, (fileName) => fileName, async (fileName, path) => {
60
- const fileInfo = data[fileName];
61
- const result = await setCoveredLines(path, context.repoRoot, fileInfo.s, context.handlers.has('html'));
62
- const updatedLines = hasSourceContent(result) ? result.updatedLines : result;
63
- fileInfo.s = updatedLines;
64
- return { lines: updatedLines, sourceContent: hasSourceContent(result) ? result.sourceContent : undefined };
65
- });
58
+ return processEntries(Object.keys(data), context, (fileName) => fileName, async (fileName, path) => ({
59
+ lines: data[fileName].s,
60
+ sourceContent: await loadSourceContent(path, context),
61
+ }));
66
62
  }
67
63
  export function processTestCoverage(data, context) {
68
64
  return processEntries(data, context, (entry) => entry.name, async (entry, path) => ({
69
65
  lines: entry.lines,
70
- sourceContent: context.handlers.has('html') ? await readSourceFile(join(context.repoRoot, path)) : undefined,
66
+ sourceContent: await loadSourceContent(path, context),
71
67
  }));
72
68
  }
73
69
  //# sourceMappingURL=coverageProcessor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coverageProcessor.js","sourceRoot":"","sources":["../../src/transformers/coverageProcessor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coverageProcessor.js","sourceRoot":"","sources":["../../src/transformers/coverageProcessor.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAShD,MAAM,UAAU,cAAc,CAAC,OAAiB;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiD,CAAC;IAC1E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,YAAoB;IAChD,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,OAAkC;IACzE,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAA6B;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACtC,CAAC;AAID,KAAK,UAAU,cAAc,CAC3B,KAAU,EACV,OAAkC,EAClC,OAA4B,EAC5B,YAA+D;IAE/D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,EAAE,KAAK,EAAE,IAAO,EAAE,EAAE;QAChE,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAEhE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,aAAa,0CAA0C,CAAC,CAAC;YAChG,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/F,OAAO;QACT,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;QAChC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC;QAEpC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAChD,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QACjE,CAAC;QACD,SAAS,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,IAAwB,EACxB,OAAkC;IAElC,OAAO,cAAc,CACnB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EACjB,OAAO,EACP,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACzB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvB,aAAa,EAAE,MAAM,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC;KACtD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAwB,EACxB,OAAkC;IAElC,OAAO,cAAc,CACnB,IAAI,EACJ,OAAO,EACP,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EACrB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,aAAa,EAAE,MAAM,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC;KACtD,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -131,5 +131,5 @@
131
131
  ]
132
132
  }
133
133
  },
134
- "version": "3.1.12"
134
+ "version": "4.0.0"
135
135
  }
package/package.json CHANGED
@@ -1,34 +1,34 @@
1
1
  {
2
2
  "name": "apex-code-coverage-transformer",
3
3
  "description": "Transform Salesforce Apex code coverage JSON for SonarQube, SonarCloud, GitHub, GitLab, Azure, and Bitbucket",
4
- "version": "3.1.12",
4
+ "version": "4.0.0",
5
5
  "dependencies": {
6
- "@oclif/core": "5.1.2",
7
- "@salesforce/core": "9.2.0",
8
- "@salesforce/sf-plugins-core": "13.0.4"
6
+ "@oclif/core": "5.1.10",
7
+ "@salesforce/core": "9.4.4",
8
+ "@salesforce/sf-plugins-core": "13.0.8"
9
9
  },
10
10
  "devDependencies": {
11
11
  "@actions/core": "3.0.1",
12
- "@biomejs/biome": "2.5.14",
13
- "@commitlint/cli": "21.2.3",
14
- "@commitlint/config-conventional": "21.2.3",
15
- "@salesforce/cli-plugins-testkit": "5.3.66",
12
+ "@biomejs/biome": "2.6.5",
13
+ "@commitlint/cli": "21.2.4",
14
+ "@commitlint/config-conventional": "21.2.4",
15
+ "@salesforce/cli-plugins-testkit": "5.3.83",
16
16
  "@salesforce/dev-config": "4.3.3",
17
- "@stryker-mutator/core": "10.0.0",
18
- "@stryker-mutator/vitest-runner": "10.0.0",
19
- "@types/node": "26.6.3",
20
- "@vitest/coverage-v8": "5.0.2",
17
+ "@stryker-mutator/core": "10.1.1",
18
+ "@stryker-mutator/vitest-runner": "10.1.1",
19
+ "@types/node": "26.6.6",
20
+ "@vitest/coverage-v8": "5.0.5",
21
21
  "esbuild": "0.28.2",
22
22
  "husky": "9.1.7",
23
- "knip": "6.38.0",
23
+ "knip": "6.44.1",
24
24
  "lint-staged": "17.6.0",
25
25
  "ls-engines": "0.10.1",
26
- "oclif": "6.0.2",
26
+ "oclif": "6.0.15",
27
27
  "shx": "0.4.0",
28
28
  "tsx": "4.23.15",
29
29
  "typescript": "7.0.2",
30
- "vitest": "5.0.2",
31
- "wireit": "0.14.13"
30
+ "vitest": "5.0.5",
31
+ "wireit": "0.15.0"
32
32
  },
33
33
  "engines": {
34
34
  "node": ">=22.19.0"
@@ -92,6 +92,7 @@
92
92
  "clean:build": "wireit",
93
93
  "clean:package-manager": "wireit",
94
94
  "compile": "wireit",
95
+ "dependencies:upgrade": "npx npm-check-updates -u && npm install && npm audit fix",
95
96
  "format": "wireit",
96
97
  "lint": "wireit",
97
98
  "lint:dependencies": "wireit",
@@ -175,22 +176,24 @@
175
176
  "clean": "if-file-deleted"
176
177
  },
177
178
  "format": {
178
- "command": "biome format --write src test",
179
+ "command": "biome format --write src test README.md CONTRIBUTING.md",
179
180
  "files": [
180
181
  "src/**/*.ts",
181
182
  "test/**/*.ts",
182
- "biome.json"
183
+ "biome.json",
184
+ "*.md"
183
185
  ],
184
186
  "output": []
185
187
  },
186
188
  "lint": {
187
- "command": "biome check src test",
189
+ "command": "biome check src test README.md CONTRIBUTING.md",
188
190
  "files": [
189
191
  "src/**/*.ts",
190
192
  "test/**/*.ts",
191
193
  "messages/**",
192
194
  "biome.json",
193
- "**/tsconfig.json"
195
+ "**/tsconfig.json",
196
+ "*.md"
194
197
  ],
195
198
  "output": []
196
199
  },
@@ -332,6 +335,6 @@
332
335
  "url": "https://github.com/mcarvin8/apex-code-coverage-transformer/issues"
333
336
  },
334
337
  "allowScripts": {
335
- "esbuild@0.28.1": true
338
+ "esbuild@0.28.2": true
336
339
  }
337
340
  }
@@ -1,5 +0,0 @@
1
- export type GetTotalLinesResult = number | {
2
- totalLines: number;
3
- content: string;
4
- };
5
- export declare function getTotalLines(filePath: string, returnContent?: boolean): Promise<GetTotalLinesResult>;
@@ -1,8 +0,0 @@
1
- 'use strict';
2
- import { readFile } from 'node:fs/promises';
3
- export async function getTotalLines(filePath, returnContent = false) {
4
- const content = await readFile(filePath, 'utf8');
5
- const totalLines = content.split(/\r\n|\r|\n/).length;
6
- return returnContent ? { totalLines, content } : totalLines;
7
- }
8
- //# sourceMappingURL=getTotalLines.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getTotalLines.js","sourceRoot":"","sources":["../../src/utils/getTotalLines.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,aAAa,GAAG,KAAK;IACzE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;IACtD,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9D,CAAC"}
@@ -1,5 +0,0 @@
1
- export type SetCoveredLinesResult = Record<string, number> | {
2
- updatedLines: Record<string, number>;
3
- sourceContent: string;
4
- };
5
- export declare function setCoveredLines(filePath: string, repoRoot: string, lines: Record<string, number>, returnSourceContent?: boolean): Promise<SetCoveredLinesResult>;
@@ -1,38 +0,0 @@
1
- 'use strict';
2
- import { join } from 'node:path';
3
- import { getTotalLines } from './getTotalLines.js';
4
- function debugLog(message) {
5
- if (process.env.SF_LOG_LEVEL === 'debug') {
6
- // eslint-disable-next-line no-console
7
- console.debug(`[DEBUG] setCoveredLines: ${message}`);
8
- }
9
- }
10
- export async function setCoveredLines(filePath, repoRoot, lines, returnSourceContent = false) {
11
- const result = await getTotalLines(join(repoRoot, filePath), returnSourceContent);
12
- const totalLines = typeof result === 'number' ? result : result.totalLines;
13
- const updatedLines = {};
14
- const usedLines = new Set();
15
- const sortedLines = Object.entries(lines).sort(([lineA], [lineB]) => parseInt(lineA, 10) - parseInt(lineB, 10));
16
- for (const [line, status] of sortedLines) {
17
- const lineNumber = parseInt(line, 10);
18
- if (status === 1 && lineNumber > totalLines) {
19
- for (let randomLine = 1; randomLine <= totalLines; randomLine++) {
20
- if (!usedLines.has(randomLine)) {
21
- debugLog(`Remapping out-of-range covered line ${lineNumber} to line ${randomLine} in ${filePath} (file has ${totalLines} lines)`);
22
- updatedLines[randomLine.toString()] = status;
23
- usedLines.add(randomLine);
24
- break;
25
- }
26
- }
27
- }
28
- else {
29
- updatedLines[line] = status;
30
- usedLines.add(lineNumber);
31
- }
32
- }
33
- if (returnSourceContent && typeof result !== 'number') {
34
- return { updatedLines, sourceContent: result.content };
35
- }
36
- return updatedLines;
37
- }
38
- //# sourceMappingURL=setCoveredLines.js.map
@@ -1 +0,0 @@
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,SAAS,QAAQ,CAAC,OAAe;IAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;QACzC,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,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,QAAQ,CACN,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"}