konobangu/packages/seo/metadata.ts

68 lines
1.4 KiB
TypeScript

import merge from 'lodash.merge';
import type { Metadata } from 'next';
type MetadataGenerator = Omit<Metadata, 'description' | 'title'> & {
title: string;
description: string;
image?: string;
};
const applicationName = 'next-forge';
const author: Metadata['authors'] = {
name: 'Hayden Bleasel',
url: 'https://haydenbleasel.com/',
};
const publisher = 'Hayden Bleasel';
const twitterHandle = '@haydenbleasel';
export const createMetadata = ({
title,
description,
image,
...properties
}: MetadataGenerator): Metadata => {
const parsedTitle = `${title} | ${applicationName}`;
const defaultMetadata: Metadata = {
title: parsedTitle,
description,
applicationName,
authors: [author],
creator: author.name,
formatDetection: {
telephone: false,
},
appleWebApp: {
capable: true,
statusBarStyle: 'default',
title: parsedTitle,
},
openGraph: {
title: parsedTitle,
description,
type: 'website',
siteName: applicationName,
locale: 'en_US',
},
publisher,
twitter: {
card: 'summary_large_image',
creator: twitterHandle,
},
};
const metadata: Metadata = merge(defaultMetadata, properties);
if (image && metadata.openGraph) {
metadata.openGraph.images = [
{
url: image,
width: 1200,
height: 630,
alt: title,
},
];
}
return metadata;
};