--- import { getCollection, render } from 'astro:content'; import BaseLayout from '../../layouts/BaseLayout.astro'; import EditAction from '../../components/EditAction.astro'; import DiscussCta from '../../components/DiscussCta.astro'; import { sourceSlug } from '../../lib/sources'; import { resolveExternalLink, AFFILIATE_REL, AFFILIATE_DISCLOSURE, } from '../../lib/affiliate'; import { buildOgImage, buildBreadcrumbs, reviewedItemType, PERSON_AUTHOR, absoluteUrl, } from '../../lib/seo'; export async function getStaticPaths() { const reviews = await getCollection('reviews'); return reviews.map((review) => ({ params: { slug: review.id }, props: { review }, })); } const { review } = Astro.props; const { Content } = await render(review); const fmt = new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'long', day: 'numeric', timeZone: 'UTC', }); const linkLabel = review.data.link && (review.data.linkText ?? new URL(review.data.link).hostname.replace(/^www\./, '')); const external = review.data.link ? resolveExternalLink(review.data.link) : undefined; const amazon = review.data.amazonLink ? resolveExternalLink(review.data.amazonLink) : undefined; const fromFindItem = review.data.fromFind ? (await getCollection('find')).find((f) => f.id === review.data.fromFind) : undefined; const description = review.data.description ?? review.data.subtitle ?? `A review of ${review.data.name}.`; const ogImage = buildOgImage(review.id, 'reviews', `${review.data.name} hero image`); const itemReviewed: Record = { '@type': reviewedItemType(review.data.category), name: review.data.name, }; if (review.data.link) itemReviewed.url = review.data.link; if (ogImage) itemReviewed.image = ogImage.url; const reviewSchema: Record = { '@context': 'https://schema.org', '@type': 'Review', '@id': absoluteUrl(`/reviews/${review.id}/#review`), url: absoluteUrl(`/reviews/${review.id}/`), name: review.data.name, headline: review.data.subtitle || review.data.name, description, datePublished: review.data.date.toISOString(), author: PERSON_AUTHOR, inLanguage: 'en-US', itemReviewed, }; const breadcrumbs = buildBreadcrumbs([ { name: 'Home', url: '/' }, { name: review.data.category, url: `/categories/${review.data.category}/` }, { name: review.data.name, url: `/reviews/${review.id}/` }, ]); const categoryLabel = review.data.category.charAt(0).toUpperCase() + review.data.category.slice(1); ---
{external && (

{linkLabel} ↗ {external.isAffiliate && Affiliate}

)} {amazon && (

Also on Amazon ↗ {amazon.isAffiliate && Affiliate}

)} {(external?.isAffiliate || amazon?.isAffiliate) && (

{AFFILIATE_DISCLOSURE}

)} {import.meta.env.DEV && (
)}

← back