Hardening responsiveness and SEO
This commit is contained in:
46
hdyc-svelte/src/lib/seo.ts
Normal file
46
hdyc-svelte/src/lib/seo.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
export const SITE_URL = 'https://howdoyouconvert.com';
|
||||
export const SITE_NAME = 'HowDoYouConvert.com';
|
||||
export const DEFAULT_ROBOTS = 'index,follow';
|
||||
export const DEFAULT_TWITTER_CARD = 'summary';
|
||||
|
||||
type OpenGraphType = 'website' | 'article';
|
||||
|
||||
type SeoInput = {
|
||||
title: string;
|
||||
description: string;
|
||||
pathname: string;
|
||||
type?: OpenGraphType;
|
||||
};
|
||||
|
||||
const normalizePathname = (pathname: string): string => {
|
||||
const pathWithSlash = pathname.startsWith('/') ? pathname : `/${pathname}`;
|
||||
const normalized = pathWithSlash.replace(/\/{2,}/g, '/');
|
||||
if (normalized.length > 1 && normalized.endsWith('/')) {
|
||||
return normalized.slice(0, -1);
|
||||
}
|
||||
return normalized;
|
||||
};
|
||||
|
||||
export const canonicalUrl = (pathname: string): string => `${SITE_URL}${normalizePathname(pathname)}`;
|
||||
|
||||
export const buildSeoMeta = ({ title, description, pathname, type = 'website' }: SeoInput) => {
|
||||
const canonical = canonicalUrl(pathname);
|
||||
return {
|
||||
canonical,
|
||||
robots: DEFAULT_ROBOTS,
|
||||
og: {
|
||||
type,
|
||||
title,
|
||||
description,
|
||||
url: canonical,
|
||||
siteName: SITE_NAME,
|
||||
},
|
||||
twitter: {
|
||||
card: DEFAULT_TWITTER_CARD,
|
||||
title,
|
||||
description,
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export const toJsonLd = (value: unknown): string => JSON.stringify(value).replace(/</g, '\\u003c');
|
||||
Reference in New Issue
Block a user