'use strict' var convertSourceMap = require('convert-source-map') var mergeSourceMap = require('merge-source-map') function InstrumenterIstanbul (cwd, options) { var istanbul = InstrumenterIstanbul.istanbul() var instrumenter = istanbul.createInstrumenter({ autoWrap: true, coverageVariable: '__coverage__', embedSource: true, noCompact: false, preserveComments: true, produceSourceMap: options.produceSourceMap, esModules: true }) return { instrumentSync: function (code, filename, sourceMap) { var instrumented = instrumenter.instrumentSync(code, filename) // the instrumenter can optionally produce source maps, // this is useful for features like remapping stack-traces. // TODO: test source-map merging logic. if (options.produceSourceMap) { var lastSourceMap = instrumenter.lastSourceMap() if (lastSourceMap) { if (sourceMap) { lastSourceMap = mergeSourceMap( sourceMap.toObject(), lastSourceMap ) } instrumented += '\n' + convertSourceMap.fromObject(lastSourceMap).toComment() } } return instrumented }, lastFileCoverage: function () { return instrumenter.lastFileCoverage() } } } InstrumenterIstanbul.istanbul = function () { InstrumenterIstanbul._istanbul || (InstrumenterIstanbul._istanbul = require('istanbul-lib-instrument')) return InstrumenterIstanbul._istanbul || (InstrumenterIstanbul._istanbul = require('istanbul')) } module.exports = InstrumenterIstanbul