Lewati ke konten

Jalankan seluruh pemeriksa

Menjalankan sepuluh pemeriksa sekaligus lalu merangkum hasilnya.

Berkas: alat/hari-3/jalankan-semua.mjs

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');