Istanbul coverage provider for Vitest that instruments JavaScript and TypeScript code to track code execution during tests
npx @tessl/cli install tessl/npm-vitest--coverage-istanbul@3.2.0Istanbul coverage provider for Vitest that instruments JavaScript and TypeScript code to track code execution during tests. This package provides an alternative to Vitest's default V8 coverage provider, offering the mature Istanbul toolchain for comprehensive code coverage analysis.
npm install @vitest/coverage-istanbulimport istanbulProvider from "@vitest/coverage-istanbul";
// istanbulProvider is a CoverageProviderModule with takeCoverage, startCoverage, and getProvider methodsFor CommonJS:
const istanbulProvider = require("@vitest/coverage-istanbul");Note: This package exports a default module implementing the CoverageProviderModule interface, not named exports.
// vitest.config.ts
import { defineConfig } from 'vitest/config'
export default defineConfig({
test: {
coverage: {
provider: 'istanbul',
reporter: ['text', 'json', 'html'],
reportsDirectory: './coverage'
}
}
})The package implements Vitest's coverage provider interface through several key components:
CoverageProviderModule interfaceMain export that integrates with Vitest's coverage system.
interface CoverageProviderModule {
takeCoverage(): CoverageMapData;
startCoverage(): void;
getProvider(): Promise<IstanbulCoverageProvider>;
}
interface CoverageMapData {
[filename: string]: FileCoverage;
}
interface FileCoverage {
f: FunctionCoverage;
s: StatementCoverage;
b: BranchCoverage;
}
interface FunctionCoverage {
[key: string]: number;
}
interface StatementCoverage {
[key: string]: number;
}
interface BranchCoverage {
[key: string]: number[];
}The default export provides three core functions:
takeCoverage() - Retrieves coverage data from the global coverage storestartCoverage() - Resets coverage counters to prevent duplicate results between test runsgetProvider() - Returns an instance of the Istanbul coverage providerCore coverage provider implementation that handles instrumentation and reporting.
class IstanbulCoverageProvider extends BaseCoverageProvider<ResolvedCoverageOptions<'istanbul'>> implements CoverageProvider {
name: 'istanbul';
version: string;
instrumenter: Instrumenter;
testExclude: InstanceType<typeof TestExclude>;
initialize(ctx: Vitest): void;
onFileTransform(sourceCode: string, id: string, pluginCtx: any): { code: string; map: any } | undefined;
createCoverageMap(): CoverageMap;
generateCoverage(reportContext: ReportContext): Promise<CoverageMap>;
generateReports(coverageMap: CoverageMap, allTestsRun: boolean | undefined): Promise<void>;
parseConfigModule(configFilePath: string): Promise<ProxifiedModule<any>>;
}
interface ReportContext {
allTestsRun?: boolean;
}
interface CoverageMap {
files(): string[];
merge(other: CoverageMap): void;
filter(fn: (filename: string) => boolean): void;
addFileCoverage(coverage: FileCoverage): void;
}Key methods:
initialize(ctx) - Sets up the provider with Vitest context, configures instrumenter and file exclusion rulesonFileTransform(sourceCode, id, pluginCtx) - Instruments source code during build process for coverage trackingcreateCoverageMap() - Creates a new Istanbul coverage map instancegenerateCoverage(reportContext) - Collects and processes coverage data from test executiongenerateReports(coverageMap, allTestsRun) - Generates coverage reports in configured formatsparseConfigModule(configFilePath) - Parses configuration files using magicast for dynamic config processing// vitest.config.ts
import { defineConfig } from 'vitest/config'
export default defineConfig({
test: {
coverage: {
provider: 'istanbul',
reporter: ['text', 'json-summary', 'html'],
reportsDirectory: './coverage',
exclude: [
'node_modules/',
'src/test-utils/',
'**/*.{test,spec}.{js,ts}',
],
include: ['src/**/*.{js,ts}'],
all: true,
skipFull: false
}
}
})// vitest.config.ts
import { defineConfig } from 'vitest/config'
export default defineConfig({
test: {
coverage: {
provider: 'istanbul',
reporter: [
['text'],
['html', { subdir: 'html' }],
['json', { file: 'coverage.json' }],
['lcov', { file: 'lcov.info' }]
],
reportsDirectory: './coverage',
watermarks: {
statements: [80, 95],
functions: [80, 95],
branches: [80, 95],
lines: [80, 95]
},
thresholds: {
statements: 90,
functions: 90,
branches: 90,
lines: 90
},
ignoreClassMethods: ['toString', 'toJSON'],
excludeAfterRemap: true,
all: true,
cleanOnRerun: true
}
}
})// vitest.config.ts
import { defineConfig } from 'vitest/config'
export default defineConfig({
test: {
coverage: {
provider: 'istanbul',
reporter: [
'text-summary',
['html', {
subdir: 'html-report',
skipFull: false
}],
['cobertura', {
file: 'cobertura-coverage.xml'
}],
['teamcity', {
file: 'teamcity-coverage.txt'
}]
]
}
}
})The Istanbul coverage provider supports specific configuration options through Vitest's coverage configuration.
interface CoverageIstanbulOptions extends BaseCoverageOptions {
/**
* Set to array of class method names to ignore for coverage
*
* @default []
*/
ignoreClassMethods?: string[];
}
interface BaseCoverageOptions {
enabled?: boolean;
include?: string[];
extension?: string | string[];
exclude?: string[];
all?: boolean;
clean?: boolean;
cleanOnRerun?: boolean;
reportsDirectory?: string;
reporter?: CoverageReporter[];
skipFull?: boolean;
thresholds?: Thresholds;
watermarks?: {
statements?: [number, number];
functions?: [number, number];
branches?: [number, number];
lines?: [number, number];
};
reportOnFailure?: boolean;
allowExternal?: boolean;
excludeAfterRemap?: boolean;
processingConcurrency?: number;
}
type CoverageReporter = 'text' | 'json' | 'html' | 'lcov' | 'text-summary' | 'json-summary' | 'cobertura' | 'teamcity' | (string & {});
interface Thresholds {
statements?: number;
functions?: number;
branches?: number;
lines?: number;
}
type ResolvedCoverageOptions<T extends 'istanbul'> = CoverageIstanbulOptions & Required<Pick<CoverageIstanbulOptions, 'enabled' | 'clean' | 'cleanOnRerun' | 'all' | 'skipFull' | 'reportOnFailure' | 'allowExternal' | 'excludeAfterRemap'>>;/** Key used to store coverage data in global scope */
const COVERAGE_STORE_KEY: string = '__VITEST_COVERAGE__';interface CoverageProviderModule {
takeCoverage(): CoverageMapData;
startCoverage(): void;
getProvider(): Promise<IstanbulCoverageProvider>;
}
interface CoverageMapData {
[filename: string]: FileCoverage;
}
interface FileCoverage {
f: FunctionCoverage;
s: StatementCoverage;
b: BranchCoverage;
}
interface FunctionCoverage {
[key: string]: number;
}
interface StatementCoverage {
[key: string]: number;
}
interface BranchCoverage {
[key: string]: number[];
}
interface CoverageMap {
files(): string[];
merge(other: CoverageMap): void;
filter(fn: (filename: string) => boolean): void;
addFileCoverage(coverage: FileCoverage): void;
}
interface ReportContext {
allTestsRun?: boolean;
}
interface ProxifiedModule<T> {
$ast: any;
$code: string;
exports: T;
}