boxuk/commit-message-checker

View on GitHub
reporter/table-reporter.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

const chalk = require('chalk');
const table = require('table').table;

const FAILURE_EXPLANATIONS = require('../lib/failure-reasons').EXPLANATIONS;

/**
 * Build a table of validation failures and reasons.
 *
 * @param {ValidationResult} validationResult
 *
 * @returns {string}
 */
function buildTable (validationResult) {
    const rows = [];

    if (validationResult.isValid) {
        // For valid commit messages we have nothing to show
        return '';
    }

    rows.push([
        chalk.bold('Rule ID'),
        chalk.bold('Message')
    ]);

    for (const failure of validationResult.failures) {
        const explanation = FAILURE_EXPLANATIONS[failure] || 'Unknown error';

        rows.push([
            failure,
            explanation
        ]);
    }

    return table(rows, {
        drawHorizontalLine (index) {
            // Draw a horizontal line before the second line (i.e. below the header)
            return index === 1;
        },

        columns: {
            1: {
                wrapWord: true,
                width: 60
            },

            0: {
                wrapWord: true,
                width: 30
            }
        }
    });
}

/**
 * @param {Array<ValidationResult>} validationResults
 *
 * @returns {string}
 */
function buildReport (validationResults) {
    let output = '';

    for (const validationResult of validationResults) {
        if (!validationResult.isValid) {
            output += chalk.bold.underline.red('\nThe following commit message failed validation:\n\n');
            output += chalk.white.bold(`${validationResult.commitMessage}\n\n${buildTable(validationResult)}`);
        }
    }

    return output;
}

module.exports = function reporter (validationResults) {
    const failures = validationResults.filter(validationResult => !validationResult.isValid);

    if (!failures.length) {
        return;
    }

    const report = buildReport(validationResults);

    console.log(report);
    console.log(
        '\nSee https://github.com/boxuk/commit-message-checker/blob/master/README.md for more ' +
        'details on failure reasons\n\n'
    );
};