import { AssetType } from '@vendure/common/lib/generated-types'; import { AssetPreviewStrategy, getAssetType } from '@vendure/core'; import path from 'path'; import sharp from 'sharp'; export class SharpAssetPreviewStrategy implements AssetPreviewStrategy { constructor( private config: { maxHeight: number; maxWidth: number; }, ) {} async generatePreviewImage(mimeType: string, data: Buffer): Promise { const assetType = getAssetType(mimeType); const { maxWidth, maxHeight } = this.config; if (assetType === AssetType.IMAGE) { const image = sharp(data); const metadata = await image.metadata(); const width = metadata.width || 0; const height = metadata.height || 0; if (maxWidth < width || maxHeight < height) { return image.resize(maxWidth, maxHeight, { fit: 'inside' }).toBuffer(); } else { return data; } } else { return sharp(path.join(__dirname, 'file-icon.png')) .resize(800, 800, { fit: 'outside' }) .overlayWith(this.generateMimeTypeOverlay(mimeType), { gravity: sharp.gravity.center, }) .toBuffer(); } } private generateMimeTypeOverlay(mimeType: string): Buffer { return Buffer.from(` ${mimeType} `); } }