command-line-util
Version:
Command-line utility package provides bush command myls
85 lines (68 loc) • 2.29 kB
JavaScript
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