Proyek pertama Course ini menghimpun materi Section Command Line Applications menjadi satu alat yang utuh: Manajer Berkas, sebuah CLI untuk mengelola berkas lewat terminal. Kita akan menampilkan isi folder, membaca berkas dengan nomor baris, menulis dan menyalin berkas, sampai menghapus berkas dengan konfirmasi. Proyek semacam ini adalah latihan yang klasik karena satu alat sederhana ternyata menyentuh banyak keterampilan sekaligus: parsing argumen, operasi berkas asynchronous, penanganan galat, kontrak kode keluar, dan pengujian otomatis. Seluruh kode hanya memakai modul bawaan Node.js — tidak ada package tambahan yang perlu dipasang.

Perintah yang Tersedia #

Manajer Berkas punya tujuh perintah. Setiap perintah menerima argumen posisi (path berkas atau folder) dan sebagian mengenali opsi dengan awalan --.

PerintahArgumenFungsi
daftar<folder>Menampilkan isi folder: nama, ukuran, dan jenis, terurut menurut nama
baca<berkas>Menampilkan isi berkas dengan nomor baris
info<berkas>Menampilkan metadata: nama, jenis, ukuran, dan waktu terakhir diubah
tulis<berkas> <isi>Menulis isi baru; opsi --lanjut menyambung di akhir berkas
salin<asal> <tujuan>Menyalin berkas ke path tujuan
hapus<berkas>Menghapus berkas; wajib disertai opsi --ya sebagai konfirmasi
help—Menampilkan seluruh petunjuk pemakaian

Selain kontrak perintah, kita juga menetapkan kontrak kode keluar yang konsisten: 0 berarti perintah berhasil, 1 berarti pemakaian salah (perintah tidak dikenal atau argumen kurang), dan 2 berarti galat berkas (path tidak ditemukan atau tujuan bukan berkas). Skrip shell yang memanggil alat ini dapat membedakan ketiga keadaan tersebut lewat kode keluar, persis seperti perilaku alat Unix pada umumnya.

Struktur Direktori #

Kode dipisah menjadi modul kecil dengan tanggung jawab yang jelas agar mudah dibaca dan diuji satu per satu. Berkas package.json hanya berisi {"type": "module"} sehingga seluruh berkas .js di proyek ini adalah ES Modules.

text
cli-file-manager/
├── package.json           # {"type": "module"} — semua berkas .js adalah ESM
├── src/
│   ├── cli.js             # pintu masuk: pembagian perintah + kode keluar
│   ├── argumen.js         # parsing argumen dengan util.parseArgs
│   ├── bantuan.js         # teks bantuan perintah help
│   ├── galat.js           # jenis galat + penerjemahan pesan sistem
│   ├── format.js          # format ukuran berkas dan waktu
│   ├── perintah-baca.js   # daftar, baca, info
│   └── perintah-tulis.js  # tulis, salin, hapus
└── tests/
    ├── bantu-uji.js       # pembantu folder uji sementara
    ├── argumen.test.js    # test parsing argumen
    ├── format.test.js     # test pembantu format
    ├── galat.test.js      # test penerjemahan galat
    ├── baca.test.js       # test daftar, baca, info
    ├── tulis.test.js      # test tulis, salin, hapus
    └── cli.test.js        # test integrasi lewat proses nyata

Titik masuk src/cli.js bertugas memanggil parseArgumen, meneruskan hasilnya ke fungsi perintah yang sesuai, lalu menangkap semua galat di satu tempat. Fungsi perintah itu sendiri tidak memanggil console.log — setiap fungsi mengembalikan teks keluaran sehingga test dapat memeriksa hasilnya tanpa perlu membaca layar terminal.

Sesi Pemakaian yang Diharapkan #

Sesi berikut memperlihatkan alur kerja singkat: menulis sebuah berkas, melihat isinya di daftar folder, membaca isinya, lalu menghapusnya. Perintah hapus pertama sengaja dipanggil tanpa --ya untuk memperlihatkan penolakan yang dirancang.

bash
node src/cli.js tulis data/catatan.txt 'Belajar Node.js di terminal.'
node src/cli.js daftar data
node src/cli.js baca data/catatan.txt
node src/cli.js hapus data/catatan.txt
echo kode keluar: $?
node src/cli.js hapus data/catatan.txt --ya

Output yang Dihasilkan:

text
berkas ditulis: data/catatan.txt
nama                      ukuran  jenis
catatan.txt                 29 B  berkas

total: 1 butir
  1 | Belajar Node.js di terminal.
manajer: hapus butuh konfirmasi; jalankan kembali dengan opsi --ya
kode keluar: 1
berkas dihapus: data/catatan.txt

Perhatikan tiga perilaku pada output di atas. Pertama, perintah tulis membuat folder data secara otomatis karena folder induk belum ada. Kedua, hapus tanpa --ya menolak bekerja dan keluar dengan kode 1 — pesan galat dicetak ke stderr, bukan stdout. Ketiga, panggilan hapus kedua berhasil sehingga kode keluarnya 0 dan berkas sungguh terhapus.

Pembagian Empat Bagian #

Pembangunan alat ini dibagi menjadi empat bagian yang berurutan. Setiap bagian membangun di atas berkas yang sudah ada, jadi sebaiknya diikuti secara berurutan.

  1. Bagian 1 — Struktur Proyek dan Argumen: menata anatomi proyek, memparsing argumen dengan util.parseArgs, menulis pesan bantuan, dan menetapkan kontrak kode keluar.
  2. Bagian 2 — Perintah Baca: membangun daftar, baca, dan info di atas node:fs/promises, termasuk format tampilan yang rapi dan penerjemahan pesan galat sistem.
  3. Bagian 3 — Perintah Tulis: membangun tulis, salin, dan hapus lengkap dengan pengaman untuk operasi yang mengubah isi disk.
  4. Bagian 4 — Pengujian dan Perapihan: menguji seluruh kontrak lewat node:test — mulai dari unit test fungsi murni sampai test integrasi yang menjalankan CLI sebagai proses nyata.

Sebelum mulai, pastikan materi Chapter process.argv, util.parseArgs, dan Exit Code pada Section Command Line Applications sudah kita pahami, karena ketiganya dipakai sepanjang proyek ini. Dokumentasi util.parseArgs dan Promise API pada node:fs akan menjadi rujukan utama kita. Mari kita mulai dari Bagian 1: menata struktur proyek dan argumen.