istanbul-instrumenter-loader

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

Install

npm i -D istanbul-instrumenter-loader

Usage

##

Structure

├─ 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

test/index.js

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

tests.keys().forEach(tests);

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

components.keys().forEach(components);

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

karma.conf.js

config.set({
  ...
  files: [
    'test/index.js'
  ],
  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

webpack.config.js

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

Options

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

Name
Type
Default
Description
Name
debug
Type
{Boolean}
Default
false
Description
Turn on debugging mode
Name
compact
Type
{Boolean}
Default
true
Description
Generate compact code
Name
autoWrap
Type
{Boolean}
Default
false
Description
Set to true to allow return statements outside of functions
Name
esModules
Type
{Boolean}
Default
false
Description
Set to true to instrument ES2015 Modules
Name
coverageVariable
Type
{String}
Default
__coverage__
Description
Name of global coverage variable
Name
preserveComments
Type
{Boolean}
Default
false
Description
Preserve comments in output
Name
produceSourceMap
Type
{Boolean}
Default
false
Description
Set to true to produce a source map for the instrumented code
Name
sourceMapUrlCallback
Type
{Function}
Default
null
Description
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

webpack.config.js

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

Maintainers


Kir Belevich


      Juho Vepsäläinen


      Joshua Wiens


      Michael Ciniawsky


      Matt Lewis