Home

Awesome

npm node deps tests coverage chat

<div align="center"> <a href="https://github.com/webpack/webpack"> <img width="200" height="200" src="https://webpack.js.org/assets/icon-square-big.svg"> </a> <h1>Istanbul Instrumenter Loader</h1> </div>

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

<h2 align="center">Install</h2>
npm i -D istanbul-instrumenter-loader
<h2 align="center"><a href="https://webpack.js.org/concepts/loaders">Usage</a></h2>

References

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$/,
}
<h2 align="center"><a href="https://github.com/istanbuljs/istanbuljs/blob/master/packages/istanbul-lib-instrument/api.md#instrumenter">Options</a></h2>

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

NameTypeDefaultDescription
debug{Boolean}falseTurn on debugging mode
compact{Boolean}trueGenerate compact code
autoWrap{Boolean}falseSet to true to allow return statements outside of functions
esModules{Boolean}falseSet to true to instrument ES2015 Modules
coverageVariable{String}__coverage__Name of global coverage variable
preserveComments{Boolean}falsePreserve comments in output
produceSourceMap{Boolean}falseSet to true to produce a source map for the instrumented code
sourceMapUrlCallback{Function}nullA 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}
  }
}
<h2 align="center">Maintainers</h2> <table> <tbody> <tr> <td align="center"> <img width="150" height="150" src="https://avatars.githubusercontent.com/u/266822?v=3&s=150"> </br> <a href="https://github.com/deepsweet">Kir Belevich</a> </td> <td align="center"> <a href="https://github.com/bebraw"> <img width="150" height="150" src="https://github.com/bebraw.png?v=3&s=150"> </br> Juho Vepsäläinen </a> </td> <td align="center"> <a href="https://github.com/d3viant0ne"> <img width="150" height="150" src="https://github.com/d3viant0ne.png?v=3&s=150"> </br> Joshua Wiens </a> </td> <td align="center"> <a href="https://github.com/michael-ciniawsky"> <img width="150" height="150" src="https://github.com/michael-ciniawsky.png?v=3&s=150"> </br> Michael Ciniawsky </a> </td> <td align="center"> <a href="https://github.com/mattlewis92"> <img width="150" height="150" src="https://github.com/mattlewis92.png?v=3&s=150"> </br> Matt Lewis </a> </td> </tr> <tbody> </table>