Xiphe/Thrall

View on GitHub
lib/applyTaskOptions.js

Summary

Maintainability
B
5 hrs
Test Coverage
module.exports = function(_, grunt, cliOptions) {
  'use strict';

  /** @const */
  var OPTION_TYPE_ARRAY = 'array';

  function getOptionValue(optionNames) {
    var value;

    optionNames.forEach(function(optionName) {
      if (!optionName) {
        return;
      }

      if (_.isUndefined(value) && !_.isUndefined(cliOptions[optionName])) {
        value = cliOptions[optionName];
      }
    });

    return value;
  }

  function normalize(option) {
    if (!_.isObject(option)) {
      option = {
        key: option
      };
    }
    return option;
  }

  function convertValue(value, type) {
    if (type === OPTION_TYPE_ARRAY && _.isString(value)) {
      return value.split(',');
    }

    return value;
  }

  function getEnvValue(key) {
    if (!key) {
      return;
    }

    return process.env[key];
  }

  function getGruntValue(key) {
    if (!cliOptions._[0]) {
      return;
    }

    var index = cliOptions._[0].indexOf(key);
    if (index !== -1) {
      return true;
    }
  }

  function applyOption(option, optionName) {
    option = normalize(option, optionName);

    var value = getOptionValue([optionName].concat(option.alias));

    if (_.isUndefined(value)) {
      value = getGruntValue(option.grunt);
    }

    if (_.isUndefined(value)) {
      value = getEnvValue(option.env);
    }

    if (_.isUndefined(value)) {
      return;
    }

    value = convertValue(value, option.type);

    grunt.config.set(option.key, value);
  }

  return function applyOptions(options) {
    if (!_.isObject(options)) { return; }

    _.forEach(options, applyOption);
  };
};