@codefast/image-loader
Version:
Flexible image loader for Next.js supporting multiple CDN providers
40 lines (39 loc) • 1.48 kB
JavaScript
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 };