import axios from 'axios'; import * as cheerio from 'cheerio'; const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; async function main() { console.log(`\nšŸš€ Starting HTTP Sitemap Validation for: ${targetUrl}\n`); try { const sitemapUrl = `${targetUrl.replace(/\/$/, '')}/sitemap.xml`; console.log(`šŸ“„ Fetching sitemap from ${sitemapUrl}...`); const response = await axios.get(sitemapUrl, { headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, validateStatus: (status) => status < 400, }); const $ = cheerio.load(response.data, { xmlMode: true }); let urls = $('url loc') .map((i, el) => $(el).text()) .get(); const urlPattern = /https?:\/\/[^\/]+/; urls = [...new Set(urls)] .filter((u) => u.startsWith('http')) .map((u) => u.replace(urlPattern, targetUrl.replace(/\/$/, ''))) .sort(); console.log(`āœ… Found ${urls.length} target URLs in sitemap.`); if (urls.length === 0) { console.error('āŒ No URLs found in sitemap. Is the site up?'); process.exit(1); } console.log(`\nšŸ” Verifying HTTP Status Codes (Limit: None)...`); let hasErrors = false; // Run fetches sequentially to avoid overwhelming the server during CI for (let i = 0; i < urls.length; i++) { const u = urls[i]; try { const res = await axios.get(u, { headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, validateStatus: null, // Don't throw on error status }); if (res.status >= 400) { console.error(`āŒ ERROR ${res.status}: ${res.statusText} -> ${u}`); hasErrors = true; } else { console.log(`āœ… OK ${res.status} -> ${u}`); } } catch (err: any) { console.error(`āŒ NETWORK ERROR: ${err.message} -> ${u}`); hasErrors = true; } } if (hasErrors) { console.error(`\nāŒ HTTP Sitemap Validation Failed. One or more pages returned an error.`); process.exit(1); } else { console.log(`\n✨ Success: All ${urls.length} pages are healthy! (HTTP 200)`); process.exit(0); } } catch (error: any) { console.error(`\nāŒ Critical Error during Sitemap Fetch:`, error.message); process.exit(1); } } main();