Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 16x 16x 3x | // Builds the schema.org Person JSON-LD object for individual designer pros.
// Extracted into a plain function so it can be unit-tested without Astro.
export interface PersonSchemaProps {
name: string;
url: string;
image?: string;
jobTitle?: string;
worksFor?: { "@type": "Organization"; name: string; url?: string };
address?: {
addressLocality?: string;
addressRegion?: string;
addressCountry?: string;
};
areaServed?: string[];
sameAs?: string[];
description?: string;
}
export function buildPersonSchema(props: PersonSchemaProps): Record<string, unknown> {
const {
name,
url,
image,
jobTitle = "Interior Designer",
worksFor,
address,
areaServed = [],
sameAs = [],
description,
} = props;
return {
"@context": "https://schema.org",
"@type": "Person",
name,
url,
jobTitle,
...(description && { description }),
...(image && {
image: {
"@type": "ImageObject",
url: image,
},
}),
...(worksFor && { worksFor }),
...(address && {
address: {
"@type": "PostalAddress",
...(address.addressLocality && { addressLocality: address.addressLocality }),
...(address.addressRegion && { addressRegion: address.addressRegion }),
addressCountry: address.addressCountry ?? "IN",
},
}),
...(areaServed.length > 0 && {
areaServed: areaServed.map((area) => ({
"@type": "City",
name: area,
addressCountry: "IN",
})),
}),
...(sameAs.length > 0 && { sameAs }),
};
}
|