Skip to content

Commit 552d89f

Browse files
committed
fix(coverage): ignore generated TS decorators
1 parent 196e843 commit 552d89f

File tree

13 files changed

+971
-10
lines changed

13 files changed

+971
-10
lines changed

packages/coverage-istanbul/src/provider.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ export class IstanbulCoverageProvider extends BaseCoverageProvider implements Co
115115
const sourceMap = pluginCtx.getCombinedSourcemap()
116116
sourceMap.sources = sourceMap.sources.map(removeQueryParameters)
117117

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

packages/coverage-v8/src/provider.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const WRAPPER_LENGTH = 185
5252

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

5758
const debug = createDebug('vitest:coverage')
@@ -315,7 +316,7 @@ export class V8CoverageProvider extends BaseCoverageProvider implements Coverage
315316
originalSource: sourcesContent,
316317
source: code || sourcesContent,
317318
sourceMap: {
318-
sourcemap: removeViteHelpersFromSourceMaps(code, {
319+
sourcemap: excludeGeneratedCode(code, {
319320
...map,
320321
version: 3,
321322
sources: [url],
@@ -366,21 +367,24 @@ async function transformCoverage(coverageMap: CoverageMap) {
366367
/**
367368
* Remove generated code from the source maps:
368369
* - Vite's export helpers: e.g. `Object.defineProperty(__vite_ssr_exports__, "sum", { enumerable: true, configurable: true, get(){ return sum }});`
370+
* - SWC's decorator metadata: e.g. `_ts_metadata("design:paramtypes", [\ntypeof Request === "undefined" ? Object : Request\n]),`
369371
*/
370-
function removeViteHelpersFromSourceMaps(source: string | undefined, map: EncodedSourceMap) {
371-
if (!source || !source.match(VITE_EXPORTS_LINE_PATTERN))
372+
function excludeGeneratedCode(source: string | undefined, map: EncodedSourceMap) {
373+
if (!source)
372374
return map
373375

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

377-
const mapWithoutHelpers = sourceWithoutHelpers.generateMap({
378-
hires: 'boundary',
379-
})
383+
const trimmedMap = trimmed.generateMap({ hires: 'boundary' })
380384

381-
// A merged source map where the first one excludes helpers
385+
// A merged source map where the first one excludes generated parts
382386
const combinedMap = remapping(
383-
[{ ...mapWithoutHelpers, version: 3 }, map],
387+
[{ ...trimmedMap, version: 3 }, map],
384388
() => null,
385389
)
386390

pnpm-lock.yaml

Lines changed: 172 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/coverage-test/coverage-report-tests/__snapshots__/custom.report.test.ts.snap

Lines changed: 1 addition & 0 deletions
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)