-
Notifications
You must be signed in to change notification settings - Fork 4
/
index.js
76 lines (59 loc) · 1.45 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
var path = require('path')
var fs = require('fs')
module.exports = closest
module.exports.sync = closestSync
function closest(dirname, filter, found) {
dirname = path.resolve(dirname)
if (!found) {
found = filter
filter = truthy
}
check()
function check() {
if (isRoot(dirname)) return found(null, null)
var pkgfile = path.join(dirname, 'package.json')
fs.exists(pkgfile, function(exists) {
if (!exists) return next()
read(pkgfile, function(err, pkg) {
if (err) return found(err)
if (filter(pkg, pkgfile)) return found(null, pkgfile)
next()
})
})
}
function next() {
dirname = path.join(dirname, '..')
check()
}
}
function closestSync(dirname, filter) {
dirname = path.resolve(dirname)
filter = filter || truthy
do {
var pkgfile = path.join(dirname, 'package.json')
if (!fs.existsSync(pkgfile)) continue
var pkg = readSync(pkgfile)
if (filter(pkg, pkgfile)) return pkgfile
} while (!isRoot(
dirname = path.join(dirname, '..')
))
return null
}
function isRoot(dirname) {
return path.resolve(dirname, '..') === dirname
}
function read(pkg, done) {
fs.readFile(pkg, 'utf8', function(err, json) {
if (err) return done(err)
try {
json = JSON.parse(json)
} catch(e) { done(e) }
return done(null, json)
})
}
function readSync(pkg) {
return JSON.parse(fs.readFileSync(pkg, 'utf8'))
}
function truthy() {
return true
}