All files / lib/Defects index.js

96.67% Statements 29/30
100% Branches 6/6
83.33% Functions 5/6
96.3% Lines 26/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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87        3x                   3x 3x   3x       3x 3x                     8x 8x             8x 8x     8x   8x   8x 8x   8x 60x 48x 48x     8x                       3x 4x 4x     3x 2x   2x               3x
/**
 * SEO Defect class
 * To detect SEO defects
 */
const _ = {
  defaults: require('lodash/defaults'),
  defaultsDeep: require('lodash/defaultsDeep'),
  isArray: require('lodash/isArray'),
};
 
const {
  DEFAULT_RULES_CONFIG,
  DEFAULT_RULES_DEFINITION,
  RULE_DEFINITION_TEMPLATE
} = require('./rules');
const validate = require('./validate');
 
const DEFAULT_CONFIG = {
  // Any additional config needed?
}
 
let rulesDef = Object.assign({}, DEFAULT_RULES_DEFINITION);
let rulesConf = Object.assign({}, DEFAULT_RULES_CONFIG);
 
class Defects {
  // config = {}
  // io = null
 
  /**
   * @param {object} io an instance of Io (input/output) class
   * @param {*} config defects config including rules and other config
   */
  constructor(io, config) {
    this.config = _.defaultsDeep(config, DEFAULT_CONFIG);
    this.io = io;
  }
 
  /**
   * Run the SEO defects detection
   */
  run() {
    const io = this.io;
    const { rules, overrideDefinition } = this.config
    
    // get$ will return a promise which resolve the $ object returned from the reader. 
    io.get$
      .then(($) => {
        const results = [];
    
        const completedRulesDef = _.defaultsDeep(overrideDefinition, rulesDef);
        const completedRulesConf = _.defaults(rules, rulesConf);
    
        for (let rule in completedRulesConf) {
          if (!completedRulesConf[rule]) continue;
          const issue = validate($, completedRulesDef[rule]);
          if (issue) results.push(issue);
        }
 
        io.write(results);
      })
      .catch(err => console.error('Deffects errors: ', err));
 
  }
 
  /**
   * Define a custom rule that can be applied later when detect for SEO defects
   * @param {*} config 
   */
  static defineRule(config) {
 
    const assignNewDef = (rule) => {
      rulesDef[rule.id] = _.defaults(rule, RULE_DEFINITION_TEMPLATE);
      rulesConf[rule.id] = true;
    }
 
    if (_.isArray(config)) {
      for (let rule of config) assignNewDef(rule);
    } else {
      assignNewDef(config);
    }
 
  }
 
}
 
// Export the detector and something you may need
module.exports = Defects;