All files / lib runner.js

100% Statements 30/30
100% Branches 14/14
100% Functions 8/8
100% Lines 27/27

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44    1x 1x 1x 1x   1x   1x 14x 14x 14x 2x   12x       7x 7x   7x 7x 14x   14x 14x   4x 4x 1x 1x 3x 2x       7x 7x 7x      
'use strict';
 
const _ = require('lodash');
const { isSemver } = require('./utils');
const Formatter = require('./formatters/text');
const path = require('path');
 
const debug = require('debug')('gint:runner');
 
const run = (name, rule, opts) => {
  debug('Exec rule "%s"', name);
  const checker = require(path.join(__dirname, 'rules', name));
  if (checker.hookName !== opts.hookName || isSemver(opts)) {
    return Promise.resolve();
  }
  return checker.check(rule, opts);
};
 
 
module.exports = (config, opts) => new Promise((resolve, reject) => {
  debug('Starting');
 
  let errored = false;
  const formatter = new Formatter();
  const rules = _.map(config.rules, (rule, name) => ({ name, rule }));
 
  _.reduce(rules, (result, { rule, name }) => result
    .then(() => run(name, rule, opts))
    .catch((err) => {
      const level = rule[0];
      if (level === 'err' || level === 'error') {
        errored = true;
        formatter.line('error', name, err);
      } else if (level === 'warn' || level === 'warning') {
        formatter.line('warning', name, err);
      }
    }), Promise.resolve())
    .then(() => {
      const output = formatter.result();
      debug('Finishing', { errored, output });
      errored ? reject(output) : resolve(output);
    });
});