summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/find-npm-prefix/find-prefix.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/find-npm-prefix/find-prefix.js')
-rw-r--r--deps/npm/node_modules/find-npm-prefix/find-prefix.js54
1 files changed, 54 insertions, 0 deletions
diff --git a/deps/npm/node_modules/find-npm-prefix/find-prefix.js b/deps/npm/node_modules/find-npm-prefix/find-prefix.js
new file mode 100644
index 0000000000..089572ec11
--- /dev/null
+++ b/deps/npm/node_modules/find-npm-prefix/find-prefix.js
@@ -0,0 +1,54 @@
+'use strict'
+// try to find the most reasonable prefix to use
+
+module.exports = findPrefix
+
+const fs = require('fs')
+const path = require('path')
+const Bluebird = require('bluebird')
+const readdir = Bluebird.promisify(fs.readdir)
+
+function findPrefix (dir) {
+ return Bluebird.try(() => {
+ dir = path.resolve(dir)
+
+ // this is a weird special case where an infinite recurse of
+ // node_modules folders resolves to the level that contains the
+ // very first node_modules folder
+ let walkedUp = false
+ while (path.basename(dir) === 'node_modules') {
+ dir = path.dirname(dir)
+ walkedUp = true
+ }
+ if (walkedUp) return dir
+
+ return findPrefix_(dir)
+ })
+}
+
+function findPrefix_ (dir, original) {
+ if (!original) original = dir
+
+ const parent = path.dirname(dir)
+ // this is a platform independent way of checking if we're in the root
+ // directory
+ if (parent === dir) return original
+
+ return readdir(dir).then(files => {
+ if (files.indexOf('node_modules') !== -1 ||
+ files.indexOf('package.json') !== -1) {
+ return dir
+ }
+
+ return findPrefix_(parent, original)
+ }, er => {
+ // an error right away is a bad sign.
+ // unless the prefix was simply a non
+ // existent directory.
+ if (er && dir === original && er.code !== 'ENOENT') {
+ throw er
+ } else {
+ return original
+ }
+ })
+}