-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
executable file
·106 lines (92 loc) · 2.19 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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#! /usr/bin/env node
window = {}
document = {}
var fs = require('fs')
var path = require('path')
var isDepject = require('depject/is')
function Filter (stat) {
if(stat.name === 'node_modules') return
if(/^\./.test(stat.name)) return
if(stat.isDirectory()) return true
if(/\.js$/.test(stat.name)) return true
}
function Map (stat) {
try {
var m = require(stat.path)
if(isDepject(m)) {
if('string' === typeof m.gives) {
var o = {}
o[m.gives] = true
return {gives: o, needs: m.needs}
}
return m
}
} catch (err) {
return err.message
}
}
function walk (dir, filter, map) {
filter = filter || Filter
map = map || Map
var o = {}
fs.readdirSync(dir)
.forEach(function (file) {
var filename = path.join(dir, file)
var stat = fs.statSync(filename)
stat.name = file
stat.path = filename
if(!filter(stat)) return
if(stat.isDirectory())
o[file] = walk(filename, filter, map)
else
o[file] = map(stat)
})
return o
}
module.exports = function (dirs) {
if('string' == typeof dirs) dirs = [dirs]
var files = {}
dirs.forEach(function (dir) {
walk(
path.resolve(process.cwd(), dir),
Filter,
function (e) {
files[e.path] = Map(e)
}
)
})
var _files = files; files = {}
for(var k in _files)
files[path.relative(process.cwd(), k)] = _files[k]
var N = require('libnested')
return N.map(files, function (value, path) {
var last = path[path.length - 1]
if(path[1] == 'gives') {
if('string' === typeof value) {
path.push(value)
}
var needed = []
for(var k in files) {
var m = files[k]
if(m && m.needs && N.get(m.needs, path.slice(2)))
needed.push(k)
}
return needed
}
else if(path[1] == 'needs') {
var given = []
for(var k in files) {
var m = files[k]
if(m && m.gives && path && N.get(m.gives, path.slice(2)))
given.push(k)
}
return given
}
})
}
if(!module.parent) {
var dirs = process.argv.slice(2)
if(!dirs.length) dirs = [process.cwd()]
console.log(JSON.stringify(module.exports(dirs), null, 2))
process.exit(0)
}