Files
stats/apps/public/src/lib/metadata.ts
Carl-Gerhard Lindesvärd ac4429d6d9 feat: new public website
2025-12-02 09:22:36 +01:00

85 lines
1.8 KiB
TypeScript

import type { Metadata } from 'next';
import { url as baseUrl } from './layout.shared';
const siteName = 'OpenPanel';
const defaultDescription =
'OpenPanel is a simple, affordable open-source alternative to Mixpanel for web and product analytics. Get powerful insights without the complexity.';
const defaultImage = baseUrl('/ogimage.png');
export function getOgImageUrl(url: string): string {
return `/og/${url.replace(baseUrl('/'), '/')}`;
}
export function getRootMetadata(): Metadata {
return getRawMetadata({
url: baseUrl('/'),
title: `${siteName} | An open-source alternative to Mixpanel`,
description: defaultDescription,
image: defaultImage,
});
}
export function getPageMetadata({
url,
title,
description,
image,
}: {
url: string;
title: string;
description: string;
image?: string;
}): Metadata {
return getRawMetadata({
url,
title: `${title} | ${siteName}`,
description,
image: image ?? getOgImageUrl(url),
});
}
export function getRawMetadata(
{
url,
title,
description,
image,
}: { url: string; title: string; description: string; image: string },
meta: Metadata = {},
): Metadata {
return {
title,
description,
alternates: {
canonical: baseUrl(url),
},
icons: {
apple: '/apple-touch-icon.png',
icon: '/favicon.ico',
},
manifest: '/site.webmanifest',
openGraph: {
title,
description,
siteName: siteName,
url: baseUrl(url),
type: 'website',
images: [
{
url: image,
width: 1200,
height: 630,
alt: title,
},
],
},
twitter: {
card: 'summary_large_image',
title,
description,
images: [image],
},
...meta,
};
}