/
index.js
64 lines (52 loc) · 1.39 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
var commondir = require('commondir')
var reduce = require('async-reduce')
var path = require('path')
var flat = require('flat')
module.exports = tree
function tree(filenames, mapper, callback) {
filenames = filenames.map(resolve)
var top = commondir(filenames)
reduce(filenames, {}, function(memo, name, next) {
var key = path.relative(top, name)
mapper(name, function(err, result) {
if (err) return next(err)
result.__deepest_node__ = true
memo[key] = result
return next(null, memo)
})
}, function(err, object) {
if (err) return callback(err)
object = flat.unflatten(object, { delimiter: path.sep })
callback(null, clean(reformat(object, 'name')))
})
}
function reformat(object, namekey) {
if (typeof object !== 'object') return object
if (object.__deepest_node__) return object
var entries = []
var result
var entry
for (var key in object) {
var entry = reformat(object[key], namekey)
if (entry.__deepest_node__) {
entry[namekey] = key
entries.push(entry)
} else {
entry = { children: entry }
entry[namekey] = key
entries.push(entry)
}
}
return entries
}
function clean(object) {
if (typeof object !== 'object') return object
delete object.__deepest_node__
for (var key in object) {
clean(object[key])
}
return object
}
function resolve(file) {
return path.resolve(file)
}