text: /*eslint-disable valid-jsdoc */
  'use strict';
  
  /**
   * Module dependencies.
   */
  var _ = require('lodash');
  var glob = require('glob');
  var fs = require('fs');
  
  /**
   * Resolve environment configuration by extending each env configuration file,
   * and lastly merge/override that with any local repository configuration that exists
   * in local.js
   */
  var resolvingConfig = function() {
  
    var conf = {};
  
    conf = _.extend(
      require('./env/all'),
      require('./env/' + process.env.NODE_ENV) || {}
    );
  
    return _.merge(conf, (fs.existsSync('./config/env/local.js') && require('./env/local.js')) || {});
  };
  
  /**
   * Load app configurations
   */
  module.exports = resolvingConfig();
  
  /**
   * Get files by glob patterns
   */
  module.exports.getGlobbedFiles = function(globPatterns, removeRoot) {
  
    // For context switching
    var _this = this;
  
    // URL paths regex
    var urlRegex = new RegExp('^(?:[a-z]+:)?\/\/', 'i');
  
    // The output array
    var output = [];
  
    // If glob pattern is array so we use each pattern in a recursive way, otherwise we use glob
    if (_.isArray(globPatterns)) {
      globPatterns.forEach(function(globPattern) {
        output = _.union(output, _this.getGlobbedFiles(globPattern, removeRoot));
      });
    } else if (_.isString(globPatterns)) {
      if (urlRegex.test(globPatterns)) {
        output.push(globPatterns);
      } else {
        var files = glob(globPatterns, {
          sync: true
        });
        // console.log('files', files);
        if (removeRoot) {
          files = files.map(function(file) {
            // console.log('file', file);
            return file.replace(removeRoot, '');
          });
        }
  
        output = _.union(output, files);
      }
    }
  
    return output;
  };
  
  /**
   * Get the modules JavaScript files
   */
  module.exports.getJavaScriptAssets = function(includeTests) {
  
    var output = this.getGlobbedFiles(this.assets.lib.js.concat(this.assets.js), 'public/');
  
    // To include tests
    if (includeTests) {
      output = _.union(output, this.getGlobbedFiles(this.assets.tests));
    }
  
    return output;
  };
  
  /**
   * Get the modules CSS files
   */
  module.exports.getCSSAssets = function() {
  
    var output = this.getGlobbedFiles(this.assets.lib.css.concat(this.assets.css), 'public/');
    return output;
  };
  