meru
Version:
Make your life simple when using human readable directories and files
131 lines (107 loc) • 2.97 kB
JavaScript
'strict';
const fs = require('fs');
const path = require('path');
const tableaux = require('tableaux');
const chokidar = require('chokidar');
const human = require('human-time');
const watcher = chokidar.watch(process.argv[2] || '.', {
alwaysStat: true
})
watcher.on('ready', () => {
watcher
.on('add', (file, stat) => {
console.log(`${file} created ${human((stat.birthtime))}`)
})
.on('unlink', (file) => {
console.log(`${file} removed`)
})
.on('change', (file, stat) => {
const msg = (+stat.ctime === +stat.mtime) ? 'updated' :
'modified'
console.log(`${file} ${msg} ${human((stat.ctime))}`)
})
.on('addDir', (dir, stat) => {
console.log(`${dir} folder created ${human((stat.birthtime))}`)
})
.on('unlinkDir', (dir) => {
console.log(`${dir} folder removed`)
})
})
//Initialize tableaux with some table headers, which in turn will supply a write function.
const write = tableaux(
{name: 'Name', size: 20},
{name: 'Created', size: 30},
{name: 'DeviceId', size: 10},
{name: 'Mode', size: 8},
{name: 'Lnks', size: 4},
{name: 'Size', size: 6},
{name: 'Rdev', size: 10},
{name: 'Uid', size: 10},
{name: 'birthtime', size: 20},
{name: 'ctime', size: 20}
);
//Now let's sketch out a print function
function print(dir) {
fs.readdirSync(dir)
.map((file) => ({file, dir}))
.map(toMeta)
.forEach(output)
write.newline()
};
print(process.argv[2] || './');
fs.access('file', fs.constants.F_OK |fs.constants.R_OK | fs.constants.W_OK, (err) => {
console.log(err ? 'Listening access ok, keep me going!' : 'can read/write');
});
//The print function won't work yet, not until we define the toMeta and output functions.
function toMeta({file, dir}) {
const stats = fs.statSync(path.join(dir, file));
var {birthtime, ino, mode, nlink, size, atime, ctime} = stats
birthtime = birthtime.toUTCString()
mode = mode.toString(8)
size += 'B'
return {
file,
dir,
info: [
birthtime,
ino,
mode,
nlink,
size,
atime,
ctime
],
isDir: stats.isDirectory(),
isSymLink: stats.isSymbolicLink()
}
};
function outputSymlink(file, dir, info) {
write('_______________','\u001b[33m','______________' + file + '\u001b[0m', ...info)
process.stdout.write('\u001b[33m')
write.arrow(4)
write.bold(fs.readlinkSync(path.join(dir, file)));
process.stdout.write('\u001b[0m');
write.newline()
};
//Output function is going to output the information supplied by toMeta
function output({file, folder, dir, info, isDir, isSymLink}) {
if (isSymLink) {
outputSymlink(file, dir, info, folder)
return;
};
write(file, ...info);
write(folder, ...info);
if (!isDir) {
return;
};
const p = path.join(dir, file);
write.arrow()
fs.readdirSync(p).forEach((f) => {
const stats = fs.statSync(path.join(p, f));
const style = stats.isDirectory() ? 'bold' : 'dim';
if (stats.isSymbolicLink());
{ f = '\u001b[33m' + f + '\u001b[0m'};
write[style](f)
})
write.newline()
};