Latihan 1 dari materi Defensive Scripting & trap di Terminal — praktek dengan editor kode interaktif, test case otomatis, dan hint terpandu. Langsung jalan di browser.
Lengkapi dua function yang meniru pengaman script bash. defaultValue(expr, env) (meniru ${VAR:-default}) di kode awal sudah jadi, biarkan begitu, juga sebelas baris console.log-nya.
-
analyzePreamble(line) menerima satu baris seperti "set -euo pipefail" dan mengembalikan array nama pengaman yang menyala, urut sesuai kemunculannya:
- huruf
e jadi "exit-on-error", u jadi "undefined-fails", x jadi "xtrace"
- kata
pipefail (yang datang sesudah o) jadi "pipefail"
- huruf lain diabaikan, dan baris yang gak diawali
set mengembalikan []
Pengecekan set dan array flags sudah ada di kode awal, tinggal isi bagian tengahnya.
-
createScriptRunner() mengembalikan object { onExit, run }:
onExit(fn) mendaftarkan satu handler, dan boleh dipanggil berkali-kali.
run(task) menjalankan task(). Setelah itu, entah sukses atau task melempar error, panggil semua handler dengan urutan terbalik: yang terakhir didaftarkan jalan duluan. Kembalikan "ok" kalau sukses, "error" kalau task melempar error.
Di bash sungguhan, trap ... EXIT yang kedua menggantikan yang pertama. Daftar handler ini meniru isi satu function cleanup yang membereskan semuanya dengan urutan terbalik.
Output-nya harus persis sebelas baris ini, berurutan:
["exit-on-error","undefined-fails"]
["exit-on-error","undefined-fails","pipefail"]
["xtrace"]
[]
prod.com
localhost
localhost
ok
task,second,first
error
cleanup
Ada juga cek tambahan: analyzePreamble("set -ex") harus ["exit-on-error", "xtrace"], analyzePreamble("set -o pipefail") harus ["pipefail"], defaultValue dicek dengan ${PORT:-8080} (kosong jadi 8080, "3000" tetap 3000) dan dengan teks biasa "halo" yang dikembalikan apa adanya, dan runner dengan tiga handler a, b, c yang task-nya gagal harus menghasilkan urutan c,b,a.