// scripts/visual-diff.ts import { chromium } from '@playwright/test' import { mkdir } from 'node:fs/promises' const URLS = [ '/', '/blog/', '/blog/a-guide-to-laravel-authorization-patterns/', '/blog/feedback-loops-in-an-AI-era/', '/blog/im-free/', '/projects/', '/projects/bully/', '/tags/', '/about/', '/hire-me/', ] const NEW_BASE = process.env.PLAYWRIGHT_BASE_URL ?? 'http://localhost:3001' async function main() { await mkdir('.visual-diff/old', { recursive: true }) await mkdir('.visual-diff/new', { recursive: true }) const browser = await chromium.launch() const ctx = await browser.newContext({ viewport: { width: 1280, height: 800 } }) const page = await ctx.newPage() for (const url of URLS) { const file = url.replace(/\W+/g, '_').replace(/^_|_$/g, '') || 'home' console.log(`Capturing: ${url}`) try { await page.goto('https://arter.dev' + url, { waitUntil: 'networkidle', timeout: 30000 }) await page.screenshot({ path: `.visual-diff/old/${file}.png`, fullPage: true }) } catch (e) { console.error(` [WARN] Failed to capture old site for ${url}: ${(e as Error).message}`) } try { await page.goto(NEW_BASE + url, { waitUntil: 'networkidle', timeout: 30000 }) await page.screenshot({ path: `.visual-diff/new/${file}.png`, fullPage: true }) } catch (e) { console.error(` [WARN] Failed to capture new site for ${url}: ${(e as Error).message}`) } } await browser.close() console.log('Visual diff screenshots written to .visual-diff/{old,new}') } main().catch((e) => { console.error(e); process.exit(1) })