UNPKG

command-line-util

Version:

Command-line utility package provides bush command myls

85 lines (68 loc) 2.29 kB
#!/usr/bin/env node const fs = require('fs') const directoryPath = process.cwd() const regex = /^\..*/ const FILTER_FLAGS = ['-hf', '-vf'] const SORT_FLAGS = ['-t'] const RENDER_FLAGS = ['-l'] const SUPPORTED_FLAGS = [...FILTER_FLAGS, ...SORT_FLAGS, ...RENDER_FLAGS] function isHidden (filename) { return regex.test(filename) }; function sortBySupportedValues (inputValues, supportedValues) { return inputValues.sort((a, b) => supportedValues.indexOf(a) - supportedValues.indexOf(b)) } function hasOnlyValidOptions (inputValues, supportedValues) { return inputValues.every(item => supportedValues.includes(item)) } function getFilesStats (filenames, directory) { return filenames.map(filename => ({ stat: fs.statSync(`${directory}/${filename}`), filename })) } function print (data = []) { data.forEach(item => console.log(item)) } function handleFilesByFlag (filesnames, flag) { switch (flag) { case '-hf': return filesnames.filter(isHidden) case '-vf': return filesnames.filter(file => !isHidden(file)) case '-t': return getFilesStats(filesnames, directoryPath) .sort((a, b) => a.stat.ctime < b.stat.ctime) .map(item => item.filename) case '-l': return getFilesStats(filesnames, directoryPath) .map(({ filename, stat }) => `Filename: ${filename}, size in bytes: ${stat.size}, last modified date: ${stat.mtime}`) default: return filesnames } } function handleFiles (files, flags) { return flags.reduce((accum, flag) => { return handleFilesByFlag(accum, flag) }, files) } function executeCommand () { const [,, ...args] = process.argv if (args.length > 0 && !hasOnlyValidOptions(args, SUPPORTED_FLAGS)) { throw new Error(`Provided arguments for myls command are not supported\nPlease, use these ${SUPPORTED_FLAGS.join(', ')}.`) } try { const files = fs.readdirSync(directoryPath) const sortedArgs = sortBySupportedValues(args, SUPPORTED_FLAGS) return args.length === 0 ? files : handleFiles(files, sortedArgs) } catch (error) { if (error.code === 'ENOENT') { console.log('No such file or directory!') } else { throw error } } } const filesToShow = executeCommand() print(filesToShow) module.exports = executeCommand