const archy = require('archy') const libCoverage = require('istanbul-lib-coverage') function ProcessInfo (defaults) { defaults = defaults || {} this.pid = String(process.pid) this.argv = process.argv this.execArgv = process.execArgv this.cwd = process.cwd() this.time = Date.now() this.ppid = null this.root = null this.coverageFilename = null this.nodes = [] // list of children, filled by buildProcessTree() this._coverageMap = null for (var key in defaults) { this[key] = defaults[key] } } Object.defineProperty(ProcessInfo.prototype, 'label', { get: function () { if (this._label) { return this._label } var covInfo = '' if (this._coverageMap) { covInfo = '\n ' + this._coverageMap.getCoverageSummary().lines.pct + ' % Lines' } return this.argv.join(' ') + covInfo } }) ProcessInfo.buildProcessTree = function (infos) { var treeRoot = new ProcessInfo({ _label: 'nyc' }) var nodes = { } infos = infos.sort(function (a, b) { return a.time - b.time }) infos.forEach(function (p) { nodes[p.root + ':' + p.pid] = p }) infos.forEach(function (p) { if (!p.ppid) { return } var parent = nodes[p.root + ':' + p.ppid] if (!parent) { parent = treeRoot } parent.nodes.push(p) }) return treeRoot } ProcessInfo.prototype.getCoverageMap = function (merger) { if (this._coverageMap) { return this._coverageMap } var childMaps = this.nodes.map(function (child) { return child.getCoverageMap(merger) }) this._coverageMap = merger([this.coverageFilename], childMaps) return this._coverageMap } ProcessInfo.prototype.render = function (nyc) { this.getCoverageMap(function (filenames, maps) { var map = libCoverage.createCoverageMap({}) nyc.loadReports(filenames).forEach(function (report) { map.merge(report) }) maps.forEach(function (otherMap) { map.merge(otherMap) }) return map }) return archy(this) } module.exports = ProcessInfo