'use strict'; /* Copyright 2012-2015, Yahoo Inc. Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. */ const fs = require('fs'); const path = require('path'); const { ReportBase } = require('istanbul-lib-report'); const HtmlReport = require('../html'); const standardLinkMapper = { getPath(node) { if (typeof node === 'string') { return node; } let filePath = node.getQualifiedName(); if (node.isSummary()) { if (filePath !== '') { filePath += '/index.html'; } else { filePath = 'index.html'; } } else { filePath += '.html'; } return filePath; }, relativePath(source, target) { const targetPath = this.getPath(target); const sourcePath = path.dirname(this.getPath(source)); return path.relative(sourcePath, targetPath); }, assetPath(node, name) { return this.relativePath(this.getPath(node), name); } }; class HtmlSpaReport extends ReportBase { constructor(opts = {}) { super({ // force the summarizer to nested for html-spa summarizer: 'nested' }); this.verbose = opts.verbose || false; this.linkMapper = opts.linkMapper || standardLinkMapper; this.subdir = opts.subdir || ''; this.date = Date(); this.skipEmpty = opts.skipEmpty; this.htmlReport = new HtmlReport(opts); this.htmlReport.getBreadcrumbHtml = function() { return 'Back'; }; this.metricsToShow = opts.metricsToShow || [ 'lines', 'branches', 'functions' ]; } getWriter(context) { if (!this.subdir) { return context.writer; } return context.writer.writerForDir(this.subdir); } onStart(root, context) { this.htmlReport.onStart(root, context); const writer = this.getWriter(context); const srcDir = path.resolve(__dirname, './assets'); fs.readdirSync(srcDir).forEach(f => { const resolvedSource = path.resolve(srcDir, f); const resolvedDestination = '.'; const stat = fs.statSync(resolvedSource); let dest; if (stat.isFile()) { dest = resolvedDestination + '/' + f; if (this.verbose) { console.log('Write asset: ' + dest); } writer.copyFile(resolvedSource, dest); } }); } onDetail(node, context) { this.htmlReport.onDetail(node, context); } getMetric(metric, type, context) { const isEmpty = metric.total === 0; return { total: metric.total, covered: metric.covered, skipped: metric.skipped, missed: metric.total - metric.covered, pct: isEmpty ? 0 : metric.pct, classForPercent: isEmpty ? 'empty' : context.classForPercent(type, metric.pct) }; } toDataStructure(node, context) { const coverageSummary = node.getCoverageSummary(); const metrics = { statements: this.getMetric( coverageSummary.statements, 'statements', context ), branches: this.getMetric( coverageSummary.branches, 'branches', context ), functions: this.getMetric( coverageSummary.functions, 'functions', context ), lines: this.getMetric(coverageSummary.lines, 'lines', context) }; return { file: node.getRelativeName(), isEmpty: coverageSummary.isEmpty(), metrics, children: node.isSummary() && node .getChildren() .map(child => this.toDataStructure(child, context)) }; } onEnd(rootNode, context) { const data = this.toDataStructure(rootNode, context); const cw = this.getWriter(context).writeFile( this.linkMapper.getPath(rootNode) ); cw.write( `
` ); cw.close(); } } module.exports = HtmlSpaReport;