import type { OptimizeForWebOptions, Sharp } from "../types.js"; export async function optimizeForWeb(image: Sharp, options: OptimizeForWebOptions): Promise { const { format, quality, maxWidth, maxHeight, progressive = true, stripMetadata = true, } = options; let pipeline = image; // Step 1: Resize if max dimensions are set if (maxWidth || maxHeight) { pipeline = pipeline.resize({ width: maxWidth, height: maxHeight, fit: "inside", withoutEnlargement: true, }); } // Step 2: Preserve metadata only if requested // Sharp strips metadata by default on output, so we only need to act // when the user wants to KEEP metadata. if (!stripMetadata) { pipeline = pipeline.withMetadata(); } // Step 3: Convert to target format with optimized settings switch (format) { case "webp": return pipeline.webp({ quality, effort: 4 }); case "jpeg": return pipeline.jpeg({ quality, progressive, mozjpeg: true }); case "avif": return pipeline.avif({ quality, effort: 4 }); case "png": return pipeline.png({ compressionLevel: 9, palette: true }); case "jxl": return pipeline.jxl({ quality, effort: 7 }); default: throw new Error(`Unsupported format: ${format}`); } }