apex-code-coverage-transformer 2.13.4 → 2.14.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.
Files changed (55) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +276 -9
  3. package/lib/handlers/BaseHandler.d.ts +51 -0
  4. package/lib/handlers/BaseHandler.js +63 -0
  5. package/lib/handlers/BaseHandler.js.map +1 -0
  6. package/lib/handlers/HandlerRegistry.d.ts +90 -0
  7. package/lib/handlers/HandlerRegistry.js +103 -0
  8. package/lib/handlers/HandlerRegistry.js.map +1 -0
  9. package/lib/handlers/clover.d.ts +16 -2
  10. package/lib/handlers/clover.js +35 -16
  11. package/lib/handlers/clover.js.map +1 -1
  12. package/lib/handlers/cobertura.d.ts +11 -2
  13. package/lib/handlers/cobertura.js +26 -14
  14. package/lib/handlers/cobertura.js.map +1 -1
  15. package/lib/handlers/getHandler.d.ts +24 -0
  16. package/lib/handlers/getHandler.js +27 -19
  17. package/lib/handlers/getHandler.js.map +1 -1
  18. package/lib/handlers/istanbulJson.d.ts +18 -2
  19. package/lib/handlers/istanbulJson.js +35 -2
  20. package/lib/handlers/istanbulJson.js.map +1 -1
  21. package/lib/handlers/jacoco.d.ts +18 -2
  22. package/lib/handlers/jacoco.js +33 -2
  23. package/lib/handlers/jacoco.js.map +1 -1
  24. package/lib/handlers/jsonSummary.d.ts +49 -0
  25. package/lib/handlers/jsonSummary.js +110 -0
  26. package/lib/handlers/jsonSummary.js.map +1 -0
  27. package/lib/handlers/lcov.d.ts +17 -2
  28. package/lib/handlers/lcov.js +29 -9
  29. package/lib/handlers/lcov.js.map +1 -1
  30. package/lib/handlers/opencover.d.ts +71 -0
  31. package/lib/handlers/opencover.js +169 -0
  32. package/lib/handlers/opencover.js.map +1 -0
  33. package/lib/handlers/simplecov.d.ts +50 -0
  34. package/lib/handlers/simplecov.js +90 -0
  35. package/lib/handlers/simplecov.js.map +1 -0
  36. package/lib/handlers/sonar.d.ts +10 -2
  37. package/lib/handlers/sonar.js +21 -3
  38. package/lib/handlers/sonar.js.map +1 -1
  39. package/lib/transformers/coverageTransformer.js +7 -2
  40. package/lib/transformers/coverageTransformer.js.map +1 -1
  41. package/lib/transformers/reportGenerator.d.ts +2 -2
  42. package/lib/transformers/reportGenerator.js +7 -8
  43. package/lib/transformers/reportGenerator.js.map +1 -1
  44. package/lib/utils/buildFilePathCache.d.ts +9 -0
  45. package/lib/utils/buildFilePathCache.js +64 -0
  46. package/lib/utils/buildFilePathCache.js.map +1 -0
  47. package/lib/utils/constants.d.ts +5 -0
  48. package/lib/utils/constants.js +8 -1
  49. package/lib/utils/constants.js.map +1 -1
  50. package/lib/utils/findFilePath.d.ts +8 -1
  51. package/lib/utils/findFilePath.js +26 -35
  52. package/lib/utils/findFilePath.js.map +1 -1
  53. package/lib/utils/types.d.ts +82 -4
  54. package/oclif.manifest.json +8 -5
  55. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sonar.js","sourceRoot":"","sources":["../../src/handlers/sonar.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAIb,MAAM,OAAO,oBAAoB;IACd,WAAW,CAAsB;IAElD;QACE,IAAI,CAAC,WAAW,GAAG,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IAEM,WAAW,CAAC,QAAgB,EAAE,SAAiB,EAAE,KAA6B;QACnF,MAAM,OAAO,GAAe;YAC1B,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,KAAK,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvB,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBACvC,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAEM,QAAQ;QACb,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"sonar.js","sourceRoot":"","sources":["../../src/handlers/sonar.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IAClC,WAAW,CAAsB;IAElD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IAEM,WAAW,CAAC,QAAgB,EAAE,SAAiB,EAAE,KAA6B;QACnF,MAAM,OAAO,GAAe;YAC1B,OAAO,EAAE,QAAQ;YACjB,WAAW,EAAE,EAAE;SAChB,CAAC;QACF,KAAK,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvB,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBACvC,UAAU,EAAE,OAAO;aACpB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAEM,QAAQ;QACb,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,6BAA6B;AAC7B,eAAe,CAAC,QAAQ,CAAC;IACvB,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,mCAAmC;IAChD,aAAa,EAAE,MAAM;IACrB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE;IACzC,cAAc,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;CAC5C,CAAC,CAAC"}
