Files
JiboViteDocs/node_modules/@lando/vitepress-theme-default-plus/node/add-metadata.js

66 lines
2.6 KiB
JavaScript
Raw Normal View History

2026-05-03 12:12:57 -04:00
import {resolve} from 'node:path';
import Debug from 'debug';
export default async function(pageData, {
debug = Debug('@lando/add-metadata'), // eslint-disable-line
siteConfig,
} = {}) {
debug = debug.extend(`${pageData.relativePath}`);
// get stuff
const {frontmatter, lastUpdated, relativePath} = pageData;
const {site} = siteConfig;
// make sure header info is at least an empty array
if (!Array.isArray(frontmatter.head)) frontmatter.head = [];
// retrieve metadata
const autometa = siteConfig?.site?.themeConfig?.autometa ?? false;
if (autometa !== false) {
const {canonicalUrl, image, twitter, x} = autometa;
const title = frontmatter.title ?? pageData.title ?? site.title;
const description = frontmatter.description ?? frontmatter.summary ?? site.description;
const i = frontmatter.image ?? image ?? site?.logo?.src;
const xandle = x ?? twitter;
const published = new Date(Number.isNaN(lastUpdated) || !lastUpdated ? Date.now() : lastUpdated);
// generics
frontmatter.head.push(
['meta', {name: 'twitter:card', content: 'summary'}],
['meta', {name: 'twitter:title', content: title}],
['meta', {name: 'twitter:description', content: description}],
['meta', {name: 'twitter:image', content: i}],
['meta', {name: 'twitter:image:alt', content: title}],
['meta', {property: 'og:type', content: 'article'}],
['meta', {property: 'og:title', content: title}],
['meta', {property: 'og:description', content: description}],
['meta', {property: 'og:site_name', content: site.title}],
['meta', {name: 'og:image', content: i}],
['meta', {name: 'og:image:alt', content: title}],
['meta', {property: 'article:published_time', content: published}],
['meta', {itemprop: 'name', content: title}],
['meta', {itemprop: 'description', content: description}],
);
debug('set metadata %o', {title, description, i, published});
// twitter/x
if (xandle) {
frontmatter.head.push(['meta', {name: 'twitter:site', content: xandle}]);
debug('set xandle to %o', xandle);
}
// canonical stuff
if (canonicalUrl) {
const pathname = relativePath.replace(/(^|\/)index\.md$/, '$1').replace(/\.md$/, site.cleanUrls ? '' : '.html');
const url = new URL(resolve(site.base, pathname), canonicalUrl);
const {href} = url;
frontmatter.head.unshift(
['meta', {name: 'twitter:url', content: href}],
['meta', {property: 'og:url', content: href}],
['link', {rel: 'canonical', href: href}],
);
debug('set canonical url to %o', href);
}
}
};