Skip to content

Commit 1159cf0

Browse files
committed
feat(@angular/build): add code coverage reporters option for unit-test
The experimental `unit-test` builder now contains an additional option named `codeCoverageReporters` that supports configuring the reporter(s) for code coverage results. This options only has an effect if the `codeCoverage` option is also enabled. The `codeCoverageReporters` is an array with elements that can be either a string or a tuple of a string and options object. The later form supports customizing individual reporters. The options object fields are not validated by the builder schema. This option currently only is used by the `vitest` runner. Currently supported values for a coverage reporter are: "html", "lcov", "lcovonly", "text", "text-summary", "cobertura"
1 parent e0d30fb commit 1159cf0

File tree

4 files changed

+39
-8
lines changed

4 files changed

+39
-8
lines changed

packages/angular/build/src/builders/unit-test/builder.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ export async function* execute(
237237
browser,
238238
reporters: normalizedOptions.reporters ?? ['default'],
239239
coverage: {
240-
enabled: normalizedOptions.codeCoverage,
240+
enabled: !!normalizedOptions.codeCoverage,
241+
reporter: normalizedOptions.codeCoverage?.reporters,
241242
excludeAfterRemap: true,
242243
},
243244
...debugOptions,
@@ -251,7 +252,7 @@ export async function* execute(
251252
// builder's test setup. To workaround this, the excludes are adjusted here to only automatically
252253
// exclude the TypeScript source test files.
253254
context.project.config.coverage.exclude = [
254-
...(normalizedOptions.codeCoverageExclude ?? []),
255+
...(normalizedOptions.codeCoverage?.exclude ?? []),
255256
'**/*.{test,spec}.?(c|m)ts',
256257
];
257258
},

packages/angular/build/src/builders/unit-test/karma-bridge.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ export async function useKarmaBuilder(
4545
poll: buildTargetOptions.poll,
4646
preserveSymlinks: buildTargetOptions.preserveSymlinks,
4747
browsers: unitTestOptions.browsers?.join(','),
48-
codeCoverage: unitTestOptions.codeCoverage,
49-
codeCoverageExclude: unitTestOptions.codeCoverageExclude,
48+
codeCoverage: !!unitTestOptions.codeCoverage,
49+
codeCoverageExclude: unitTestOptions.codeCoverage?.exclude,
5050
fileReplacements: buildTargetOptions.fileReplacements,
5151
reporters: unitTestOptions.reporters,
5252
webWorkerTsConfig: buildTargetOptions.webWorkerTsConfig,

packages/angular/build/src/builders/unit-test/options.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export async function normalizeOptions(
3333
const buildTargetSpecifier = options.buildTarget ?? `::development`;
3434
const buildTarget = targetFromTargetString(buildTargetSpecifier, projectName, 'build');
3535

36-
const { codeCoverage, codeCoverageExclude, tsConfig, runner, reporters, browsers } = options;
36+
const { tsConfig, runner, reporters, browsers } = options;
3737

3838
return {
3939
// Project/workspace information
@@ -46,8 +46,16 @@ export async function normalizeOptions(
4646
include: options.include ?? ['**/*.spec.ts'],
4747
exclude: options.exclude ?? [],
4848
runnerName: runner,
49-
codeCoverage,
50-
codeCoverageExclude,
49+
codeCoverage: options.codeCoverage
50+
? {
51+
exclude: options.codeCoverageExclude,
52+
reporters: options.codeCoverageReporters?.map((entry) =>
53+
typeof entry === 'string'
54+
? ([entry, {}] as [string, Record<string, unknown>])
55+
: (entry as [string, Record<string, unknown>]),
56+
),
57+
}
58+
: undefined,
5159
tsConfig,
5260
reporters,
5361
browsers,

packages/angular/build/src/builders/unit-test/schema.json

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,23 @@
6464
},
6565
"default": []
6666
},
67+
"codeCoverageReporters": {
68+
"type": "array",
69+
"description": "Reporters to use for code coverage results.",
70+
"items": {
71+
"oneOf": [
72+
{
73+
"$ref": "#/definitions/coverage-reporters"
74+
},
75+
{
76+
"type": "array",
77+
"minItems": 1,
78+
"maxItems": 2,
79+
"items": [{ "$ref": "#/definitions/coverage-reporters" }, { "type": "object" }]
80+
}
81+
]
82+
}
83+
},
6784
"reporters": {
6885
"type": "array",
6986
"description": "Test runner reporters to use. Directly passed to the test runner.",
@@ -78,5 +95,10 @@
7895
}
7996
},
8097
"additionalProperties": false,
81-
"required": ["buildTarget", "tsConfig", "runner"]
98+
"required": ["buildTarget", "tsConfig", "runner"],
99+
"definitions": {
100+
"coverage-reporters": {
101+
"enum": ["html", "lcov", "lcovonly", "text", "text-summary", "cobertura"]
102+
}
103+
}
82104
}

0 commit comments

Comments
 (0)