UNPKG

snipify

Version:

A production-ready tool for capturing and processing web screenshots with Puppeteer and Sharp.

128 lines (108 loc) • 4.09 kB
#!/usr/bin/env node import { join } from "path"; import { captureProductionScreenshots, captureScreenshot, generateFilename, PRODUCTION_SIZES } from "../dist/index.js"; async function main() { try { const args = process.argv.slice(2); if (args.includes("--help") || args.includes("-h")) { console.log(` Usage: snipify [URL] [OPTIONS] Arguments: URL Website URL (default: http://example.com/) Options: --device=DEVICE Device preset: desktop, laptop, tablet, mobile, mobile-large (default: mobile) --size=SIZE Production size preset: thumbnail, card, social-media, etc. --production Generate all common production sizes --output=DIR Output directory (default: ./screenshots) --help, -h Show this help Examples: snipify # Basic mobile screenshot snipify https://example.com --device=desktop # Desktop screenshot snipify https://example.com --device=mobile --size=thumbnail # Mobile thumbnail snipify https://example.com --device=desktop --production # All production sizes Production sizes available: ${Object.keys(PRODUCTION_SIZES).join(", ")} `); return; } // Parse URL (first non-flag argument) const url = args.find((arg) => !arg.startsWith("-")) || "http://example.com/"; // Parse options const deviceOption = args.find((arg) => arg.startsWith("--device=")); const device = deviceOption ? deviceOption.split("=")[1] : "mobile"; const sizeOption = args.find((arg) => arg.startsWith("--size=")); const isProduction = args.includes("--production"); const outputOption = args.find((arg) => arg.startsWith("--output=")); const outputDir = outputOption ? outputOption.split("=")[1] : join(process.cwd(), "screenshots"); const sizePreset = sizeOption ? sizeOption.split("=")[1] : null; console.log(`Capturing screenshot of: ${url}`); console.log(`Device preset: ${device}`); if (isProduction) { console.log(`Mode: Production (multiple sizes)`); const results = await captureProductionScreenshots({ url, device, sizes: ["thumbnail", "card", "social-media", "blog-header"], options: { outputDir, format: "png", quality: 90 }, }); console.log(`\nšŸŽ‰ Production screenshots captured successfully!`); console.log(`Total files: ${results.length}`); console.log(`Saved to: ${outputDir}`); } else if (sizePreset && PRODUCTION_SIZES[sizePreset]) { console.log(`Mode: Production size (${sizePreset})`); const size = PRODUCTION_SIZES[sizePreset]; const filename = await generateFilename( url, device, "png", sizePreset, ); const outputPath = join(outputDir, filename); const screenshot = await captureScreenshot({ url, device, options: { outputPath, format: "png", quality: 90, fullPage: true, delay: 1000, fixedSize: size, }, }); console.log(`Screenshot captured successfully!`); console.log(`Size: ${size.width}x${size.height} (${sizePreset})`); console.log(`File size: ${(screenshot.length / 1024).toFixed(2)} KB`); console.log(`Saved to: ${outputPath}`); } else { console.log(`Mode: Full page screenshot`); const filename = await generateFilename(url, device); const outputPath = join(outputDir, filename); const screenshot = await captureScreenshot({ url, device, options: { outputPath, format: "png", quality: 90, fullPage: true, delay: 1000, }, }); console.log(`Screenshot captured successfully!`); console.log(`File size: ${(screenshot.length / 1024).toFixed(2)} KB`); console.log(`Saved to: ${outputPath}`); } } catch (error) { console.error(`Error: ${error.message}`); process.exit(1); } } main();