Skip to main content
Version: v4.x.x

c8

V8 code coverage for your test suite using c8.

Plugin

What is @pokujs/c8?

@pokujs/c8 is a Poku plugin that collects V8 code coverage from your tests and generates reports — with zero config needed. It supports:

  • All Istanbul reporters (text, lcov, html, json, etc.).
  • Coverage thresholds to enforce minimum coverage.
  • TypeScript source map support out of the box.
  • Monocart reporters as an experimental option.
important

This plugin relies on Node.js' built-in NODE_V8_COVERAGE environment variable. Bun and Deno do not support this mechanism, so coverage data will not be collected when running tests with these runtimes.

Install

npm i -D @pokujs/c8

Enabling the Plugin

Add the plugin to your Poku configuration file:

// poku.config.ts
import { coverage } from '@pokujs/c8';
import { defineConfig } from 'poku';

export default defineConfig({
plugins: [coverage()],
});

That's it! Run poku and a coverage summary will be printed after your test results.

Options

coverage({
// Reporters
reporter: ['text', 'lcov'], // default: ['text']

// File selection
include: ['src/**'], // default: [] (all files)
exclude: ['**/*.test.ts'], // default: c8 defaults
extension: ['.ts', '.js'], // default: c8 defaults

// Thresholds
checkCoverage: true, // default: false
lines: 80, // default: 0
branches: 80, // default: 0
functions: 80, // default: 0
statements: 80, // default: 0
perFile: false, // default: false

// Include untested files
all: true, // default: false
src: ['src'], // default: [cwd]

// Experimental
experimental: ['monocart'], // default: []

// Output
reportsDirectory: './coverage', // default: './coverage'
skipFull: false, // default: false

// Advanced
excludeAfterRemap: false, // default: false
mergeAsync: false, // default: false
clean: true, // default: true
});

Examples

Basic text coverage

import { coverage } from '@pokujs/c8';
import { defineConfig } from 'poku';

export default defineConfig({
plugins: [
coverage({
include: ['src/**'],
}),
],
});

Generate HTML and LCOV reports

coverage({
include: ['src/**'],
reporter: ['text', 'html', 'lcov'],
});

Enforce coverage thresholds

Set a single threshold for all metrics at once by passing a number:

coverage({
include: ['src/**'],
checkCoverage: 100,
});

Or use true to set individual thresholds for each metric:

coverage({
include: ['src/**'],
checkCoverage: true,
lines: 95,
branches: 90,
functions: 85,
statements: 95,
});

TypeScript coverage

coverage({
include: ['src/**'],
extension: ['.ts'],
all: true,
});

Extending Monocart reporters

Install the optional dependency:

npm i -D monocart-coverage-reports
coverage({
include: ['src/**'],
reporter: ['v8', 'console-details', 'codecov'],
experimental: ['monocart'],
});

How It Works

  • setup creates a temp directory and sets NODE_V8_COVERAGE — every test process spawned by Poku automatically writes V8 coverage data.
  • teardown uses c8 to generate reports from the collected data, optionally checks thresholds, then cleans up.
  • No modification to test commands or runner configuration needed.