| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | var isWindows = process.platform === 'win32'var windir = isWindows ? process.env.windir || 'C:\\Windows' : nullvar path = require('path')var exec = require('child_process').exec// looking up envs is a bit costly.// Also, sometimes we want to have a fallback// Pass in a callback to wait for the fallback on failures// After the first lookup, always returns the same thing.function memo (key, lookup, fallback) {  var fell = false  var falling = false  exports[key] = function (cb) {    var val = lookup()    if (!val && !fell && !falling && fallback) {      fell = true      falling = true      exec(fallback, function (er, output, stderr) {        falling = false        if (er) return // oh well, we tried        val = output.trim()      })    }    exports[key] = function (cb) {      if (cb) process.nextTick(cb.bind(null, null, val))      return val    }    if (cb && !falling) process.nextTick(cb.bind(null, null, val))    return val  }}memo('user', function () {  return ( isWindows         ? process.env.USERDOMAIN + '\\' + process.env.USERNAME         : process.env.USER         )}, 'whoami')memo('prompt', function () {  return isWindows ? process.env.PROMPT : process.env.PS1})memo('hostname', function () {  return isWindows ? process.env.COMPUTERNAME : process.env.HOSTNAME}, 'hostname')memo('tmpdir', function () {  var t = isWindows ? 'temp' : 'tmp'  return process.env.TMPDIR ||         process.env.TMP ||         process.env.TEMP ||         ( exports.home() ? path.resolve(exports.home(), t)         : isWindows ? path.resolve(windir, t)         : '/tmp'         )})memo('home', function () {  return ( isWindows ? process.env.USERPROFILE         : process.env.HOME         )})memo('path', function () {  return (process.env.PATH ||          process.env.Path ||          process.env.path).split(isWindows ? ';' : ':')})memo('editor', function () {  return process.env.EDITOR ||         process.env.VISUAL ||         (isWindows ? 'notepad.exe' : 'vi')})memo('shell', function () {  return isWindows ? process.env.ComSpec || 'cmd'         : process.env.SHELL || 'bash'})
 |