Skip to content

Commit a280451

Browse files
fix(coverage): ignore generated TS decorators (#5206)
Co-authored-by: Vladimir <sleuths.slews0s@icloud.com>
1 parent 5376d5b commit a280451

File tree

13 files changed

+1059
-66
lines changed

13 files changed

+1059
-66
lines changed

Diff for: packages/coverage-istanbul/src/provider.ts

+3
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ export class IstanbulCoverageProvider extends BaseCoverageProvider implements Co
114114
const sourceMap = pluginCtx.getCombinedSourcemap()
115115
sourceMap.sources = sourceMap.sources.map(removeQueryParameters)
116116

117+
// Exclude SWC's decorators that are left in source maps
118+
sourceCode = sourceCode.replaceAll('_ts_decorate', '/* istanbul ignore next */_ts_decorate')
119+
117120
const code = this.instrumenter.instrumentSync(sourceCode, id, sourceMap as any)
118121
const map = this.instrumenter.lastSourceMap() as any
119122

Diff for: packages/coverage-v8/src/provider.ts

+14-10
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const WRAPPER_LENGTH = 185
5151

5252
// Note that this needs to match the line ending as well
5353
const VITE_EXPORTS_LINE_PATTERN = /Object\.defineProperty\(__vite_ssr_exports__.*\n/g
54+
const DECORATOR_METADATA_PATTERN = /_ts_metadata\("design:paramtypes"(\s|.)+?]\),/g
5455
const DEFAULT_PROJECT = Symbol.for('default-project')
5556

5657
const debug = createDebug('vitest:coverage')
@@ -312,7 +313,7 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
312313
originalSource: sourcesContent,
313314
source: code || sourcesContent,
314315
sourceMap: {
315-
sourcemap: removeViteHelpersFromSourceMaps(code, {
316+
sourcemap: excludeGeneratedCode(code, {
316317
...map,
317318
version: 3,
318319
sources: [url],
@@ -363,21 +364,24 @@ async function transformCoverage(coverageMap: CoverageMap) {
363364
/**
364365
* Remove generated code from the source maps:
365366
* - Vite's export helpers: e.g. `Object.defineProperty(__vite_ssr_exports__, "sum", { enumerable: true, configurable: true, get(){ return sum }});`
367+
* - SWC's decorator metadata: e.g. `_ts_metadata("design:paramtypes", [\ntypeof Request === "undefined" ? Object : Request\n]),`
366368
*/
367-
function removeViteHelpersFromSourceMaps(source: string | undefined, map: EncodedSourceMap) {
368-
if (!source || !source.match(VITE_EXPORTS_LINE_PATTERN))
369+
function excludeGeneratedCode(source: string | undefined, map: EncodedSourceMap) {
370+
if (!source)
369371
return map
370372

371-
const sourceWithoutHelpers = new MagicString(source)
372-
sourceWithoutHelpers.replaceAll(VITE_EXPORTS_LINE_PATTERN, '\n')
373+
if (!source.match(VITE_EXPORTS_LINE_PATTERN) && !source.match(DECORATOR_METADATA_PATTERN))
374+
return map
375+
376+
const trimmed = new MagicString(source)
377+
trimmed.replaceAll(VITE_EXPORTS_LINE_PATTERN, '\n')
378+
trimmed.replaceAll(DECORATOR_METADATA_PATTERN, match => '\n'.repeat(match.split('\n').length - 1))
373379

374-
const mapWithoutHelpers = sourceWithoutHelpers.generateMap({
375-
hires: 'boundary',
376-
})
380+
const trimmedMap = trimmed.generateMap({ hires: 'boundary' })
377381

378-
// A merged source map where the first one excludes helpers
382+
// A merged source map where the first one excludes generated parts
379383
const combinedMap = remapping(
380-
[{ ...mapWithoutHelpers, version: 3 }, map],
384+
[{ ...trimmedMap, version: 3 }, map],
381385
() => null,
382386
)
383387

Diff for: pnpm-lock.yaml

+172
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: test/coverage-test/coverage-report-tests/__snapshots__/custom.report.test.ts.snap

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ exports[`custom json report 1`] = `
2020
"<process-cwd>/src/Defined.vue",
2121
"<process-cwd>/src/Hello.vue",
2222
"<process-cwd>/src/another-setup.ts",
23+
"<process-cwd>/src/decorators.ts",
2324
"<process-cwd>/src/dynamic-file-esm.ignore.js",
2425
"<process-cwd>/src/dynamic-files.ts",
2526
"<process-cwd>/src/function-count.ts",

0 commit comments

Comments
 (0)