|
1 | | -#!/usr/bin/env node |
| 1 | +#!/usr/bin/env node |
2 | 2 |
|
3 | 3 | const fs = require("node:fs"); |
4 | 4 | const path = require("node:path"); |
5 | 5 |
|
| 6 | +function main() { |
| 7 | + const args = process.argv.slice(2); |
| 8 | + |
| 9 | + const { |
| 10 | + showAll, |
| 11 | + onePerLine, |
| 12 | + targetDir, |
| 13 | + unknownFlags |
| 14 | + } = parseArgs(args); |
| 15 | + |
| 16 | + if (unknownFlags.length > 0) { |
| 17 | + console.error( |
| 18 | + `warning: unknown option(s): ${unknownFlags.join(", ")}` |
| 19 | + ); |
| 20 | + } |
| 21 | + |
| 22 | + let files = readDirectory(targetDir); |
| 23 | + |
| 24 | + files = applyFilters(files, showAll); |
| 25 | + files = sortFiles(files); |
| 26 | + |
| 27 | + const output = render(files, onePerLine); |
| 28 | + |
| 29 | + console.log(output); |
| 30 | +} |
| 31 | + |
| 32 | +main(); |
| 33 | + |
6 | 34 | function parseArgs(args) { |
7 | 35 | let showAll = false; |
| 36 | + let onePerLine = false; |
8 | 37 | let targetDir = "."; |
| 38 | + const unknownFlags = []; |
| 39 | + |
| 40 | + const knownFlags = new Set(["-a", "-1"]); |
9 | 41 |
|
10 | 42 | for (const arg of args) { |
11 | | - if (arg === "-a") { |
12 | | - showAll = true; |
13 | | - } else if (!arg.startsWith("-")) { |
| 43 | + if (knownFlags.has(arg)) { |
| 44 | + if (arg === "-a") showAll = true; |
| 45 | + if (arg === "-1") onePerLine = true; |
| 46 | + } else if (arg.startsWith("-")) { |
| 47 | + unknownFlags.push(arg); |
| 48 | + } else { |
14 | 49 | targetDir = arg; |
15 | 50 | } |
16 | 51 | } |
17 | 52 |
|
18 | | - return { showAll, targetDir }; |
| 53 | + return { showAll, onePerLine, targetDir, unknownFlags }; |
19 | 54 | } |
20 | 55 |
|
21 | | -function listDirectory(dirPath, showAll) { |
22 | | - let files = fs.readdirSync(dirPath); |
23 | | - |
24 | | - let hidden = []; |
25 | | - let normal = files; |
| 56 | +function readDirectory(dir) { |
| 57 | + return fs.readdirSync(dir); |
| 58 | +} |
26 | 59 |
|
| 60 | +function applyFilters(files, showAll) { |
27 | 61 | if (!showAll) { |
28 | | - normal = files.filter(file => !file.startsWith(".")); |
29 | | - } else { |
30 | | - hidden = files.filter(file => file.startsWith(".")); |
31 | | - normal = files.filter(file => !file.startsWith(".")); |
32 | | - |
| 62 | + return files.filter(f => !f.startsWith(".")); |
33 | 63 | } |
34 | 64 |
|
35 | | - normal.sort(); |
36 | | - hidden.sort(); |
37 | | - |
38 | | - let result = []; |
39 | | - |
40 | | - if (showAll) { |
41 | | - result.push(".",".."); |
| 65 | + return [".", "..", ...files]; |
42 | 66 | } |
43 | | - result.push (...normal, ...hidden); |
44 | | - |
45 | | - return result; |
46 | | - |
| 67 | +function sortFiles(files) { |
| 68 | + return files.sort(); |
47 | 69 | } |
48 | 70 |
|
49 | | -function main() { |
50 | | - const args = process.argv.slice(2); |
51 | | - const { showAll, targetDir } = parseArgs(args); |
| 71 | +function render(files, onePerLine) { |
| 72 | + if (onePerLine) { |
| 73 | + return files.join("\n"); |
| 74 | + } |
52 | 75 |
|
53 | | - const files = listDirectory(targetDir, showAll); |
54 | | - console.log(files.join("\n")); |
| 76 | + // default format (simple column simulation) |
| 77 | + return files.join(" "); |
55 | 78 | } |
56 | 79 |
|
57 | | -main(); |
58 | 80 |
|
59 | 81 |
|
0 commit comments