/
ls.js
104 lines (83 loc) · 2.51 KB
/
ls.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
var fs = require('fs'),
view = require('view/view'),
composePath = require('misc').composePath,
whenDone = require('misc').whenDone,
EventEmitter = require('events').EventEmitter,
async = require('misc').async,
meta = require('shell/meta'),
expandPath = require('misc').expandPath;
exports.main = function (tokens, pipes, exit) {
var out = new view.bridge(pipes.viewOut);
var hidden = false;
// Parse out directory references to list.
var items = [];
for (i in tokens) if (i > 0) {
var m;
if (m = /-([aA])/(tokens[i])) {
switch (m[1]) {
case 'a':
case 'A':
hidden = true;
break;
}
}
else {
items.push(tokens[i]);
}
}
// Default to working directory.
if (!items.length) {
items.push(process.cwd());
}
// Prepare async job tracker.
var errors = 0;
var output = {};
var track = whenDone(function () {
// Format data.
var data = JSON.stringify(output);
// Output headers.
var headers = new meta.headers();
headers.set({
'Content-Type': [ 'application/json', { schema: 'termkit.files' } ],
'Content-Length': data.length,
});
pipes.dataOut.write(headers.generate());
pipes.dataOut.write(data);
exit(errors == 0);
}); // whenDone
// Process arguments (list of paths).
for (var i in items) (function (i, key) {
output[key] = [];
// Expand path
expandPath(key, track(function (path) {
// Stat the requested files / directories.
fs.stat(path, track(function (error, stats) {
// Iterate valid directories.
if (stats && stats.isDirectory()) {
// Scan contents of found directories.
fs.readdir(path, track(function (error, files) {
if (!error) {
// Sort files.
var children = [];
files.sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
// Apply hidden filter.
if (!hidden) {
files = files.filter(function (file) { return file[0] != '.'; });
}
// Output files.
output[key] = files;
} // !error
})); // fs.readdir
} // isDirectory
else {
// Count errors.
errors += +error;
// Output message.
out.print(error.message);
}
})); // fs.stat
})); // expandPath
})(i, items[i]); // for i in items
};