diff options
Diffstat (limited to 'deps/node/deps/npm/node_modules/libnpx/get-prefix.js')
-rw-r--r-- | deps/node/deps/npm/node_modules/libnpx/get-prefix.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/deps/node/deps/npm/node_modules/libnpx/get-prefix.js b/deps/node/deps/npm/node_modules/libnpx/get-prefix.js new file mode 100644 index 00000000..3fef7f7e --- /dev/null +++ b/deps/node/deps/npm/node_modules/libnpx/get-prefix.js @@ -0,0 +1,54 @@ +'use strict' + +const promisify = require('./util.js').promisify + +const path = require('path') +const statAsync = promisify(require('fs').stat) + +module.exports = getPrefix +function getPrefix (root) { + const original = root = path.resolve(root) + while (path.basename(root) === 'node_modules') { + root = path.dirname(root) + } + if (original !== root) { + return Promise.resolve(root) + } else { + return Promise.resolve(getPrefixFromTree(root)) + } +} + +function getPrefixFromTree (current) { + if (isRootPath(current, process.platform)) { + return false + } else { + return Promise.all([ + fileExists(path.join(current, 'package.json')), + fileExists(path.join(current, 'node_modules')) + ]).then(args => { + const hasPkg = args[0] + const hasModules = args[1] + if (hasPkg || hasModules) { + return current + } else { + return getPrefixFromTree(path.dirname(current)) + } + }) + } +} + +module.exports._fileExists = fileExists +function fileExists (f) { + return statAsync(f).catch(err => { + if (err.code !== 'ENOENT') { + throw err + } + }) +} + +module.exports._isRootPath = isRootPath +function isRootPath (p, platform) { + return platform === 'win32' + ? p.match(/^[a-z]+:[/\\]?$/i) + : p === '/' +} |