parcel-optimizer-ogimage
Version:
Set absolute URL for og:image meta tags.
71 lines (62 loc) • 1.59 kB
JavaScript
// 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),
),
};
}
},
});