import axios from 'axios'; const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; const requiredHeaders = [ 'strict-transport-security', 'x-frame-options', 'x-content-type-options', 'referrer-policy', 'content-security-policy', ]; async function main() { console.log(`\nšŸ›”ļø Starting Security Headers Scan for: ${targetUrl}\n`); try { const response = await axios.head(targetUrl, { headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, validateStatus: () => true, }); const headers = response.headers; let allPassed = true; const results = requiredHeaders.map((header) => { const present = !!headers[header]; if (!present) allPassed = false; return { Header: header, Status: present ? 'āœ… Present' : 'āŒ Missing', Value: present ? headers[header].length > 50 ? headers[header].substring(0, 47) + '...' : headers[header] : 'N/A', }; }); console.table(results); if (allPassed) { console.log(`\nāœ… All required security headers are correctly configured!\n`); process.exit(0); } else { console.log(`\nāŒ Missing critical security headers. Please update next.config.mjs!\n`); process.exit(process.env.CI ? 1 : 0); // Don't crash local dev hard if missing, but crash CI } } catch (error: any) { console.error(`āŒ Failed to scan headers: ${error.message}`); process.exit(1); } } main();