All files / src/lib/seo person-schema.ts

100% Statements 3/3
100% Branches 21/21
100% Functions 2/2
100% Lines 3/3

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 }),
	};
}