This repository has been archived by the owner on Feb 16, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
scanner.js
98 lines (86 loc) · 2.7 KB
/
scanner.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
/* MIT License
*
* Copyright (c) 2018 Coder by Blood, Inc.
*/
const d = require('debug');
const { promisify } = require('util');
const fs = require('fs');
const path = require('path');
const readdir = promisify(fs.readdir);
const stat = promisify(fs.stat);
const defaultConfig = {};
const defaultInfo = { directory: '.' };
const ns = 'deified:scanner:';
const log = {
debug: {
configure: d(`${ns}configure`),
scan: d(`${ns}scan`),
},
trace: {
configure: d(`${ns}configure:trace`),
scan: d(`${ns}scan:trace`),
},
};
/**
* Scan files in any directory and return them in an array.
* @module scanner
*/
module.exports = {
/**
* Configures the scan function
*
* @param {object} config - The configuration for the scanning
* - `config.options` is passed to readdir
* - [`config.filter`]{@link module:filter} filters the results from readdir
*
* @return {function} Scans based on the configuration
*/
configure(config) {
log.trace.configure({ enter: 'configure', args: { config } });
const conf = Object.assign({}, defaultConfig, config);
log.debug.configure({ conf });
/**
* Recursively builds a list of files and directories for the specified
* directory and all subdirectors - can be optionally filtered.
*
* @param {string} dir - The directory to list (ls)
* @param {array} files - The array for appending files/directors
* @return {array} The files argument
*/
const tree = async function tree(dir, files) {
log.trace.configure({ reading: dir });
const { filter } = conf;
const ls = await readdir(dir, conf.options);
for (let i = 0; i < ls.length; i += 1) {
const file = path.join(dir, ls[i]);
if (!filter || filter([file]).length) {
log.trace.configure({ passed_fitler: file });
files.push(file);
// eslint-disable-next-line no-await-in-loop
if ((await stat(file)).isDirectory()) {
log.trace.configure({ recursing: file });
// eslint-disable-next-line no-await-in-loop
await tree(file, files);
}
}
}
return files;
};
/**
* Recursively scans directories
*
* @function scan
*
* @param {object} dirInfo - The information about the directory to scan
* - `dirInfo.directory` is the directory to scan
*
* @return {array} All of the files and subdirectors - depth first
*/
return async function scan(dirInfo) {
log.trace.scan({ enter: 'scan', args: { dirInfo } });
const info = Object.assign({}, defaultInfo, dirInfo);
log.debug.scan({ info });
return tree(info.directory || defaultInfo.directory, []);
};
},
};