|
| 1 | +import { promises as fs } from "node:fs"; |
| 2 | +import { program } from "commander"; |
| 3 | + |
| 4 | +program |
| 5 | + .name("list files and directories") |
| 6 | + .option("-a", "show hidden files") |
| 7 | + .option("-1", "force displaying each item in a new line") |
| 8 | + .argument("<paths...>", "path of directory"); |
| 9 | + |
| 10 | +program.parse(); |
| 11 | + |
| 12 | +const showHiddenFiles = program.opts()["a"]; |
| 13 | +const showFilesInLines = program.opts()["1"]; |
| 14 | +const fetchedDirectories = await fetchDirectoriesFunc(program.args); |
| 15 | + |
| 16 | +console.log(formatDisplay(fetchedDirectories)); |
| 17 | + |
| 18 | +function formatDisplay(fetchedDirectories) { |
| 19 | + const controlDisplaying = fetchedDirectories.map((directoryFilesInArray) => { |
| 20 | + const joiner = showFilesInLines ? `\n\r` : ` `; |
| 21 | + const showFolderName = |
| 22 | + fetchedDirectories.length > 1 |
| 23 | + ? `${directoryFilesInArray.folderName}:\n\r` |
| 24 | + : ""; |
| 25 | + |
| 26 | + return `${showFolderName}${directoryFilesInArray.files.join(joiner)}`; |
| 27 | + }); |
| 28 | + return controlDisplaying.join("\n\r\n\r"); |
| 29 | +} |
| 30 | + |
| 31 | +// returns array of objects, like: [{folderName: [file1, file2]}] |
| 32 | +async function fetchDirectoriesFunc(directories) { |
| 33 | + const result = []; |
| 34 | + |
| 35 | + for (const folderName of directories) { |
| 36 | + let files = await fs.readdir(folderName); |
| 37 | + |
| 38 | + if (showHiddenFiles) files.unshift(".", ".."); |
| 39 | + |
| 40 | + files.sort((a, b) => a.localeCompare(b)); |
| 41 | + result.push({ |
| 42 | + folderName, |
| 43 | + files, |
| 44 | + }); |
| 45 | + } |
| 46 | + |
| 47 | + return result; |
| 48 | +} |
0 commit comments