Skip to content

Commit

Permalink
feat!: create vitest/coverage module
Browse files Browse the repository at this point in the history
BREAKING CHANGES: Coverage packages require new version of vitest
  • Loading branch information
AriPerkkio committed Feb 25, 2023
1 parent 615e150 commit e3fc51e
Show file tree
Hide file tree
Showing 11 changed files with 79 additions and 93 deletions.
1 change: 1 addition & 0 deletions packages/coverage-c8/rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const external = [
'vitest',
'vitest/node',
'vitest/config',
'vitest/coverage',
]

const plugins = [
Expand Down
75 changes: 23 additions & 52 deletions packages/coverage-c8/src/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import c from 'picocolors'
import { provider } from 'std-env'
import type { EncodedSourceMap } from 'vite-node'
import { coverageConfigDefaults } from 'vitest/config'
import { BaseCoverageProvider } from 'vitest/coverage'
// eslint-disable-next-line no-restricted-imports
import type { AfterSuiteRunMeta, CoverageC8Options, CoverageProvider, ReportContext, ResolvedCoverageOptions } from 'vitest'
import type { Vitest } from 'vitest/node'
Expand All @@ -17,16 +18,36 @@ import { checkCoverages } from 'c8/lib/commands/check-coverage.js'

type Options = ResolvedCoverageOptions<'c8'>

export class C8CoverageProvider implements CoverageProvider {
export class C8CoverageProvider extends BaseCoverageProvider implements CoverageProvider {
name = 'c8'

ctx!: Vitest
options!: Options
coverages: Profiler.TakePreciseCoverageReturnType[] = []

initialize(ctx: Vitest) {
const config: CoverageC8Options = ctx.config.coverage

this.ctx = ctx
this.options = resolveC8Options(ctx.config.coverage, ctx.config.root)
this.options = {
...coverageConfigDefaults,

// Provider specific defaults
excludeNodeModules: true,
allowExternal: false,

// User's options
...config,

// Resolved fields
provider: 'c8',
reporter: this.resolveReporters(config.reporter || coverageConfigDefaults.reporter),
reportsDirectory: resolve(ctx.config.root, config.reportsDirectory || coverageConfigDefaults.reportsDirectory),
lines: config['100'] ? 100 : config.lines,
functions: config['100'] ? 100 : config.functions,
branches: config['100'] ? 100 : config.branches,
statements: config['100'] ? 100 : config.statements,
}
}

resolveOptions() {
Expand Down Expand Up @@ -158,53 +179,3 @@ export class C8CoverageProvider implements CoverageProvider {
await checkCoverages(options, report)
}
}

function resolveC8Options(options: CoverageC8Options, root: string): Options {
const reportsDirectory = resolve(root, options.reportsDirectory || coverageConfigDefaults.reportsDirectory)

const resolved: Options = {
...coverageConfigDefaults,

// Provider specific defaults
excludeNodeModules: true,
allowExternal: false,

// User's options
...options,

// Resolved fields
provider: 'c8',
reporter: resolveReporters(options.reporter || coverageConfigDefaults.reporter),
reportsDirectory,
}

if (options['100']) {
resolved.lines = 100
resolved.functions = 100
resolved.branches = 100
resolved.statements = 100
}

return resolved
}

function resolveReporters(configReporters: NonNullable<CoverageC8Options['reporter']>): Options['reporter'] {
// E.g. { reporter: "html" }
if (!Array.isArray(configReporters))
return [[configReporters, {}]]

const resolvedReporters: Options['reporter'] = []

for (const reporter of configReporters) {
if (Array.isArray(reporter)) {
// E.g. { reporter: [ ["html", { skipEmpty: true }], ["lcov"], ["json", { file: "map.json" }] ]}
resolvedReporters.push([reporter[0], reporter[1] || {}])
}
else {
// E.g. { reporter: ["html", "json"]}
resolvedReporters.push([reporter, {}])
}
}

return resolvedReporters
}
1 change: 1 addition & 0 deletions packages/coverage-istanbul/rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const external = [
'vitest',
'vitest/node',
'vitest/config',
'vitest/coverage',
]

const plugins = [
Expand Down
56 changes: 15 additions & 41 deletions packages/coverage-istanbul/src/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { relative, resolve } from 'pathe'
import type { TransformPluginContext } from 'rollup'
import type { AfterSuiteRunMeta, CoverageIstanbulOptions, CoverageProvider, ReportContext, ResolvedCoverageOptions, Vitest } from 'vitest'
import { coverageConfigDefaults, defaultExclude, defaultInclude } from 'vitest/config'
import { BaseCoverageProvider } from 'vitest/coverage'
import libReport from 'istanbul-lib-report'
import reports from 'istanbul-reports'
import type { CoverageMap } from 'istanbul-lib-coverage'
Expand Down Expand Up @@ -31,7 +32,7 @@ interface TestExclude {
}
}

export class IstanbulCoverageProvider implements CoverageProvider {
export class IstanbulCoverageProvider extends BaseCoverageProvider implements CoverageProvider {
name = 'istanbul'

ctx!: Vitest
Expand All @@ -48,8 +49,20 @@ export class IstanbulCoverageProvider implements CoverageProvider {
coverages: any[] = []

initialize(ctx: Vitest) {
const config: CoverageIstanbulOptions = ctx.config.coverage

this.ctx = ctx
this.options = resolveIstanbulOptions(ctx.config.coverage, ctx.config.root)
this.options = {
...coverageConfigDefaults,

// User's options
...config,

// Resolved fields
provider: 'istanbul',
reportsDirectory: resolve(ctx.config.root, config.reportsDirectory || coverageConfigDefaults.reportsDirectory),
reporter: this.resolveReporters(config.reporter || coverageConfigDefaults.reporter),
}

this.instrumenter = createInstrumenter({
produceSourceMap: true,
Expand Down Expand Up @@ -220,24 +233,6 @@ export class IstanbulCoverageProvider implements CoverageProvider {
}
}

function resolveIstanbulOptions(options: CoverageIstanbulOptions, root: string): Options {
const reportsDirectory = resolve(root, options.reportsDirectory || coverageConfigDefaults.reportsDirectory)

const resolved: Options = {
...coverageConfigDefaults,

// User's options
...options,

// Resolved fields
provider: 'istanbul',
reportsDirectory,
reporter: resolveReporters(options.reporter || coverageConfigDefaults.reporter),
}

return resolved
}

/**
* Remove possible query parameters from filenames
* - From `/src/components/Header.component.ts?vue&type=script&src=true&lang.ts`
Expand Down Expand Up @@ -287,24 +282,3 @@ function isEmptyCoverageRange(range: libCoverage.Range) {
|| range.end.column === undefined
)
}

function resolveReporters(configReporters: NonNullable<CoverageIstanbulOptions['reporter']>): Options['reporter'] {
// E.g. { reporter: "html" }
if (!Array.isArray(configReporters))
return [[configReporters, {}]]

const resolvedReporters: Options['reporter'] = []

for (const reporter of configReporters) {
if (Array.isArray(reporter)) {
// E.g. { reporter: [ ["html", { skipEmpty: true }], ["lcov"], ["json", { file: "map.json" }] ]}
resolvedReporters.push([reporter[0], reporter[1] || {}])
}
else {
// E.g. { reporter: ["html", "json"]}
resolvedReporters.push([reporter, {}])
}
}

return resolvedReporters
}
1 change: 1 addition & 0 deletions packages/vitest/coverage.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './dist/coverage.js'
5 changes: 5 additions & 0 deletions packages/vitest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@
"types": "./config.d.ts",
"require": "./dist/config.cjs",
"import": "./dist/config.js"
},
"./coverage": {
"types": "./coverage.d.ts",
"import": "./dist/coverage.js"
}
},
"main": "./dist/index.js",
Expand Down Expand Up @@ -144,6 +148,7 @@
"@edge-runtime/vm": "2.0.2",
"@sinonjs/fake-timers": "^10.0.2",
"@types/diff": "^5.0.2",
"@types/istanbul-lib-coverage": "^2.0.4",
"@types/istanbul-reports": "^3.0.1",
"@types/jsdom": "^21.1.0",
"@types/micromatch": "^4.0.2",
Expand Down
2 changes: 2 additions & 0 deletions packages/vitest/rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const entries = [
'src/runtime/loader.ts',
'src/runtime/entry.ts',
'src/integrations/spy.ts',
'src/coverage.ts',
]

const dtsEntries = [
Expand All @@ -36,6 +37,7 @@ const dtsEntries = [
'src/runners.ts',
'src/suite.ts',
'src/config.ts',
'src/coverage.ts',
]

const external = [
Expand Down
1 change: 1 addition & 0 deletions packages/vitest/src/coverage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { BaseCoverageProvider } from './utils/coverage'
27 changes: 27 additions & 0 deletions packages/vitest/src/utils/coverage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import type { BaseCoverageOptions, ResolvedCoverageOptions } from '../types'

export class BaseCoverageProvider {
/**
* Resolve reporters from various configuration options
*/
resolveReporters(configReporters: NonNullable<BaseCoverageOptions['reporter']>): ResolvedCoverageOptions['reporter'] {
// E.g. { reporter: "html" }
if (!Array.isArray(configReporters))
return [[configReporters, {}]]

const resolvedReporters: ResolvedCoverageOptions['reporter'] = []

for (const reporter of configReporters) {
if (Array.isArray(reporter)) {
// E.g. { reporter: [ ["html", { skipEmpty: true }], ["lcov"], ["json", { file: "map.json" }] ]}
resolvedReporters.push([reporter[0], reporter[1] || {}])
}
else {
// E.g. { reporter: ["html", "json"]}
resolvedReporters.push([reporter, {}])
}
}

return resolvedReporters
}
}
2 changes: 2 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"vitest/globals": ["./packages/vitest/globals.d.ts"],
"vitest/node": ["./packages/vitest/src/node/index.ts"],
"vitest/config": ["./packages/vitest/src/config.ts"],
"vitest/coverage": ["./packages/vitest/src/coverage.ts"],
"vitest/browser": ["./packages/vitest/src/browser.ts"],
"vitest/runners": ["./packages/vitest/src/runners.ts"],
"vite-node": ["./packages/vite-node/src/index.ts"],
Expand Down

0 comments on commit e3fc51e

Please sign in to comment.