#!/usr/bin/env node /** * Jabali Panel Screenshot Script * * Takes screenshots of admin and user panels for documentation. * * Usage: node tests/take-screenshots.cjs [--output-dir=/path/to/dir] * * Requires: puppeteer (npm install puppeteer) */ const puppeteer = require('puppeteer'); const path = require('path'); const args = process.argv.slice(2); const getArg = (key, fallback) => { const arg = args.find((item) => item.startsWith(`--${key}=`)); return arg ? arg.split('=').slice(1).join('=') : fallback; }; const hasFlag = (flag) => args.includes(`--${flag}`); let browser; // Configuration const CONFIG = { baseUrl: getArg('base-url', 'https://mx.jabali-panel.com'), adminPath: getArg('admin-path', '/jabali-admin'), userPath: getArg('user-path', '/jabali-panel'), admin: { email: getArg('admin-email', 'admin@mx.jabali-panel.com'), password: getArg('admin-password', 'PycpS1dUuLvxMMQs') }, user: { email: getArg('user-email', 'user@jabali-panel.com'), password: getArg('user-password', 'PycpS1dUuLvxMMQs') }, viewport: { width: 1400, height: 900 }, outputDir: getArg('output-dir', '/tmp'), skipAdmin: hasFlag('skip-admin'), skipUser: hasFlag('skip-user') }; // Admin pages to screenshot const ADMIN_PAGES = [ { name: 'dashboard', path: '', description: 'Admin Dashboard' }, { name: 'server-status', path: '/server-status', description: 'Server Status' }, { name: 'server-settings', path: '/server-settings', description: 'Server Settings' }, { name: 'security', path: '/security', description: 'Security Center' }, { name: 'users', path: '/users', description: 'User Management' }, { name: 'ssl-manager', path: '/ssl-manager', description: 'SSL Manager' }, { name: 'dns-zones', path: '/dns-zones', description: 'DNS Zones' }, { name: 'backups', path: '/backups', description: 'Backups' }, { name: 'services', path: '/services', description: 'Services' }, ]; // User pages to screenshot const USER_PAGES = [ { name: 'dashboard', path: '', description: 'User Dashboard' }, { name: 'domains', path: '/domains', description: 'Domain Management' }, { name: 'backups', path: '/backups', description: 'Backups' }, { name: 'cpanel-migration', path: '/cpanel-migration', description: 'cPanel Migration' } ]; const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); async function capturePanel({ panelName, basePath, credentials, pages, outputPrefix }) { const context = await browser.createBrowserContext(); const page = await context.newPage(); await page.setViewport(CONFIG.viewport); try { console.log(`Logging in to ${panelName} panel...`); await page.goto(`${CONFIG.baseUrl}${basePath}/login`, { waitUntil: 'networkidle0' }); await wait(1500); await page.type('input[type="email"]', credentials.email); await page.type('input[type="password"]', credentials.password); await page.click('button[type="submit"]'); await wait(4000); const currentUrl = page.url(); if (currentUrl.includes('/login')) { throw new Error(`${panelName} login failed - still on login page`); } console.log(`${panelName} login successful!\n`); for (const pageInfo of pages) { const url = `${CONFIG.baseUrl}${basePath}${pageInfo.path}`; const filename = `${outputPrefix}-${pageInfo.name}.png`; const filepath = path.join(CONFIG.outputDir, filename); console.log(`Taking screenshot: ${pageInfo.description}`); console.log(` URL: ${url}`); try { await page.goto(url, { waitUntil: 'networkidle0', timeout: 30000 }); await wait(3000); await page.screenshot({ path: filepath, fullPage: true }); console.log(` Saved: ${filepath}\n`); } catch (err) { console.log(` Error: ${err.message}\n`); } } } catch (err) { console.error(`${panelName} screenshots failed:`, err.message); } finally { await context.close(); } } async function takeScreenshots() { console.log('Starting Jabali Panel Screenshot Script...\n'); browser = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox', '--disable-setuid-sandbox', '--ignore-certificate-errors'] }); try { if (!CONFIG.skipAdmin) { await capturePanel({ panelName: 'Admin', basePath: CONFIG.adminPath, credentials: CONFIG.admin, pages: ADMIN_PAGES, outputPrefix: 'admin' }); } if (!CONFIG.skipUser) { await capturePanel({ panelName: 'User', basePath: CONFIG.userPath, credentials: CONFIG.user, pages: USER_PAGES, outputPrefix: 'user' }); } console.log('Screenshot capture completed!'); console.log(`Output directory: ${CONFIG.outputDir}`); } catch (err) { console.error('Error:', err.message); process.exit(1); } finally { await browser.close(); } } takeScreenshots();