UNPKG

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
/* 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