| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | module.exports = whichwhich.sync = whichSyncvar isWindows = process.platform === 'win32' ||    process.env.OSTYPE === 'cygwin' ||    process.env.OSTYPE === 'msys'var path = require('path')var COLON = isWindows ? ';' : ':'var isexe = require('isexe')function getNotFoundError (cmd) {  var er = new Error('not found: ' + cmd)  er.code = 'ENOENT'  return er}function getPathInfo (cmd, opt) {  var colon = opt.colon || COLON  var pathEnv = opt.path || process.env.PATH || ''  var pathExt = ['']  pathEnv = pathEnv.split(colon)  var pathExtExe = ''  if (isWindows) {    pathEnv.unshift(process.cwd())    pathExtExe = (opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM')    pathExt = pathExtExe.split(colon)    // Always test the cmd itself first.  isexe will check to make sure    // it's found in the pathExt set.    if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')      pathExt.unshift('')  }  // If it has a slash, then we don't bother searching the pathenv.  // just check the file itself, and that's it.  if (cmd.match(/\//) || isWindows && cmd.match(/\\/))    pathEnv = ['']  return {    env: pathEnv,    ext: pathExt,    extExe: pathExtExe  }}function which (cmd, opt, cb) {  if (typeof opt === 'function') {    cb = opt    opt = {}  }  var info = getPathInfo(cmd, opt)  var pathEnv = info.env  var pathExt = info.ext  var pathExtExe = info.extExe  var found = []  ;(function F (i, l) {    if (i === l) {      if (opt.all && found.length)        return cb(null, found)      else        return cb(getNotFoundError(cmd))    }    var pathPart = pathEnv[i]    if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"')      pathPart = pathPart.slice(1, -1)    var p = path.join(pathPart, cmd)    if (!pathPart && (/^\.[\\\/]/).test(cmd)) {      p = cmd.slice(0, 2) + p    }    ;(function E (ii, ll) {      if (ii === ll) return F(i + 1, l)      var ext = pathExt[ii]      isexe(p + ext, { pathExt: pathExtExe }, function (er, is) {        if (!er && is) {          if (opt.all)            found.push(p + ext)          else            return cb(null, p + ext)        }        return E(ii + 1, ll)      })    })(0, pathExt.length)  })(0, pathEnv.length)}function whichSync (cmd, opt) {  opt = opt || {}  var info = getPathInfo(cmd, opt)  var pathEnv = info.env  var pathExt = info.ext  var pathExtExe = info.extExe  var found = []  for (var i = 0, l = pathEnv.length; i < l; i ++) {    var pathPart = pathEnv[i]    if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"')      pathPart = pathPart.slice(1, -1)    var p = path.join(pathPart, cmd)    if (!pathPart && /^\.[\\\/]/.test(cmd)) {      p = cmd.slice(0, 2) + p    }    for (var j = 0, ll = pathExt.length; j < ll; j ++) {      var cur = p + pathExt[j]      var is      try {        is = isexe.sync(cur, { pathExt: pathExtExe })        if (is) {          if (opt.all)            found.push(cur)          else            return cur        }      } catch (ex) {}    }  }  if (opt.all && found.length)    return found  if (opt.nothrow)    return null  throw getNotFoundError(cmd)}
 |