'use strict'; var fs = require('fs'); var parse = require('parse-passwd'); function homedir() { // The following logic is from looking at logic used in the different platform // versions of the uv_os_homedir function found in https://github.com/libuv/libuv // This is the function used in modern versions of node.js if (process.platform === 'win32') { // check the USERPROFILE first if (process.env.USERPROFILE) { return process.env.USERPROFILE; } // check HOMEDRIVE and HOMEPATH if (process.env.HOMEDRIVE && process.env.HOMEPATH) { return process.env.HOMEDRIVE + process.env.HOMEPATH; } // fallback to HOME if (process.env.HOME) { return process.env.HOME; } return null; } // check HOME environment variable first if (process.env.HOME) { return process.env.HOME; } // on linux platforms (including OSX) find the current user and get their homedir from the /etc/passwd file var passwd = tryReadFileSync('/etc/passwd'); var home = find(parse(passwd), getuid()); if (home) { return home; } // fallback to using user environment variables var user = process.env.LOGNAME || process.env.USER || process.env.LNAME || process.env.USERNAME; if (!user) { return null; } if (process.platform === 'darwin') { return '/Users/' + user; } return '/home/' + user; } function find(arr, uid) { var len = arr.length; for (var i = 0; i < len; i++) { if (+arr[i].uid === uid) { return arr[i].homedir; } } } function getuid() { if (typeof process.geteuid === 'function') { return process.geteuid(); } return process.getuid(); } function tryReadFileSync(fp) { try { return fs.readFileSync(fp, 'utf8'); } catch (err) { return ''; } } module.exports = homedir;