UNPKG

meru

Version:

Make your life simple when using human readable directories and files

131 lines (107 loc) 2.97 kB
'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() };