All files / libs/sys addEnvPath.js

100% Statements 17/17
100% Branches 10/10
100% Functions 2/2
100% Lines 14/14
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                1x 1x                                     1x 6x 6x 6x 6x 6x 6x       6x 2x 2x 3x     4x    
/**
 * @module      libs/sys/addEnvPath
 * @createdAt   2016-07-14
 *
 * @copyright   Copyright (c) 2016 Zhonglei Qiu
 * @license     Licensed under the MIT license.
 */
 
var isWin = require('./isWin')
var rePath = /^path$/i
 
/**
 * 添加指定的路径到 PATH 环境变量中
 *
 * 新添加的路径都会放在最前面,方便系统最先解析它
 *
 * @param  {Object}               env     process.env 对象
 * @param  {Array<String>|String} paths   要添加的路径
 * @return {Object}               传入的 env 对象
 *
 * @example
 * var env = addEnvPath(process.env, ['/you/path/need/to/add'])
 * console.log(env === process.env) // true: 意味着返回的是修改过的原对象,而不是一个新对象
 *
 * @see [manage-path@2.0.0]{@link https://github.com/kentcdodds/node-manage-path/tree/v2.0.0}
 * @author Zhonglei Qiu
 * @since 2.0.0
 */
module.exports = function(env, paths) {
  var pathKey = getPathKey(env)
  var oldPath = env[pathKey]
  if (!Array.isArray(paths)) paths = [paths]
  if (oldPath) paths = paths.concat(oldPath) // 不要修改用户传过来的数组
  env[pathKey] = paths.join(isWin ? ';' : ':') // 放函数里面来得到 separator 是为了方便测试
  return env
}
 
function getPathKey(env) {
  if (isWin) {
    var keys = Object.keys(env)
    for (var i = 0; i < keys.length; i++) {
      if (rePath.test(keys[i])) return keys[i]
    }
  }
  return 'PATH'
}