import merge from 'lodash.merge'; import type { Metadata } from 'next'; type MetadataGenerator = Omit & { 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; };