all files / lib/ functions.js

42.22% Statements 19/45
33.33% Branches 11/33
21.43% Functions 3/14
42.22% Lines 19/45
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';
 
var slice = Array.prototype.slice;
 
var fs = require('fs'),
    path = require('path');
 
function resolvePath(file, dir) {
  return path.resolve(process.cwd(), path.dirname(file), dir);
}
 
function expandPaths(from_file, target, paths) {
  for (var key in target) {
    var item = target[key];
 
    if (typeof item === 'object' && !Array.isArray(item)) {
      expandPaths(from_file, item, paths);
    } else if (paths.indexOf(key) > -1) {
      target[key] = Array.isArray(item) ? item.map(function(folder) {
        return resolvePath(from_file, folder);
      }) : resolvePath(from_file, item);
    }
  }
}
 
function replaceEnv(value) {
  if (typeof value === 'string') {
    return value.replace(/\$\{(\w+)\}/g, function(match, key) {
      return process.env[key] || match;
    });
  }
 
  return value;
}
 
function mergeVars(target) {
  if (!target) {
    target = {};
  }
 
  slice.call(arguments, 1)
    .forEach(function(source) {
      for (var key in source) {
        var value = source[key];
 
        if (target[key] !== null && !Array.isArray(target[key]) && typeof target[key] === 'object') {
          target[key] = mergeVars(target[key], value);
        } else {
          target[key] = replaceEnv(typeof value === 'undefined' ? target[key] : value);
        }
      }
    });
 
  return target;
}
 
function copy(obj, keys, filter) {
  var out = {};
 
  Iif (!obj) {
    return out;
  }
 
  keys = Array.isArray(keys) ? keys : [];
 
  for (var key in obj) {
    if (filter && keys.indexOf(key) > -1) {
      out[key] = obj[key];
    }
 
    if (!filter && keys.indexOf(key) === -1) {
      out[key] = obj[key];
    }
  }
 
  return out;
}
 
module.exports = {
  cwd: function(file) {
    return path.join(process.cwd(), file);
  },
 
  json: function(file) {
    return JSON.parse(fs.readFileSync(file));
  },
 
  pick: function(obj, props) {
    return copy(obj, props, true);
  },
 
  omit: function(obj, props) {
    return copy(obj, props);
  },
 
  exists: function(file) {
    return fs.existsSync(file);
  },
 
  resolve: function(file) {
    return path.resolve(file);
  },
 
  mergeVars: mergeVars,
  replaceEnv: replaceEnv,
  expandPaths: expandPaths
};