istanbul.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. 'use strict'
  2. const { createInstrumenter } = require('istanbul-lib-instrument')
  3. const convertSourceMap = require('convert-source-map')
  4. const mergeSourceMap = require('merge-source-map')
  5. function InstrumenterIstanbul (cwd, options) {
  6. const plugins = options.plugins
  7. const configPlugins = plugins ? { plugins } : {}
  8. const instrumenter = createInstrumenter(Object.assign({
  9. autoWrap: true,
  10. coverageVariable: '__coverage__',
  11. embedSource: true,
  12. compact: options.compact,
  13. preserveComments: options.preserveComments,
  14. produceSourceMap: options.produceSourceMap,
  15. ignoreClassMethods: options.ignoreClassMethods,
  16. esModules: options.esModules
  17. }, configPlugins))
  18. return {
  19. instrumentSync (code, filename, sourceMap) {
  20. var instrumented = instrumenter.instrumentSync(code, filename)
  21. // the instrumenter can optionally produce source maps,
  22. // this is useful for features like remapping stack-traces.
  23. // TODO: test source-map merging logic.
  24. if (options.produceSourceMap) {
  25. var lastSourceMap = instrumenter.lastSourceMap()
  26. if (lastSourceMap) {
  27. if (sourceMap) {
  28. lastSourceMap = mergeSourceMap(
  29. sourceMap.toObject(),
  30. lastSourceMap
  31. )
  32. }
  33. instrumented += '\n' + convertSourceMap.fromObject(lastSourceMap).toComment()
  34. }
  35. }
  36. return instrumented
  37. },
  38. lastFileCoverage () {
  39. return instrumenter.lastFileCoverage()
  40. }
  41. }
  42. }
  43. module.exports = InstrumenterIstanbul