all files / src/ NpmPackageJsonLint.js

100% Statements 35/35
80% Branches 8/10
100% Functions 6/6
100% Lines 35/35
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108                                                                                                                                                 
"use strict";
 
const chalk = require("chalk");
const Config = require("./Config");
const inArray = require("in-array");
const isPlainObj = require("is-plain-obj");
const Rules = require("./Rules");
 
class NpmPackageJsonLint {
 
  /**
   * constructor
   * @param  {Object}           packageJsonData   Valid package.json data
   * @param  {Object|String}    config            Object or string with desired configuration
   * @param  {Object}           options           Object containing run options
   */
  constructor(packageJsonData, config, options) {
    this.packageJsonData = packageJsonData;
    this.ignoreWarnings = options.ignoreWarnings;
    this.arrayRuleTypes = ["valid-values", "invalid-dependencies", "invalid-pre-release-dependencies"];
    this.errors = [];
    this.warnings = [];
 
    this.rules = new Rules();
    this._loadRules();
 
    this.config = this._getConfig(config);
  }
 
  /**
   * Main execution method for package json lint.
   * @return {Object} Results object
   */
  lint() {
    for (let configItem in this.config) {
      let configItemValue = this.config[configItem];
      let ruleModule = this.rules.get(configItem);
 
      if (inArray(this.arrayRuleTypes, ruleModule.ruleType)) {
        let lintResult = ruleModule.lint(this.packageJsonData, configItemValue);
 
        this._processResult(lintResult, ruleModule.lintType);
      } else Eif (configItemValue) {
        // else all other rules either have a true or false flag if they are enabled
        let lintResult = ruleModule.lint(this.packageJsonData);
 
        this._processResult(lintResult, ruleModule.lintType);
      }
    }
 
    return this._getResultsObject();
  }
 
  /**
   * Private method for processing the result
   * @param   {Object|Boolean} lintResult  Either true if no errors or a LintIssue object is invalid
   * @param   {String}         lintType    Error or warning for issue type
   * @return  {undefined}                  No return
   */
  _processResult(lintResult, lintType) {
    Eif (typeof lintResult !== "boolean") {
      if (lintType === "error") {
        this.errors.push(lintResult);
      } else {
        this.warnings.push(lintResult);
      }
    }
  }
 
  /**
   * Private method for getting the results object
   * @return {Object} Results based on the run
   */
  _getResultsObject() {
    let result = {
      errors: this.errors
    };
 
    if (!this.ignoreWarnings) {
      result.warnings = this.warnings;
    }
 
    return result;
  }
 
  /**
   * Private method for loading rules
   * @return {undefined}            No return
   */
  _loadRules() {
    this.rules.load();
  }
 
  /**
   * Private method for loading config
   * @param  {Object|String} config   Object or string with desired configuration
   * @return {Object}                 Configuration object for the run
   */
  _getConfig(config) {
    let configObj = new Config(config);
 
    return configObj.get();
  }
 
}
 
module.exports = NpmPackageJsonLint;