@code-pushup/coverage-plugin 0.96.1 → 0.98.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/package.json +3 -4
- package/src/lib/config.js +3 -2
- package/src/lib/config.js.map +1 -1
- package/src/lib/constants.d.ts +3 -0
- package/src/lib/constants.js +4 -0
- package/src/lib/constants.js.map +1 -0
- package/src/lib/coverage-plugin.js +10 -10
- package/src/lib/coverage-plugin.js.map +1 -1
- package/src/lib/format.d.ts +5 -0
- package/src/lib/format.js +13 -0
- package/src/lib/format.js.map +1 -0
- package/src/lib/nx/coverage-paths.js +19 -13
- package/src/lib/nx/coverage-paths.js.map +1 -1
- package/src/lib/runner/lcov/lcov-runner.js +79 -15
- package/src/lib/runner/lcov/lcov-runner.js.map +1 -1
- package/src/lib/runner/runner.d.ts +3 -0
- package/src/lib/runner/runner.js +39 -0
- package/src/lib/runner/runner.js.map +1 -0
- package/src/bin.d.ts +0 -1
- package/src/bin.js +0 -6
- package/src/bin.js.map +0 -1
- package/src/lib/runner/index.d.ts +0 -4
- package/src/lib/runner/index.js +0 -37
- package/src/lib/runner/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/coverage-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.98.0",
|
|
4
4
|
"description": "Code PushUp plugin for tracking code coverage ☂",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-coverage#readme",
|
|
@@ -34,10 +34,9 @@
|
|
|
34
34
|
},
|
|
35
35
|
"type": "module",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@code-pushup/models": "0.
|
|
38
|
-
"@code-pushup/utils": "0.
|
|
37
|
+
"@code-pushup/models": "0.98.0",
|
|
38
|
+
"@code-pushup/utils": "0.98.0",
|
|
39
39
|
"parse-lcov": "^1.0.4",
|
|
40
|
-
"yargs": "^17.7.2",
|
|
41
40
|
"zod": "^4.0.5"
|
|
42
41
|
},
|
|
43
42
|
"peerDependencies": {
|
package/src/lib/config.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { pluginScoreTargetsSchema } from '@code-pushup/models';
|
|
3
|
+
import { ALL_COVERAGE_TYPES } from './constants.js';
|
|
3
4
|
export const coverageTypeSchema = z
|
|
4
|
-
.enum(
|
|
5
|
+
.enum(ALL_COVERAGE_TYPES)
|
|
5
6
|
.meta({ title: 'CoverageType' });
|
|
6
7
|
export const coverageResultSchema = z
|
|
7
8
|
.union([
|
|
@@ -41,7 +42,7 @@ export const coveragePluginConfigSchema = z
|
|
|
41
42
|
coverageTypes: z
|
|
42
43
|
.array(coverageTypeSchema)
|
|
43
44
|
.min(1)
|
|
44
|
-
.default([
|
|
45
|
+
.default([...ALL_COVERAGE_TYPES])
|
|
45
46
|
.meta({
|
|
46
47
|
description: 'Coverage types measured. Defaults to all available types.',
|
|
47
48
|
}),
|
package/src/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,IAAI,CAAC,kBAAkB,CAAC;KACxB,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;AAGnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,KAAK,CAAC;IACL,CAAC,CAAC,MAAM,CAAC;QACP,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,CAAC,MAAM,CAAC;aAChB,IAAI,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;QAClE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,IAAI,CAAC;YACJ,WAAW,EACT,qGAAqG;SACxG,CAAC;aACD,QAAQ,EAAE;KACd,CAAC;IACF,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QAC/B,WAAW,EAAE,sDAAsD;KACpE,CAAC;CACH,CAAC;KACD,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAGrC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,mBAAmB,EAAE,CAAC;SACnB,MAAM,CAAC;QACN,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,IAAI,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;QACzD,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;YACxC,WAAW,EAAE,8CAA8C;SAC5D,CAAC;KACH,CAAC;SACD,QAAQ,EAAE;IACb,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QACpD,WAAW,EACT,uEAAuE;KAC1E,CAAC;IACF,aAAa,EAAE,CAAC;SACb,KAAK,CAAC,kBAAkB,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC;SAChC,IAAI,CAAC;QACJ,WAAW,EACT,2DAA2D;KAC9D,CAAC;IACJ,OAAO,EAAE,CAAC;SACP,KAAK,CAAC,oBAAoB,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,gFAAgF,CACjF;IACH,YAAY,EAAE,wBAAwB;CACvC,CAAC;KACD,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAC/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAErD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
2
|
import { validate, } from '@code-pushup/models';
|
|
5
|
-
import {
|
|
3
|
+
import { logger, pluralizeToken } from '@code-pushup/utils';
|
|
6
4
|
import { coveragePluginConfigSchema, } from './config.js';
|
|
7
|
-
import {
|
|
5
|
+
import { COVERAGE_PLUGIN_SLUG, COVERAGE_PLUGIN_TITLE } from './constants.js';
|
|
6
|
+
import { formatMetaLog, typeToAuditSlug, typeToAuditTitle } from './format.js';
|
|
7
|
+
import { createRunnerFunction } from './runner/runner.js';
|
|
8
8
|
import { coverageDescription, coverageTypeWeightMapper } from './utils.js';
|
|
9
9
|
/**
|
|
10
10
|
* Instantiates Code PushUp code coverage plugin for core config.
|
|
@@ -27,8 +27,8 @@ import { coverageDescription, coverageTypeWeightMapper } from './utils.js';
|
|
|
27
27
|
export async function coveragePlugin(config) {
|
|
28
28
|
const coverageConfig = validate(coveragePluginConfigSchema, config);
|
|
29
29
|
const audits = coverageConfig.coverageTypes.map((type) => ({
|
|
30
|
-
slug:
|
|
31
|
-
title:
|
|
30
|
+
slug: typeToAuditSlug(type),
|
|
31
|
+
title: typeToAuditTitle(type),
|
|
32
32
|
description: coverageDescription[type],
|
|
33
33
|
}));
|
|
34
34
|
const group = {
|
|
@@ -40,12 +40,12 @@ export async function coveragePlugin(config) {
|
|
|
40
40
|
weight: coverageTypeWeightMapper[audit.slug.slice(0, audit.slug.indexOf('-'))],
|
|
41
41
|
})),
|
|
42
42
|
};
|
|
43
|
-
|
|
43
|
+
logger.info(formatMetaLog(`Created ${pluralizeToken('audit', audits.length)} (${coverageConfig.coverageTypes.join('/')} coverage) and 1 group`));
|
|
44
44
|
const packageJson = createRequire(import.meta.url)('../../package.json');
|
|
45
45
|
const scoreTargets = coverageConfig.scoreTargets;
|
|
46
46
|
return {
|
|
47
|
-
slug:
|
|
48
|
-
title:
|
|
47
|
+
slug: COVERAGE_PLUGIN_SLUG,
|
|
48
|
+
title: COVERAGE_PLUGIN_TITLE,
|
|
49
49
|
icon: 'folder-coverage-open',
|
|
50
50
|
description: 'Official Code PushUp code coverage plugin.',
|
|
51
51
|
docsUrl: 'https://www.npmjs.com/package/@code-pushup/coverage-plugin/',
|
|
@@ -53,7 +53,7 @@ export async function coveragePlugin(config) {
|
|
|
53
53
|
version: packageJson.version,
|
|
54
54
|
audits,
|
|
55
55
|
groups: [group],
|
|
56
|
-
runner:
|
|
56
|
+
runner: createRunnerFunction(coverageConfig),
|
|
57
57
|
...(scoreTargets && { scoreTargets }),
|
|
58
58
|
};
|
|
59
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-plugin.js","sourceRoot":"","sources":["../../../src/lib/coverage-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"coverage-plugin.js","sourceRoot":"","sources":["../../../src/lib/coverage-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAIL,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAGL,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAA4B;IAE5B,MAAM,cAAc,GAAG,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC,GAAG,CAC7C,CAAC,IAAI,EAAS,EAAE,CAAC,CAAC;QAChB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;QAC3B,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC;QAC7B,WAAW,EAAE,mBAAmB,CAAC,IAAI,CAAC;KACvC,CAAC,CACH,CAAC;IAEF,MAAM,KAAK,GAAU;QACnB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,wDAAwD;QACrE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzB,GAAG,KAAK;YACR,MAAM,EACJ,wBAAwB,CACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAiB,CAC7D;SACJ,CAAC,CAAC;KACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,CACX,WAAW,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,wBAAwB,CACrH,CACF,CAAC;IAEF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,oBAAoB,CACkB,CAAC;IAEzC,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC;IAEjD,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,4CAA4C;QACzD,OAAO,EAAE,6DAA6D;QACtE,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,MAAM;QACN,MAAM,EAAE,CAAC,KAAK,CAAC;QACf,MAAM,EAAE,oBAAoB,CAAC,cAAc,CAAC;QAC5C,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CoverageType } from './config.js';
|
|
2
|
+
export declare const formatMetaLog: (message: string) => string;
|
|
3
|
+
export declare function typeToAuditSlug(type: CoverageType): string;
|
|
4
|
+
export declare function typeToAuditTitle(type: CoverageType): string;
|
|
5
|
+
export declare function slugToTitle(slug: string): string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { capitalize, pluginMetaLogFormatter } from '@code-pushup/utils';
|
|
2
|
+
import { COVERAGE_PLUGIN_TITLE } from './constants.js';
|
|
3
|
+
export const formatMetaLog = pluginMetaLogFormatter(COVERAGE_PLUGIN_TITLE);
|
|
4
|
+
export function typeToAuditSlug(type) {
|
|
5
|
+
return `${type}-coverage`;
|
|
6
|
+
}
|
|
7
|
+
export function typeToAuditTitle(type) {
|
|
8
|
+
return `${capitalize(type)} coverage`;
|
|
9
|
+
}
|
|
10
|
+
export function slugToTitle(slug) {
|
|
11
|
+
return capitalize(slug.split('-').join(' '));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/lib/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG,sBAAsB,CAAC,qBAAqB,CAAC,CAAC;AAE3E,MAAM,UAAU,eAAe,CAAC,IAAkB;IAChD,OAAO,GAAG,IAAI,WAAW,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAkB;IACjD,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import { importModule, logger, stringifyError } from '@code-pushup/utils';
|
|
2
|
+
import { importModule, logger, pluralize, pluralizeToken, stringifyError, } from '@code-pushup/utils';
|
|
3
|
+
import { formatMetaLog } from '../format.js';
|
|
3
4
|
/**
|
|
4
5
|
* Resolves the cached project graph for the current Nx workspace.
|
|
5
6
|
* First tries to read cache and if not possible, go for the async creation.
|
|
@@ -10,8 +11,7 @@ async function resolveCachedProjectGraph() {
|
|
|
10
11
|
return readCachedProjectGraph();
|
|
11
12
|
}
|
|
12
13
|
catch (error) {
|
|
13
|
-
logger.
|
|
14
|
-
${stringifyError(error)}`);
|
|
14
|
+
logger.warn(`Could not read cached project graph, falling back to async creation - ${stringifyError(error)}`);
|
|
15
15
|
return await createProjectGraphAsync({ exitOnError: false });
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -20,18 +20,24 @@ async function resolveCachedProjectGraph() {
|
|
|
20
20
|
* @returns An array of coverage result information for the coverage plugin.
|
|
21
21
|
*/
|
|
22
22
|
export async function getNxCoveragePaths(targets = ['test']) {
|
|
23
|
-
logger.debug('💡 Gathering coverage from the following nx projects:');
|
|
24
23
|
const { nodes } = await resolveCachedProjectGraph();
|
|
25
|
-
const
|
|
24
|
+
const coverageResultsPerTarget = Object.fromEntries(await Promise.all(targets.map(async (target) => {
|
|
26
25
|
const relevantNodes = Object.values(nodes).filter(graph => hasNxTarget(graph, target));
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
logger.
|
|
34
|
-
|
|
26
|
+
return [
|
|
27
|
+
target,
|
|
28
|
+
await Promise.all(relevantNodes.map(({ data }) => getCoveragePathsForTarget(data, target))),
|
|
29
|
+
];
|
|
30
|
+
})));
|
|
31
|
+
const coverageResults = Object.values(coverageResultsPerTarget).flat();
|
|
32
|
+
logger.info(formatMetaLog(`Inferred ${pluralizeToken('coverage report', coverageResults.length)} from Nx projects with ${pluralize('target', targets.length)} ${targets.length === 1
|
|
33
|
+
? targets[0]
|
|
34
|
+
: Object.entries(coverageResultsPerTarget)
|
|
35
|
+
.map(([target, results]) => `${target} (${results.length})`)
|
|
36
|
+
.join(' and ')}`));
|
|
37
|
+
logger.debug(formatMetaLog(coverageResults
|
|
38
|
+
.map(result => `• ${typeof result === 'string' ? result : result.resultsPath}`)
|
|
39
|
+
.join('\n')));
|
|
40
|
+
return coverageResults;
|
|
35
41
|
}
|
|
36
42
|
function hasNxTarget(project, target) {
|
|
37
43
|
return project.data.targets != null && target in project.data.targets;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-paths.js","sourceRoot":"","sources":["../../../../src/lib/nx/coverage-paths.ts"],"names":[],"mappings":"AAQA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"coverage-paths.js","sourceRoot":"","sources":["../../../../src/lib/nx/coverage-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import { exists, getGitRoot, logger, objectFromEntries, objectToEntries, readTextFile, toUnixNewlines, } from '@code-pushup/utils';
|
|
2
|
+
import { capitalize, exists, formatAsciiTable, getGitRoot, logger, objectFromEntries, objectToEntries, pluralize, pluralizeToken, readTextFile, toUnixNewlines, truncatePaths, } from '@code-pushup/utils';
|
|
3
|
+
import { ALL_COVERAGE_TYPES } from '../../constants.js';
|
|
3
4
|
import { mergeLcovResults } from './merge-lcov.js';
|
|
4
5
|
import { parseLcov } from './parse-lcov.js';
|
|
5
6
|
import { lcovCoverageToAuditOutput, recordToStatFunctionMapper, } from './transform.js';
|
|
@@ -16,6 +17,7 @@ export async function lcovResultsToAuditOutputs(results, coverageTypes) {
|
|
|
16
17
|
const lcovResults = await parseLcovFiles(results);
|
|
17
18
|
// Merge multiple coverage reports for the same file
|
|
18
19
|
const mergedResults = mergeLcovResults(lcovResults);
|
|
20
|
+
logMergedRecords({ before: lcovResults.length, after: mergedResults.length });
|
|
19
21
|
// Calculate code coverage from all coverage results
|
|
20
22
|
const totalCoverageStats = groupLcovRecordsByCoverageType(mergedResults, coverageTypes);
|
|
21
23
|
const gitRoot = await getGitRoot();
|
|
@@ -35,14 +37,25 @@ export async function lcovResultsToAuditOutputs(results, coverageTypes) {
|
|
|
35
37
|
* @returns Array of parsed LCOVRecords.
|
|
36
38
|
*/
|
|
37
39
|
export async function parseLcovFiles(results) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
const recordsPerReport = Object.fromEntries(await Promise.all(results.map(parseLcovFile)));
|
|
41
|
+
logLcovRecords(recordsPerReport);
|
|
42
|
+
const allRecords = Object.values(recordsPerReport).flat();
|
|
43
|
+
if (allRecords.length === 0) {
|
|
44
|
+
throw new Error('All provided coverage results are empty.');
|
|
45
|
+
}
|
|
46
|
+
return allRecords;
|
|
47
|
+
}
|
|
48
|
+
async function parseLcovFile(result) {
|
|
49
|
+
const resultsPath = typeof result === 'string' ? result : result.resultsPath;
|
|
50
|
+
const lcovFileContent = await readTextFile(resultsPath);
|
|
51
|
+
if (lcovFileContent.trim() === '') {
|
|
52
|
+
logger.warn(`Empty LCOV report file detected at ${resultsPath}.`);
|
|
53
|
+
}
|
|
54
|
+
const parsedRecords = parseLcov(toUnixNewlines(lcovFileContent));
|
|
55
|
+
logger.debug(`Parsed LCOV report file at ${resultsPath}`);
|
|
56
|
+
return [
|
|
57
|
+
resultsPath,
|
|
58
|
+
parsedRecords.map((record) => ({
|
|
46
59
|
title: record.title,
|
|
47
60
|
file: typeof result === 'string' || result.pathToProject == null
|
|
48
61
|
? record.file
|
|
@@ -50,12 +63,8 @@ export async function parseLcovFiles(results) {
|
|
|
50
63
|
functions: patchInvalidStats(record, 'functions'),
|
|
51
64
|
branches: patchInvalidStats(record, 'branches'),
|
|
52
65
|
lines: patchInvalidStats(record, 'lines'),
|
|
53
|
-
}))
|
|
54
|
-
|
|
55
|
-
if (parsedResults.length === 0) {
|
|
56
|
-
throw new Error('All provided coverage results are empty.');
|
|
57
|
-
}
|
|
58
|
-
return parsedResults;
|
|
66
|
+
})),
|
|
67
|
+
];
|
|
59
68
|
}
|
|
60
69
|
/**
|
|
61
70
|
* Filters out invalid `line` numbers, and ensures `hit <= found`.
|
|
@@ -91,4 +100,59 @@ function getCoverageStatsFromLcovRecord(record, coverageTypes) {
|
|
|
91
100
|
recordToStatFunctionMapper[coverageType](record),
|
|
92
101
|
]));
|
|
93
102
|
}
|
|
103
|
+
function logLcovRecords(recordsPerReport) {
|
|
104
|
+
const reportPaths = Object.keys(recordsPerReport);
|
|
105
|
+
const reportsCount = reportPaths.length;
|
|
106
|
+
const sourceFilesCount = new Set(Object.values(recordsPerReport)
|
|
107
|
+
.flat()
|
|
108
|
+
.map(record => record.file)).size;
|
|
109
|
+
logger.info(`Parsed ${pluralizeToken('LCOV report', reportsCount)}, coverage collected from ${pluralizeToken('source file', sourceFilesCount)}`);
|
|
110
|
+
if (!logger.isVerbose()) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const truncatedPaths = truncatePaths(reportPaths);
|
|
114
|
+
logger.newline();
|
|
115
|
+
logger.debug(formatAsciiTable({
|
|
116
|
+
columns: [
|
|
117
|
+
{ key: 'report', label: 'LCOV report', align: 'left' },
|
|
118
|
+
{ key: 'filesCount', label: 'Files', align: 'right' },
|
|
119
|
+
...ALL_COVERAGE_TYPES.map((type) => ({
|
|
120
|
+
key: type,
|
|
121
|
+
label: capitalize(pluralize(type)),
|
|
122
|
+
align: 'right',
|
|
123
|
+
})),
|
|
124
|
+
],
|
|
125
|
+
rows: Object.entries(recordsPerReport).map(([reportPath, records], idx) => {
|
|
126
|
+
const groups = groupLcovRecordsByCoverageType(records, ALL_COVERAGE_TYPES);
|
|
127
|
+
const stats = objectFromEntries(objectToEntries(groups).map(([type, files = []]) => [
|
|
128
|
+
type,
|
|
129
|
+
formatCoverageSum(files),
|
|
130
|
+
]));
|
|
131
|
+
const report = truncatedPaths[idx] ?? reportPath;
|
|
132
|
+
return { report, filesCount: records.length, ...stats };
|
|
133
|
+
}),
|
|
134
|
+
}));
|
|
135
|
+
logger.newline();
|
|
136
|
+
}
|
|
137
|
+
function formatCoverageSum(files) {
|
|
138
|
+
const { covered, total } = files.reduce((acc, file) => ({
|
|
139
|
+
covered: acc.covered + file.covered,
|
|
140
|
+
total: acc.total + file.total,
|
|
141
|
+
}), { covered: 0, total: 0 });
|
|
142
|
+
if (total === 0) {
|
|
143
|
+
return 'n/a';
|
|
144
|
+
}
|
|
145
|
+
const percentage = (covered / total) * 100;
|
|
146
|
+
return `${percentage.toFixed(1)}%`;
|
|
147
|
+
}
|
|
148
|
+
function logMergedRecords(counts) {
|
|
149
|
+
if (counts.before === counts.after) {
|
|
150
|
+
logger.debug(counts.after === 1
|
|
151
|
+
? 'There is only 1 LCOV record' // should be rare
|
|
152
|
+
: `All of ${pluralizeToken('LCOV record', counts.after)} have unique source files`);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
logger.info(`Merged ${counts.before} into ${pluralizeToken('unique LCOV record', counts.after)} per source file`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
94
158
|
//# sourceMappingURL=lcov-runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lcov-runner.js","sourceRoot":"","sources":["../../../../../src/lib/runner/lcov/lcov-runner.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAEL,MAAM,EACN,UAAU,EACV,MAAM,EACN,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,cAAc,
|
|
1
|
+
{"version":3,"file":"lcov-runner.js","sourceRoot":"","sources":["../../../../../src/lib/runner/lcov/lcov-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { executeProcess, formatAsciiTable, logger, pluralizeToken, } from '@code-pushup/utils';
|
|
2
|
+
import { slugToTitle } from '../format.js';
|
|
3
|
+
import { lcovResultsToAuditOutputs } from './lcov/lcov-runner.js';
|
|
4
|
+
export function createRunnerFunction(config) {
|
|
5
|
+
return async () => {
|
|
6
|
+
const { reports, coverageToolCommand, continueOnCommandFail, coverageTypes, } = config;
|
|
7
|
+
// Run coverage tool if provided
|
|
8
|
+
if (coverageToolCommand == null) {
|
|
9
|
+
logger.info('No test command provided, assuming coverage has already been collected');
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
logger.info('Executing test command to collect coverage ...');
|
|
13
|
+
const { command, args } = coverageToolCommand;
|
|
14
|
+
try {
|
|
15
|
+
await executeProcess({ command, args });
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
if (!continueOnCommandFail) {
|
|
19
|
+
throw new Error('Running coverage tool failed. Make sure all your tests are passing.');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Calculate coverage from LCOV results
|
|
24
|
+
const auditOutputs = await lcovResultsToAuditOutputs(reports, coverageTypes);
|
|
25
|
+
logAuditOutputs(auditOutputs);
|
|
26
|
+
return auditOutputs;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function logAuditOutputs(auditOutputs) {
|
|
30
|
+
logger.info(`Transformed LCOV reports to ${pluralizeToken('audit output', auditOutputs.length)}`);
|
|
31
|
+
logger.info(formatAsciiTable({
|
|
32
|
+
columns: ['left', 'right'],
|
|
33
|
+
rows: auditOutputs.map(audit => [
|
|
34
|
+
`• ${slugToTitle(audit.slug)}`,
|
|
35
|
+
`${audit.value.toFixed(2)}%`,
|
|
36
|
+
]),
|
|
37
|
+
}, { borderless: true }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/lib/runner/runner.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,MAAM,EACN,cAAc,GACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,UAAU,oBAAoB,CAClC,MAAiC;IAEjC,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,EACJ,OAAO,EACP,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,GACd,GAAG,MAAM,CAAC;QAEX,gCAAgC;QAChC,IAAI,mBAAmB,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CACT,wEAAwE,CACzE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC9D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,MAAM,IAAI,KAAK,CACb,qEAAqE,CACtE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAClD,OAAO,EACP,aAAa,CACd,CAAC;QAEF,eAAe,CAAC,YAAY,CAAC,CAAC;QAE9B,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,YAA0B;IACjD,MAAM,CAAC,IAAI,CACT,+BAA+B,cAAc,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CACrF,CAAC;IACF,MAAM,CAAC,IAAI,CACT,gBAAgB,CACd;QACE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;QAC1B,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC9B,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;SAC7B,CAAC;KACH,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CACF,CAAC;AACJ,CAAC"}
|
package/src/bin.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/src/bin.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import process from 'node:process';
|
|
2
|
-
import { Parser } from 'yargs/helpers';
|
|
3
|
-
import { executeRunner } from './lib/runner/index.js';
|
|
4
|
-
const { runnerConfigPath, runnerOutputPath } = Parser(process.argv);
|
|
5
|
-
await executeRunner({ runnerConfigPath, runnerOutputPath });
|
|
6
|
-
//# sourceMappingURL=bin.js.map
|
package/src/bin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpE,MAAM,aAAa,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { RunnerConfig, RunnerFilesPaths } from '@code-pushup/models';
|
|
2
|
-
import type { FinalCoveragePluginConfig } from '../config.js';
|
|
3
|
-
export declare function executeRunner({ runnerConfigPath, runnerOutputPath, }: RunnerFilesPaths): Promise<void>;
|
|
4
|
-
export declare function createRunnerConfig(scriptPath: string, config: FinalCoveragePluginConfig): Promise<RunnerConfig>;
|
package/src/lib/runner/index.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { writeFile } from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { createRunnerFiles, ensureDirectoryExists, executeProcess, filePathToCliArg, objectToCliArgs, readJsonFile, } from '@code-pushup/utils';
|
|
4
|
-
import { lcovResultsToAuditOutputs } from './lcov/lcov-runner.js';
|
|
5
|
-
export async function executeRunner({ runnerConfigPath, runnerOutputPath, }) {
|
|
6
|
-
const { reports, coverageToolCommand, continueOnCommandFail, coverageTypes } = await readJsonFile(runnerConfigPath);
|
|
7
|
-
// Run coverage tool if provided
|
|
8
|
-
if (coverageToolCommand != null) {
|
|
9
|
-
const { command, args } = coverageToolCommand;
|
|
10
|
-
try {
|
|
11
|
-
await executeProcess({ command, args });
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
if (!continueOnCommandFail) {
|
|
15
|
-
throw new Error('Coverage plugin: Running coverage tool failed. Make sure all your provided tests are passing.');
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
// Calculate coverage from LCOV results
|
|
20
|
-
const auditOutputs = await lcovResultsToAuditOutputs(reports, coverageTypes);
|
|
21
|
-
await ensureDirectoryExists(path.dirname(runnerOutputPath));
|
|
22
|
-
await writeFile(runnerOutputPath, JSON.stringify(auditOutputs));
|
|
23
|
-
}
|
|
24
|
-
export async function createRunnerConfig(scriptPath, config) {
|
|
25
|
-
// Create JSON config for executeRunner
|
|
26
|
-
const { runnerConfigPath, runnerOutputPath } = await createRunnerFiles('coverage', JSON.stringify(config));
|
|
27
|
-
return {
|
|
28
|
-
command: 'node',
|
|
29
|
-
args: [
|
|
30
|
-
filePathToCliArg(scriptPath),
|
|
31
|
-
...objectToCliArgs({ runnerConfigPath, runnerOutputPath }),
|
|
32
|
-
],
|
|
33
|
-
configFile: runnerConfigPath,
|
|
34
|
-
outputFile: runnerOutputPath,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,gBAAgB,EAChB,gBAAgB,GACC;IACjB,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,aAAa,EAAE,GAC1E,MAAM,YAAY,CAA4B,gBAAgB,CAAC,CAAC;IAElE,gCAAgC;IAChC,IAAI,mBAAmB,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAE7E,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,MAAiC;IAEjC,uCAAuC;IACvC,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,MAAM,iBAAiB,CACpE,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CACvB,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,MAAM;QACf,IAAI,EAAE;YACJ,gBAAgB,CAAC,UAAU,CAAC;YAC5B,GAAG,eAAe,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;SAC3D;QACD,UAAU,EAAE,gBAAgB;QAC5B,UAAU,EAAE,gBAAgB;KAC7B,CAAC;AACJ,CAAC"}
|