Jalankan seluruh pemeriksa
Jalankan seluruh pemeriksa
Section titled “Jalankan seluruh pemeriksa”Menjalankan sepuluh pemeriksa sekaligus lalu merangkum hasilnya.
Berkas: alat/hari-3/jalankan-semua.mjs
#!/usr/bin/env node// =====================================================================// jalankan-semua.mjs//// Menjalankan seluruh pemeriksa code_review pada folder hari_3 dan// merangkum hasilnya. Dipakai untuk memastikan temuan di catatan review// masih sesuai dengan berkas yang ada.//// Pakai:// node jalankan-semua.mjs// node jalankan-semua.mjs --hari ../../ # tentukan folder hari_3// =====================================================================
import { spawnSync } from 'node:child_process';import { existsSync } from 'node:fs';import { join, dirname } from 'node:path';import { fileURLToPath } from 'node:url';
const sini = dirname(fileURLToPath(import.meta.url));const argv = process.argv.slice(2);const idxHari = argv.indexOf('--hari');const akar = idxHari > -1 ? argv[idxHari + 1] : join(sini, '..');
if (!existsSync(akar)) { console.error(`Folder hari_3 tidak ditemukan: ${akar}`); process.exit(2);}
// Setiap pemeriksa: nama, skrip, argumen.const pemeriksa = [ { nama: 'Praktik 6 - perbaiki CSV 2D', skrip: 'Praktik 6/tools/perbaiki-csv.mjs', args: [ join(akar, 'Praktik 6/Management Database Non Spasial/File latihan/katalog_data_2d.csv'), join(sini, 'Praktik 6/data/katalog_data_2d.bersih.csv'), ], }, { nama: 'Praktik 6 - perbaiki CSV 3D', skrip: 'Praktik 6/tools/perbaiki-csv.mjs', args: [ join(akar, 'Praktik 8/Koneksi Prisma ORM dan API Login/File latihan/katalog_data_3d.csv'), join(sini, 'Praktik 6/data/katalog_data_3d.bersih.csv'), ], }, { nama: 'Praktik 8 - periksa koneksi database', skrip: 'Praktik 8/tools/periksa-koneksi.mjs', args: [join(akar, 'Praktik 8/Koneksi Prisma ORM dan API Login/File latihan/DATABASE_URL.txt')], }, { nama: 'Praktik 9 - audit statis API', skrip: 'Praktik 9/tools/audit-api.mjs', args: [join(akar, 'Praktik 9')], }, { nama: 'Praktik 10 - audit statis NextAuth', skrip: 'Praktik 9/tools/audit-api.mjs', args: [join(akar, 'Praktik 10/Konfigurasi NextAuth/File Latihan')], }, { nama: 'Praktik 10 - periksa konfigurasi', skrip: 'Praktik 10/tools/periksa-konfigurasi.mjs', args: [join(akar, 'Praktik 10/Konfigurasi NextAuth/File Latihan')], }, { nama: 'Praktik 11 - periksa deploy', skrip: 'Praktik 11/tools/periksa-deploy.mjs', args: [join(akar, 'Praktik 11/file latihan')], }, { nama: 'Praktik 11 - periksa nginx versi modul', skrip: 'Praktik 11/tools/periksa-nginx.mjs', args: [join(akar, 'Praktik 11/file latihan/nginx.conf')], }, { nama: 'Praktik 11 - periksa nginx versi perbaikan', skrip: 'Praktik 11/tools/periksa-nginx.mjs', args: [join(sini, 'Praktik 11/perbaikan/nginx.conf')], }, { // Pengganti scripts/check-config.mjs dari modul, yang butuh paket `yaml` // padahal paket itu tidak ada di dependencies package.json. nama: 'Praktik 11 - periksa YAML (tanpa dependensi)', skrip: 'Praktik 11/tools/periksa-yaml.mjs', args: [], cwd: join(akar, 'Praktik 11/file latihan'), }, { // Empat peserta berbagi satu project. Periksa nama mana yang wajib unik // dan mana yang memang dipakai bersama. nama: 'Praktik 11 - audit tabrakan nama resource', skrip: 'Praktik 11/tools/audit-tabrakan.mjs', args: [join(akar, 'Praktik 11')], }, { // Pemeriksa yang dijalankan peserta sebelum menyentuh Tahap 4. nama: 'Praktik 11 - pra-terbang (identitas sah)', skrip: 'Praktik 11/tools/pra-terbang.mjs', args: ['--roster', join(sini, 'Praktik 11/data/daftar-peserta.contoh.csv'), '--email', 'asisten02@example.com'], },];
const ringkasan = [];
for (const p of pemeriksa) { const jalurSkrip = join(sini, p.skrip); if (!existsSync(jalurSkrip)) { ringkasan.push({ nama: p.nama, status: 'SKRIP HILANG', keluaran: '' }); continue; } console.log(''); console.log('\u001b[1m' + '='.repeat(70) + '\u001b[0m'); console.log('\u001b[1m' + p.nama + '\u001b[0m'); console.log('\u001b[1m' + '='.repeat(70) + '\u001b[0m');
const r = spawnSync(process.execPath, [jalurSkrip, ...p.args], { encoding: 'utf8', cwd: p.cwd ?? undefined, }); const keluaran = (r.stdout ?? '') + (r.stderr ?? ''); process.stdout.write(keluaran);
// Ambil baris "Ringkasan:" atau "HASIL:" terakhir sebagai ringkasan singkat. const barisRingkas = keluaran .split('\n') .filter((b) => /^(Ringkasan:|HASIL:)/.test(b.trim())) .pop();
ringkasan.push({ nama: p.nama, status: r.status === 0 ? 'BERSIH' : `ADA TEMUAN (exit ${r.status})`, keluaran: (barisRingkas ?? '').trim(), });}
console.log('');console.log('\u001b[1m' + '='.repeat(70) + '\u001b[0m');console.log('\u001b[1mRINGKASAN SELURUH PEMERIKSA\u001b[0m');console.log('\u001b[1m' + '='.repeat(70) + '\u001b[0m');for (const r of ringkasan) { const tanda = r.status === 'BERSIH' ? '\u001b[32m✓\u001b[0m' : '\u001b[33m!\u001b[0m'; console.log(`${tanda} ${r.nama}`); console.log(` ${r.status}${r.keluaran ? ' | ' + r.keluaran : ''}`);}console.log('');console.log('Catatan: pemeriksa yang menguji aplikasi berjalan tidak diikutkan di sini.');console.log(' Praktik 9 : BASE_URL=http://localhost:3000 PASSWORD=... node "Praktik 9/tools/uji-api.mjs"');console.log(' Praktik 7 : GEOSERVER_PASSWORD=... node "Praktik 7/tools/periksa-geoserver.mjs"');console.log(' Praktik 11 : node "Praktik 11/tools/uji-subdomain.mjs" nama01.gisbigtrainer.com');