From 9b7a67272293a79477d57a63ac9b25a70945fe73 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Tue, 24 Mar 2026 21:41:26 +0000 Subject: [PATCH 01/17] cat without flag --- implement-shell-tools/cat/cat.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 implement-shell-tools/cat/cat.js diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js new file mode 100644 index 000000000..6296dfcf9 --- /dev/null +++ b/implement-shell-tools/cat/cat.js @@ -0,0 +1,13 @@ +import process from "node:process"; +import { promises as fs } from "node:fs"; + +const argv = process.argv.slice(2); +if (argv.length < 1) { + console.error(`Expected exactly 1 or more arguments (paths) to be passed but got ${argv.length}.`); + process.exit(1); +} +const paths = argv; + +for (const path of paths) { + console.log(await fs.readFile(path, "utf-8")); +} From ed6323db872a93f48350f0279c8e68ffca6d2ba6 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 10:25:41 +0000 Subject: [PATCH 02/17] Fix newline --- implement-shell-tools/cat/cat.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js index 6296dfcf9..33d4918aa 100644 --- a/implement-shell-tools/cat/cat.js +++ b/implement-shell-tools/cat/cat.js @@ -6,8 +6,12 @@ if (argv.length < 1) { console.error(`Expected exactly 1 or more arguments (paths) to be passed but got ${argv.length}.`); process.exit(1); } -const paths = argv; -for (const path of paths) { - console.log(await fs.readFile(path, "utf-8")); +const stringArr = []; +for (const path of argv) { + stringArr.push(await fs.readFile(path, "utf-8")); } + +for (let i = 0; i < stringArr.length; i++) { + console.log(stringArr[i].trim()) +} \ No newline at end of file From c2d2692051f0db86db1de062c209a58384a22012 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 11:11:29 +0000 Subject: [PATCH 03/17] Add logic to count lines --- implement-shell-tools/cat/cat.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js index 33d4918aa..5b406dbbf 100644 --- a/implement-shell-tools/cat/cat.js +++ b/implement-shell-tools/cat/cat.js @@ -1,7 +1,13 @@ +import { program } from "commander"; import process from "node:process"; import { promises as fs } from "node:fs"; -const argv = process.argv.slice(2); +let showNumber = false; + +program.name("cat").description("Prints the output of a file to the console").option("-n, --number", "Displays the lines along with their number").argument("", "The file path").allowExcessArguments() +program.parse() + +const argv = program.args if (argv.length < 1) { console.error(`Expected exactly 1 or more arguments (paths) to be passed but got ${argv.length}.`); process.exit(1); @@ -12,6 +18,9 @@ for (const path of argv) { stringArr.push(await fs.readFile(path, "utf-8")); } -for (let i = 0; i < stringArr.length; i++) { - console.log(stringArr[i].trim()) +const flatArr = stringArr.flatMap(l => l.split("\n").map((l, i, a) => i < a.length - 1 ? l + "\n" : l).filter(l => l !== "")); + +if (!showNumber) console.log(flatArr.join("")) +else { +console.log(flatArr.map((l, i) => `${i + 1} ${l}`).join("")) } \ No newline at end of file From 2b3c0d319b4102b68036eabca512dde92d79a2c2 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 11:12:28 +0000 Subject: [PATCH 04/17] Tweak format --- implement-shell-tools/cat/cat.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js index 5b406dbbf..d702ad51d 100644 --- a/implement-shell-tools/cat/cat.js +++ b/implement-shell-tools/cat/cat.js @@ -21,6 +21,4 @@ for (const path of argv) { const flatArr = stringArr.flatMap(l => l.split("\n").map((l, i, a) => i < a.length - 1 ? l + "\n" : l).filter(l => l !== "")); if (!showNumber) console.log(flatArr.join("")) -else { -console.log(flatArr.map((l, i) => `${i + 1} ${l}`).join("")) -} \ No newline at end of file +else console.log(flatArr.map((l, i) => `${i + 1} ${l}`).join("")) \ No newline at end of file From 379a512fb339caa4750e28f7664c1bc5c12edcb1 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 11:13:55 +0000 Subject: [PATCH 05/17] Add program package --- implement-shell-tools/cat/package-lock.json | 25 +++++++++++++++++++++ implement-shell-tools/cat/package.json | 15 +++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 implement-shell-tools/cat/package-lock.json create mode 100644 implement-shell-tools/cat/package.json diff --git a/implement-shell-tools/cat/package-lock.json b/implement-shell-tools/cat/package-lock.json new file mode 100644 index 000000000..737542646 --- /dev/null +++ b/implement-shell-tools/cat/package-lock.json @@ -0,0 +1,25 @@ +{ + "name": "cat", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cat", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "commander": "^14.0.3" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + } + } +} diff --git a/implement-shell-tools/cat/package.json b/implement-shell-tools/cat/package.json new file mode 100644 index 000000000..d6423e6f3 --- /dev/null +++ b/implement-shell-tools/cat/package.json @@ -0,0 +1,15 @@ +{ + "name": "cat", + "version": "1.0.0", + "description": "You should already be familiar with the `cat` command line tool.", + "license": "ISC", + "author": "", + "type": "module", + "main": "cat.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "commander": "^14.0.3" + } +} From 24320912e9c3d1316afc61d8b839cb6065b07d14 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 11:17:38 +0000 Subject: [PATCH 06/17] cat complete --- implement-shell-tools/cat/cat.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js index d702ad51d..a77d12d38 100644 --- a/implement-shell-tools/cat/cat.js +++ b/implement-shell-tools/cat/cat.js @@ -13,6 +13,8 @@ if (argv.length < 1) { process.exit(1); } +if (program.opts().number) showNumber = true; + const stringArr = []; for (const path of argv) { stringArr.push(await fs.readFile(path, "utf-8")); From 0bfe406412a549fba216ac10613239b96a0b5d97 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 11:50:31 +0000 Subject: [PATCH 07/17] list files from current directory --- implement-shell-tools/ls/ls.js | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 implement-shell-tools/ls/ls.js diff --git a/implement-shell-tools/ls/ls.js b/implement-shell-tools/ls/ls.js new file mode 100644 index 000000000..dda0ea719 --- /dev/null +++ b/implement-shell-tools/ls/ls.js @@ -0,0 +1,7 @@ +import fs from 'node:fs'; + +const folderPath = '.'; + +const contents = fs.readdirSync(folderPath); + +console.log(contents.join(" ")); \ No newline at end of file From cd612692863879985fd66a6afb24c915bc793cb0 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 11:58:47 +0000 Subject: [PATCH 08/17] ls can list from other directories --- implement-shell-tools/ls/ls.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/implement-shell-tools/ls/ls.js b/implement-shell-tools/ls/ls.js index dda0ea719..8e94abe84 100644 --- a/implement-shell-tools/ls/ls.js +++ b/implement-shell-tools/ls/ls.js @@ -1,6 +1,9 @@ +import process from 'node:process'; import fs from 'node:fs'; -const folderPath = '.'; +const argv = process.argv.slice(2) + +const folderPath = argv[0] || "."; const contents = fs.readdirSync(folderPath); From 74981d40b6d33e219b92ba2c029cc65c6c1b1788 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 13:03:18 +0000 Subject: [PATCH 09/17] Add vertical print --- implement-shell-tools/ls/ls.js | 19 ++++++++++++++-- implement-shell-tools/ls/package-lock.json | 25 ++++++++++++++++++++++ implement-shell-tools/ls/package.json | 16 ++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 implement-shell-tools/ls/package-lock.json create mode 100644 implement-shell-tools/ls/package.json diff --git a/implement-shell-tools/ls/ls.js b/implement-shell-tools/ls/ls.js index 8e94abe84..5bcdfe41f 100644 --- a/implement-shell-tools/ls/ls.js +++ b/implement-shell-tools/ls/ls.js @@ -1,10 +1,25 @@ +import { program } from "commander"; import process from 'node:process'; import fs from 'node:fs'; -const argv = process.argv.slice(2) +let vertical = false; + +program.name("list-directory-contents").description("Shows all files and folders in a directory").option("-1", "List one file/directory per line").argument("[path]", "Path of the directory to list (defaults to .)") + +program.parse(); + +const argv = program.args; + +vertical = program.opts()[1] const folderPath = argv[0] || "."; const contents = fs.readdirSync(folderPath); -console.log(contents.join(" ")); \ No newline at end of file +if (!vertical) { + console.log(contents.join(" ")); +} else { + for (const content of contents) { + console.log(content); + } +} \ No newline at end of file diff --git a/implement-shell-tools/ls/package-lock.json b/implement-shell-tools/ls/package-lock.json new file mode 100644 index 000000000..74bc88d5b --- /dev/null +++ b/implement-shell-tools/ls/package-lock.json @@ -0,0 +1,25 @@ +{ + "name": "ls", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ls", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "commander": "^14.0.3" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + } + } +} diff --git a/implement-shell-tools/ls/package.json b/implement-shell-tools/ls/package.json new file mode 100644 index 000000000..43e0a50d8 --- /dev/null +++ b/implement-shell-tools/ls/package.json @@ -0,0 +1,16 @@ +{ + "name": "ls", + "version": "1.0.0", + "description": "You should already be familiar with the `ls` command line tool.", + "main": "ls.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "module", + "dependencies": { + "commander": "^14.0.3" + } +} From 7eeb2182ae8642a1ad2cde9bbf2ae3ab85b9b017 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 13:17:42 +0000 Subject: [PATCH 10/17] Hidden files --- implement-shell-tools/ls/ls.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/implement-shell-tools/ls/ls.js b/implement-shell-tools/ls/ls.js index 5bcdfe41f..3de469656 100644 --- a/implement-shell-tools/ls/ls.js +++ b/implement-shell-tools/ls/ls.js @@ -3,23 +3,29 @@ import process from 'node:process'; import fs from 'node:fs'; let vertical = false; +let showHidden = false; -program.name("list-directory-contents").description("Shows all files and folders in a directory").option("-1", "List one file/directory per line").argument("[path]", "Path of the directory to list (defaults to .)") +program.name("list-directory-contents").description("Shows all files and folders in a directory").option("-1", "List one file/directory per line").option("-a, --all", "Show hidden files").argument("[path]", "Path of the directory to list (defaults to .)") program.parse(); const argv = program.args; -vertical = program.opts()[1] +vertical = program.opts()[1]; +showHidden = program.opts().all; const folderPath = argv[0] || "."; const contents = fs.readdirSync(folderPath); +const filtered = contents.filter(f => f[0] !== ".") + +const dirArr = !showHidden ? filtered : contents + if (!vertical) { - console.log(contents.join(" ")); + console.log(dirArr.join(" ")); } else { - for (const content of contents) { + for (const content of dirArr) { console.log(content); } } \ No newline at end of file From 6f2610498230ce8e61186d59f803ce4b0522bca4 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 13:19:23 +0000 Subject: [PATCH 11/17] Tweak number logic --- implement-shell-tools/cat/cat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js index a77d12d38..de1d861ee 100644 --- a/implement-shell-tools/cat/cat.js +++ b/implement-shell-tools/cat/cat.js @@ -13,7 +13,7 @@ if (argv.length < 1) { process.exit(1); } -if (program.opts().number) showNumber = true; +showNumber = program.opts().number const stringArr = []; for (const path of argv) { From a6ef52850ac5dce1b20e5b50bedef624f7bcd440 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 17:16:35 +0000 Subject: [PATCH 12/17] Calculate data per file --- implement-shell-tools/wc/package-lock.json | 25 +++++++++++++++++ implement-shell-tools/wc/package.json | 16 +++++++++++ implement-shell-tools/wc/wc.js | 31 ++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 implement-shell-tools/wc/package-lock.json create mode 100644 implement-shell-tools/wc/package.json create mode 100644 implement-shell-tools/wc/wc.js diff --git a/implement-shell-tools/wc/package-lock.json b/implement-shell-tools/wc/package-lock.json new file mode 100644 index 000000000..8aa122ddd --- /dev/null +++ b/implement-shell-tools/wc/package-lock.json @@ -0,0 +1,25 @@ +{ + "name": "wc", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wc", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "commander": "^14.0.3" + } + }, + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + } + } +} diff --git a/implement-shell-tools/wc/package.json b/implement-shell-tools/wc/package.json new file mode 100644 index 000000000..dc9367c92 --- /dev/null +++ b/implement-shell-tools/wc/package.json @@ -0,0 +1,16 @@ +{ + "name": "wc", + "version": "1.0.0", + "description": "You should already be familiar with the `wc` command line tool.", + "main": "wc.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "module", + "dependencies": { + "commander": "^14.0.3" + } +} diff --git a/implement-shell-tools/wc/wc.js b/implement-shell-tools/wc/wc.js new file mode 100644 index 000000000..9655deb04 --- /dev/null +++ b/implement-shell-tools/wc/wc.js @@ -0,0 +1,31 @@ +import { program } from "commander"; +import process from "node:process"; +import { promises as fs } from "node:fs"; + +program.name("wc").description("Print the number of lines, word and bytes for each file and a total if there are multiple files") +.option("-l, --lines", "Print the number of lines") +.option("-w, --words", "Print the number of words") +.option("-c, --bytes", "Print the number of bytes") +.argument("", "The file path").allowExcessArguments() +program.parse() + +const argv = program.args; + + +const stringArr = []; +for (const path of argv) { + stringArr.push(await fs.readFile(path, "utf-8")); +} + +const infoArr = []; +for (let i = 0; i < stringArr.length; i++) { + const arr = []; + const line = stringArr[i].split("\n")//.filter(e => e.includes("\n")) + arr.push(line.length - 1) + arr.push(stringArr[i].split(" ").flatMap(l => l.split("\n").map((l, i, a) => i < a.length - 1 ? l + "\n" : l).filter(l => l.trim() !== "")).length) + arr.push(new Blob([stringArr[i]]).size) + arr.push(argv[i]) + infoArr.push(arr.join(" ")) +} + +console.log(infoArr) \ No newline at end of file From 24adf292ef84b90c319fd6eea05bd840bc570b1b Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 17:24:47 +0000 Subject: [PATCH 13/17] Add total --- implement-shell-tools/wc/wc.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/implement-shell-tools/wc/wc.js b/implement-shell-tools/wc/wc.js index 9655deb04..20cf473fb 100644 --- a/implement-shell-tools/wc/wc.js +++ b/implement-shell-tools/wc/wc.js @@ -17,15 +17,25 @@ for (const path of argv) { stringArr.push(await fs.readFile(path, "utf-8")); } +let lines = 0; +let words = 0; +let bytes = 0; + const infoArr = []; for (let i = 0; i < stringArr.length; i++) { const arr = []; - const line = stringArr[i].split("\n")//.filter(e => e.includes("\n")) - arr.push(line.length - 1) - arr.push(stringArr[i].split(" ").flatMap(l => l.split("\n").map((l, i, a) => i < a.length - 1 ? l + "\n" : l).filter(l => l.trim() !== "")).length) - arr.push(new Blob([stringArr[i]]).size) + const line = stringArr[i].split("\n").length + const wc = stringArr[i].split(" ").flatMap(l => l.split("\n").map((l, i, a) => i < a.length - 1 ? l + "\n" : l).filter(l => l.trim() !== "")).length + const lineByte = new Blob([stringArr[i]]).size + arr.push(line - 1) + lines += line - 1; + arr.push(wc); + words += wc; + arr.push(lineByte) + bytes += lineByte arr.push(argv[i]) infoArr.push(arr.join(" ")) } +if (infoArr.length > 1) infoArr.push([lines, words, bytes, "total"].join(" ")) console.log(infoArr) \ No newline at end of file From 9dd458361bd972d505f758dea1cfd6021fdca0aa Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 17:33:39 +0000 Subject: [PATCH 14/17] Format wc --- implement-shell-tools/wc/wc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/implement-shell-tools/wc/wc.js b/implement-shell-tools/wc/wc.js index 20cf473fb..5775338f4 100644 --- a/implement-shell-tools/wc/wc.js +++ b/implement-shell-tools/wc/wc.js @@ -38,4 +38,4 @@ for (let i = 0; i < stringArr.length; i++) { } if (infoArr.length > 1) infoArr.push([lines, words, bytes, "total"].join(" ")) -console.log(infoArr) \ No newline at end of file +console.log(infoArr.join("\n")) \ No newline at end of file From 62821e43416a34326d047e1d412d5cc7a2d79f05 Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 18:58:06 +0000 Subject: [PATCH 15/17] flags --- implement-shell-tools/wc/wc.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/implement-shell-tools/wc/wc.js b/implement-shell-tools/wc/wc.js index 5775338f4..ceedc8e92 100644 --- a/implement-shell-tools/wc/wc.js +++ b/implement-shell-tools/wc/wc.js @@ -2,6 +2,10 @@ import { program } from "commander"; import process from "node:process"; import { promises as fs } from "node:fs"; +let showLineCount = true; +let showWordCount = true; +let showByteCount = true; + program.name("wc").description("Print the number of lines, word and bytes for each file and a total if there are multiple files") .option("-l, --lines", "Print the number of lines") .option("-w, --words", "Print the number of words") @@ -11,6 +15,11 @@ program.parse() const argv = program.args; +if (Object.keys(program.opts()).length >= 1) { + showLineCount = program.opts().lines; + showWordCount = program.opts().words; + showByteCount = program.opts().bytes; +} const stringArr = []; for (const path of argv) { @@ -27,12 +36,18 @@ for (let i = 0; i < stringArr.length; i++) { const line = stringArr[i].split("\n").length const wc = stringArr[i].split(" ").flatMap(l => l.split("\n").map((l, i, a) => i < a.length - 1 ? l + "\n" : l).filter(l => l.trim() !== "")).length const lineByte = new Blob([stringArr[i]]).size + if (showLineCount) { arr.push(line - 1) lines += line - 1; + } + if (showWordCount) { arr.push(wc); words += wc; + } + if (showByteCount) { arr.push(lineByte) bytes += lineByte + } arr.push(argv[i]) infoArr.push(arr.join(" ")) } From a324eef9a2efe725ce5015cb096087fde5aed39a Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 20:02:57 +0000 Subject: [PATCH 16/17] Remove 0s from unwanted data --- implement-shell-tools/wc/wc.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/implement-shell-tools/wc/wc.js b/implement-shell-tools/wc/wc.js index ceedc8e92..71006b8e8 100644 --- a/implement-shell-tools/wc/wc.js +++ b/implement-shell-tools/wc/wc.js @@ -52,5 +52,11 @@ for (let i = 0; i < stringArr.length; i++) { infoArr.push(arr.join(" ")) } -if (infoArr.length > 1) infoArr.push([lines, words, bytes, "total"].join(" ")) +if (infoArr.length > 1) { + const totalArr = ["total"]; + if (showByteCount) totalArr.unshift(bytes); + if (showWordCount) totalArr.unshift(words); + if (showLineCount) totalArr.unshift(lines); + infoArr.push(totalArr.join(" ")) +} console.log(infoArr.join("\n")) \ No newline at end of file From 37c7da2a1bac467a7912a067b3e15b639dddf0bb Mon Sep 17 00:00:00 2001 From: Craig D'Silva Date: Wed, 25 Mar 2026 20:09:59 +0000 Subject: [PATCH 17/17] Format --- implement-shell-tools/cat/cat.js | 32 +++++++++----- implement-shell-tools/ls/ls.js | 25 ++++++----- implement-shell-tools/wc/wc.js | 72 ++++++++++++++++++-------------- 3 files changed, 78 insertions(+), 51 deletions(-) diff --git a/implement-shell-tools/cat/cat.js b/implement-shell-tools/cat/cat.js index de1d861ee..c1638d83a 100644 --- a/implement-shell-tools/cat/cat.js +++ b/implement-shell-tools/cat/cat.js @@ -4,23 +4,35 @@ import { promises as fs } from "node:fs"; let showNumber = false; -program.name("cat").description("Prints the output of a file to the console").option("-n, --number", "Displays the lines along with their number").argument("", "The file path").allowExcessArguments() -program.parse() +program + .name("cat") + .description("Prints the output of a file to the console") + .option("-n, --number", "Displays the lines along with their number") + .argument("", "The file path") + .allowExcessArguments(); +program.parse(); -const argv = program.args +const argv = program.args; if (argv.length < 1) { - console.error(`Expected exactly 1 or more arguments (paths) to be passed but got ${argv.length}.`); - process.exit(1); + console.error( + `Expected exactly 1 or more arguments (paths) to be passed but got ${argv.length}.`, + ); + process.exit(1); } -showNumber = program.opts().number +showNumber = program.opts().number; const stringArr = []; for (const path of argv) { - stringArr.push(await fs.readFile(path, "utf-8")); + stringArr.push(await fs.readFile(path, "utf-8")); } -const flatArr = stringArr.flatMap(l => l.split("\n").map((l, i, a) => i < a.length - 1 ? l + "\n" : l).filter(l => l !== "")); +const flatArr = stringArr.flatMap((l) => + l + .split("\n") + .map((l, i, a) => (i < a.length - 1 ? l + "\n" : l)) + .filter((l) => l !== ""), +); -if (!showNumber) console.log(flatArr.join("")) -else console.log(flatArr.map((l, i) => `${i + 1} ${l}`).join("")) \ No newline at end of file +if (!showNumber) console.log(flatArr.join("")); +else console.log(flatArr.map((l, i) => `${i + 1} ${l}`).join("")); diff --git a/implement-shell-tools/ls/ls.js b/implement-shell-tools/ls/ls.js index 3de469656..5e915ec19 100644 --- a/implement-shell-tools/ls/ls.js +++ b/implement-shell-tools/ls/ls.js @@ -1,11 +1,16 @@ import { program } from "commander"; -import process from 'node:process'; -import fs from 'node:fs'; +import process from "node:process"; +import fs from "node:fs"; let vertical = false; let showHidden = false; -program.name("list-directory-contents").description("Shows all files and folders in a directory").option("-1", "List one file/directory per line").option("-a, --all", "Show hidden files").argument("[path]", "Path of the directory to list (defaults to .)") +program + .name("list-directory-contents") + .description("Shows all files and folders in a directory") + .option("-1", "List one file/directory per line") + .option("-a, --all", "Show hidden files") + .argument("[path]", "Path of the directory to list (defaults to .)"); program.parse(); @@ -18,14 +23,14 @@ const folderPath = argv[0] || "."; const contents = fs.readdirSync(folderPath); -const filtered = contents.filter(f => f[0] !== ".") +const filtered = contents.filter((f) => f[0] !== "."); -const dirArr = !showHidden ? filtered : contents +const dirArr = !showHidden ? filtered : contents; if (!vertical) { - console.log(dirArr.join(" ")); + console.log(dirArr.join(" ")); } else { - for (const content of dirArr) { - console.log(content); - } -} \ No newline at end of file + for (const content of dirArr) { + console.log(content); + } +} diff --git a/implement-shell-tools/wc/wc.js b/implement-shell-tools/wc/wc.js index 71006b8e8..b15a673bd 100644 --- a/implement-shell-tools/wc/wc.js +++ b/implement-shell-tools/wc/wc.js @@ -6,24 +6,29 @@ let showLineCount = true; let showWordCount = true; let showByteCount = true; -program.name("wc").description("Print the number of lines, word and bytes for each file and a total if there are multiple files") -.option("-l, --lines", "Print the number of lines") -.option("-w, --words", "Print the number of words") -.option("-c, --bytes", "Print the number of bytes") -.argument("", "The file path").allowExcessArguments() -program.parse() +program + .name("wc") + .description( + "Print the number of lines, word and bytes for each file and a total if there are multiple files", + ) + .option("-l, --lines", "Print the number of lines") + .option("-w, --words", "Print the number of words") + .option("-c, --bytes", "Print the number of bytes") + .argument("", "The file path") + .allowExcessArguments(); +program.parse(); const argv = program.args; if (Object.keys(program.opts()).length >= 1) { - showLineCount = program.opts().lines; - showWordCount = program.opts().words; - showByteCount = program.opts().bytes; + showLineCount = program.opts().lines; + showWordCount = program.opts().words; + showByteCount = program.opts().bytes; } const stringArr = []; for (const path of argv) { - stringArr.push(await fs.readFile(path, "utf-8")); + stringArr.push(await fs.readFile(path, "utf-8")); } let lines = 0; @@ -32,31 +37,36 @@ let bytes = 0; const infoArr = []; for (let i = 0; i < stringArr.length; i++) { - const arr = []; - const line = stringArr[i].split("\n").length - const wc = stringArr[i].split(" ").flatMap(l => l.split("\n").map((l, i, a) => i < a.length - 1 ? l + "\n" : l).filter(l => l.trim() !== "")).length - const lineByte = new Blob([stringArr[i]]).size - if (showLineCount) { - arr.push(line - 1) + const arr = []; + const line = stringArr[i].split("\n").length; + const wc = stringArr[i].split(" ").flatMap((l) => + l + .split("\n") + .map((l, i, a) => (i < a.length - 1 ? l + "\n" : l)) + .filter((l) => l.trim() !== ""), + ).length; + const lineByte = new Blob([stringArr[i]]).size; + if (showLineCount) { + arr.push(line - 1); lines += line - 1; - } - if (showWordCount) { + } + if (showWordCount) { arr.push(wc); words += wc; - } - if (showByteCount) { - arr.push(lineByte) - bytes += lineByte - } - arr.push(argv[i]) - infoArr.push(arr.join(" ")) + } + if (showByteCount) { + arr.push(lineByte); + bytes += lineByte; + } + arr.push(argv[i]); + infoArr.push(arr.join(" ")); } if (infoArr.length > 1) { - const totalArr = ["total"]; - if (showByteCount) totalArr.unshift(bytes); - if (showWordCount) totalArr.unshift(words); - if (showLineCount) totalArr.unshift(lines); - infoArr.push(totalArr.join(" ")) + const totalArr = ["total"]; + if (showByteCount) totalArr.unshift(bytes); + if (showWordCount) totalArr.unshift(words); + if (showLineCount) totalArr.unshift(lines); + infoArr.push(totalArr.join(" ")); } -console.log(infoArr.join("\n")) \ No newline at end of file +console.log(infoArr.join("\n"));