134 lines
2.8 KiB
TypeScript
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,
|
|
},
|
|
};
|
|
}
|