UNPKG

1.88 kBJavaScriptView Raw
1var isWindows = process.platform === 'win32'
2var path = require('path')
3var exec = require('child_process').exec
4var os = require('os')
5
6// looking up envs is a bit costly.
7// Also, sometimes we want to have a fallback
8// Pass in a callback to wait for the fallback on failures
9// After the first lookup, always returns the same thing.
10function memo (key, lookup, fallback) {
11 var fell = false
12 var falling = false
13 exports[key] = function (cb) {
14 var val = lookup()
15 if (!val && !fell && !falling && fallback) {
16 fell = true
17 falling = true
18 exec(fallback, function (er, output, stderr) {
19 falling = false
20 if (er) return // oh well, we tried
21 val = output.trim()
22 })
23 }
24 exports[key] = function (cb) {
25 if (cb) process.nextTick(cb.bind(null, null, val))
26 return val
27 }
28 if (cb && !falling) process.nextTick(cb.bind(null, null, val))
29 return val
30 }
31}
32
33memo('user', function () {
34 return ( isWindows
35 ? process.env.USERDOMAIN + '\\' + process.env.USERNAME
36 : process.env.USER
37 )
38}, 'whoami')
39
40memo('prompt', function () {
41 return isWindows ? process.env.PROMPT : process.env.PS1
42})
43
44memo('hostname', function () {
45 return isWindows ? process.env.COMPUTERNAME : process.env.HOSTNAME
46}, 'hostname')
47
48memo('tmpdir', function () {
49 return os.tmpDir()
50})
51
52memo('home', function () {
53 return ( isWindows ? process.env.USERPROFILE
54 : process.env.HOME
55 )
56})
57
58memo('path', function () {
59 return (process.env.PATH ||
60 process.env.Path ||
61 process.env.path).split(isWindows ? ';' : ':')
62})
63
64memo('editor', function () {
65 return process.env.EDITOR ||
66 process.env.VISUAL ||
67 (isWindows ? 'notepad.exe' : 'vi')
68})
69
70memo('shell', function () {
71 return isWindows ? process.env.ComSpec || 'cmd'
72 : process.env.SHELL || 'bash'
73})