UNPKG

parcel-optimizer-ogimage

Version:
71 lines (62 loc) 1.59 kB
// Package modules. import { Optimizer } from '@parcel/plugin'; import url from 'url'; /* * Extract a meta from a given html string */ const findMeta = (html, propertyName, propertyValue) => { const regex = new RegExp(`<meta[^>]*${propertyName}=["|']${propertyValue}["|'][^>]*>`, 'i'); const regexExec = regex.exec(html); if (regexExec) { return regexExec[0]; } return false; }; /* * Extract the content of a given meta html */ const getMetaTagContent = (metaTagHtml) => { const regex = /content=["]([^"]*)["]/i; const regexExec = regex.exec(metaTagHtml); if (regexExec) { return regexExec[1]; } return false; }; /* * Change the url of a meta by prepending the given baseUrl */ const patchMetaToAbsolute = (metaHTML, baseUrl) => { const metaContent = getMetaTagContent(metaHTML); return metaHTML.replace( metaContent, url.resolve(baseUrl, metaContent), // Relative url to absolute url ); }; // Exports. export default new Optimizer({ async optimize({ contents, map, options, }) { const ogUrlTag = findMeta(contents, 'property', 'og:url'); if (options.hot) { return { contents, map }; } if (!ogUrlTag) { return { contents, map }; } const ogUrl = getMetaTagContent(ogUrlTag); // Fetch original meta const opengraphImageMeta = findMeta(contents, 'property', 'og:image'); if (opengraphImageMeta) { return { contents: contents.replace( opengraphImageMeta, patchMetaToAbsolute(opengraphImageMeta, ogUrl), ), }; } }, });