Istanbul instrumenter loader for webpack

Usage no npm install needed!

<script type="module">
  import adamburgessIstanbulInstrumenterLoader from 'https://cdn.skypack.dev/@adamburgess/istanbul-instrumenter-loader';


npm node deps tests coverage chat

Istanbul Instrumenter Loader

Instrument JS files with istanbul-lib-instrument for subsequent code coverage reporting


npm i -D istanbul-instrumenter-loader




├─ src
│ |– components
│ | |– bar
│ | │ |─ index.js
│ | |– foo/
│     |– index.js
|– test
| |– src
| | |– components
| | | |– foo
| | | | |– index.js

To create a code coverage report for all components (even for those for which you have no tests yet) you have to require all the 1) sources and 2) tests. Something like it's described in "alternative usage" of karma-webpack


// requires all tests in `project/test/src/components/**/index.js`
const tests = require.context('./src/components/', true, /index\.js$/);


// requires all components in `project/src/components/**/index.js`
const components = require.context('../src/components/', true, /index\.js$/);


ℹ️ This file will be the only entry point for karma


  files: [
  preprocessors: {
    'test/index.js': 'webpack'
  webpack: {
    module: {
      rules: [
        // instrument only testing sources with Istanbul
          test: /\.js$/,
          use: { loader: 'istanbul-instrumenter-loader' },
          include: path.resolve('src/components/')
  reporters: [ 'progress', 'coverage-istanbul' ],
  coverageIstanbulReporter: {
    reports: [ 'text-summary' ],
    fixWebpackSourcePaths: true

with Babel

You must run the instrumentation as a post step


  test: /\.js$|\.jsx$/,
  use: {
    loader: 'istanbul-instrumenter-loader',
    options: { esModules: true }
  enforce: 'post',
  exclude: /node_modules|\.spec\.js$/,


The loader supports all options supported by istanbul-lib-instrument

Name Type Default Description
debug {Boolean} false Turn on debugging mode
compact {Boolean} true Generate compact code
autoWrap {Boolean} false Set to true to allow return statements outside of functions
esModules {Boolean} false Set to true to instrument ES2015 Modules
coverageVariable {String} __coverage__ Name of global coverage variable
preserveComments {Boolean} false Preserve comments in output
produceSourceMap {Boolean} false Set to true to produce a source map for the instrumented code
sourceMapUrlCallback {Function} null A callback function that is called when a source map URL is found in the original code. This function is called with the source filename and the source map URL


  test: /\.js$/,
  use: {
    loader: 'istanbul-instrumenter-loader',
    options: {...options}


Kir Belevich

Juho Vepsäläinen

Joshua Wiens

Michael Ciniawsky

Matt Lewis