"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ImageOptimizer = void 0; const sharp_1 = __importDefault(require("sharp")); class ImageOptimizer { /** * Optimizes an image: converts to WebP, strips metadata, * and applies a 1:1 Smart Crop if needed. */ static async optimize(buffer, category = 'media', options = {}) { try { let pipeline = (0, sharp_1.default)(buffer); const metadata = await pipeline.metadata(); if (!metadata.format) return { buffer, mimetype: 'application/octet-stream' }; // 1. Identify Target Size // Default sizes based on category let targetSize = options.size || 1024; if (category === 'partners' || category === 'users') targetSize = 400; if (category === 'benefits') targetSize = 800; // 2. Smart Crop 1:1 if aspect=1:1 is requested or implied by category const shouldCrop = options.aspect === '1:1' || ['partners', 'users'].includes(category); if (shouldCrop) { pipeline = pipeline.resize({ width: targetSize, height: targetSize, fit: sharp_1.default.fit.cover, position: sharp_1.default.strategy.entropy // Smart focal point detection }); } else { // Resize without cropping if it's too large pipeline = pipeline.resize({ width: targetSize, withoutEnlargement: true, fit: sharp_1.default.fit.inside }); } // 3. Convert to WebP & Strip Metadata const optimizedBuffer = await pipeline .webp({ quality: 85, effort: 4 }) .toBuffer(); return { buffer: optimizedBuffer, mimetype: 'image/webp' }; } catch (err) { console.error('[SmartVision] Optimization failed:', err); return { buffer, mimetype: 'image/jpeg' }; // Fallback } } } exports.ImageOptimizer = ImageOptimizer; //# sourceMappingURL=Optimizer.js.map