123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- '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 '<a href="javascript:history.back()">Back</a>';
- };
- 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,
- 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(
- `<!doctype html>
- <html lang="en">
- <head>
- <link rel="stylesheet" href="spa.css" />
- <meta name="viewport" content="width=device-width, initial-scale=1">
- </head>
- <body>
- <div id="app" class="app"></div>
- <script>
- window.data = ${JSON.stringify(data)};
- window.generatedDatetime = ${JSON.stringify(
- String(Date())
- )};
- window.metricsToShow = ${JSON.stringify(
- this.metricsToShow
- )};
- </script>
- <script src="bundle.js"></script>
- </body>
- </html>`
- );
- cw.close();
- }
- }
- module.exports = HtmlSpaReport;
|