UNPKG

@codefast/image-loader

Version:

Flexible image loader for Next.js supporting multiple CDN providers

40 lines (39 loc) 1.48 kB
import { BaseImageLoader } from "../base-loader.js"; class CloudinaryLoader extends BaseImageLoader { static DOMAIN_PATTERN = /\.cloudinary\.com$/; static NAME = "cloudinary"; getName() { return CloudinaryLoader.NAME; } canHandle(source) { const domain = this.extractDomain(source); return CloudinaryLoader.DOMAIN_PATTERN.test(domain); } transformUrl(config) { const { quality, src, width } = config; try { const url = new URL(src); const pathParts = url.pathname.split("/"); const uploadIndex = pathParts.indexOf("upload"); if (-1 === uploadIndex) { console.warn(`Invalid Cloudinary URL structure: ${src}`); return src; } const transformations = []; transformations.push(`w_${width.toString()}`); if (void 0 !== quality) transformations.push(`q_${quality.toString()}`); transformations.push("f_auto", "c_fill"); const newPathParts = [ ...pathParts.slice(0, uploadIndex + 1), transformations.join(","), ...pathParts.slice(uploadIndex + 1) ]; url.pathname = newPathParts.join("/"); return url.toString(); } catch (error) { console.warn(`Failed to transform Cloudinary URL: ${src}`, error); return src; } } } export { CloudinaryLoader };