rehype-image-optim
Version:
rehype plugin to change the `src` (and `srcset`/`sizes`) of images to optimized versions from your image CDN/optimization provider
68 lines • 2.65 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */
import { visit } from "unist-util-visit";
import transformers from "./link-transformer/index.js";
function transformer(originalLink, provider, options) {
if (typeof provider === "function") {
return provider(originalLink, options);
}
return transformers[provider](originalLink, options);
}
export default function rehypeImageOptimization(options) {
const { provider, originValidation, optimizeSrcOptions: optimizeOptions, srcsetOptionsList, sizesOptionsList, style, } = options;
const validateOrigin = (origin) => {
if (originValidation === undefined) {
return true;
}
if (typeof originValidation === "string") {
return originValidation === origin;
}
if (originValidation instanceof RegExp) {
return originValidation.test(origin);
}
if (typeof originValidation === "function") {
return originValidation(origin);
}
throw new Error("Invalid originValidation option");
};
return function (tree) {
visit(tree, "element", (node) => {
if (node.tagName !== "img" || !node.properties.src) {
return;
}
const originalLink = node.properties.src.toString();
let origin;
try {
const url = new URL(originalLink);
origin = url.origin;
}
catch {
console.error("Invalid URL:", originalLink);
return;
}
if (!validateOrigin(origin)) {
return;
}
if (optimizeOptions !== undefined)
node.properties.src = transformer(originalLink, provider, optimizeOptions);
if (srcsetOptionsList !== undefined)
node.properties.srcset = srcsetOptionsList
.map(([optimOptions, descriptor]) => `${transformer(originalLink, provider, optimOptions)} ${descriptor}`)
.join(", ");
if (sizesOptionsList !== undefined)
node.properties.sizes =
typeof sizesOptionsList === "string"
? sizesOptionsList
: sizesOptionsList.join(", ");
if (style) {
if (node.properties.style === undefined)
node.properties.style = style;
else
node.properties.style += " " + style;
}
});
};
}
export function defineOptions(options) {
return options;
}
//# sourceMappingURL=index.js.map