sanity-plugin-seofields 1.3.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -40
- package/dist/index.cjs +1924 -1618
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +68 -17
- package/dist/index.d.ts +68 -17
- package/dist/index.js +1879 -1563
- package/dist/index.js.map +1 -1
- package/dist/next.cjs +1506 -0
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +4 -1
- package/dist/next.d.ts +4 -1
- package/dist/next.js +1457 -0
- package/dist/next.js.map +1 -1
- package/dist/schema/next.cjs +1548 -0
- package/dist/schema/next.cjs.map +1 -0
- package/dist/schema/next.d.cts +438 -0
- package/dist/schema/next.d.ts +438 -0
- package/dist/schema/next.js +1476 -0
- package/dist/schema/next.js.map +1 -0
- package/dist/schema.cjs +1743 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.cts +387 -0
- package/dist/schema.d.ts +387 -0
- package/dist/schema.js +1691 -0
- package/dist/schema.js.map +1 -0
- package/dist/types-CVaAX7uy.d.cts +589 -0
- package/dist/types-Ci-ZZT7A.d.ts +589 -0
- package/dist/{types-B91ena4g.d.cts → types-R3n9Fu4w.d.cts} +16 -1
- package/dist/{types-B91ena4g.d.ts → types-R3n9Fu4w.d.ts} +16 -1
- package/package.json +18 -3
package/dist/next.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/next.ts","../src/helpers/seoMeta.ts","../src/helpers/SeoMetaTags.tsx"],"sourcesContent":["/**\n * Next.js App Router helpers — safe to import in Server Components.\n *\n * @example\n * import { buildSeoMeta, SeoMetaTags } from 'sanity-plugin-seofields/next'\n */\nexport type {\n BuildSeoMetaOptions,\n SeoFieldsInput,\n SeoMetadata,\n SeoMetaDefaults,\n} from './helpers/seoMeta'\nexport {buildSeoMeta, sanitizeOGType, sanitizeTwitterCard} from './helpers/seoMeta'\nexport type {SeoMetaTagsProps} from './helpers/SeoMetaTags'\nexport {SeoMetaTags} from './helpers/SeoMetaTags'\n","/**\n * Headless CMS integration helpers for sanity-plugin-seofields\n *\n * Provides framework-agnostic SEO metadata utilities for use with:\n * - Next.js App Router → buildSeoMeta() inside generateMetadata()\n * - Next.js Pages Router → <SeoMetaTags> inside Next.js <Head>\n * - Nuxt / Remix / any SSR → <SeoMetaTags> inside your <head> slot\n */\n\nimport type {SanityImage, SanityImageWithAlt, SeoFields} from '../types'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/** Structured metadata returned by buildSeoMeta(). Compatible with Next.js Metadata (App Router). */\nexport interface SeoMetadata {\n title?: string | null\n description?: string | null\n keywords?: string[]\n robots?: {\n index?: boolean\n follow?: boolean\n googleBot?: {\n index?: boolean\n follow?: boolean\n }\n }\n openGraph?: {\n type?: string\n url?: string\n title?: string\n description?: string\n siteName?: string\n images?: Array<{url: string; width?: number; height?: number; alt?: string}>\n }\n twitter?: {\n card?: string\n site?: string\n creator?: string\n title?: string\n description?: string\n images?: string[]\n }\n alternates?: {\n canonical?: string\n }\n /** Any custom meta attributes from seo.metaAttributes */\n other?: Record<string, string>\n}\n\n/** Default values used when SEO fields are missing. */\nexport interface SeoMetaDefaults {\n title?: string\n description?: string\n siteName?: string\n twitterSite?: string\n twitterCreator?: string\n /** Fallback image URL when no OG / Twitter image is set. */\n ogImage?: string\n}\n\n/**\n * Permissive image shape accepted by buildSeoMeta — compatible with both the\n * plugin's SanityImage and Sanity's code-generated image type (where `asset`\n * and `alt` are optional).\n */\ninterface SeoImageInput {\n _type?: string\n asset?: {_ref: string; _type: string; _weak?: boolean; [key: string]: unknown}\n hotspot?: unknown\n crop?: unknown\n alt?: string\n}\n\n/**\n * Input-compatible variant of SeoFields. Structurally matches Sanity's\n * code-generated types (where `asset`, `alt`, `key`, and `type` are all\n * optional), so you can pass `data.seo` from a sanityFetch result directly\n * without any `as any` or manual casting.\n */\nexport interface SeoFieldsInput {\n _type?: string\n robots?: {noIndex?: boolean | null; noFollow?: boolean | null} | null\n title?: string | null\n description?: string | null\n metaImage?: SeoImageInput | null\n metaAttributes?: Array<{_key?: string; key?: string; value?: string; type?: string}> | null\n keywords?: string[] | null\n canonicalUrl?: string | null\n openGraph?: {\n _type?: string\n url?: string | null\n title?: string | null\n description?: string | null\n siteName?: string | null\n type?: string | null\n imageType?: string | null\n image?: SeoImageInput | null\n imageUrl?: string | null\n } | null\n twitter?: {\n _type?: string\n card?: string | null\n site?: string | null\n creator?: string | null\n title?: string | null\n description?: string | null\n imageType?: string | null\n image?: SeoImageInput | null\n imageUrl?: string | null\n } | null\n}\n\n/** Options accepted by buildSeoMeta(). */\nexport interface BuildSeoMetaOptions {\n /**\n * The raw SEO object from Sanity (_type excluded or included — both work).\n * Pass `null` or `undefined` to fall back entirely to `defaults`.\n *\n * Accepts both the strict plugin `SeoFields` type and Sanity's code-generated\n * type (which has all nested fields optional) without any `as any` cast.\n */\n seo?: SeoFieldsInput | null\n\n /**\n * The base URL of your site, e.g. \"https://example.com\".\n * Used for canonical URL and OpenGraph URL construction.\n */\n baseUrl?: string\n\n /**\n * The path for the current page, e.g. \"/about\".\n * Combined with baseUrl to produce the canonical + OG url.\n * Defaults to \"\".\n */\n path?: string\n\n /**\n * Default values used when the Sanity SEO fields are empty / missing.\n */\n defaults?: SeoMetaDefaults\n\n /**\n * Resolve a Sanity image asset to a plain URL string.\n *\n * @example (using @sanity/image-url)\n * imageUrlResolver: (img) => urlFor(img).width(1200).url()\n */\n imageUrlResolver?: (image: SanityImage | SanityImageWithAlt) => string | null | undefined\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nconst VALID_OG_TYPES = [\n 'website',\n 'article',\n 'profile',\n 'book',\n 'music',\n 'video',\n 'product',\n] as const\ntype OGType = (typeof VALID_OG_TYPES)[number]\n\n/**\n * Coerce an arbitrary string to a valid OpenGraph type.\n * Falls back to \"website\" when the value is invalid.\n */\nexport function sanitizeOGType(value?: string): OGType {\n if (value && (VALID_OG_TYPES as readonly string[]).includes(value)) {\n return value as OGType\n }\n return 'website'\n}\n\nconst VALID_TWITTER_CARDS = ['summary', 'summary_large_image', 'app', 'player'] as const\ntype TwitterCard = (typeof VALID_TWITTER_CARDS)[number]\n\n/**\n * Coerce an arbitrary string to a valid Twitter card type.\n * Falls back to \"summary_large_image\" when the value is invalid.\n */\nexport function sanitizeTwitterCard(value?: string): TwitterCard {\n if (value && (VALID_TWITTER_CARDS as readonly string[]).includes(value)) {\n return value as TwitterCard\n }\n return 'summary_large_image'\n}\n\n// ─── Core builder ─────────────────────────────────────────────────────────────\n\n/**\n * Convert a Sanity SEO object into a structured metadata object.\n *\n * The return value is structurally compatible with Next.js App Router's\n * `Metadata` type, so you can return it directly from `generateMetadata()`.\n *\n * @example Next.js App Router\n * ```ts\n * import { buildSeoMeta } from 'sanity-plugin-seofields'\n * import { urlFor } from '@/sanity/lib/image'\n *\n * export async function generateMetadata(): Promise<Metadata> {\n * const { seo } = await sanityFetch({ query: PAGE_SEO_QUERY })\n * return buildSeoMeta({\n * seo,\n * baseUrl: process.env.NEXT_PUBLIC_SITE_URL,\n * path: '/about',\n * defaults: { title: 'My Site', siteName: 'My Site' },\n * imageUrlResolver: (img) => urlFor(img).width(1200).url(),\n * })\n * }\n * ```\n */\nexport function buildSeoMeta(options: BuildSeoMetaOptions): SeoMetadata {\n const {seo, baseUrl = '', path = '', defaults = {}, imageUrlResolver} = options\n\n const normalizedBase = baseUrl.replace(/\\/+$/, '') // remove trailing /\n const normalizedPath = path.replace(/^\\/+/, '') // remove leading /\n\n const fullUrl = [normalizedBase, normalizedPath].filter(Boolean).join('/')\n\n // ── OG image resolution ──\n let ogImageURL: string = defaults.ogImage || ''\n if (seo?.openGraph?.imageType === 'url' && seo.openGraph.imageUrl) {\n ogImageURL = seo.openGraph.imageUrl\n } else if (seo?.openGraph?.image && imageUrlResolver) {\n ogImageURL = imageUrlResolver(seo.openGraph.image as SanityImage) || ogImageURL\n }\n\n // ── Twitter image resolution ──\n let twitterImageURL: string = ogImageURL // reuse OG image as fallback\n if (seo?.twitter?.imageType === 'url' && seo.twitter.imageUrl) {\n twitterImageURL = seo.twitter.imageUrl\n } else if (seo?.twitter?.image && imageUrlResolver) {\n twitterImageURL = imageUrlResolver(seo.twitter.image as SanityImage) || twitterImageURL\n }\n\n // ── Custom meta attributes → `other` map ──\n const other: Record<string, string> = {}\n if (Array.isArray(seo?.metaAttributes)) {\n for (const attr of seo!.metaAttributes!) {\n if (attr.key && attr.value) {\n other[attr.key] = attr.value\n }\n }\n }\n\n const ogUrl = seo?.openGraph?.url || fullUrl\n\n return {\n title: seo?.title ?? defaults.title ?? null,\n description: seo?.description ?? defaults.description ?? null,\n keywords: seo?.keywords?.length ? (seo.keywords as string[]) : undefined,\n robots: {\n index: !seo?.robots?.noIndex,\n follow: !seo?.robots?.noFollow,\n googleBot: {\n index: !seo?.robots?.noIndex,\n follow: !seo?.robots?.noFollow,\n },\n },\n openGraph: {\n type: sanitizeOGType(seo?.openGraph?.type ?? undefined),\n url: ogUrl || undefined,\n title: seo?.openGraph?.title ?? defaults.title,\n description: seo?.openGraph?.description ?? defaults.description,\n siteName: seo?.openGraph?.siteName ?? defaults.siteName,\n images: ogImageURL ? [{url: ogImageURL}] : [],\n },\n twitter: {\n card: sanitizeTwitterCard(seo?.twitter?.card ?? undefined),\n site: seo?.twitter?.site ?? defaults.twitterSite,\n creator: seo?.twitter?.creator ?? defaults.twitterCreator,\n title: seo?.twitter?.title ?? defaults.title,\n description: seo?.twitter?.description ?? defaults.description,\n images: twitterImageURL ? [twitterImageURL] : [],\n },\n alternates: {\n canonical: fullUrl || undefined,\n },\n ...(Object.keys(other).length > 0 ? {other} : {}),\n }\n}\n","/**\n * <SeoMetaTags> — Framework-agnostic React SEO meta tag renderer.\n *\n * Renders all SEO meta tags as plain React elements.\n * Place it inside your framework's <Head> component:\n *\n * @example Next.js Pages Router\n * ```tsx\n * import Head from 'next/head'\n * import { SeoMetaTags } from 'sanity-plugin-seofields'\n *\n * export default function Page({ seo }) {\n * return (\n * <>\n * <Head>\n * <SeoMetaTags\n * data={seo}\n * baseUrl=\"https://example.com\"\n * path=\"/about\"\n * defaults={{ title: 'My Site', siteName: 'My Site' }}\n * imageUrlResolver={(img) => urlFor(img).width(1200).url()}\n * />\n * </Head>\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n *\n * @example Nuxt 3 / generic SSR (inside <Head> slot)\n * ```tsx\n * <Head>\n * <SeoMetaTags data={seo} baseUrl=\"https://example.com\" path=\"/\" />\n * </Head>\n * ```\n */\nimport React from 'react'\n\nimport type {SanityImage, SanityImageWithAlt, SeoFields} from '../types'\nimport {buildSeoMeta, type BuildSeoMetaOptions} from './seoMeta'\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface SeoMetaTagsProps {\n /**\n * The raw SEO object from Sanity.\n * Pass `null` / `undefined` to render only the defaults.\n */\n data?: Partial<SeoFields> | null\n\n /**\n * Base URL of your site, e.g. \"https://example.com\".\n * Used for canonical link, og:url fallback.\n */\n baseUrl?: string\n\n /**\n * Current page path, e.g. \"/about\".\n * Defaults to \"\".\n */\n path?: string\n\n /**\n * Default values used when SEO fields are missing.\n */\n defaults?: BuildSeoMetaOptions['defaults']\n\n /**\n * Resolve a Sanity image asset reference to a full URL string.\n *\n * @example\n * imageUrlResolver={(img) => urlFor(img).width(1200).url()}\n */\n imageUrlResolver?: (image: SanityImage | SanityImageWithAlt) => string | null | undefined\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Renders all SEO meta tags for a page as plain React elements.\n * Intended to be placed inside your framework's <Head> / <head> component.\n *\n * Renders:\n * - `<title>`\n * - `<meta name=\"description\">`\n * - `<meta name=\"keywords\">`\n * - `<meta name=\"robots\">`\n * - OpenGraph meta tags (`og:*`)\n * - Twitter Card meta tags (`twitter:*`)\n * - Any custom `seo.metaAttributes` as `<meta name=\"...\" content=\"...\">`\n */\nexport function SeoMetaTags({data, baseUrl, path, defaults, imageUrlResolver}: SeoMetaTagsProps) {\n const meta = buildSeoMeta({seo: data, baseUrl, path, defaults, imageUrlResolver})\n\n const robotsContent = [\n meta.robots?.index === false ? 'noindex' : 'index',\n meta.robots?.follow === false ? 'nofollow' : 'follow',\n ].join(', ')\n\n return (\n <>\n {/* ── Title ── */}\n {meta.title && <title>{meta.title}</title>}\n\n {/* ── Basic meta ── */}\n {meta.description && <meta name=\"description\" content={meta.description} />}\n {meta.keywords?.length ? <meta name=\"keywords\" content={meta.keywords.join(', ')} /> : null}\n <meta name=\"robots\" content={robotsContent} />\n <meta name=\"googlebot\" content={robotsContent} />\n\n {/* ── Open Graph ── */}\n {meta.openGraph?.type && <meta property=\"og:type\" content={meta.openGraph.type} />}\n {meta.openGraph?.url && <meta property=\"og:url\" content={meta.openGraph.url} />}\n {meta.openGraph?.title && <meta property=\"og:title\" content={meta.openGraph.title} />}\n {meta.openGraph?.description && (\n <meta property=\"og:description\" content={meta.openGraph.description} />\n )}\n {meta.openGraph?.siteName && (\n <meta property=\"og:site_name\" content={meta.openGraph.siteName} />\n )}\n {meta.openGraph?.images?.map((img, i) => (\n <React.Fragment key={`og-img-${i}`}>\n <meta property=\"og:image\" content={img.url} />\n {img.width && <meta property=\"og:image:width\" content={String(img.width)} />}\n {img.height && <meta property=\"og:image:height\" content={String(img.height)} />}\n {img.alt && <meta property=\"og:image:alt\" content={img.alt} />}\n </React.Fragment>\n ))}\n\n {/* ── Twitter Card ── */}\n {meta.twitter?.card && <meta name=\"twitter:card\" content={meta.twitter.card} />}\n {meta.twitter?.site && <meta name=\"twitter:site\" content={meta.twitter.site} />}\n {meta.twitter?.creator && <meta name=\"twitter:creator\" content={meta.twitter.creator} />}\n {meta.twitter?.title && <meta name=\"twitter:title\" content={meta.twitter.title} />}\n {meta.twitter?.description && (\n <meta name=\"twitter:description\" content={meta.twitter.description} />\n )}\n {meta.twitter?.images?.map((url, i) => (\n <meta key={`tw-img-${i}`} name=\"twitter:image\" content={url} />\n ))}\n\n {/* ── Custom meta attributes ── */}\n {meta.other &&\n Object.entries(meta.other).map(([name, content]) => (\n <meta key={`custom-${name}`} name={name} content={content} />\n ))}\n\n {/* ── Canonical URL ── */}\n {meta.alternates?.canonical && <link rel=\"canonical\" href={meta.alternates.canonical} />}\n </>\n )\n}\n\nexport default SeoMetaTags\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACwJA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,eAAe,OAAwB;AACrD,MAAI,SAAU,eAAqC,SAAS,KAAK,GAAG;AAClE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAAC,WAAW,uBAAuB,OAAO,QAAQ;AAOvE,SAAS,oBAAoB,OAA6B;AAC/D,MAAI,SAAU,oBAA0C,SAAS,KAAK,GAAG;AACvE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AA2BO,SAAS,aAAa,SAA2C;AArNxE;AAsNE,QAAM,EAAC,KAAK,UAAU,IAAI,OAAO,IAAI,WAAW,CAAC,GAAG,iBAAgB,IAAI;AAExE,QAAM,iBAAiB,QAAQ,QAAQ,QAAQ,EAAE;AACjD,QAAM,iBAAiB,KAAK,QAAQ,QAAQ,EAAE;AAE9C,QAAM,UAAU,CAAC,gBAAgB,cAAc,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAGzE,MAAI,aAAqB,SAAS,WAAW;AAC7C,QAAI,gCAAK,cAAL,mBAAgB,eAAc,SAAS,IAAI,UAAU,UAAU;AACjE,iBAAa,IAAI,UAAU;AAAA,EAC7B,aAAW,gCAAK,cAAL,mBAAgB,UAAS,kBAAkB;AACpD,iBAAa,iBAAiB,IAAI,UAAU,KAAoB,KAAK;AAAA,EACvE;AAGA,MAAI,kBAA0B;AAC9B,QAAI,gCAAK,YAAL,mBAAc,eAAc,SAAS,IAAI,QAAQ,UAAU;AAC7D,sBAAkB,IAAI,QAAQ;AAAA,EAChC,aAAW,gCAAK,YAAL,mBAAc,UAAS,kBAAkB;AAClD,sBAAkB,iBAAiB,IAAI,QAAQ,KAAoB,KAAK;AAAA,EAC1E;AAGA,QAAM,QAAgC,CAAC;AACvC,MAAI,MAAM,QAAQ,2BAAK,cAAc,GAAG;AACtC,eAAW,QAAQ,IAAK,gBAAiB;AACvC,UAAI,KAAK,OAAO,KAAK,OAAO;AAC1B,cAAM,KAAK,GAAG,IAAI,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAQ,gCAAK,cAAL,mBAAgB,QAAO;AAErC,SAAO;AAAA,IACL,QAAO,sCAAK,UAAL,YAAc,SAAS,UAAvB,YAAgC;AAAA,IACvC,cAAa,sCAAK,gBAAL,YAAoB,SAAS,gBAA7B,YAA4C;AAAA,IACzD,YAAU,gCAAK,aAAL,mBAAe,UAAU,IAAI,WAAwB;AAAA,IAC/D,QAAQ;AAAA,MACN,OAAO,GAAC,gCAAK,WAAL,mBAAa;AAAA,MACrB,QAAQ,GAAC,gCAAK,WAAL,mBAAa;AAAA,MACtB,WAAW;AAAA,QACT,OAAO,GAAC,gCAAK,WAAL,mBAAa;AAAA,QACrB,QAAQ,GAAC,gCAAK,WAAL,mBAAa;AAAA,MACxB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT,MAAM,gBAAe,sCAAK,cAAL,mBAAgB,SAAhB,YAAwB,MAAS;AAAA,MACtD,KAAK,SAAS;AAAA,MACd,QAAO,sCAAK,cAAL,mBAAgB,UAAhB,YAAyB,SAAS;AAAA,MACzC,cAAa,sCAAK,cAAL,mBAAgB,gBAAhB,YAA+B,SAAS;AAAA,MACrD,WAAU,sCAAK,cAAL,mBAAgB,aAAhB,YAA4B,SAAS;AAAA,MAC/C,QAAQ,aAAa,CAAC,EAAC,KAAK,WAAU,CAAC,IAAI,CAAC;AAAA,IAC9C;AAAA,IACA,SAAS;AAAA,MACP,MAAM,qBAAoB,sCAAK,YAAL,mBAAc,SAAd,YAAsB,MAAS;AAAA,MACzD,OAAM,sCAAK,YAAL,mBAAc,SAAd,YAAsB,SAAS;AAAA,MACrC,UAAS,sCAAK,YAAL,mBAAc,YAAd,YAAyB,SAAS;AAAA,MAC3C,QAAO,sCAAK,YAAL,mBAAc,UAAd,YAAuB,SAAS;AAAA,MACvC,cAAa,sCAAK,YAAL,mBAAc,gBAAd,YAA6B,SAAS;AAAA,MACnD,QAAQ,kBAAkB,CAAC,eAAe,IAAI,CAAC;AAAA,IACjD;AAAA,IACA,YAAY;AAAA,MACV,WAAW,WAAW;AAAA,IACxB;AAAA,KACI,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,EAAC,MAAK,IAAI,CAAC;AAEnD;;;ACtPA,mBAAkB;AAgEd;AATG,SAAS,YAAY,EAAC,MAAM,SAAS,MAAM,UAAU,iBAAgB,GAAqB;AA3FjG;AA4FE,QAAM,OAAO,aAAa,EAAC,KAAK,MAAM,SAAS,MAAM,UAAU,iBAAgB,CAAC;AAEhF,QAAM,gBAAgB;AAAA,MACpB,UAAK,WAAL,mBAAa,WAAU,QAAQ,YAAY;AAAA,MAC3C,UAAK,WAAL,mBAAa,YAAW,QAAQ,aAAa;AAAA,EAC/C,EAAE,KAAK,IAAI;AAEX,SACE,4EAEG;AAAA,SAAK,SAAS,4CAAC,WAAO,eAAK,OAAM;AAAA,IAGjC,KAAK,eAAe,4CAAC,UAAK,MAAK,eAAc,SAAS,KAAK,aAAa;AAAA,MACxE,UAAK,aAAL,mBAAe,UAAS,4CAAC,UAAK,MAAK,YAAW,SAAS,KAAK,SAAS,KAAK,IAAI,GAAG,IAAK;AAAA,IACvF,4CAAC,UAAK,MAAK,UAAS,SAAS,eAAe;AAAA,IAC5C,4CAAC,UAAK,MAAK,aAAY,SAAS,eAAe;AAAA,MAG9C,UAAK,cAAL,mBAAgB,SAAQ,4CAAC,UAAK,UAAS,WAAU,SAAS,KAAK,UAAU,MAAM;AAAA,MAC/E,UAAK,cAAL,mBAAgB,QAAO,4CAAC,UAAK,UAAS,UAAS,SAAS,KAAK,UAAU,KAAK;AAAA,MAC5E,UAAK,cAAL,mBAAgB,UAAS,4CAAC,UAAK,UAAS,YAAW,SAAS,KAAK,UAAU,OAAO;AAAA,MAClF,UAAK,cAAL,mBAAgB,gBACf,4CAAC,UAAK,UAAS,kBAAiB,SAAS,KAAK,UAAU,aAAa;AAAA,MAEtE,UAAK,cAAL,mBAAgB,aACf,4CAAC,UAAK,UAAS,gBAAe,SAAS,KAAK,UAAU,UAAU;AAAA,KAEjE,gBAAK,cAAL,mBAAgB,WAAhB,mBAAwB,IAAI,CAAC,KAAK,MACjC,6CAAC,aAAAA,QAAM,UAAN,EACC;AAAA,kDAAC,UAAK,UAAS,YAAW,SAAS,IAAI,KAAK;AAAA,MAC3C,IAAI,SAAS,4CAAC,UAAK,UAAS,kBAAiB,SAAS,OAAO,IAAI,KAAK,GAAG;AAAA,MACzE,IAAI,UAAU,4CAAC,UAAK,UAAS,mBAAkB,SAAS,OAAO,IAAI,MAAM,GAAG;AAAA,MAC5E,IAAI,OAAO,4CAAC,UAAK,UAAS,gBAAe,SAAS,IAAI,KAAK;AAAA,SAJzC,UAAU,CAAC,EAKhC;AAAA,MAID,UAAK,YAAL,mBAAc,SAAQ,4CAAC,UAAK,MAAK,gBAAe,SAAS,KAAK,QAAQ,MAAM;AAAA,MAC5E,UAAK,YAAL,mBAAc,SAAQ,4CAAC,UAAK,MAAK,gBAAe,SAAS,KAAK,QAAQ,MAAM;AAAA,MAC5E,UAAK,YAAL,mBAAc,YAAW,4CAAC,UAAK,MAAK,mBAAkB,SAAS,KAAK,QAAQ,SAAS;AAAA,MACrF,UAAK,YAAL,mBAAc,UAAS,4CAAC,UAAK,MAAK,iBAAgB,SAAS,KAAK,QAAQ,OAAO;AAAA,MAC/E,UAAK,YAAL,mBAAc,gBACb,4CAAC,UAAK,MAAK,uBAAsB,SAAS,KAAK,QAAQ,aAAa;AAAA,KAErE,gBAAK,YAAL,mBAAc,WAAd,mBAAsB,IAAI,CAAC,KAAK,MAC/B,4CAAC,UAAyB,MAAK,iBAAgB,SAAS,OAA7C,UAAU,CAAC,EAAuC;AAAA,IAI9D,KAAK,SACJ,OAAO,QAAQ,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,MAC5C,4CAAC,UAA4B,MAAY,WAA9B,UAAU,IAAI,EAAkC,CAC5D;AAAA,MAGF,UAAK,eAAL,mBAAiB,cAAa,4CAAC,UAAK,KAAI,aAAY,MAAM,KAAK,WAAW,WAAW;AAAA,KACxF;AAEJ;","names":["React"]}
|
|
1
|
+
{"version":3,"sources":["../src/next.ts","../src/helpers/seoMeta.ts","../src/helpers/SeoMetaTags.tsx","../src/schema/generator.ts","../src/schema/aggregateRating/schema.ts","../src/schema/article/schema.ts","../src/schema/blogPosting/schema.ts","../src/schema/brand/schema.ts","../src/schema/breadcrumbList/schema.ts","../src/schema/contactPoint/schema.ts","../src/schema/course/schema.ts","../src/schema/event/schema.ts","../src/schema/faqPage/schema.ts","../src/schema/howTo/schema.ts","../src/schema/imageObject/schema.ts","../src/schema/localBusiness/schema.ts","../src/schema/offer/schema.ts","../src/schema/utils.ts","../src/schema/organization/component.tsx","../src/schema/person/schema.ts","../src/schema/place/schema.ts","../src/schema/postalAddress/schema.ts","../src/schema/product/schema.ts","../src/schema/review/schema.ts","../src/schema/SchemaOrgScript.tsx","../src/schema/softwareApplication/schema.ts","../src/schema/videoObject/schema.ts","../src/schema/webApplication/schema.ts","../src/schema/webPage/schema.ts","../src/schema/website/component.tsx","../src/schema/SchemaOrgScripts.tsx","../src/schema/aggregateRating/component.tsx","../src/schema/article/component.tsx","../src/schema/blogPosting/component.tsx","../src/schema/brand/component.tsx","../src/schema/breadcrumbList/component.tsx","../src/schema/contactPoint/component.tsx","../src/schema/course/component.tsx","../src/schema/event/component.tsx","../src/schema/faqPage/component.tsx","../src/schema/howTo/component.tsx","../src/schema/imageObject/component.tsx","../src/schema/localBusiness/component.tsx","../src/schema/offer/component.tsx","../src/schema/person/component.tsx","../src/schema/place/component.tsx","../src/schema/postalAddress/component.tsx","../src/schema/product/component.tsx","../src/schema/review/component.tsx","../src/schema/softwareApplication/component.tsx","../src/schema/videoObject/component.tsx","../src/schema/webApplication/component.tsx","../src/schema/webPage/component.tsx"],"sourcesContent":["/**\n * Next.js App Router helpers — safe to import in Server Components.\n *\n * @example\n * import { buildSeoMeta, SeoMetaTags } from 'sanity-plugin-seofields/next'\n * import { WebsiteSchema, ArticleSchema, SchemaOrgScripts } from 'sanity-plugin-seofields/next'\n */\nexport type {\n BuildSeoMetaOptions,\n SeoFieldsInput,\n SeoMetadata,\n SeoMetaDefaults,\n} from './helpers/seoMeta'\nexport {buildSeoMeta, sanitizeOGType, sanitizeTwitterCard} from './helpers/seoMeta'\nexport type {SeoMetaTagsProps} from './helpers/SeoMetaTags'\nexport {SeoMetaTags} from './helpers/SeoMetaTags'\n\n// Schema.org — Combined\nexport type {SchemaOrgScriptsProps} from './schema/SchemaOrgScripts'\nexport {SchemaOrgScripts} from './schema/SchemaOrgScripts'\n\n// Schema.org — Individual (also importable from ./next/website etc.)\nexport type {AggregateRatingSchemaProps} from './schema/aggregateRating/component'\nexport {AggregateRatingSchema, buildAggregateRatingJsonLd} from './schema/aggregateRating/component'\nexport type {ArticleSchemaProps} from './schema/article/component'\nexport {ArticleSchema, buildArticleJsonLd} from './schema/article/component'\nexport type {BlogPostingSchemaProps} from './schema/blogPosting/component'\nexport {BlogPostingSchema, buildBlogPostingJsonLd} from './schema/blogPosting/component'\nexport type {BrandSchemaProps} from './schema/brand/component'\nexport {BrandSchema, buildBrandJsonLd} from './schema/brand/component'\nexport type {BreadcrumbListSchemaProps} from './schema/breadcrumbList/component'\nexport {BreadcrumbListSchema, buildBreadcrumbListJsonLd} from './schema/breadcrumbList/component'\nexport type {ContactPointSchemaProps} from './schema/contactPoint/component'\nexport {buildContactPointJsonLd, ContactPointSchema} from './schema/contactPoint/component'\nexport type {CourseSchemaProps} from './schema/course/component'\nexport {buildCourseJsonLd, CourseSchema} from './schema/course/component'\nexport type {EventSchemaProps} from './schema/event/component'\nexport {buildEventJsonLd, EventSchema} from './schema/event/component'\nexport type {FAQPageSchemaProps} from './schema/faqPage/component'\nexport {buildFAQPageJsonLd, FAQPageSchema} from './schema/faqPage/component'\nexport type {HowToSchemaProps} from './schema/howTo/component'\nexport {buildHowToJsonLd, HowToSchema} from './schema/howTo/component'\nexport type {ImageObjectSchemaProps} from './schema/imageObject/component'\nexport {buildImageObjectJsonLd, ImageObjectSchema} from './schema/imageObject/component'\nexport type {LocalBusinessSchemaProps} from './schema/localBusiness/component'\nexport {buildLocalBusinessJsonLd, LocalBusinessSchema} from './schema/localBusiness/component'\nexport type {OfferSchemaProps} from './schema/offer/component'\nexport {buildOfferJsonLd, OfferSchema} from './schema/offer/component'\nexport type {OrganizationSchemaProps} from './schema/organization/component'\nexport {buildOrganizationJsonLd, OrganizationSchema} from './schema/organization/component'\nexport type {PersonSchemaProps} from './schema/person/component'\nexport {buildPersonJsonLd, PersonSchema} from './schema/person/component'\nexport type {PlaceSchemaProps} from './schema/place/component'\nexport {buildPlaceJsonLd, PlaceSchema} from './schema/place/component'\nexport type {PostalAddressSchemaProps} from './schema/postalAddress/component'\nexport {buildPostalAddressJsonLd, PostalAddressSchema} from './schema/postalAddress/component'\nexport type {ProductSchemaProps} from './schema/product/component'\nexport {buildProductJsonLd, ProductSchema} from './schema/product/component'\nexport type {ReviewSchemaProps} from './schema/review/component'\nexport {buildReviewJsonLd, ReviewSchema} from './schema/review/component'\nexport type {SoftwareApplicationSchemaProps} from './schema/softwareApplication/component'\nexport {\n buildSoftwareApplicationJsonLd,\n SoftwareApplicationSchema,\n} from './schema/softwareApplication/component'\nexport type {VideoObjectSchemaProps} from './schema/videoObject/component'\nexport {buildVideoObjectJsonLd, VideoObjectSchema} from './schema/videoObject/component'\nexport type {WebApplicationSchemaProps} from './schema/webApplication/component'\nexport {buildWebApplicationJsonLd, WebApplicationSchema} from './schema/webApplication/component'\nexport type {WebPageSchemaProps} from './schema/webPage/component'\nexport {buildWebPageJsonLd, WebPageSchema} from './schema/webPage/component'\nexport type {WebsiteSchemaProps} from './schema/website/component'\nexport {buildWebsiteJsonLd, WebsiteSchema} from './schema/website/component'\n","/**\n * Headless CMS integration helpers for sanity-plugin-seofields\n *\n * Provides framework-agnostic SEO metadata utilities for use with:\n * - Next.js App Router → buildSeoMeta() inside generateMetadata()\n * - Next.js Pages Router → <SeoMetaTags> inside Next.js <Head>\n * - Nuxt / Remix / any SSR → <SeoMetaTags> inside your <head> slot\n */\n\nimport type {SanityImage, SanityImageWithAlt, SeoFields} from '../types'\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/** Structured metadata returned by buildSeoMeta(). Compatible with Next.js Metadata (App Router). */\nexport interface SeoMetadata {\n title?: string | null\n description?: string | null\n keywords?: string[]\n robots?: {\n index?: boolean\n follow?: boolean\n googleBot?: {\n index?: boolean\n follow?: boolean\n }\n }\n openGraph?: {\n type?: string\n url?: string\n title?: string\n description?: string\n siteName?: string\n images?: Array<{url: string; width?: number; height?: number; alt?: string}>\n }\n twitter?: {\n card?: string\n site?: string\n creator?: string\n title?: string\n description?: string\n images?: string[]\n }\n alternates?: {\n canonical?: string\n }\n /** Any custom meta attributes from seo.metaAttributes */\n other?: Record<string, string>\n}\n\n/** Default values used when SEO fields are missing. */\nexport interface SeoMetaDefaults {\n title?: string\n description?: string\n siteName?: string\n twitterSite?: string\n twitterCreator?: string\n /** Fallback image URL when no OG / Twitter image is set. */\n ogImage?: string\n}\n\n/**\n * Permissive image shape accepted by buildSeoMeta — compatible with both the\n * plugin's SanityImage and Sanity's code-generated image type (where `asset`\n * and `alt` are optional).\n */\ninterface SeoImageInput {\n _type?: string\n asset?: {_ref: string; _type: string; _weak?: boolean; [key: string]: unknown}\n hotspot?: unknown\n crop?: unknown\n alt?: string\n}\n\n/**\n * Input-compatible variant of SeoFields. Structurally matches Sanity's\n * code-generated types (where `asset`, `alt`, `key`, and `type` are all\n * optional), so you can pass `data.seo` from a sanityFetch result directly\n * without any `as any` or manual casting.\n */\nexport interface SeoFieldsInput {\n _type?: string\n robots?: {noIndex?: boolean | null; noFollow?: boolean | null} | null\n title?: string | null\n description?: string | null\n metaImage?: SeoImageInput | null\n metaAttributes?: Array<{_key?: string; key?: string; value?: string; type?: string}> | null\n keywords?: string[] | null\n canonicalUrl?: string | null\n openGraph?: {\n _type?: string\n url?: string | null\n title?: string | null\n description?: string | null\n siteName?: string | null\n type?: string | null\n imageType?: string | null\n image?: SeoImageInput | null\n imageUrl?: string | null\n } | null\n twitter?: {\n _type?: string\n card?: string | null\n site?: string | null\n creator?: string | null\n title?: string | null\n description?: string | null\n imageType?: string | null\n image?: SeoImageInput | null\n imageUrl?: string | null\n } | null\n}\n\n/** Options accepted by buildSeoMeta(). */\nexport interface BuildSeoMetaOptions {\n /**\n * The raw SEO object from Sanity (_type excluded or included — both work).\n * Pass `null` or `undefined` to fall back entirely to `defaults`.\n *\n * Accepts both the strict plugin `SeoFields` type and Sanity's code-generated\n * type (which has all nested fields optional) without any `as any` cast.\n */\n seo?: SeoFieldsInput | null\n\n /**\n * The base URL of your site, e.g. \"https://example.com\".\n * Used for canonical URL and OpenGraph URL construction.\n */\n baseUrl?: string\n\n /**\n * The path for the current page, e.g. \"/about\".\n * Combined with baseUrl to produce the canonical + OG url.\n * Defaults to \"\".\n */\n path?: string\n\n /**\n * Default values used when the Sanity SEO fields are empty / missing.\n */\n defaults?: SeoMetaDefaults\n\n /**\n * Resolve a Sanity image asset to a plain URL string.\n *\n * @example (using @sanity/image-url)\n * imageUrlResolver: (img) => urlFor(img).width(1200).url()\n */\n imageUrlResolver?: (image: SanityImage | SanityImageWithAlt) => string | null | undefined\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nconst VALID_OG_TYPES = [\n 'website',\n 'article',\n 'profile',\n 'book',\n 'music',\n 'video',\n 'product',\n] as const\ntype OGType = (typeof VALID_OG_TYPES)[number]\n\n/**\n * Coerce an arbitrary string to a valid OpenGraph type.\n * Falls back to \"website\" when the value is invalid.\n */\nexport function sanitizeOGType(value?: string): OGType {\n if (value && (VALID_OG_TYPES as readonly string[]).includes(value)) {\n return value as OGType\n }\n return 'website'\n}\n\nconst VALID_TWITTER_CARDS = ['summary', 'summary_large_image', 'app', 'player'] as const\ntype TwitterCard = (typeof VALID_TWITTER_CARDS)[number]\n\n/**\n * Coerce an arbitrary string to a valid Twitter card type.\n * Falls back to \"summary_large_image\" when the value is invalid.\n */\nexport function sanitizeTwitterCard(value?: string): TwitterCard {\n if (value && (VALID_TWITTER_CARDS as readonly string[]).includes(value)) {\n return value as TwitterCard\n }\n return 'summary_large_image'\n}\n\n// ─── Core builder ─────────────────────────────────────────────────────────────\n\n/**\n * Convert a Sanity SEO object into a structured metadata object.\n *\n * The return value is structurally compatible with Next.js App Router's\n * `Metadata` type, so you can return it directly from `generateMetadata()`.\n *\n * @example Next.js App Router\n * ```ts\n * import { buildSeoMeta } from 'sanity-plugin-seofields'\n * import { urlFor } from '@/sanity/lib/image'\n *\n * export async function generateMetadata(): Promise<Metadata> {\n * const { seo } = await sanityFetch({ query: PAGE_SEO_QUERY })\n * return buildSeoMeta({\n * seo,\n * baseUrl: process.env.NEXT_PUBLIC_SITE_URL,\n * path: '/about',\n * defaults: { title: 'My Site', siteName: 'My Site' },\n * imageUrlResolver: (img) => urlFor(img).width(1200).url(),\n * })\n * }\n * ```\n */\nexport function buildSeoMeta(options: BuildSeoMetaOptions): SeoMetadata {\n const {seo, baseUrl = '', path = '', defaults = {}, imageUrlResolver} = options\n\n const normalizedBase = baseUrl.replace(/\\/+$/, '') // remove trailing /\n const normalizedPath = path.replace(/^\\/+/, '') // remove leading /\n\n const fullUrl = [normalizedBase, normalizedPath].filter(Boolean).join('/')\n\n // ── OG image resolution ──\n let ogImageURL: string = defaults.ogImage || ''\n if (seo?.openGraph?.imageType === 'url' && seo.openGraph.imageUrl) {\n ogImageURL = seo.openGraph.imageUrl\n } else if (seo?.openGraph?.image && imageUrlResolver) {\n ogImageURL = imageUrlResolver(seo.openGraph.image as SanityImage) || ogImageURL\n }\n\n // ── Twitter image resolution ──\n let twitterImageURL: string = ogImageURL // reuse OG image as fallback\n if (seo?.twitter?.imageType === 'url' && seo.twitter.imageUrl) {\n twitterImageURL = seo.twitter.imageUrl\n } else if (seo?.twitter?.image && imageUrlResolver) {\n twitterImageURL = imageUrlResolver(seo.twitter.image as SanityImage) || twitterImageURL\n }\n\n // ── Custom meta attributes → `other` map ──\n const other: Record<string, string> = {}\n if (Array.isArray(seo?.metaAttributes)) {\n for (const attr of seo!.metaAttributes!) {\n if (attr.key && attr.value) {\n other[attr.key] = attr.value\n }\n }\n }\n\n const ogUrl = seo?.openGraph?.url || fullUrl\n\n return {\n title: seo?.title ?? defaults.title ?? null,\n description: seo?.description ?? defaults.description ?? null,\n keywords: seo?.keywords?.length ? (seo.keywords as string[]) : undefined,\n robots: {\n index: !seo?.robots?.noIndex,\n follow: !seo?.robots?.noFollow,\n googleBot: {\n index: !seo?.robots?.noIndex,\n follow: !seo?.robots?.noFollow,\n },\n },\n openGraph: {\n type: sanitizeOGType(seo?.openGraph?.type ?? undefined),\n url: ogUrl || undefined,\n title: seo?.openGraph?.title ?? defaults.title,\n description: seo?.openGraph?.description ?? defaults.description,\n siteName: seo?.openGraph?.siteName ?? defaults.siteName,\n images: ogImageURL ? [{url: ogImageURL}] : [],\n },\n twitter: {\n card: sanitizeTwitterCard(seo?.twitter?.card ?? undefined),\n site: seo?.twitter?.site ?? defaults.twitterSite,\n creator: seo?.twitter?.creator ?? defaults.twitterCreator,\n title: seo?.twitter?.title ?? defaults.title,\n description: seo?.twitter?.description ?? defaults.description,\n images: twitterImageURL ? [twitterImageURL] : [],\n },\n alternates: {\n canonical: fullUrl || undefined,\n },\n ...(Object.keys(other).length > 0 ? {other} : {}),\n }\n}\n","/**\n * <SeoMetaTags> — Framework-agnostic React SEO meta tag renderer.\n *\n * Renders all SEO meta tags as plain React elements.\n * Place it inside your framework's <Head> component:\n *\n * @example Next.js Pages Router\n * ```tsx\n * import Head from 'next/head'\n * import { SeoMetaTags } from 'sanity-plugin-seofields'\n *\n * export default function Page({ seo }) {\n * return (\n * <>\n * <Head>\n * <SeoMetaTags\n * data={seo}\n * baseUrl=\"https://example.com\"\n * path=\"/about\"\n * defaults={{ title: 'My Site', siteName: 'My Site' }}\n * imageUrlResolver={(img) => urlFor(img).width(1200).url()}\n * />\n * </Head>\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n *\n * @example Nuxt 3 / generic SSR (inside <Head> slot)\n * ```tsx\n * <Head>\n * <SeoMetaTags data={seo} baseUrl=\"https://example.com\" path=\"/\" />\n * </Head>\n * ```\n */\nimport React from 'react'\n\nimport type {SanityImage, SanityImageWithAlt, SeoFields} from '../types'\nimport {buildSeoMeta, type BuildSeoMetaOptions} from './seoMeta'\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface SeoMetaTagsProps {\n /**\n * The raw SEO object from Sanity.\n * Pass `null` / `undefined` to render only the defaults.\n */\n data?: Partial<SeoFields> | null\n\n /**\n * Base URL of your site, e.g. \"https://example.com\".\n * Used for canonical link, og:url fallback.\n */\n baseUrl?: string\n\n /**\n * Current page path, e.g. \"/about\".\n * Defaults to \"\".\n */\n path?: string\n\n /**\n * Default values used when SEO fields are missing.\n */\n defaults?: BuildSeoMetaOptions['defaults']\n\n /**\n * Resolve a Sanity image asset reference to a full URL string.\n *\n * @example\n * imageUrlResolver={(img) => urlFor(img).width(1200).url()}\n */\n imageUrlResolver?: (image: SanityImage | SanityImageWithAlt) => string | null | undefined\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Renders all SEO meta tags for a page as plain React elements.\n * Intended to be placed inside your framework's <Head> / <head> component.\n *\n * Renders:\n * - `<title>`\n * - `<meta name=\"description\">`\n * - `<meta name=\"keywords\">`\n * - `<meta name=\"robots\">`\n * - OpenGraph meta tags (`og:*`)\n * - Twitter Card meta tags (`twitter:*`)\n * - Any custom `seo.metaAttributes` as `<meta name=\"...\" content=\"...\">`\n */\nexport function SeoMetaTags({data, baseUrl, path, defaults, imageUrlResolver}: SeoMetaTagsProps) {\n const meta = buildSeoMeta({seo: data, baseUrl, path, defaults, imageUrlResolver})\n\n const robotsContent = [\n meta.robots?.index === false ? 'noindex' : 'index',\n meta.robots?.follow === false ? 'nofollow' : 'follow',\n ].join(', ')\n\n return (\n <>\n {/* ── Title ── */}\n {meta.title && <title>{meta.title}</title>}\n\n {/* ── Basic meta ── */}\n {meta.description && <meta name=\"description\" content={meta.description} />}\n {meta.keywords?.length ? <meta name=\"keywords\" content={meta.keywords.join(', ')} /> : null}\n <meta name=\"robots\" content={robotsContent} />\n <meta name=\"googlebot\" content={robotsContent} />\n\n {/* ── Open Graph ── */}\n {meta.openGraph?.type && <meta property=\"og:type\" content={meta.openGraph.type} />}\n {meta.openGraph?.url && <meta property=\"og:url\" content={meta.openGraph.url} />}\n {meta.openGraph?.title && <meta property=\"og:title\" content={meta.openGraph.title} />}\n {meta.openGraph?.description && (\n <meta property=\"og:description\" content={meta.openGraph.description} />\n )}\n {meta.openGraph?.siteName && (\n <meta property=\"og:site_name\" content={meta.openGraph.siteName} />\n )}\n {meta.openGraph?.images?.map((img, i) => (\n <React.Fragment key={`og-img-${i}`}>\n <meta property=\"og:image\" content={img.url} />\n {img.width && <meta property=\"og:image:width\" content={String(img.width)} />}\n {img.height && <meta property=\"og:image:height\" content={String(img.height)} />}\n {img.alt && <meta property=\"og:image:alt\" content={img.alt} />}\n </React.Fragment>\n ))}\n\n {/* ── Twitter Card ── */}\n {meta.twitter?.card && <meta name=\"twitter:card\" content={meta.twitter.card} />}\n {meta.twitter?.site && <meta name=\"twitter:site\" content={meta.twitter.site} />}\n {meta.twitter?.creator && <meta name=\"twitter:creator\" content={meta.twitter.creator} />}\n {meta.twitter?.title && <meta name=\"twitter:title\" content={meta.twitter.title} />}\n {meta.twitter?.description && (\n <meta name=\"twitter:description\" content={meta.twitter.description} />\n )}\n {meta.twitter?.images?.map((url, i) => (\n <meta key={`tw-img-${i}`} name=\"twitter:image\" content={url} />\n ))}\n\n {/* ── Custom meta attributes ── */}\n {meta.other &&\n Object.entries(meta.other).map(([name, content]) => (\n <meta key={`custom-${name}`} name={name} content={content} />\n ))}\n\n {/* ── Canonical URL ── */}\n {meta.alternates?.canonical && <link rel=\"canonical\" href={meta.alternates.canonical} />}\n </>\n )\n}\n\nexport default SeoMetaTags\n","/**\n * Dynamic Sanity schema generator for Schema.org types.\n *\n * Each Schema.org type declares its fields as a plain `SchemaFieldDef[]` array.\n * The generator converts them into Sanity `defineType` / `defineField` calls,\n * wiring up validation, initial values, options, and nested objects/arrays\n * automatically.\n *\n * It also provides a generic JSON-LD builder and React component factory so\n * adding a new Schema.org type requires only a field definition array.\n */\nimport React from 'react'\nimport {defineField, defineType, FieldDefinition, SchemaTypeDefinition} from 'sanity'\n\n// ─── Field Definition Types ───────────────────────────────────────────────────\n\nexport interface SchemaFieldOption {\n title: string\n value: string\n}\n\nexport interface SchemaFieldDef {\n /** Sanity field name */\n name: string\n /** Human-readable title shown in Studio */\n title: string\n /** Sanity field type */\n type: 'string' | 'url' | 'text' | 'array' | 'object' | 'image' | 'number' | 'date' | 'datetime'\n /** Help text shown below the field */\n description?: string\n /** If set, field is required — key is the validation config key, message is the default */\n required?: {key: string; message: string}\n /** Initial value for the field */\n initialValue?: unknown\n /** Dropdown / radio options for string fields */\n options?: SchemaFieldOption[]\n /** Number of rows for text fields */\n rows?: number\n /** Array member types, e.g. [{type: 'string'}] */\n of?: {type: string}[]\n /** Nested fields for object type */\n fields?: SchemaFieldDef[]\n /** Schema.org @type for this nested object or array items in JSON-LD output */\n jsonLdType?: string\n /** JSON-LD key if different from the Sanity field name */\n jsonLdKey?: string\n}\n\n// ─── Schema Type Definition ───────────────────────────────────────────────────\n\nexport interface SchemaTypeDef {\n /** Sanity type name, e.g. \"schemaOrgWebsite\" */\n name: string\n /** Title shown in Studio, e.g. \"Schema.org — Website\" */\n title: string\n /** Icon component shown in Studio and the array grid picker */\n icon?: React.ComponentType\n /** Field definitions */\n fields: SchemaFieldDef[]\n}\n\n// ─── Shared Config Shape ──────────────────────────────────────────────────────\n\nexport interface SchemaOrgConfig {\n /** Custom validation error messages keyed by field config key */\n validation?: Record<string, string>\n}\n\n// ─── Sanity Schema Generator ─────────────────────────────────────────────────\n\n/** Recursively converts a `SchemaFieldDef` into a Sanity `FieldDefinition`. */\nfunction buildField(\n fieldDef: SchemaFieldDef,\n validation?: Record<string, string>,\n): FieldDefinition {\n const base: Record<string, unknown> = {\n name: fieldDef.name,\n title: fieldDef.title,\n type: fieldDef.type,\n }\n\n if (fieldDef.description) base.description = fieldDef.description\n if (fieldDef.initialValue !== undefined) base.initialValue = fieldDef.initialValue\n if (fieldDef.rows) base.rows = fieldDef.rows\n\n if (fieldDef.options) {\n base.options = {list: fieldDef.options}\n }\n\n // Array of objects: auto-generate `of: [{ type: 'object', fields }]`\n if (fieldDef.type === 'array' && fieldDef.fields?.length && !fieldDef.of) {\n base.of = [\n {\n type: 'object',\n fields: fieldDef.fields.map((child) => buildField(child, validation)),\n },\n ]\n } else if (fieldDef.of) {\n base.of = fieldDef.of\n }\n\n // Nested object fields — recurse (only for non-array types)\n if (fieldDef.type !== 'array' && fieldDef.fields?.length) {\n base.fields = fieldDef.fields.map((child) => buildField(child, validation))\n }\n\n // Required validation with configurable message\n if (fieldDef.required) {\n const msg = validation?.[fieldDef.required.key] ?? fieldDef.required.message\n base.validation = (Rule: {required: () => {error: (m: string) => unknown}}) =>\n Rule.required().error(msg)\n }\n\n return defineField(base as unknown as FieldDefinition)\n}\n\n/**\n * Generates a complete Sanity `SchemaTypeDefinition` from a declarative\n * `SchemaTypeDef` and optional user config.\n */\nexport function generateSchemaType(\n def: SchemaTypeDef,\n config: SchemaOrgConfig = {},\n): SchemaTypeDefinition {\n return defineType({\n name: def.name,\n title: def.title,\n type: 'object',\n ...(def.icon && {icon: def.icon}),\n fields: def.fields.map((f) => buildField(f, config.validation)),\n preview: {\n select: {\n title: 'name',\n },\n prepare(selection) {\n return {\n title: selection.title || def.title,\n subtitle: `@type: ${def.title.split('—')[1]?.trim() || def.title}`,\n ...(def.icon && {media: def.icon}),\n }\n },\n },\n })\n}\n\n// ─── Generic JSON-LD Builder ──────────────────────────────────────────────────\n\n/** Sanity-internal keys that should never appear in JSON-LD output. */\nconst SANITY_INTERNAL_KEYS = new Set([\n '_key',\n '_type',\n '_ref',\n '_id',\n '_rev',\n '_createdAt',\n '_updatedAt',\n])\n\n/**\n * Recursively builds a JSON-LD fragment from Sanity data using field defs.\n * Handles nested objects with `@type` and arrays of typed objects.\n */\nfunction buildNestedJsonLd(\n data: Record<string, unknown>,\n fieldDefs: SchemaFieldDef[],\n jsonLdType?: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = jsonLdType ? {'@type': jsonLdType} : {}\n\n for (const field of fieldDefs) {\n const value = data[field.name]\n if (value === undefined || value === null || value === '') continue\n\n const key = field.jsonLdKey ?? field.name\n\n if (\n field.type === 'object' &&\n field.fields &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n const nested = buildNestedJsonLd(\n value as Record<string, unknown>,\n field.fields,\n field.jsonLdType,\n )\n const minKeys = field.jsonLdType ? 1 : 0\n if (Object.keys(nested).length > minKeys) {\n result[key] = nested\n }\n } else if (field.type === 'array' && Array.isArray(value)) {\n if (field.fields && field.jsonLdType) {\n // Array of typed objects\n const items = value\n .filter(\n (item): item is Record<string, unknown> => typeof item === 'object' && item !== null,\n )\n .map((item) => buildNestedJsonLd(item, field.fields!, field.jsonLdType))\n if (items.length) result[key] = items\n } else if (value.length) {\n // Simple array (strings, urls, etc.)\n result[key] = value.filter((v) => v !== undefined && v !== null && v !== '')\n }\n } else if (!SANITY_INTERNAL_KEYS.has(field.name)) {\n result[key] = value\n }\n }\n\n return result\n}\n\n/**\n * Builds a complete Schema.org JSON-LD object from Sanity data using field defs.\n * Returns `null` if any of the `requiredFields` are missing.\n *\n * @param schemaType The Schema.org `@type` (e.g. \"Person\", \"Article\")\n * @param data Raw data from a Sanity GROQ query\n * @param fieldDefs The field definitions for this schema type\n * @param requiredFields Field names that must be present (returns null if missing)\n */\nexport function buildGenericJsonLd(\n schemaType: string,\n data: Record<string, unknown> | null | undefined,\n fieldDefs: SchemaFieldDef[],\n requiredFields: string[] = [],\n): Record<string, unknown> | null {\n if (!data) return null\n for (const req of requiredFields) {\n if (!data[req]) return null\n }\n\n const body = buildNestedJsonLd(data, fieldDefs)\n return {\n '@context': 'https://schema.org',\n '@type': schemaType,\n ...body,\n }\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgAggregateRatingConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const aggregateRatingFields: SchemaFieldDef[] = [\n {\n name: 'ratingValue',\n title: 'Rating Value',\n type: 'string',\n description: 'The average rating value, e.g. \"4.5\".',\n required: {\n key: 'ratingValueRequired',\n message: 'Rating value is required for Schema.org.',\n },\n },\n {\n name: 'reviewCount',\n title: 'Review Count',\n type: 'string',\n description: 'The total number of reviews, e.g. \"120\".',\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgAggregateRating(\n config: SchemaOrgAggregateRatingConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgAggregateRating',\n title: 'Schema.org — AggregateRating',\n icon: SchemaOrgIcons.aggregateRating,\n fields: aggregateRatingFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgArticleConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const articleFields: SchemaFieldDef[] = [\n {\n name: 'headline',\n title: 'Headline',\n type: 'string',\n required: {key: 'headlineRequired', message: 'Headline is required for Schema.org Article.'},\n },\n {\n name: 'description',\n title: 'Description',\n type: 'text',\n rows: 3,\n },\n {\n name: 'image',\n title: 'Image',\n type: 'url',\n description: 'URL of the article image.',\n },\n {\n name: 'author',\n title: 'Author',\n type: 'object',\n jsonLdType: 'Person',\n fields: [\n {\n name: 'name',\n title: 'Author Name',\n type: 'string',\n },\n ],\n },\n {\n name: 'publisher',\n title: 'Publisher',\n type: 'object',\n jsonLdType: 'Organization',\n fields: [\n {\n name: 'name',\n title: 'Publisher Name',\n type: 'string',\n },\n {\n name: 'logo',\n title: 'Publisher Logo',\n type: 'object',\n jsonLdType: 'ImageObject',\n fields: [\n {\n name: 'url',\n title: 'Logo URL',\n type: 'url',\n },\n ],\n },\n ],\n },\n {\n name: 'datePublished',\n title: 'Date Published',\n type: 'date',\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org Article — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgArticle } from 'sanity-plugin-seofields/schema/article'\n *\n * schemaOrgArticle()\n * ```\n */\nexport default function schemaOrgArticle(\n config: SchemaOrgArticleConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgArticle',\n title: 'Schema.org — Article',\n icon: SchemaOrgIcons.article,\n fields: articleFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgBlogPostingConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const blogPostingFields: SchemaFieldDef[] = [\n {\n name: 'headline',\n title: 'Headline',\n type: 'string',\n required: {\n key: 'headlineRequired',\n message: 'Headline is required for Schema.org BlogPosting.',\n },\n },\n {\n name: 'description',\n title: 'Description',\n type: 'text',\n rows: 3,\n },\n {\n name: 'author',\n title: 'Author',\n type: 'object',\n jsonLdType: 'Person',\n fields: [\n {\n name: 'name',\n title: 'Author Name',\n type: 'string',\n },\n ],\n },\n {\n name: 'datePublished',\n title: 'Date Published',\n type: 'date',\n },\n {\n name: 'mainEntityOfPage',\n title: 'Main Entity of Page',\n type: 'object',\n jsonLdType: 'WebPage',\n fields: [\n {\n name: 'id',\n title: 'Page URL',\n type: 'url',\n jsonLdKey: '@id',\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org BlogPosting — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgBlogPosting } from 'sanity-plugin-seofields/schema/blogPosting'\n *\n * schemaOrgBlogPosting()\n * ```\n */\nexport default function schemaOrgBlogPosting(\n config: SchemaOrgBlogPostingConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgBlogPosting',\n title: 'Schema.org — BlogPosting',\n icon: SchemaOrgIcons.blogPosting,\n fields: blogPostingFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgBrandConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const brandFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Brand Name',\n type: 'string',\n description: 'The name of the brand.',\n required: {key: 'nameRequired', message: 'Brand name is required for Schema.org.'},\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgBrand(config: SchemaOrgBrandConfig = {}): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgBrand',\n title: 'Schema.org — Brand',\n icon: SchemaOrgIcons.brand,\n fields: brandFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgBreadcrumbListConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const breadcrumbListFields: SchemaFieldDef[] = [\n {\n name: 'itemListElement',\n title: 'Breadcrumb Items',\n type: 'array',\n jsonLdType: 'ListItem',\n fields: [\n {\n name: 'position',\n title: 'Position',\n type: 'number',\n required: {key: 'positionRequired', message: 'Position is required.'},\n },\n {\n name: 'name',\n title: 'Label',\n type: 'string',\n required: {key: 'nameRequired', message: 'Label is required.'},\n },\n {\n name: 'item',\n title: 'URL',\n type: 'url',\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org BreadcrumbList — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgBreadcrumbList } from 'sanity-plugin-seofields/schema/breadcrumbList'\n *\n * schemaOrgBreadcrumbList()\n * ```\n */\nexport default function schemaOrgBreadcrumbList(\n config: SchemaOrgBreadcrumbListConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgBreadcrumbList',\n title: 'Schema.org — BreadcrumbList',\n icon: SchemaOrgIcons.breadcrumbList,\n fields: breadcrumbListFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgContactPointConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const contactPointFields: SchemaFieldDef[] = [\n {\n name: 'contactType',\n title: 'Contact Type',\n type: 'string',\n description: 'The type of contact, e.g. \"customer support\", \"sales\".',\n required: {key: 'contactTypeRequired', message: 'Contact type is required for Schema.org.'},\n initialValue: 'customer support',\n options: [\n {title: 'Customer Support', value: 'customer support'},\n {title: 'Sales', value: 'sales'},\n {title: 'Technical Support', value: 'technical support'},\n {title: 'Billing', value: 'billing'},\n {title: 'General Inquiry', value: 'general inquiry'},\n ],\n },\n {\n name: 'email',\n title: 'Email',\n type: 'string',\n description: 'Contact email address.',\n },\n {\n name: 'telephone',\n title: 'Telephone',\n type: 'string',\n description: 'Contact telephone number.',\n },\n {\n name: 'availableLanguage',\n title: 'Available Languages',\n type: 'array',\n of: [{type: 'string'}],\n description: 'Languages supported by this contact point, e.g. \"English\", \"Spanish\".',\n initialValue: ['English'],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgContactPoint(\n config: SchemaOrgContactPointConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgContactPoint',\n title: 'Schema.org — ContactPoint',\n icon: SchemaOrgIcons.contactPoint,\n fields: contactPointFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgCourseConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const courseFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Course Name',\n type: 'string',\n description: 'The name of the course.',\n required: {key: 'nameRequired', message: 'Course name is required for Schema.org.'},\n },\n {\n name: 'description',\n title: 'Description',\n type: 'text',\n rows: 3,\n description: 'A short description of the course.',\n },\n {\n name: 'provider',\n title: 'Provider',\n type: 'object',\n description: 'The organization that provides this course.',\n jsonLdType: 'Organization',\n fields: [\n {\n name: 'name',\n title: 'Provider Name',\n type: 'string',\n description: 'Name of the providing organization.',\n },\n {\n name: 'sameAs',\n title: 'Provider URL',\n type: 'url',\n description: 'URL of the providing organization.',\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org Course — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgCourse } from 'sanity-plugin-seofields/schema/course'\n *\n * // Default\n * schemaOrgCourse()\n *\n * // Custom validation messages\n * schemaOrgCourse({\n * validation: { nameRequired: 'Please enter the course name.' },\n * })\n * ```\n */\nexport default function schemaOrgCourse(config: SchemaOrgCourseConfig = {}): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgCourse',\n title: 'Schema.org — Course',\n icon: SchemaOrgIcons.course,\n fields: courseFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgEventConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const eventFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Event Name',\n type: 'string',\n description: 'The name of the event.',\n required: {key: 'nameRequired', message: 'Event name is required for Schema.org.'},\n },\n {\n name: 'startDate',\n title: 'Start Date',\n type: 'date',\n description: 'The start date of the event.',\n },\n {\n name: 'location',\n title: 'Location',\n type: 'object',\n description: 'The location where the event takes place.',\n jsonLdType: 'Place',\n fields: [\n {\n name: 'name',\n title: 'Venue Name',\n type: 'string',\n description: 'Name of the venue or location.',\n },\n {\n name: 'address',\n title: 'Address',\n type: 'string',\n description: 'Full address as a single string.',\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgEvent(config: SchemaOrgEventConfig = {}): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgEvent',\n title: 'Schema.org — Event',\n icon: SchemaOrgIcons.event,\n fields: eventFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgFAQPageConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const faqPageFields: SchemaFieldDef[] = [\n {\n name: 'mainEntity',\n title: 'FAQ Items',\n type: 'array',\n jsonLdType: 'Question',\n fields: [\n {\n name: 'name',\n title: 'Question',\n type: 'string',\n required: {key: 'questionRequired', message: 'Question text is required.'},\n },\n {\n name: 'acceptedAnswer',\n title: 'Accepted Answer',\n type: 'object',\n jsonLdType: 'Answer',\n fields: [\n {\n name: 'text',\n title: 'Answer Text',\n type: 'text',\n rows: 3,\n },\n ],\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org FAQPage — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgFAQPage } from 'sanity-plugin-seofields/schema/faqPage'\n *\n * schemaOrgFAQPage()\n * ```\n */\nexport default function schemaOrgFAQPage(\n config: SchemaOrgFAQPageConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgFAQPage',\n title: 'Schema.org — FAQPage',\n icon: SchemaOrgIcons.faqPage,\n fields: faqPageFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgHowToConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const howToFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Name',\n type: 'string',\n required: {key: 'nameRequired', message: 'Name is required for Schema.org HowTo.'},\n },\n {\n name: 'description',\n title: 'Description',\n type: 'text',\n rows: 3,\n },\n {\n name: 'step',\n title: 'Steps',\n type: 'array',\n jsonLdType: 'HowToStep',\n fields: [\n {\n name: 'name',\n title: 'Step Name',\n type: 'string',\n required: {key: 'stepNameRequired', message: 'Step name is required.'},\n },\n {\n name: 'text',\n title: 'Step Description',\n type: 'text',\n rows: 2,\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org HowTo — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgHowTo } from 'sanity-plugin-seofields/schema/howTo'\n *\n * schemaOrgHowTo()\n * ```\n */\nexport default function schemaOrgHowTo(config: SchemaOrgHowToConfig = {}): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgHowTo',\n title: 'Schema.org — HowTo',\n icon: SchemaOrgIcons.howTo,\n fields: howToFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgImageObjectConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const imageObjectFields: SchemaFieldDef[] = [\n {\n name: 'url',\n title: 'Image URL',\n type: 'url',\n description: 'The URL of the image.',\n required: {key: 'urlRequired', message: 'Image URL is required for Schema.org.'},\n },\n {\n name: 'width',\n title: 'Width',\n type: 'number',\n description: 'Image width in pixels.',\n },\n {\n name: 'height',\n title: 'Height',\n type: 'number',\n description: 'Image height in pixels.',\n },\n {\n name: 'caption',\n title: 'Caption',\n type: 'string',\n description: 'Caption or alt text for the image.',\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgImageObject(\n config: SchemaOrgImageObjectConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgImageObject',\n title: 'Schema.org — ImageObject',\n icon: SchemaOrgIcons.imageObject,\n fields: imageObjectFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgLocalBusinessConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const localBusinessFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Business Name',\n type: 'string',\n description: 'The official name of the business.',\n required: {key: 'nameRequired', message: 'Business name is required for Schema.org.'},\n },\n {\n name: 'image',\n title: 'Image URL',\n type: 'url',\n description: 'URL to the business image.',\n },\n {\n name: 'telephone',\n title: 'Telephone',\n type: 'string',\n description: 'The telephone number of the business.',\n },\n {\n name: 'address',\n title: 'Address',\n type: 'object',\n description: 'The physical address of the business.',\n jsonLdType: 'PostalAddress',\n fields: [\n {\n name: 'streetAddress',\n title: 'Street Address',\n type: 'string',\n },\n {\n name: 'addressLocality',\n title: 'Locality',\n type: 'string',\n description: 'City or town.',\n },\n {\n name: 'addressCountry',\n title: 'Country',\n type: 'string',\n description: 'Country code, e.g. \"US\".',\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgLocalBusiness(\n config: SchemaOrgLocalBusinessConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgLocalBusiness',\n title: 'Schema.org — LocalBusiness',\n icon: SchemaOrgIcons.localBusiness,\n fields: localBusinessFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgOfferConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const offerFields: SchemaFieldDef[] = [\n {\n name: 'price',\n title: 'Price',\n type: 'string',\n description: 'The price of the offer, e.g. \"199.99\".',\n required: {key: 'priceRequired', message: 'Price is required for Schema.org.'},\n },\n {\n name: 'priceCurrency',\n title: 'Currency',\n type: 'string',\n description: 'The currency of the price, e.g. \"USD\".',\n initialValue: 'USD',\n options: [\n {title: 'USD', value: 'USD'},\n {title: 'EUR', value: 'EUR'},\n {title: 'GBP', value: 'GBP'},\n {title: 'INR', value: 'INR'},\n {title: 'JPY', value: 'JPY'},\n {title: 'CAD', value: 'CAD'},\n {title: 'AUD', value: 'AUD'},\n ],\n },\n {\n name: 'availability',\n title: 'Availability',\n type: 'url',\n description: 'Schema.org availability URL, e.g. \"https://schema.org/InStock\".',\n },\n {\n name: 'url',\n title: 'Offer URL',\n type: 'url',\n description: 'URL of the offer page.',\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgOffer(config: SchemaOrgOfferConfig = {}): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgOffer',\n title: 'Schema.org — Offer',\n icon: SchemaOrgIcons.offer,\n fields: offerFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","/**\n * Escapes characters in a JSON string that could enable XSS when embedded\n * inside a `<script>` tag. Prevents `</script>` breakout, HTML comment\n * injection, and Unicode line terminators that can break JS parsing.\n */\nexport function escapeJsonForScript(json: string): string {\n return json\n .replace(/</g, '\\\\u003C')\n .replace(/>/g, '\\\\u003E')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n}\n","/**\n * <OrganizationSchema> — Renders Schema.org Organization JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { OrganizationSchema } from 'sanity-plugin-seofields/next/organization'\n *\n * const data = await sanityFetch({ query: `*[_type == \"settings\"][0]{ organization }` })\n *\n * <OrganizationSchema data={data.organization} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport type {SanityImage} from '../../types'\nimport {escapeJsonForScript} from '../utils'\nimport type {SchemaOrgOrganizationData} from './types'\n\nexport interface OrganizationSchemaProps {\n /** The Schema.org Organization data from your Sanity GROQ query. */\n data?: SchemaOrgOrganizationData | null\n /**\n * Resolve a Sanity image asset to a URL string (for the logo field).\n * Only needed if you use the Sanity image upload field instead of logoUrl.\n *\n * @example\n * imageUrlResolver={(img) => urlFor(img).width(600).url()}\n */\n imageUrlResolver?: (image: SanityImage) => string | null | undefined\n}\n\n/**\n * Builds a Schema.org Organization JSON-LD object from Sanity data.\n * Returns `null` if required fields (name, url) are missing.\n */\nexport function buildOrganizationJsonLd(\n data?: SchemaOrgOrganizationData | null,\n imageUrlResolver?: (image: SanityImage) => string | null | undefined,\n): Record<string, unknown> | null {\n if (!data?.name || !data?.url) return null\n\n const jsonLd: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'Organization',\n name: data.name,\n url: data.url,\n }\n\n // Resolve logo — prefer explicit URL, fall back to Sanity image\n const logoUrl =\n data.logoUrl || (data.logo && imageUrlResolver ? imageUrlResolver(data.logo) : undefined)\n if (logoUrl) jsonLd.logo = logoUrl\n\n if (data.description) jsonLd.description = data.description\n\n if (data.sameAs?.length) jsonLd.sameAs = data.sameAs\n\n if (data.contactPoint?.contactType) {\n const cp: Record<string, unknown> = {\n '@type': 'ContactPoint',\n contactType: data.contactPoint.contactType,\n }\n if (data.contactPoint.email) cp.email = data.contactPoint.email\n if (data.contactPoint.availableLanguage?.length) {\n cp.availableLanguage = data.contactPoint.availableLanguage\n }\n jsonLd.contactPoint = cp\n }\n\n return jsonLd\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Organization data.\n * Renders nothing if required fields are missing.\n */\nexport function OrganizationSchema({\n data,\n imageUrlResolver,\n}: OrganizationSchemaProps): JSX.Element | null {\n const jsonLd = buildOrganizationJsonLd(data, imageUrlResolver)\n if (!jsonLd) return null\n\n return (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{__html: escapeJsonForScript(JSON.stringify(jsonLd))}}\n />\n )\n}\n\nexport default OrganizationSchema\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgPersonConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const personFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Full Name',\n type: 'string',\n description: 'The full name of the person.',\n required: {key: 'nameRequired', message: 'Person name is required for Schema.org.'},\n },\n {\n name: 'jobTitle',\n title: 'Job Title',\n type: 'string',\n description: 'The job title or role of the person.',\n },\n {\n name: 'url',\n title: 'Profile URL',\n type: 'url',\n description: \"URL of the person's profile or personal website.\",\n },\n {\n name: 'imageUrl',\n title: 'Image URL',\n type: 'url',\n description: 'URL to a photo/image of this person.',\n jsonLdKey: 'image',\n },\n {\n name: 'sameAs',\n title: 'Social / External Profiles',\n type: 'array',\n of: [{type: 'url'}],\n description:\n 'URLs of social media profiles and other authoritative pages (LinkedIn, GitHub, etc.).',\n },\n {\n name: 'worksFor',\n title: 'Works For',\n type: 'object',\n description: 'The organization this person works for.',\n jsonLdType: 'Organization',\n fields: [\n {\n name: 'name',\n title: 'Organization Name',\n type: 'string',\n description: 'Name of the organization.',\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org Person — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgPerson } from 'sanity-plugin-seofields/schema/person'\n *\n * // Default\n * schemaOrgPerson()\n *\n * // Custom validation messages\n * schemaOrgPerson({\n * validation: { nameRequired: 'Please enter the person\\'s name.' },\n * })\n * ```\n */\nexport default function schemaOrgPerson(config: SchemaOrgPersonConfig = {}): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgPerson',\n title: 'Schema.org — Person',\n icon: SchemaOrgIcons.person,\n fields: personFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgPlaceConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const placeFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Place Name',\n type: 'string',\n description: 'The name of the place.',\n required: {key: 'nameRequired', message: 'Place name is required for Schema.org.'},\n },\n {\n name: 'address',\n title: 'Address',\n type: 'object',\n description: 'The physical address of the place.',\n jsonLdType: 'PostalAddress',\n fields: [\n {\n name: 'addressLocality',\n title: 'Locality',\n type: 'string',\n description: 'City or town.',\n },\n {\n name: 'addressCountry',\n title: 'Country',\n type: 'string',\n description: 'Country code, e.g. \"US\".',\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgPlace(config: SchemaOrgPlaceConfig = {}): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgPlace',\n title: 'Schema.org — Place',\n icon: SchemaOrgIcons.place,\n fields: placeFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgPostalAddressConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const postalAddressFields: SchemaFieldDef[] = [\n {\n name: 'streetAddress',\n title: 'Street Address',\n type: 'string',\n description: 'The street address, e.g. \"123 Main St\".',\n },\n {\n name: 'addressLocality',\n title: 'City / Locality',\n type: 'string',\n description: 'The city or locality, e.g. \"New York\".',\n },\n {\n name: 'postalCode',\n title: 'Postal Code',\n type: 'string',\n description: 'The postal or ZIP code, e.g. \"10001\".',\n },\n {\n name: 'addressCountry',\n title: 'Country',\n type: 'string',\n description: 'The country code, e.g. \"US\".',\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgPostalAddress(\n config: SchemaOrgPostalAddressConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgPostalAddress',\n title: 'Schema.org — PostalAddress',\n icon: SchemaOrgIcons.postalAddress,\n fields: postalAddressFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgProductConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const productFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Product Name',\n type: 'string',\n description: 'The name of the product.',\n required: {key: 'nameRequired', message: 'Product name is required for Schema.org.'},\n },\n {\n name: 'imageUrl',\n title: 'Image URL',\n type: 'url',\n description: 'URL to the product image.',\n jsonLdKey: 'image',\n },\n {\n name: 'description',\n title: 'Description',\n type: 'text',\n rows: 3,\n description: 'A short description of the product.',\n },\n {\n name: 'brand',\n title: 'Brand',\n type: 'object',\n description: 'The brand of the product.',\n jsonLdType: 'Brand',\n fields: [\n {\n name: 'name',\n title: 'Brand Name',\n type: 'string',\n description: 'Name of the brand.',\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org Product — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgProduct } from 'sanity-plugin-seofields/schema/product'\n *\n * // Default\n * schemaOrgProduct()\n *\n * // Custom validation messages\n * schemaOrgProduct({\n * validation: { nameRequired: 'Please enter the product name.' },\n * })\n * ```\n */\nexport default function schemaOrgProduct(\n config: SchemaOrgProductConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgProduct',\n title: 'Schema.org — Product',\n icon: SchemaOrgIcons.product,\n fields: productFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgReviewConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const reviewFields: SchemaFieldDef[] = [\n {\n name: 'reviewRating',\n title: 'Review Rating',\n type: 'object',\n jsonLdType: 'Rating',\n fields: [\n {\n name: 'ratingValue',\n title: 'Rating Value',\n type: 'string',\n required: {\n key: 'ratingValueRequired',\n message: 'Rating value is required for Schema.org Review.',\n },\n },\n ],\n },\n {\n name: 'author',\n title: 'Author',\n type: 'object',\n jsonLdType: 'Person',\n fields: [\n {\n name: 'name',\n title: 'Author Name',\n type: 'string',\n required: {\n key: 'authorNameRequired',\n message: 'Author name is required for Schema.org Review.',\n },\n },\n ],\n },\n {\n name: 'reviewBody',\n title: 'Review Body',\n type: 'text',\n rows: 3,\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org Review — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgReview } from 'sanity-plugin-seofields/schema/review'\n *\n * schemaOrgReview()\n * ```\n */\nexport default function schemaOrgReview(config: SchemaOrgReviewConfig = {}): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgReview',\n title: 'Schema.org — Review',\n icon: SchemaOrgIcons.review,\n fields: reviewFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","/**\n * Shared component that renders a `<script type=\"application/ld+json\">` tag.\n * Used by all Schema.org type components.\n */\nimport {JSX} from 'react'\n\nimport {escapeJsonForScript} from './utils'\n\nexport function SchemaOrgScript({\n jsonLd,\n}: {\n jsonLd: Record<string, unknown> | null\n}): JSX.Element | null {\n if (!jsonLd) return null\n\n return (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{__html: escapeJsonForScript(JSON.stringify(jsonLd))}}\n />\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgSoftwareApplicationConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const softwareApplicationFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Application Name',\n type: 'string',\n description: 'The name of the software application.',\n required: {\n key: 'nameRequired',\n message: 'Application name is required for Schema.org.',\n },\n },\n {\n name: 'applicationCategory',\n title: 'Application Category',\n type: 'string',\n description: 'The category of the application.',\n options: [\n {title: 'Developer Application', value: 'DeveloperApplication'},\n {title: 'Business Application', value: 'BusinessApplication'},\n {title: 'Game Application', value: 'GameApplication'},\n {title: 'Educational Application', value: 'EducationalApplication'},\n {title: 'Utilities Application', value: 'UtilitiesApplication'},\n {title: 'Social Networking Application', value: 'SocialNetworkingApplication'},\n ],\n },\n {\n name: 'operatingSystem',\n title: 'Operating System',\n type: 'string',\n description: 'The supported operating systems, e.g. \"Windows, macOS\".',\n },\n {\n name: 'url',\n title: 'Application URL',\n type: 'url',\n description: 'URL of the software application.',\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org SoftwareApplication — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgSoftwareApplication } from 'sanity-plugin-seofields/schema/softwareApplication'\n *\n * // Default\n * schemaOrgSoftwareApplication()\n *\n * // Custom validation messages\n * schemaOrgSoftwareApplication({\n * validation: { nameRequired: 'Please enter the application name.' },\n * })\n * ```\n */\nexport default function schemaOrgSoftwareApplication(\n config: SchemaOrgSoftwareApplicationConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgSoftwareApplication',\n title: 'Schema.org — SoftwareApplication',\n icon: SchemaOrgIcons.softwareApplication,\n fields: softwareApplicationFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgVideoObjectConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const videoObjectFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Video Name',\n type: 'string',\n description: 'The name of the video.',\n required: {key: 'nameRequired', message: 'Video name is required for Schema.org.'},\n },\n {\n name: 'description',\n title: 'Description',\n type: 'text',\n rows: 3,\n description: 'A description of the video.',\n },\n {\n name: 'thumbnailUrl',\n title: 'Thumbnail URL',\n type: 'url',\n description: 'URL of the video thumbnail image.',\n },\n {\n name: 'uploadDate',\n title: 'Upload Date',\n type: 'date',\n description: 'The date the video was uploaded.',\n },\n {\n name: 'contentUrl',\n title: 'Content URL',\n type: 'url',\n description: 'URL to the actual video file.',\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\nexport default function schemaOrgVideoObject(\n config: SchemaOrgVideoObjectConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgVideoObject',\n title: 'Schema.org — VideoObject',\n icon: SchemaOrgIcons.videoObject,\n fields: videoObjectFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgWebApplicationConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const webApplicationFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Application Name',\n type: 'string',\n description: 'The name of the web application.',\n required: {\n key: 'nameRequired',\n message: 'Application name is required for Schema.org.',\n },\n },\n {\n name: 'url',\n title: 'Application URL',\n type: 'url',\n description: 'URL of the web application.',\n required: {key: 'urlRequired', message: 'Application URL is required for Schema.org.'},\n },\n {\n name: 'applicationCategory',\n title: 'Application Category',\n type: 'string',\n description: 'The category of the application.',\n options: [\n {title: 'Developer Application', value: 'DeveloperApplication'},\n {title: 'Business Application', value: 'BusinessApplication'},\n {title: 'Game Application', value: 'GameApplication'},\n {title: 'Educational Application', value: 'EducationalApplication'},\n {title: 'Utilities Application', value: 'UtilitiesApplication'},\n {title: 'Social Networking Application', value: 'SocialNetworkingApplication'},\n ],\n },\n {\n name: 'operatingSystem',\n title: 'Operating System',\n type: 'string',\n description: 'The supported operating systems.',\n initialValue: 'All',\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org WebApplication — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgWebApplication } from 'sanity-plugin-seofields/schema/webApplication'\n *\n * // Default\n * schemaOrgWebApplication()\n *\n * // Custom validation messages\n * schemaOrgWebApplication({\n * validation: { nameRequired: 'Please enter the application name.' },\n * })\n * ```\n */\nexport default function schemaOrgWebApplication(\n config: SchemaOrgWebApplicationConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgWebApplication',\n title: 'Schema.org — WebApplication',\n icon: SchemaOrgIcons.webApplication,\n fields: webApplicationFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport {generateSchemaType, SchemaFieldDef, SchemaOrgConfig} from '../generator'\nimport {SchemaOrgIcons} from '../icons'\nimport type {SchemaOrgWebPageConfig} from './types'\n\n// ─── Field Definitions ────────────────────────────────────────────────────────\n\nexport const webPageFields: SchemaFieldDef[] = [\n {\n name: 'name',\n title: 'Page Name',\n type: 'string',\n description: 'The title of the page.',\n required: {key: 'nameRequired', message: 'Page name is required for Schema.org.'},\n },\n {\n name: 'url',\n title: 'Page URL',\n type: 'url',\n description: 'The full URL of the page.',\n required: {key: 'urlRequired', message: 'Page URL is required for Schema.org.'},\n },\n {\n name: 'description',\n title: 'Description',\n type: 'text',\n rows: 3,\n description: 'A short description of the page.',\n },\n {\n name: 'inLanguage',\n title: 'Language',\n type: 'string',\n description: 'The language of the page content, e.g. \"en\".',\n initialValue: 'en',\n options: [\n {title: 'English', value: 'en'},\n {title: 'Spanish', value: 'es'},\n {title: 'French', value: 'fr'},\n {title: 'German', value: 'de'},\n {title: 'Portuguese', value: 'pt'},\n {title: 'Italian', value: 'it'},\n {title: 'Dutch', value: 'nl'},\n {title: 'Japanese', value: 'ja'},\n {title: 'Chinese', value: 'zh'},\n {title: 'Korean', value: 'ko'},\n {title: 'Hindi', value: 'hi'},\n {title: 'Arabic', value: 'ar'},\n ],\n },\n {\n name: 'isPartOf',\n title: 'Part Of (Website)',\n type: 'object',\n description: 'The website this page belongs to.',\n jsonLdType: 'WebSite',\n fields: [\n {\n name: 'url',\n title: 'Website URL',\n type: 'url',\n description: 'URL of the parent website.',\n },\n ],\n },\n]\n\n// ─── Schema Factory ───────────────────────────────────────────────────────────\n\n/**\n * Schema.org WebPage — Sanity object type.\n *\n * @example\n * ```ts\n * import { schemaOrgWebPage } from 'sanity-plugin-seofields/schema/webPage'\n *\n * // Default\n * schemaOrgWebPage()\n *\n * // Custom validation messages\n * schemaOrgWebPage({\n * validation: { nameRequired: 'Please enter a page name.' },\n * })\n * ```\n */\nexport default function schemaOrgWebPage(\n config: SchemaOrgWebPageConfig = {},\n): SchemaTypeDefinition {\n return generateSchemaType(\n {\n name: 'schemaOrgWebPage',\n title: 'Schema.org — WebPage',\n icon: SchemaOrgIcons.webPage,\n fields: webPageFields,\n },\n config as SchemaOrgConfig,\n )\n}\n","/**\n * <WebsiteSchema> — Renders Schema.org WebSite JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { WebsiteSchema } from 'sanity-plugin-seofields/next/website'\n *\n * const data = await sanityFetch({ query: `*[_type == \"settings\"][0]{ website }` })\n *\n * <WebsiteSchema data={data.website} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {escapeJsonForScript} from '../utils'\nimport type {SchemaOrgWebsiteData} from './types'\n\nexport interface WebsiteSchemaProps {\n /** The Schema.org Website data from your Sanity GROQ query. */\n data?: SchemaOrgWebsiteData | null\n}\n\n/**\n * Builds a Schema.org WebSite JSON-LD object from Sanity data.\n * Returns `null` if required fields (name, url) are missing.\n */\nexport function buildWebsiteJsonLd(\n data?: SchemaOrgWebsiteData | null,\n): Record<string, unknown> | null {\n if (!data?.name || !data?.url) return null\n\n const jsonLd: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'WebSite',\n name: data.name,\n url: data.url,\n }\n\n if (data.description) jsonLd.description = data.description\n if (data.inLanguage) jsonLd.inLanguage = data.inLanguage\n\n if (data.publisher?.name) {\n const publisher: Record<string, unknown> = {\n '@type': 'Organization',\n name: data.publisher.name,\n }\n if (data.publisher.url) publisher.url = data.publisher.url\n if (data.publisher.logoUrl) {\n publisher.logo = {\n '@type': 'ImageObject',\n url: data.publisher.logoUrl,\n }\n }\n jsonLd.publisher = publisher\n }\n\n return jsonLd\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org WebSite data.\n * Renders nothing if required fields are missing.\n */\nexport function WebsiteSchema({data}: WebsiteSchemaProps): JSX.Element | null {\n const jsonLd = buildWebsiteJsonLd(data)\n if (!jsonLd) return null\n\n return (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{__html: escapeJsonForScript(JSON.stringify(jsonLd))}}\n />\n )\n}\n\nexport default WebsiteSchema\n","/**\n * <SchemaOrgScripts> — Renders multiple Schema.org JSON-LD script tags\n * from a combined `schemaOrg` array field.\n *\n * @example\n * ```tsx\n * import { SchemaOrgScripts } from 'sanity-plugin-seofields/next'\n *\n * const data = await sanityFetch({ query: `*[_type == \"settings\"][0]{ structuredData }` })\n *\n * <SchemaOrgScripts data={data.structuredData} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {aggregateRatingFields} from './aggregateRating/schema'\nimport {articleFields} from './article/schema'\nimport {blogPostingFields} from './blogPosting/schema'\nimport {brandFields} from './brand/schema'\nimport {breadcrumbListFields} from './breadcrumbList/schema'\nimport {contactPointFields} from './contactPoint/schema'\nimport {courseFields} from './course/schema'\nimport {eventFields} from './event/schema'\nimport {faqPageFields} from './faqPage/schema'\nimport {buildGenericJsonLd, SchemaFieldDef} from './generator'\nimport {howToFields} from './howTo/schema'\nimport {imageObjectFields} from './imageObject/schema'\nimport {localBusinessFields} from './localBusiness/schema'\nimport {offerFields} from './offer/schema'\nimport {buildOrganizationJsonLd} from './organization/component'\nimport {personFields} from './person/schema'\nimport {placeFields} from './place/schema'\nimport {postalAddressFields} from './postalAddress/schema'\nimport {productFields} from './product/schema'\nimport {reviewFields} from './review/schema'\nimport {SchemaOrgScript} from './SchemaOrgScript'\nimport {softwareApplicationFields} from './softwareApplication/schema'\nimport {videoObjectFields} from './videoObject/schema'\nimport {webApplicationFields} from './webApplication/schema'\nimport {webPageFields} from './webPage/schema'\nimport {buildWebsiteJsonLd} from './website/component'\n\n// ─── Type → Builder Registry ──────────────────────────────────────────────────\n\ninterface GenericEntry {\n schemaType: string\n fields: SchemaFieldDef[]\n requiredFields: string[]\n}\n\nconst GENERIC_TYPES: Record<string, GenericEntry> = {\n schemaOrgWebPage: {schemaType: 'WebPage', fields: webPageFields, requiredFields: ['name']},\n schemaOrgPerson: {schemaType: 'Person', fields: personFields, requiredFields: ['name']},\n schemaOrgBreadcrumbList: {\n schemaType: 'BreadcrumbList',\n fields: breadcrumbListFields,\n requiredFields: [],\n },\n schemaOrgImageObject: {\n schemaType: 'ImageObject',\n fields: imageObjectFields,\n requiredFields: ['url'],\n },\n schemaOrgArticle: {schemaType: 'Article', fields: articleFields, requiredFields: ['headline']},\n schemaOrgBlogPosting: {\n schemaType: 'BlogPosting',\n fields: blogPostingFields,\n requiredFields: ['headline'],\n },\n schemaOrgFAQPage: {schemaType: 'FAQPage', fields: faqPageFields, requiredFields: []},\n schemaOrgHowTo: {schemaType: 'HowTo', fields: howToFields, requiredFields: ['name']},\n schemaOrgProduct: {schemaType: 'Product', fields: productFields, requiredFields: ['name']},\n schemaOrgOffer: {schemaType: 'Offer', fields: offerFields, requiredFields: ['price']},\n schemaOrgAggregateRating: {\n schemaType: 'AggregateRating',\n fields: aggregateRatingFields,\n requiredFields: ['ratingValue'],\n },\n schemaOrgReview: {schemaType: 'Review', fields: reviewFields, requiredFields: []},\n schemaOrgBrand: {schemaType: 'Brand', fields: brandFields, requiredFields: ['name']},\n schemaOrgLocalBusiness: {\n schemaType: 'LocalBusiness',\n fields: localBusinessFields,\n requiredFields: ['name'],\n },\n schemaOrgPostalAddress: {\n schemaType: 'PostalAddress',\n fields: postalAddressFields,\n requiredFields: [],\n },\n schemaOrgContactPoint: {\n schemaType: 'ContactPoint',\n fields: contactPointFields,\n requiredFields: [],\n },\n schemaOrgSoftwareApplication: {\n schemaType: 'SoftwareApplication',\n fields: softwareApplicationFields,\n requiredFields: ['name'],\n },\n schemaOrgWebApplication: {\n schemaType: 'WebApplication',\n fields: webApplicationFields,\n requiredFields: ['name'],\n },\n schemaOrgEvent: {schemaType: 'Event', fields: eventFields, requiredFields: ['name']},\n schemaOrgPlace: {schemaType: 'Place', fields: placeFields, requiredFields: ['name']},\n schemaOrgVideoObject: {\n schemaType: 'VideoObject',\n fields: videoObjectFields,\n requiredFields: ['name'],\n },\n schemaOrgCourse: {schemaType: 'Course', fields: courseFields, requiredFields: ['name']},\n}\n\nfunction buildJsonLdForItem(item: Record<string, unknown>): Record<string, unknown> | null {\n const type = item._type as string | undefined\n if (!type) return null\n\n // Website and Organization use custom builders\n if (type === 'schemaOrgWebsite') {\n return buildWebsiteJsonLd(item as Parameters<typeof buildWebsiteJsonLd>[0])\n }\n if (type === 'schemaOrgOrganization') {\n return buildOrganizationJsonLd(item as Parameters<typeof buildOrganizationJsonLd>[0])\n }\n\n // All other types use the generic builder\n const entry = GENERIC_TYPES[type]\n if (!entry) return null\n return buildGenericJsonLd(entry.schemaType, item, entry.fields, entry.requiredFields)\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport interface SchemaOrgScriptsProps {\n /** Array of Schema.org items from the combined `schemaOrg` field. */\n data?: Array<Record<string, unknown>> | null\n}\n\n/**\n * Renders one `<script type=\"application/ld+json\">` tag per Schema.org item.\n * Skips items that fail validation (missing required fields).\n */\nexport function SchemaOrgScripts({data}: SchemaOrgScriptsProps): JSX.Element | null {\n if (!data?.length) return null\n\n const scripts = data\n .map((item) => buildJsonLdForItem(item))\n .filter((jsonLd): jsonLd is Record<string, unknown> => jsonLd !== null)\n\n if (!scripts.length) return null\n\n return (\n <>\n {scripts.map((jsonLd) => (\n <SchemaOrgScript key={JSON.stringify(jsonLd)} jsonLd={jsonLd} />\n ))}\n </>\n )\n}\n\nexport default SchemaOrgScripts\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {aggregateRatingFields} from './schema'\nimport type {SchemaOrgAggregateRatingData} from './types'\n\nexport interface AggregateRatingSchemaProps {\n data?: SchemaOrgAggregateRatingData | null\n}\n\nexport function buildAggregateRatingJsonLd(\n data?: SchemaOrgAggregateRatingData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'AggregateRating',\n data as Record<string, unknown> | null | undefined,\n aggregateRatingFields,\n ['ratingValue'],\n )\n}\n\nexport function AggregateRatingSchema({data}: AggregateRatingSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildAggregateRatingJsonLd(data)} />\n}\n\nexport default AggregateRatingSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {articleFields} from './schema'\nimport type {SchemaOrgArticleData} from './types'\n\nexport interface ArticleSchemaProps {\n /** The Schema.org Article data from your Sanity GROQ query. */\n data?: SchemaOrgArticleData | null\n}\n\n/**\n * Builds a Schema.org Article JSON-LD object from Sanity data.\n * Returns `null` if required fields (headline) are missing.\n */\nexport function buildArticleJsonLd(\n data?: SchemaOrgArticleData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Article',\n data as Record<string, unknown> | null | undefined,\n articleFields,\n ['headline'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Article data.\n * Renders nothing if required fields are missing.\n */\nexport function ArticleSchema({data}: ArticleSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildArticleJsonLd(data)} />\n}\n\nexport default ArticleSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {blogPostingFields} from './schema'\nimport type {SchemaOrgBlogPostingData} from './types'\n\nexport interface BlogPostingSchemaProps {\n /** The Schema.org BlogPosting data from your Sanity GROQ query. */\n data?: SchemaOrgBlogPostingData | null\n}\n\n/**\n * Builds a Schema.org BlogPosting JSON-LD object from Sanity data.\n * Returns `null` if required fields (headline) are missing.\n */\nexport function buildBlogPostingJsonLd(\n data?: SchemaOrgBlogPostingData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'BlogPosting',\n data as Record<string, unknown> | null | undefined,\n blogPostingFields,\n ['headline'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org BlogPosting data.\n * Renders nothing if required fields are missing.\n */\nexport function BlogPostingSchema({data}: BlogPostingSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildBlogPostingJsonLd(data)} />\n}\n\nexport default BlogPostingSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {brandFields} from './schema'\nimport type {SchemaOrgBrandData} from './types'\n\nexport interface BrandSchemaProps {\n data?: SchemaOrgBrandData | null\n}\n\nexport function buildBrandJsonLd(data?: SchemaOrgBrandData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Brand',\n data as Record<string, unknown> | null | undefined,\n brandFields,\n ['name'],\n )\n}\n\nexport function BrandSchema({data}: BrandSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildBrandJsonLd(data)} />\n}\n\nexport default BrandSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {breadcrumbListFields} from './schema'\nimport type {SchemaOrgBreadcrumbListData} from './types'\n\nexport interface BreadcrumbListSchemaProps {\n /** The Schema.org BreadcrumbList data from your Sanity GROQ query. */\n data?: SchemaOrgBreadcrumbListData | null\n}\n\n/**\n * Builds a Schema.org BreadcrumbList JSON-LD object from Sanity data.\n * Returns `null` if data is missing.\n */\nexport function buildBreadcrumbListJsonLd(\n data?: SchemaOrgBreadcrumbListData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'BreadcrumbList',\n data as Record<string, unknown> | null | undefined,\n breadcrumbListFields,\n [],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org BreadcrumbList data.\n * Renders nothing if data is missing.\n */\nexport function BreadcrumbListSchema({data}: BreadcrumbListSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildBreadcrumbListJsonLd(data)} />\n}\n\nexport default BreadcrumbListSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {contactPointFields} from './schema'\nimport type {SchemaOrgContactPointData} from './types'\n\nexport interface ContactPointSchemaProps {\n data?: SchemaOrgContactPointData | null\n}\n\nexport function buildContactPointJsonLd(\n data?: SchemaOrgContactPointData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'ContactPoint',\n data as Record<string, unknown> | null | undefined,\n contactPointFields,\n ['contactType'],\n )\n}\n\nexport function ContactPointSchema({data}: ContactPointSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildContactPointJsonLd(data)} />\n}\n\nexport default ContactPointSchema\n","/**\n * <CourseSchema> — Renders Schema.org Course JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { CourseSchema } from 'sanity-plugin-seofields/next/course'\n *\n * const data = await sanityFetch({ query: `*[_type == \"course\"][0]{ seo }` })\n *\n * <CourseSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {courseFields} from './schema'\nimport type {SchemaOrgCourseData} from './types'\n\nexport interface CourseSchemaProps {\n /** The Schema.org Course data from your Sanity GROQ query. */\n data?: SchemaOrgCourseData | null\n}\n\n/**\n * Builds a Schema.org Course JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildCourseJsonLd(\n data?: SchemaOrgCourseData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Course',\n data as Record<string, unknown> | null | undefined,\n courseFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Course data.\n * Renders nothing if required fields are missing.\n */\nexport function CourseSchema({data}: CourseSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildCourseJsonLd(data)} />\n}\n\nexport default CourseSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {eventFields} from './schema'\nimport type {SchemaOrgEventData} from './types'\n\nexport interface EventSchemaProps {\n /** The Schema.org Event data from your Sanity GROQ query. */\n data?: SchemaOrgEventData | null\n}\n\n/**\n * Builds a Schema.org Event JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildEventJsonLd(data?: SchemaOrgEventData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Event',\n data as Record<string, unknown> | null | undefined,\n eventFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Event data.\n * Renders nothing if required fields are missing.\n */\nexport function EventSchema({data}: EventSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildEventJsonLd(data)} />\n}\n\nexport default EventSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {faqPageFields} from './schema'\nimport type {SchemaOrgFAQPageData} from './types'\n\nexport interface FAQPageSchemaProps {\n /** The Schema.org FAQPage data from your Sanity GROQ query. */\n data?: SchemaOrgFAQPageData | null\n}\n\n/**\n * Builds a Schema.org FAQPage JSON-LD object from Sanity data.\n * Returns `null` if data is missing.\n */\nexport function buildFAQPageJsonLd(\n data?: SchemaOrgFAQPageData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'FAQPage',\n data as Record<string, unknown> | null | undefined,\n faqPageFields,\n [],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org FAQPage data.\n * Renders nothing if data is missing.\n */\nexport function FAQPageSchema({data}: FAQPageSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildFAQPageJsonLd(data)} />\n}\n\nexport default FAQPageSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {howToFields} from './schema'\nimport type {SchemaOrgHowToData} from './types'\n\nexport interface HowToSchemaProps {\n /** The Schema.org HowTo data from your Sanity GROQ query. */\n data?: SchemaOrgHowToData | null\n}\n\n/**\n * Builds a Schema.org HowTo JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildHowToJsonLd(data?: SchemaOrgHowToData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'HowTo',\n data as Record<string, unknown> | null | undefined,\n howToFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org HowTo data.\n * Renders nothing if required fields are missing.\n */\nexport function HowToSchema({data}: HowToSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildHowToJsonLd(data)} />\n}\n\nexport default HowToSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {imageObjectFields} from './schema'\nimport type {SchemaOrgImageObjectData} from './types'\n\nexport interface ImageObjectSchemaProps {\n data?: SchemaOrgImageObjectData | null\n}\n\nexport function buildImageObjectJsonLd(\n data?: SchemaOrgImageObjectData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'ImageObject',\n data as Record<string, unknown> | null | undefined,\n imageObjectFields,\n ['url'],\n )\n}\n\nexport function ImageObjectSchema({data}: ImageObjectSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildImageObjectJsonLd(data)} />\n}\n\nexport default ImageObjectSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {localBusinessFields} from './schema'\nimport type {SchemaOrgLocalBusinessData} from './types'\n\nexport interface LocalBusinessSchemaProps {\n /** The Schema.org LocalBusiness data from your Sanity GROQ query. */\n data?: SchemaOrgLocalBusinessData | null\n}\n\n/**\n * Builds a Schema.org LocalBusiness JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildLocalBusinessJsonLd(\n data?: SchemaOrgLocalBusinessData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'LocalBusiness',\n data as Record<string, unknown> | null | undefined,\n localBusinessFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org LocalBusiness data.\n * Renders nothing if required fields are missing.\n */\nexport function LocalBusinessSchema({data}: LocalBusinessSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildLocalBusinessJsonLd(data)} />\n}\n\nexport default LocalBusinessSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {offerFields} from './schema'\nimport type {SchemaOrgOfferData} from './types'\n\nexport interface OfferSchemaProps {\n data?: SchemaOrgOfferData | null\n}\n\nexport function buildOfferJsonLd(data?: SchemaOrgOfferData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Offer',\n data as Record<string, unknown> | null | undefined,\n offerFields,\n ['price'],\n )\n}\n\nexport function OfferSchema({data}: OfferSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildOfferJsonLd(data)} />\n}\n\nexport default OfferSchema\n","/**\n * <PersonSchema> — Renders Schema.org Person JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { PersonSchema } from 'sanity-plugin-seofields/next/person'\n *\n * const data = await sanityFetch({ query: `*[_type == \"teamMember\"][0]{ person }` })\n *\n * <PersonSchema data={data.person} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {personFields} from './schema'\nimport type {SchemaOrgPersonData} from './types'\n\nexport interface PersonSchemaProps {\n /** The Schema.org Person data from your Sanity GROQ query. */\n data?: SchemaOrgPersonData | null\n}\n\n/**\n * Builds a Schema.org Person JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildPersonJsonLd(\n data?: SchemaOrgPersonData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Person',\n data as Record<string, unknown> | null | undefined,\n personFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Person data.\n * Renders nothing if required fields are missing.\n */\nexport function PersonSchema({data}: PersonSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildPersonJsonLd(data)} />\n}\n\nexport default PersonSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {placeFields} from './schema'\nimport type {SchemaOrgPlaceData} from './types'\n\nexport interface PlaceSchemaProps {\n /** The Schema.org Place data from your Sanity GROQ query. */\n data?: SchemaOrgPlaceData | null\n}\n\n/**\n * Builds a Schema.org Place JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildPlaceJsonLd(data?: SchemaOrgPlaceData | null): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Place',\n data as Record<string, unknown> | null | undefined,\n placeFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Place data.\n * Renders nothing if required fields are missing.\n */\nexport function PlaceSchema({data}: PlaceSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildPlaceJsonLd(data)} />\n}\n\nexport default PlaceSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {postalAddressFields} from './schema'\nimport type {SchemaOrgPostalAddressData} from './types'\n\nexport interface PostalAddressSchemaProps {\n data?: SchemaOrgPostalAddressData | null\n}\n\nexport function buildPostalAddressJsonLd(\n data?: SchemaOrgPostalAddressData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'PostalAddress',\n data as Record<string, unknown> | null | undefined,\n postalAddressFields,\n [],\n )\n}\n\nexport function PostalAddressSchema({data}: PostalAddressSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildPostalAddressJsonLd(data)} />\n}\n\nexport default PostalAddressSchema\n","/**\n * <ProductSchema> — Renders Schema.org Product JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { ProductSchema } from 'sanity-plugin-seofields/next/product'\n *\n * const data = await sanityFetch({ query: `*[_type == \"product\"][0]{ seo }` })\n *\n * <ProductSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {productFields} from './schema'\nimport type {SchemaOrgProductData} from './types'\n\nexport interface ProductSchemaProps {\n /** The Schema.org Product data from your Sanity GROQ query. */\n data?: SchemaOrgProductData | null\n}\n\n/**\n * Builds a Schema.org Product JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildProductJsonLd(\n data?: SchemaOrgProductData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Product',\n data as Record<string, unknown> | null | undefined,\n productFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Product data.\n * Renders nothing if required fields are missing.\n */\nexport function ProductSchema({data}: ProductSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildProductJsonLd(data)} />\n}\n\nexport default ProductSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {reviewFields} from './schema'\nimport type {SchemaOrgReviewData} from './types'\n\nexport interface ReviewSchemaProps {\n /** The Schema.org Review data from your Sanity GROQ query. */\n data?: SchemaOrgReviewData | null\n}\n\n/**\n * Builds a Schema.org Review JSON-LD object from Sanity data.\n * Returns `null` if data is missing.\n */\nexport function buildReviewJsonLd(\n data?: SchemaOrgReviewData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'Review',\n data as Record<string, unknown> | null | undefined,\n reviewFields,\n [],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org Review data.\n * Renders nothing if data is missing.\n */\nexport function ReviewSchema({data}: ReviewSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildReviewJsonLd(data)} />\n}\n\nexport default ReviewSchema\n","/**\n * <SoftwareApplicationSchema> — Renders Schema.org SoftwareApplication JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { SoftwareApplicationSchema } from 'sanity-plugin-seofields/next/softwareApplication'\n *\n * const data = await sanityFetch({ query: `*[_type == \"app\"][0]{ seo }` })\n *\n * <SoftwareApplicationSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {softwareApplicationFields} from './schema'\nimport type {SchemaOrgSoftwareApplicationData} from './types'\n\nexport interface SoftwareApplicationSchemaProps {\n /** The Schema.org SoftwareApplication data from your Sanity GROQ query. */\n data?: SchemaOrgSoftwareApplicationData | null\n}\n\n/**\n * Builds a Schema.org SoftwareApplication JSON-LD object from Sanity data.\n * Returns `null` if required fields (name) are missing.\n */\nexport function buildSoftwareApplicationJsonLd(\n data?: SchemaOrgSoftwareApplicationData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'SoftwareApplication',\n data as Record<string, unknown> | null | undefined,\n softwareApplicationFields,\n ['name'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org SoftwareApplication data.\n * Renders nothing if required fields are missing.\n */\nexport function SoftwareApplicationSchema({\n data,\n}: SoftwareApplicationSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildSoftwareApplicationJsonLd(data)} />\n}\n\nexport default SoftwareApplicationSchema\n","import {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {videoObjectFields} from './schema'\nimport type {SchemaOrgVideoObjectData} from './types'\n\nexport interface VideoObjectSchemaProps {\n data?: SchemaOrgVideoObjectData | null\n}\n\nexport function buildVideoObjectJsonLd(\n data?: SchemaOrgVideoObjectData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'VideoObject',\n data as Record<string, unknown> | null | undefined,\n videoObjectFields,\n ['name'],\n )\n}\n\nexport function VideoObjectSchema({data}: VideoObjectSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildVideoObjectJsonLd(data)} />\n}\n\nexport default VideoObjectSchema\n","/**\n * <WebApplicationSchema> — Renders Schema.org WebApplication JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { WebApplicationSchema } from 'sanity-plugin-seofields/next/webApplication'\n *\n * const data = await sanityFetch({ query: `*[_type == \"app\"][0]{ seo }` })\n *\n * <WebApplicationSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {webApplicationFields} from './schema'\nimport type {SchemaOrgWebApplicationData} from './types'\n\nexport interface WebApplicationSchemaProps {\n /** The Schema.org WebApplication data from your Sanity GROQ query. */\n data?: SchemaOrgWebApplicationData | null\n}\n\n/**\n * Builds a Schema.org WebApplication JSON-LD object from Sanity data.\n * Returns `null` if required fields (name, url) are missing.\n */\nexport function buildWebApplicationJsonLd(\n data?: SchemaOrgWebApplicationData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'WebApplication',\n data as Record<string, unknown> | null | undefined,\n webApplicationFields,\n ['name', 'url'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org WebApplication data.\n * Renders nothing if required fields are missing.\n */\nexport function WebApplicationSchema({data}: WebApplicationSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildWebApplicationJsonLd(data)} />\n}\n\nexport default WebApplicationSchema\n","/**\n * <WebPageSchema> — Renders Schema.org WebPage JSON-LD structured data.\n *\n * @example\n * ```tsx\n * import { WebPageSchema } from 'sanity-plugin-seofields/next/webPage'\n *\n * const data = await sanityFetch({ query: `*[_type == \"page\"][0]{ seo }` })\n *\n * <WebPageSchema data={data.seo} />\n * ```\n */\nimport {JSX} from 'react'\n\nimport {buildGenericJsonLd} from '../generator'\nimport {SchemaOrgScript} from '../SchemaOrgScript'\nimport {webPageFields} from './schema'\nimport type {SchemaOrgWebPageData} from './types'\n\nexport interface WebPageSchemaProps {\n /** The Schema.org WebPage data from your Sanity GROQ query. */\n data?: SchemaOrgWebPageData | null\n}\n\n/**\n * Builds a Schema.org WebPage JSON-LD object from Sanity data.\n * Returns `null` if required fields (name, url) are missing.\n */\nexport function buildWebPageJsonLd(\n data?: SchemaOrgWebPageData | null,\n): Record<string, unknown> | null {\n return buildGenericJsonLd(\n 'WebPage',\n data as Record<string, unknown> | null | undefined,\n webPageFields,\n ['name', 'url'],\n )\n}\n\n/**\n * Renders a `<script type=\"application/ld+json\">` tag with Schema.org WebPage data.\n * Renders nothing if required fields are missing.\n */\nexport function WebPageSchema({data}: WebPageSchemaProps): JSX.Element | null {\n return <SchemaOrgScript jsonLd={buildWebPageJsonLd(data)} />\n}\n\nexport default WebPageSchema\n"],"mappings":"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","names":["React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
package/dist/next.d.cts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { S as SanityImage, a as SanityImageWithAlt, b as SeoFields } from './types-R3n9Fu4w.cjs';
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
export { AggregateRatingSchema, AggregateRatingSchemaProps, ArticleSchema, ArticleSchemaProps, BlogPostingSchema, BlogPostingSchemaProps, BrandSchema, BrandSchemaProps, BreadcrumbListSchema, BreadcrumbListSchemaProps, ContactPointSchema, ContactPointSchemaProps, CourseSchema, CourseSchemaProps, EventSchema, EventSchemaProps, FAQPageSchema, FAQPageSchemaProps, HowToSchema, HowToSchemaProps, ImageObjectSchema, ImageObjectSchemaProps, LocalBusinessSchema, LocalBusinessSchemaProps, OfferSchema, OfferSchemaProps, OrganizationSchema, OrganizationSchemaProps, PersonSchema, PersonSchemaProps, PlaceSchema, PlaceSchemaProps, PostalAddressSchema, PostalAddressSchemaProps, ProductSchema, ProductSchemaProps, ReviewSchema, ReviewSchemaProps, SchemaOrgScripts, SchemaOrgScriptsProps, SoftwareApplicationSchema, SoftwareApplicationSchemaProps, VideoObjectSchema, VideoObjectSchemaProps, WebApplicationSchema, WebApplicationSchemaProps, WebPageSchema, WebPageSchemaProps, WebsiteSchema, WebsiteSchemaProps, buildAggregateRatingJsonLd, buildArticleJsonLd, buildBlogPostingJsonLd, buildBrandJsonLd, buildBreadcrumbListJsonLd, buildContactPointJsonLd, buildCourseJsonLd, buildEventJsonLd, buildFAQPageJsonLd, buildHowToJsonLd, buildImageObjectJsonLd, buildLocalBusinessJsonLd, buildOfferJsonLd, buildOrganizationJsonLd, buildPersonJsonLd, buildPlaceJsonLd, buildPostalAddressJsonLd, buildProductJsonLd, buildReviewJsonLd, buildSoftwareApplicationJsonLd, buildVideoObjectJsonLd, buildWebApplicationJsonLd, buildWebPageJsonLd, buildWebsiteJsonLd } from './schema/next.cjs';
|
|
4
|
+
import 'react';
|
|
5
|
+
import './types-CVaAX7uy.cjs';
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
8
|
* Headless CMS integration helpers for sanity-plugin-seofields
|
package/dist/next.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { S as SanityImage, a as SanityImageWithAlt, b as SeoFields } from './types-R3n9Fu4w.js';
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
export { AggregateRatingSchema, AggregateRatingSchemaProps, ArticleSchema, ArticleSchemaProps, BlogPostingSchema, BlogPostingSchemaProps, BrandSchema, BrandSchemaProps, BreadcrumbListSchema, BreadcrumbListSchemaProps, ContactPointSchema, ContactPointSchemaProps, CourseSchema, CourseSchemaProps, EventSchema, EventSchemaProps, FAQPageSchema, FAQPageSchemaProps, HowToSchema, HowToSchemaProps, ImageObjectSchema, ImageObjectSchemaProps, LocalBusinessSchema, LocalBusinessSchemaProps, OfferSchema, OfferSchemaProps, OrganizationSchema, OrganizationSchemaProps, PersonSchema, PersonSchemaProps, PlaceSchema, PlaceSchemaProps, PostalAddressSchema, PostalAddressSchemaProps, ProductSchema, ProductSchemaProps, ReviewSchema, ReviewSchemaProps, SchemaOrgScripts, SchemaOrgScriptsProps, SoftwareApplicationSchema, SoftwareApplicationSchemaProps, VideoObjectSchema, VideoObjectSchemaProps, WebApplicationSchema, WebApplicationSchemaProps, WebPageSchema, WebPageSchemaProps, WebsiteSchema, WebsiteSchemaProps, buildAggregateRatingJsonLd, buildArticleJsonLd, buildBlogPostingJsonLd, buildBrandJsonLd, buildBreadcrumbListJsonLd, buildContactPointJsonLd, buildCourseJsonLd, buildEventJsonLd, buildFAQPageJsonLd, buildHowToJsonLd, buildImageObjectJsonLd, buildLocalBusinessJsonLd, buildOfferJsonLd, buildOrganizationJsonLd, buildPersonJsonLd, buildPlaceJsonLd, buildPostalAddressJsonLd, buildProductJsonLd, buildReviewJsonLd, buildSoftwareApplicationJsonLd, buildVideoObjectJsonLd, buildWebApplicationJsonLd, buildWebPageJsonLd, buildWebsiteJsonLd } from './schema/next.js';
|
|
4
|
+
import 'react';
|
|
5
|
+
import './types-Ci-ZZT7A.js';
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
8
|
* Headless CMS integration helpers for sanity-plugin-seofields
|