Files
gridline/www/src/lib/seo.ts
T

134 lines
2.8 KiB
TypeScript

export interface JsonLd {
"@context": "https://schema.org";
"@type": string;
[key: string]: unknown;
}
export function buildSoftwareApplicationJsonLd(opts: {
name: string;
url: string;
description: string;
image: string;
operatingSystem: string;
applicationCategory: string;
offersPrice: number;
offersCurrency: string;
downloadUrl: string;
}): JsonLd {
return {
"@context": "https://schema.org",
"@type": "SoftwareApplication",
name: opts.name,
url: opts.url,
description: opts.description,
image: opts.image,
operatingSystem: opts.operatingSystem,
applicationCategory: opts.applicationCategory,
offers: {
"@type": "Offer",
price: opts.offersPrice,
priceCurrency: opts.offersCurrency,
},
downloadUrl: opts.downloadUrl,
};
}
export function buildFaqJsonLd(
questions: { question: string; answer: string }[],
): JsonLd {
return {
"@context": "https://schema.org",
"@type": "FAQPage",
mainEntity: questions.map((q) => ({
"@type": "Question",
name: q.question,
acceptedAnswer: {
"@type": "Answer",
text: q.answer,
},
})),
};
}
export function buildOrganizationJsonLd(opts: {
name: string;
url: string;
logo: string;
sameAs: string[];
}): JsonLd {
return {
"@context": "https://schema.org",
"@type": "Organization",
name: opts.name,
url: opts.url,
logo: opts.logo,
sameAs: opts.sameAs,
};
}
export function buildWebSiteJsonLd(opts: {
name: string;
url: string;
searchUrl?: string;
}): JsonLd {
const ld: JsonLd = {
"@context": "https://schema.org",
"@type": "WebSite",
name: opts.name,
url: opts.url,
};
if (opts.searchUrl) {
ld.potentialAction = {
"@type": "SearchAction",
target: {
"@type": "EntryPoint",
urlTemplate: opts.searchUrl,
},
"query-input": "required name=search_term_string",
};
}
return ld;
}
export function buildBreadcrumbJsonLd(
items: { name: string; url: string }[],
): JsonLd {
return {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
itemListElement: items.map((item, i) => ({
"@type": "ListItem",
position: i + 1,
name: item.name,
item: item.url,
})),
};
}
export function buildTitle(primary: string, brand = "Gridline"): string {
return `${primary} | ${brand}`;
}
export function buildProductJsonLd(opts: {
name: string;
url: string;
description: string;
image: string;
offersPrice: number;
offersCurrency: string;
}): JsonLd {
return {
"@context": "https://schema.org",
"@type": "Product",
name: opts.name,
url: opts.url,
description: opts.description,
image: opts.image,
offers: {
"@type": "Offer",
price: opts.offersPrice,
priceCurrency: opts.offersCurrency,
},
};
}