CMS & Content Collections
Outcome
Section titled “Outcome”Map untrusted CMS entries into explicit builder inputs at one validation boundary.
Local validation — Builders reject unknown properties and expose
safeParse()for external data.Schema.org — The vocabulary defines property meaning; it does not guarantee any search appearance.
Google eligibility — Google requirements are additional and can change. Valid markup never guarantees a rich result.
Prerequisites
Section titled “Prerequisites”- A trustworthy canonical URL and
baseUrl. - Current, visible data from your domain source.
- Related builders:
Article.
Recommended graph
Section titled “Recommended graph”Article— primary node
Minimal example
Section titled “Minimal example”import { Article } from '@unschema-graph/core';
const entity = Article({ "headline": "Structured data with Astro", "image": "/images/structured-data.jpg", "datePublished": "2026-09-29", "author": "Ada Lovelace"});Production pattern
Section titled “Production pattern”Validate collection shape first, map only known fields, then call safeParse() and surface diagnostics with the entry identifier.
const result = Article.safeParse(cmsData);if (!result.success) { throw new Error(result.error.issues.map((issue) => issue.message).join('\n'));}
const graph = buildJsonLdGraph([result.data], { baseUrl: 'https://example.com' });Environment variants
Section titled “Environment variants”| Astro | Svelte 5 / SvelteKit | Core |
|---|---|---|
<Schema items={items} /> |
<Schema items={items} /> |
serializeJsonLd(buildJsonLdGraph(items)) |
Common errors and diagnosis
Section titled “Common errors and diagnosis”- Spreading the complete CMS object into a strict builder. Compare the source data,
safeParse()result, and JSON-LD in the built HTML. - Silently replacing missing required data. Compare the source data,
safeParse()result, and JSON-LD in the built HTML. - Trusting rich text or URLs without validation. Compare the source data,
safeParse()result, and JSON-LD in the built HTML.
Validation
Section titled “Validation”- Run
safeParse()at the data boundary. - Inspect the script in built HTML.
- Run
unschema-graph auditagainst the output directory. - Schema.org / official documentation.
Final checklist
Section titled “Final checklist”- Marked-up content is visible and current.
- Every reusable identity has a stable
@id. - Local validation and the build audit pass.
- Eligibility is understood as non-guaranteed.
Go deeper: graphs and references, validation, audit CLI.