All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 49s
Build & Deploy / 🧪 QA (push) Successful in 2m27s
CI - Lint, Typecheck & Test / quality-assurance (pull_request) Successful in 3m28s
Build & Deploy / 🏗️ Build (push) Successful in 3m13s
Build & Deploy / 🚀 Deploy (push) Successful in 47s
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 1s
- Add robust JSON-LD schema generators (LocalBusiness, FAQ, Service, Event) - Refactor JsonLd component to use @graph pattern for merging global/local schemas - Create FaqBlock component with automatic FAQPage schema injection - Inject specific JSON-LD schemas into mdx pages (home, kompetenzen, messen) - Add structured AI SEO content (hard facts, stats, clear definitions)
119 lines
3.5 KiB
TypeScript
119 lines
3.5 KiB
TypeScript
import { config } from './config';
|
|
|
|
const getSiteUrl = () => {
|
|
if (process.env.CI) return 'http://etib.localhost';
|
|
return (config.baseUrl as string) || 'https://e-tib.com';
|
|
};
|
|
|
|
export const SITE_URL = getSiteUrl();
|
|
export const LOGO_URL = `${SITE_URL}/assets/logo.png`;
|
|
|
|
export const getOrganizationSchema = () => ({
|
|
'@context': 'https://schema.org' as const,
|
|
'@type': 'Organization' as const,
|
|
name: 'E-TIB GmbH',
|
|
url: SITE_URL,
|
|
logo: LOGO_URL,
|
|
sameAs: ['https://www.instagram.com/me.and.eloise/'],
|
|
contactPoint: {
|
|
'@type': 'ContactPoint' as const,
|
|
telephone: '+49-15207230518',
|
|
contactType: 'customer service' as const,
|
|
email: 'd.joseph@e-tib.com',
|
|
availableLanguage: ['German', 'English'],
|
|
},
|
|
});
|
|
|
|
export const getBreadcrumbSchema = (items: { name: string; item: string }[]) => ({
|
|
'@context': 'https://schema.org' as const,
|
|
'@type': 'BreadcrumbList' as const,
|
|
itemListElement: items.map((item, index) => ({
|
|
'@type': 'ListItem' as const,
|
|
position: index + 1,
|
|
name: item.name,
|
|
item: item.item.startsWith('http') ? item.item : `${SITE_URL}${item.item}`,
|
|
})),
|
|
});
|
|
|
|
export const getLocalBusinessSchema = () => ({
|
|
'@context': 'https://schema.org' as const,
|
|
'@type': 'LocalBusiness' as const,
|
|
name: 'E-TIB GmbH',
|
|
url: SITE_URL,
|
|
logo: LOGO_URL,
|
|
image: LOGO_URL,
|
|
description: 'Ihr Partner für Kabelleitungstiefbau, Horizontalspülbohrungen, Planung und Vermessung in Guben und überregional.',
|
|
telephone: '+49-15207230518',
|
|
email: 'd.joseph@e-tib.com',
|
|
address: {
|
|
'@type': 'PostalAddress' as const,
|
|
streetAddress: 'Gewerbestraße 22',
|
|
addressLocality: 'Guben',
|
|
postalCode: '03172',
|
|
addressCountry: 'DE',
|
|
},
|
|
geo: {
|
|
'@type': 'GeoCoordinates' as const,
|
|
latitude: 51.9547, // Approx coordinates for Guben area
|
|
longitude: 14.7175,
|
|
},
|
|
openingHoursSpecification: [
|
|
{
|
|
'@type': 'OpeningHoursSpecification' as const,
|
|
dayOfWeek: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
|
|
opens: '08:00',
|
|
closes: '17:00',
|
|
},
|
|
],
|
|
sameAs: ['https://www.instagram.com/me.and.eloise/'],
|
|
});
|
|
|
|
export const getFAQSchema = (questions: { question: string; answer: string }[]) => ({
|
|
'@context': 'https://schema.org' as const,
|
|
'@type': 'FAQPage' as const,
|
|
mainEntity: questions.map((q) => ({
|
|
'@type': 'Question' as const,
|
|
name: q.question,
|
|
acceptedAnswer: {
|
|
'@type': 'Answer' as const,
|
|
text: q.answer,
|
|
},
|
|
})),
|
|
});
|
|
|
|
export const getServiceSchema = (serviceName: string, description: string, image?: string) => ({
|
|
'@context': 'https://schema.org' as const,
|
|
'@type': 'Service' as const,
|
|
name: serviceName,
|
|
description: description,
|
|
provider: {
|
|
'@type': 'Organization' as const,
|
|
name: 'E-TIB GmbH',
|
|
},
|
|
...(image && { image }),
|
|
});
|
|
|
|
export const getEventSchema = (event: { name: string; startDate: string; endDate?: string; locationName: string; locationAddress?: string; url?: string }) => ({
|
|
'@context': 'https://schema.org' as const,
|
|
'@type': 'Event' as const,
|
|
name: event.name,
|
|
startDate: event.startDate,
|
|
...(event.endDate && { endDate: event.endDate }),
|
|
location: {
|
|
'@type': 'Place' as const,
|
|
name: event.locationName,
|
|
...(event.locationAddress && {
|
|
address: {
|
|
'@type': 'PostalAddress' as const,
|
|
streetAddress: event.locationAddress,
|
|
},
|
|
}),
|
|
},
|
|
organizer: {
|
|
'@type': 'Organization' as const,
|
|
name: 'E-TIB GmbH',
|
|
url: SITE_URL,
|
|
},
|
|
...(event.url && { url: event.url }),
|
|
});
|