-
Notifications
You must be signed in to change notification settings - Fork 85
/
Copy path_listDir.js
51 lines (48 loc) · 1.3 KB
/
_listDir.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
import _require from './_require'
const DOT = '.'.charCodeAt(0)
/*
Retrieves a list of entries recursively, including file names and stats.
*/
export default async function listDir (dir, opts = {}) {
return new Promise((resolve, reject) => {
_list(dir, opts, (err, records) => {
if (err) reject(err)
else resolve(records)
})
})
}
function _list (dir, opts, done) {
let fs = opts.fs || _require('fs')
let path = opts.path || _require('path')
let results = []
fs.readdir(dir, (err, list) => {
if (err) return done(err)
let pending = list.length
if (!pending) return done(null, results)
function _continue () {
if (!--pending) done(null, results)
}
list.forEach((name) => {
if (opts.ignoreDotFiles && name.charCodeAt(0) === DOT) {
return _continue()
}
let absPath = path.resolve(dir, name)
fs.stat(absPath, (err, stat) => {
if (err) return done(err)
if (stat && stat.isDirectory()) {
_list(name, opts, (err, res) => {
if (err) return done(err)
results = results.concat(res)
_continue()
})
} else {
results.push(Object.assign({}, stat, {
name,
path: absPath
}))
_continue()
}
})
})
})
}