Files
ipal-kit/dist/modules/seo/buildLocalBusinessJsonLd.js

73 lines
2.5 KiB
JavaScript

/**
* Builds LocalBusiness JSON-LD (schema.org) — the key structured data for LOCAL
* SEO. Helps Google show the business in local results / map pack with address,
* hours, phone. Strong signal for "usługa + miasto" queries.
*
* All data from the panel (company global) — nothing hardcoded. Emit once in the
* root layout (business is site-wide):
*
* import { buildLocalBusinessJsonLd } from '@intecion/ipal-kit'
* const jsonLd = buildLocalBusinessJsonLd({
* name: company.name, url: baseUrl, telephone: company.phone,
* address: company.address, openingHours: company.hours,
* })
*
* For a more specific type (e.g. 'Dentist', 'Plumber'), override @type in the
* returned object — schema.org has many LocalBusiness subtypes.
*/ export function buildLocalBusinessJsonLd({ name, address, geo, image, logo, openingHours, priceRange, sameAs, telephone, url }) {
const logoUrl = logo?.url;
const imageUrl = image?.url ?? logoUrl;
return {
name,
'@context': 'https://schema.org',
'@type': 'LocalBusiness',
url,
...telephone ? {
telephone
} : {},
...imageUrl ? {
image: imageUrl.startsWith('http') ? imageUrl : `${url}${imageUrl}`
} : {},
...logoUrl ? {
logo: logoUrl.startsWith('http') ? logoUrl : `${url}${logoUrl}`
} : {},
...address ? {
address: {
'@type': 'PostalAddress',
...address.street ? {
streetAddress: address.street
} : {},
...address.city ? {
addressLocality: address.city
} : {},
...address.postalCode ? {
postalCode: address.postalCode
} : {},
...address.region ? {
addressRegion: address.region
} : {},
...address.country ? {
addressCountry: address.country
} : {}
}
} : {},
...geo ? {
geo: {
'@type': 'GeoCoordinates',
latitude: geo.latitude,
longitude: geo.longitude
}
} : {},
...openingHours && openingHours.length > 0 ? {
openingHours
} : {},
...priceRange ? {
priceRange
} : {},
...sameAs && sameAs.length > 0 ? {
sameAs
} : {}
};
}
//# sourceMappingURL=buildLocalBusinessJsonLd.js.map