snipify
Version:
A production-ready tool for capturing and processing web screenshots with Puppeteer and Sharp.
128 lines (108 loc) ⢠4.09 kB
JavaScript
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();