1 | var isWindows = process.platform === 'win32'
|
2 | var path = require('path')
|
3 | var exec = require('child_process').exec
|
4 | var osTmpdir = require('os-tmpdir')
|
5 | var osHomedir = require('os-homedir')
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | function memo (key, lookup, fallback) {
|
12 | var fell = false
|
13 | var falling = false
|
14 | exports[key] = function (cb) {
|
15 | var val = lookup()
|
16 | if (!val && !fell && !falling && fallback) {
|
17 | fell = true
|
18 | falling = true
|
19 | exec(fallback, function (er, output, stderr) {
|
20 | falling = false
|
21 | if (er) return
|
22 | val = output.trim()
|
23 | })
|
24 | }
|
25 | exports[key] = function (cb) {
|
26 | if (cb) process.nextTick(cb.bind(null, null, val))
|
27 | return val
|
28 | }
|
29 | if (cb && !falling) process.nextTick(cb.bind(null, null, val))
|
30 | return val
|
31 | }
|
32 | }
|
33 |
|
34 | memo('user', function () {
|
35 | return ( isWindows
|
36 | ? process.env.USERDOMAIN + '\\' + process.env.USERNAME
|
37 | : process.env.USER
|
38 | )
|
39 | }, 'whoami')
|
40 |
|
41 | memo('prompt', function () {
|
42 | return isWindows ? process.env.PROMPT : process.env.PS1
|
43 | })
|
44 |
|
45 | memo('hostname', function () {
|
46 | return isWindows ? process.env.COMPUTERNAME : process.env.HOSTNAME
|
47 | }, 'hostname')
|
48 |
|
49 | memo('tmpdir', function () {
|
50 | return osTmpdir()
|
51 | })
|
52 |
|
53 | memo('home', function () {
|
54 | return osHomedir()
|
55 | })
|
56 |
|
57 | memo('path', function () {
|
58 | return (process.env.PATH ||
|
59 | process.env.Path ||
|
60 | process.env.path).split(isWindows ? ';' : ':')
|
61 | })
|
62 |
|
63 | memo('editor', function () {
|
64 | return process.env.EDITOR ||
|
65 | process.env.VISUAL ||
|
66 | (isWindows ? 'notepad.exe' : 'vi')
|
67 | })
|
68 |
|
69 | memo('shell', function () {
|
70 | return isWindows ? process.env.ComSpec || 'cmd'
|
71 | : process.env.SHELL || 'bash'
|
72 | })
|