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.
- package/CHANGELOG.md +15 -0
- package/README.md +276 -9
- package/lib/handlers/BaseHandler.d.ts +51 -0
- package/lib/handlers/BaseHandler.js +63 -0
- package/lib/handlers/BaseHandler.js.map +1 -0
- package/lib/handlers/HandlerRegistry.d.ts +90 -0
- package/lib/handlers/HandlerRegistry.js +103 -0
- package/lib/handlers/HandlerRegistry.js.map +1 -0
- package/lib/handlers/clover.d.ts +16 -2
- package/lib/handlers/clover.js +35 -16
- package/lib/handlers/clover.js.map +1 -1
- package/lib/handlers/cobertura.d.ts +11 -2
- package/lib/handlers/cobertura.js +26 -14
- package/lib/handlers/cobertura.js.map +1 -1
- package/lib/handlers/getHandler.d.ts +24 -0
- package/lib/handlers/getHandler.js +27 -19
- package/lib/handlers/getHandler.js.map +1 -1
- package/lib/handlers/istanbulJson.d.ts +18 -2
- package/lib/handlers/istanbulJson.js +35 -2
- package/lib/handlers/istanbulJson.js.map +1 -1
- package/lib/handlers/jacoco.d.ts +18 -2
- package/lib/handlers/jacoco.js +33 -2
- package/lib/handlers/jacoco.js.map +1 -1
- package/lib/handlers/jsonSummary.d.ts +49 -0
- package/lib/handlers/jsonSummary.js +110 -0
- package/lib/handlers/jsonSummary.js.map +1 -0
- package/lib/handlers/lcov.d.ts +17 -2
- package/lib/handlers/lcov.js +29 -9
- package/lib/handlers/lcov.js.map +1 -1
- package/lib/handlers/opencover.d.ts +71 -0
- package/lib/handlers/opencover.js +169 -0
- package/lib/handlers/opencover.js.map +1 -0
- package/lib/handlers/simplecov.d.ts +50 -0
- package/lib/handlers/simplecov.js +90 -0
- package/lib/handlers/simplecov.js.map +1 -0
- package/lib/handlers/sonar.d.ts +10 -2
- package/lib/handlers/sonar.js +21 -3
- package/lib/handlers/sonar.js.map +1 -1
- package/lib/transformers/coverageTransformer.js +7 -2
- package/lib/transformers/coverageTransformer.js.map +1 -1
- package/lib/transformers/reportGenerator.d.ts +2 -2
- package/lib/transformers/reportGenerator.js +7 -8
- package/lib/transformers/reportGenerator.js.map +1 -1
- package/lib/utils/buildFilePathCache.d.ts +9 -0
- package/lib/utils/buildFilePathCache.js +64 -0
- package/lib/utils/buildFilePathCache.js.map +1 -0
- package/lib/utils/constants.d.ts +5 -0
- package/lib/utils/constants.js +8 -1
- package/lib/utils/constants.js.map +1 -1
- package/lib/utils/findFilePath.d.ts +8 -1
- package/lib/utils/findFilePath.js +26 -35
- package/lib/utils/findFilePath.js.map +1 -1
- package/lib/utils/types.d.ts +82 -4
- package/oclif.manifest.json +8 -5
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sonar.js","sourceRoot":"","sources":["../../src/handlers/sonar.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;
|
|
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 =
|
|
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 =
|
|
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":"AAAA,qCAAqC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,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,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,YAAoB,EACpB,gBAAwB,EACxB,OAAiB,EACjB,UAAoB;IAEpB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,YAAY,GAAW,OAAO,CAAC,MAAM,CAAC;IAC5C,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,CAAC;IAEnE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAkB,CAAC;IACzD,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,MAAM,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,gBAAgB,GAAG,uBAAuB,EAAE,CAAC;IAEnD,MAAM,OAAO,GAA8B;QACzC,QAAQ;QACR,WAAW,EAAE,kBAAkB;QAC/B,QAAQ;QACR,gBAAgB;QAChB,QAAQ;
|
|
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 =
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/lib/utils/constants.d.ts
CHANGED
package/lib/utils/constants.js
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
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;
|
|
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"}
|
package/lib/utils/types.d.ts
CHANGED
|
@@ -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':
|
|
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':
|
|
75
|
-
'@branch-rate':
|
|
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 {};
|
package/oclif.manifest.json
CHANGED
|
@@ -54,12 +54,15 @@
|
|
|
54
54
|
"hasDynamicHelp": false,
|
|
55
55
|
"multiple": true,
|
|
56
56
|
"options": [
|
|
57
|
-
"sonar",
|
|
58
|
-
"cobertura",
|
|
59
57
|
"clover",
|
|
60
|
-
"
|
|
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.
|
|
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.
|
|
4
|
+
"version": "2.14.1",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@oclif/core": "^4.4.0",
|
|
7
7
|
"@salesforce/core": "^8.12.0",
|