☔️ @pokujs/istanbul is a Poku plugin for Istanbul code coverage.
Tip
@pokujs/istanbul supports JSONC config files (.nycrc, etc.) out of the box, allowing comments in your configuration. You can also use JS and TS by setting the options directly in the plugin.
npm i -D @pokujs/istanbul// poku.config.js
import { coverage } from '@pokujs/istanbul';
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.
Important
This plugin relies on Node.js' built-in NODE_V8_COVERAGE environment variable to collect coverage data and Istanbul libraries to generate reports. Bun and Deno do not support this mechanism, so coverage data will not be collected when running tests with these runtimes.
coverage({
// Config file (.nycrc, .nycrc.json, .nycrc.jsonc)
config: '.nycrc', // default: auto-discover
// Activation
requireFlag: true, // default: false
// Reporters
reporter: ['text', 'lcov'], // default: ['text']
// File selection
include: ['src/**'], // default: [] (all files)
exclude: ['**/*.test.ts'], // default: []
// Include untested files
all: true, // default: false
src: ['src'], // default: [cwd]
// 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
// Output
reportsDirectory: './coverage', // default: './coverage'
tempDirectory: '.v8-coverage', // default: auto (temp dir)
skipFull: false, // default: false
clean: true, // default: true
// Report coloring
watermarks: {
lines: [80, 95],
functions: [80, 95],
branches: [80, 95],
statements: [80, 95],
},
});coverage({
include: ['src/**'],
});coverage({
include: ['src/**'],
reporter: ['text', 'html', 'lcov'],
});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,
});By default, coverage runs whenever the plugin is active. Use requireFlag to only collect coverage when --coverage is passed to the CLI, keeping watch mode, debugging, and filtered runs fast:
coverage({
include: ['src/**'],
requireFlag: true,
});# No coverage (plugin is a no-op)
poku test/
# With coverage
poku --coverage test/Reuse your existing .nycrc or any JSON/JSONC config file with comments:
coverage({
config: '.nycrc', // or false to disable auto-discovery
});When no config is specified, the plugin automatically searches for .nycrc, .nycrc.json, or .nycrc.jsonc in the working directory.
You can also specify the config path via CLI:
poku --coverageConfig=.nycrc test/Note
Priority order:
- For config file discovery:
--coverageConfig(CLI) >config(plugin option) > auto-discovery - For coverage options: plugin options > config file options
Place the coverage plugin at the root level, before multiSuite:
import { coverage } from '@pokujs/istanbul';
import { multiSuite } from '@pokujs/multi-suite';
import { defineConfig } from 'poku';
export default defineConfig({
plugins: [
coverage({ include: ['src/**'] }),
multiSuite([
defineConfig({ include: ['test/unit'], concurrency: 8 }),
defineConfig({ include: ['test/e2e'], sequential: true }),
]),
],
});Since
coveragesetsNODE_V8_COVERAGEduringsetup, every test process across all sub-suites writes to the same temp directory —teardownthen merges everything into a single report.
setupcreates a temp directory and setsNODE_V8_COVERAGE— every test process spawned by Poku automatically writes V8 coverage datateardownconverts V8 coverage to Istanbul format using source maps, generates reports via Istanbul reporters, optionally checks thresholds, then cleans up- No modification to test commands or runner configuration needed
MIT © wellwelwel and contributors.