Aller au contenu

Schémas personnalisés

Lorsque votre projet nécessite des types Schema.org non couverts par le catalogue intégré (tels que PodcastEpisode, MedicalWebPage ou TechArticle), utilisez defineSchema() pour créer vos propres builders avec le même niveau de validation et d’intégration au @graph.


Appelez defineSchema() en transmettant le nom du type @type Schema.org et un schéma Zod :

src/lib/schemas/podcast.ts
import { defineSchema } from '@unschema-graph/core';
import { z } from 'zod';
export const PodcastEpisode = defineSchema(
'PodcastEpisode',
z.object({
name: z.string().min(1),
url: z.string().url(),
duration: z.string().optional(),
partOfSeries: z.string().optional(),
})
);

Votre builder personnalisé s’utilise désormais exactement comme les builders de base :

src/pages/podcast/[slug].astro
import { PodcastEpisode } from '../../lib/schemas/podcast';
const episode = PodcastEpisode({
'@id': '#episode-42',
name: 'Créer avec Astro & unschema-graph',
url: 'https://mon-site.fr/podcast/episode-42',
duration: 'PT45M',
partOfSeries: '#podcast-series',
});

Chaque builder personnalisé :

  • Injecte automatiquement le type Schema.org ("PodcastEpisode").
  • Accepte un identifiant optionnel @id.
  • Rejette les clés inconnues pour bloquer les fautes de frappe.
  • Respecte le mode de sévérité onError (throw, warn, silent).
  • Expose .schema, .entityType et .safeParse().

Tous les schémas Zod du catalogue sont exportés avec le suffixe *Schema (PersonSchema, OrganizationSchema, ImageObjectSchema, IsoDateSchema). Vous pouvez les imbriquer directement dans vos schémas :

src/lib/schemas/podcast-series.ts
import {
defineSchema,
PersonSchema,
ImageObjectSchema,
} from '@unschema-graph/core';
import { z } from 'zod';
export const PodcastSeries = defineSchema(
'PodcastSeries',
z.object({
name: z.string(),
description: z.string(),
author: PersonSchema,
image: ImageObjectSchema.optional(),
})
);