@@ -4,6 +4,7 @@ import { mapLimit } from 'async';
4
4
  import { getCoverageHandler } from '../handlers/getHandler.js';
5
5
  import { getPackageDirectories } from '../utils/getPackageDirectories.js';
6
6
  import { findFilePath } from '../utils/findFilePath.js';
7
+ import { buildFilePathCache } from '../utils/buildFilePathCache.js';
7
8
  import { setCoveredLines } from '../utils/setCoveredLines.js';
8
9
  import { getConcurrencyThreshold } from '../utils/getConcurrencyThreshold.js';
9
10
  import { checkCoverageDataType } from '../utils/setCoverageDataType.js';
@@ -21,12 +22,15 @@ export async function transformCoverageReport(jsonFilePath, outputReportPath, fo
21
22
  const handlers = createHandlers(formats);
22
23
  const commandType = checkCoverageDataType(parsedData);
23
24
  const concurrencyLimit = getConcurrencyThreshold();
25
+ // Build file path cache upfront to avoid O(n*m) directory traversals
26
+ const filePathCache = await buildFilePathCache(packageDirectories, repoRoot);
24
27
  const context = {
25
28
  handlers,
26
29
  packageDirs: packageDirectories,
27
30
  repoRoot,
28
31
  concurrencyLimit,
29
32
  warnings,
33
+ filePathCache,
30
34
  };
31
35
  if (commandType === 'DeployCoverageData') {
32
36
  filesProcessed = await processDeployCoverage(parsedData, context);
@@ -68,7 +72,7 @@ async function processDeployCoverage(data, context) {
68
72
  await mapLimit(Object.keys(data), context.concurrencyLimit, async (fileName) => {
69
73
  const fileInfo = data[fileName];
70
74
  const formattedName = fileName.replace(/no-map[\\/]+/, '');
71
- const path = await findFilePath(formattedName, context.packageDirs, context.repoRoot);
75
+ const path = findFilePath(formattedName, context.filePathCache);
72
76
  if (!path) {
73
77
  context.warnings.push(`The file name ${formattedName} was not found in any package directory.`);
74
78
  return;
@@ -83,9 +87,10 @@ async function processDeployCoverage(data, context) {
83
87
  }
84
88
  async function processTestCoverage(data, context) {
85
89
  let processed = 0;
90
+ // eslint-disable-next-line @typescript-eslint/require-await
86
91
  await mapLimit(data, context.concurrencyLimit, async (entry) => {
87
92
  const formattedName = entry.name.replace(/no-map[\\/]+/, '');
88
- const path = await findFilePath(formattedName, context.packageDirs, context.repoRoot);
93
+ const path = findFilePath(formattedName, context.filePathCache);
89
94
  if (!path) {
90
95
  context.warnings.push(`The file name ${formattedName} was not found in any package directory.`);
91
96
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"coverageTransformer.js","sourceRoot":"","sources":["../../src/transformers/coverageTransformer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coverageTransformer.js","sourceRoot":"","sources":["../../src/transformers/coverageTransformer.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { SonarCoverageObject, CoberturaCoverageObject, CloverCoverageObject, LcovCoverageObject, JaCoCoCoverageObject, IstanbulCoverageObject } from '../utils/types.js';
2
- export declare function generateAndWriteReport(outputPath: string, coverageObj: SonarCoverageObject | CoberturaCoverageObject | CloverCoverageObject | LcovCoverageObject | JaCoCoCoverageObject | IstanbulCoverageObject, format: string, formatAmount: number): Promise<string>;
1
+ import { SonarCoverageObject, CoberturaCoverageObject, CloverCoverageObject, LcovCoverageObject, JaCoCoCoverageObject, IstanbulCoverageObject, JsonSummaryCoverageObject, SimpleCovCoverageObject, OpenCoverCoverageObject } from '../utils/types.js';
2
+ export declare function generateAndWriteReport(outputPath: string, coverageObj: SonarCoverageObject | CoberturaCoverageObject | CloverCoverageObject | LcovCoverageObject | JaCoCoCoverageObject | IstanbulCoverageObject | JsonSummaryCoverageObject | SimpleCovCoverageObject | OpenCoverCoverageObject, format: string, formatAmount: number): Promise<string>;
3
3
  export declare function getExtensionForFormat(format: string): string;
@@ -1,9 +1,10 @@
1
1
  import { writeFile } from 'node:fs/promises';
2
2
  import { extname, basename, dirname, join } from 'node:path';
3
3
  import { create } from 'xmlbuilder2';
4
+ import { HandlerRegistry } from '../handlers/HandlerRegistry.js';
4
5
  export async function generateAndWriteReport(outputPath, coverageObj, format, formatAmount) {
5
6
  const content = generateReportContent(coverageObj, format);
6
- const extension = getExtensionForFormat(format);
7
+ const extension = HandlerRegistry.getExtension(format);
7
8
  const base = basename(outputPath, extname(outputPath)); // e.g., 'coverage'
8
9
  const dir = dirname(outputPath);
9
10
  const suffix = formatAmount > 1 ? `-${format}` : '';
@@ -15,10 +16,10 @@ function generateReportContent(coverageObj, format) {
15
16
  if (format === 'lcovonly' && isLcovCoverageObject(coverageObj)) {
16
17
  return generateLcov(coverageObj);
17
18
  }
18
- if (format === 'json') {
19
+ if (format === 'json' || format === 'json-summary' || format === 'simplecov') {
19
20
  return JSON.stringify(coverageObj, null, 2);
20
21
  }
21
- const isHeadless = ['cobertura', 'clover', 'jacoco'].includes(format);
22
+ const isHeadless = ['cobertura', 'clover', 'jacoco', 'opencover'].includes(format);
22
23
  const xml = create(coverageObj).end({ prettyPrint: true, indent: ' ', headless: isHeadless });
23
24
  return prependXmlHeader(xml, format);
24
25
  }
@@ -49,16 +50,14 @@ function prependXmlHeader(xml, format) {
49
50
  return `<?xml version="1.0" encoding="UTF-8"?>\n${xml}`;
50
51
  case 'jacoco':
51
52
  return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<!DOCTYPE report PUBLIC "-//JACOCO//DTD Report 1.0//EN" "report.dtd">\n${xml}`;
53
+ case 'opencover':
54
+ return `<?xml version="1.0" encoding="utf-8"?>\n${xml}`;
52
55
  default:
53
56
  return xml;
54
57
  }
55
58
  }
56
59
  export function getExtensionForFormat(format) {
57
- if (format === 'lcovonly')
58
- return '.info';
59
- if (format === 'json')
60
- return '.json';
61
- return '.xml';
60
+ return HandlerRegistry.getExtension(format);
62
61
  }
63
62
  function isLcovCoverageObject(obj) {
64
63
  return typeof obj === 'object' && obj !== null && 'files' in obj;
@@ -1 +1 @@
1
- {"version":3,"file":"reportGenerator.js","sourceRoot":"","sources":["../../src/transformers/reportGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAWrC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,UAAkB,EAClB,WAM0B,EAC1B,MAAc,EACd,YAAoB;IAEpB,MAAM,OAAO,GAAG,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,mBAAmB;IAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC;IAE3D,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,qBAAqB,CAC5B,WAM0B,EAC1B,MAAc;IAEd,IAAI,MAAM,KAAK,UAAU,IAAI,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/D,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAE/F,OAAO,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,WAA+B;IACnD,OAAO,WAAW,CAAC,KAAK;SACrB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/F,OAAO;YACL,KAAK;YACL,MAAM,IAAI,CAAC,UAAU,EAAE;YACvB,OAAO;YACP,OAAO;YACP,QAAQ;YACR,MAAM,IAAI,CAAC,UAAU,EAAE;YACvB,MAAM,IAAI,CAAC,YAAY,EAAE;YACzB,OAAO;YACP,OAAO;YACP,eAAe;SAChB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,MAAc;IACnD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW;YACd,OAAO,8GAA8G,GAAG,EAAE,CAAC;QAC7H,KAAK,QAAQ;YACX,OAAO,2CAA2C,GAAG,EAAE,CAAC;QAC1D,KAAK,QAAQ;YACX,OAAO,mIAAmI,GAAG,EAAE,CAAC;QAClJ;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAY;IACxC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,IAAI,GAAG,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"reportGenerator.js","sourceRoot":"","sources":["../../src/transformers/reportGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Build a cache mapping filenames to their full paths.
3
+ * This prevents recursive directory searches for every file in the coverage report.
4
+ *
5
+ * @param packageDirectories - Array of package directory paths to scan
6
+ * @param repoRoot - Repository root path
7
+ * @returns Map of filename (without path) to full relative path
8
+ */
9
+ export declare function buildFilePathCache(packageDirectories: string[], repoRoot: string): Promise<Map<string, string>>;
@@ -0,0 +1,64 @@
1
+ 'use strict';
2
+ import { readdir, stat } from 'node:fs/promises';
3
+ import { join, relative } from 'node:path';
4
+ import { normalizePathToUnix } from './normalizePathToUnix.js';
5
+ /**
6
+ * Build a cache mapping filenames to their full paths.
7
+ * This prevents recursive directory searches for every file in the coverage report.
8
+ *
9
+ * @param packageDirectories - Array of package directory paths to scan
10
+ * @param repoRoot - Repository root path
11
+ * @returns Map of filename (without path) to full relative path
12
+ */
13
+ export async function buildFilePathCache(packageDirectories, repoRoot) {
14
+ const cache = new Map();
15
+ const extensions = ['cls', 'trigger'];
16
+ await Promise.all(packageDirectories.map(async (directory) => {
17
+ await scanDirectory(directory, repoRoot, extensions, cache);
18
+ }));
19
+ return cache;
20
+ }
21
+ async function scanDirectory(directory, repoRoot, extensions, cache) {
22
+ let entries;
23
+ try {
24
+ entries = await readdir(directory);
25
+ }
26
+ catch {
27
+ // Directory doesn't exist or not accessible, skip it
28
+ return;
29
+ }
30
+ const subdirPromises = [];
31
+ for (const entry of entries) {
32
+ const fullPath = join(directory, entry);
33
+ let stats;
34
+ try {
35
+ // eslint-disable-next-line no-await-in-loop
36
+ stats = await stat(fullPath);
37
+ }
38
+ catch {
39
+ // File not accessible, skip it
40
+ continue;
41
+ }
42
+ if (stats.isDirectory()) {
43
+ // Queue subdirectory scanning
44
+ subdirPromises.push(scanDirectory(fullPath, repoRoot, extensions, cache));
45
+ }
46
+ else {
47
+ // Check if this is an Apex file
48
+ const ext = entry.split('.').pop();
49
+ if (ext && extensions.includes(ext)) {
50
+ const relativePath = normalizePathToUnix(relative(repoRoot, fullPath));
51
+ // Store with the full filename as key (e.g., "AccountHandler.cls")
52
+ cache.set(entry, relativePath);
53
+ // Also store without extension for lookups (e.g., "AccountHandler")
54
+ const nameWithoutExt = entry.substring(0, entry.lastIndexOf('.'));
55
+ if (!cache.has(nameWithoutExt)) {
56
+ cache.set(nameWithoutExt, relativePath);
57
+ }
58
+ }
59
+ }
60
+ }
61
+ // Process all subdirectories in parallel
62
+ await Promise.all(subdirPromises);
63
+ }
64
+ //# sourceMappingURL=buildFilePathCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildFilePathCache.js","sourceRoot":"","sources":["../../src/utils/buildFilePathCache.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,kBAA4B,EAAE,QAAgB;IACrF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAEtC,MAAM,OAAO,CAAC,GAAG,CACf,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QACzC,MAAM,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,SAAiB,EACjB,QAAgB,EAChB,UAAoB,EACpB,KAA0B;IAE1B,IAAI,OAAiB,CAAC;IAEtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;QACrD,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAyB,EAAE,CAAC;IAEhD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC;QAEV,IAAI,CAAC;YACH,4CAA4C;YAC5C,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;YAC/B,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,8BAA8B;YAC9B,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,gCAAgC;YAChC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACvE,mEAAmE;gBACnE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBAC/B,oEAAoE;gBACpE,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC/B,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACpC,CAAC"}
@@ -1 +1,6 @@
1
+ import '../handlers/getHandler.js';
2
+ /**
3
+ * Get available coverage format options.
4
+ * This dynamically retrieves all registered formats from the HandlerRegistry.
5
+ */
1
6
  export declare const formatOptions: string[];
@@ -1,2 +1,9 @@
1
- export const formatOptions = ['sonar', 'cobertura', 'clover', 'lcovonly', 'jacoco', 'json'];
1
+ import { HandlerRegistry } from '../handlers/HandlerRegistry.js';
2
+ // Import all handlers to ensure they're registered
3
+ import '../handlers/getHandler.js';
4
+ /**
5
+ * Get available coverage format options.
6
+ * This dynamically retrieves all registered formats from the HandlerRegistry.
7
+ */
8
+ export const formatOptions = HandlerRegistry.getAvailableFormats();
2
9
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAa,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,mDAAmD;AACnD,OAAO,2BAA2B,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAa,eAAe,CAAC,mBAAmB,EAAE,CAAC"}
@@ -1 +1,8 @@
1
- export declare function findFilePath(fileName: string, packageDirectories: string[], repoRoot: string): Promise<string | undefined>;
1
+ /**
2
+ * Find file path using a pre-built cache (fast) or fallback to the old method.
3
+ *
4
+ * @param fileName - Name of the file to find
5
+ * @param filePathCache - Optional pre-built cache of filename -> path mappings
6
+ * @returns Normalized Unix-style relative path or undefined if not found
7
+ */
8
+ export declare function findFilePath(fileName: string, filePathCache?: Map<string, string>): string | undefined;
@@ -1,43 +1,34 @@
1
1
  'use strict';
2
- /* eslint-disable no-await-in-loop */
3
- import { readdir, stat } from 'node:fs/promises';
4
- import { join, relative } from 'node:path';
5
- import { normalizePathToUnix } from './normalizePathToUnix.js';
6
- export async function findFilePath(fileName, packageDirectories, repoRoot) {
7
- for (const directory of packageDirectories) {
8
- const result = await resolveFilePath(fileName, directory, repoRoot);
9
- if (result) {
10
- return normalizePathToUnix(result);
11
- }
2
+ /**
3
+ * Find file path using a pre-built cache (fast) or fallback to the old method.
4
+ *
5
+ * @param fileName - Name of the file to find
6
+ * @param filePathCache - Optional pre-built cache of filename -> path mappings
7
+ * @returns Normalized Unix-style relative path or undefined if not found
8
+ */
9
+ export function findFilePath(fileName, filePathCache) {
10
+ if (filePathCache) {
11
+ return findFilePathFromCache(fileName, filePathCache);
12
12
  }
13
+ // Fallback to old behavior should never happen in practice,
14
+ // but keeping for backwards compatibility
13
15
  return undefined;
14
16
  }
15
- async function resolveFilePath(fileName, dxDirectory, repoRoot) {
16
- const extensionsToTry = getExtensionsToTry(fileName);
17
- for (const name of extensionsToTry) {
18
- const absolutePath = await searchRecursively(name, dxDirectory);
19
- if (absolutePath) {
20
- return relative(repoRoot, absolutePath);
21
- }
17
+ function findFilePathFromCache(fileName, cache) {
18
+ // Try exact match first
19
+ const exactMatch = cache.get(fileName);
20
+ if (exactMatch) {
21
+ return exactMatch;
22
22
  }
23
- return undefined;
24
- }
25
- function getExtensionsToTry(fileName) {
26
- return ['cls', 'trigger'].map((ext) => `${fileName}.${ext}`);
27
- }
28
- async function searchRecursively(fileName, directory) {
29
- const entries = await readdir(directory);
30
- for (const entry of entries) {
31
- const fullPath = join(directory, entry);
32
- const stats = await stat(fullPath);
33
- if (stats.isDirectory()) {
34
- const nestedResult = await searchRecursively(fileName, fullPath);
35
- if (nestedResult)
36
- return nestedResult;
37
- }
38
- else if (entry === fileName) {
39
- return fullPath;
40
- }
23
+ // Try with .cls extension
24
+ const clsMatch = cache.get(`${fileName}.cls`);
25
+ if (clsMatch) {
26
+ return clsMatch;
27
+ }
28
+ // Try with .trigger extension
29
+ const triggerMatch = cache.get(`${fileName}.trigger`);
30
+ if (triggerMatch) {
31
+ return triggerMatch;
41
32
  }
42
33
  return undefined;
43
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"findFilePath.js","sourceRoot":"","sources":["../../src/utils/findFilePath.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,qCAAqC;AAErC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,kBAA4B,EAC5B,QAAgB;IAEhB,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,WAAmB,EAAE,QAAgB;IACpF,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAChE,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,SAAiB;IAClE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjE,IAAI,YAAY;gBAAE,OAAO,YAAY,CAAC;QACxC,CAAC;aAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"findFilePath.js","sourceRoot":"","sources":["../../src/utils/findFilePath.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,aAAmC;IAChF,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,4DAA4D;IAC5D,0CAA0C;IAC1C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAgB,EAAE,KAA0B;IACzE,wBAAwB;IACxB,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,MAAM,CAAC,CAAC;IAC9C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC;IACtD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -41,10 +41,11 @@ export type CoverageProcessingContext = {
41
41
  repoRoot: string;
42
42
  concurrencyLimit: number;
43
43
  warnings: string[];
44
+ filePathCache: Map<string, string>;
44
45
  };
45
46
  type SonarLine = {
46
47
  '@lineNumber': number;
47
- '@covered': string;
48
+ '@covered': boolean;
48
49
  };
49
50
  export type SonarClass = {
50
51
  '@path': string;
@@ -71,8 +72,8 @@ export type CoberturaLine = {
71
72
  export type CoberturaClass = {
72
73
  '@name': string;
73
74
  '@filename': string;
74
- '@line-rate': string;
75
- '@branch-rate': string;
75
+ '@line-rate': number;
76
+ '@branch-rate': number;
76
77
  methods: Record<string, never>;
77
78
  lines: {
78
79
  line: CoberturaLine[];
@@ -154,7 +155,7 @@ export type CloverCoverageObject = {
154
155
  };
155
156
  export type CoverageHandler = {
156
157
  processFile(filePath: string, fileName: string, lines: Record<string, number>): void;
157
- finalize(): SonarCoverageObject | CoberturaCoverageObject | CloverCoverageObject | LcovCoverageObject | JaCoCoCoverageObject | IstanbulCoverageObject;
158
+ finalize(): SonarCoverageObject | CoberturaCoverageObject | CloverCoverageObject | LcovCoverageObject | JaCoCoCoverageObject | IstanbulCoverageObject | JsonSummaryCoverageObject | SimpleCovCoverageObject | OpenCoverCoverageObject;
158
159
  };
159
160
  type LcovLine = {
160
161
  lineNumber: number;
@@ -232,4 +233,81 @@ export type BranchMapping = {
232
233
  line: number;
233
234
  };
234
235
  export type IstanbulCoverageObject = IstanbulCoverageMap;
236
+ export type JsonSummaryFileCoverage = {
237
+ lines: {
238
+ total: number;
239
+ covered: number;
240
+ skipped: number;
241
+ pct: number;
242
+ };
243
+ statements: {
244
+ total: number;
245
+ covered: number;
246
+ skipped: number;
247
+ pct: number;
248
+ };
249
+ };
250
+ export type JsonSummaryCoverageObject = {
251
+ total: JsonSummaryFileCoverage;
252
+ files: {
253
+ [filePath: string]: JsonSummaryFileCoverage;
254
+ };
255
+ };
256
+ export type SimpleCovCoverageObject = {
257
+ coverage: {
258
+ [filePath: string]: Array<number | null>;
259
+ };
260
+ timestamp: number;
261
+ };
262
+ export type OpenCoverSequencePoint = {
263
+ '@vc': number;
264
+ '@sl': number;
265
+ '@sc'?: number;
266
+ '@el'?: number;
267
+ '@ec'?: number;
268
+ };
269
+ export type OpenCoverMethod = {
270
+ '@name': string;
271
+ '@isConstructor'?: boolean;
272
+ '@isStatic'?: boolean;
273
+ '@isGetter'?: boolean;
274
+ '@isSetter'?: boolean;
275
+ SequencePoints: {
276
+ SequencePoint: OpenCoverSequencePoint[];
277
+ };
278
+ };
279
+ export type OpenCoverClass = {
280
+ '@fullName': string;
281
+ Methods: {
282
+ Method: OpenCoverMethod[];
283
+ };
284
+ };
285
+ export type OpenCoverFile = {
286
+ '@uid': number;
287
+ '@fullPath': string;
288
+ };
289
+ export type OpenCoverModule = {
290
+ '@hash': string;
291
+ Files: {
292
+ File: OpenCoverFile[];
293
+ };
294
+ Classes: {
295
+ Class: OpenCoverClass[];
296
+ };
297
+ };
298
+ export type OpenCoverCoverageObject = {
299
+ CoverageSession: {
300
+ Summary: {
301
+ '@numSequencePoints': number;
302
+ '@visitedSequencePoints': number;
303
+ '@numBranchPoints': number;
304
+ '@visitedBranchPoints': number;
305
+ '@sequenceCoverage': number;
306
+ '@branchCoverage': number;
307
+ };
308
+ Modules: {
309
+ Module: OpenCoverModule[];
310
+ };
311
+ };
312
+ };
235
313
  export {};
@@ -54,12 +54,15 @@
54
54
  "hasDynamicHelp": false,
55
55
  "multiple": true,
56
56
  "options": [
57
- "sonar",
58
- "cobertura",
59
57
  "clover",
60
- "lcovonly",
58
+ "cobertura",
61
59
  "jacoco",
62
- "json"
60
+ "json",
61
+ "json-summary",
62
+ "lcovonly",
63
+ "opencover",
64
+ "simplecov",
65
+ "sonar"
63
66
  ],
64
67
  "type": "option"
65
68
  },
@@ -96,5 +99,5 @@
96
99
  ]
97
100
  }
98
101
  },
99
- "version": "2.13.4"
102
+ "version": "2.14.1"
100
103
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
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.13.4",
4
+ "version": "2.14.1",
5
5
  "dependencies": {
6
6
  "@oclif/core": "^4.4.0",
7
7
  "@salesforce/core": "^8.12.0",