Skip to content

Type de ressource : Schéma Sanity (Document / Object / Block)
Fichier source : sanity-studio/schemas/[filename].ts
Statut : [Actif / Déprécié / En développement]
Slice : [Numéro de la tranche verticale]
Version : 1.0


[Description concise du rôle de ce schéma dans l’architecture du site]

  • [Objectif principal : ce que le schéma permet de modéliser]
  • [Bénéfice pour l’architecture ou les utilisateurs]
  • [Cas d’usage principal]
  • [Cas d’usage secondaire si applicable]
Relation Schéma Type Description
Dépend de [Nom] [Référence/Composition] [Description]
Utilisé par [Nom] [Référence] [Description]

Nom du champ Type Obligatoire Description Validation
fieldName string ✅ [Description] [Règles de validation]
slug slug ✅ [Description] source: 'title'
status string ✅ [Description] Options: draft, published, archived
Nom du champ Type Obligatoire Description Fallback
seo.metaTitle string ❌ Meta title pour SEO title
seo.metaDescription text ❌ Meta description excerpt
seo.ogImage image ❌ Image Open Graph mainImage

2.3. Champs de contenu riche (si applicable)

Section titled “2.3. Champs de contenu riche (si applicable)”
Nom du champ Type Description
body array Contenu Portable Text (blocs + spans)
pageBuilder array Liste de blocs PageBuilder (hero, features, etc.)

Champ Type Validation Description
title string Rule.required() Titre obligatoire
slug slug source: 'title' Généré automatiquement depuis le titre
Champ Type Description
_id string ID unique du document
_type string Type du document
_createdAt string Date de création
_updatedAt string Date de dernière modification
État Description Transition
draft Document en brouillon → published
published Document publié → archived
archived Document archivé → published

sanity-studio/schemas/[filename].ts
import { defineField, defineType } from 'sanity';
export default defineType({
name: '[schemaName]',
title: '[Titre lisible]',
type: 'document', // ou 'object', 'block'
fields: [
defineField({
name: 'title',
title: 'Titre',
type: 'string',
validation: (Rule) => Rule.required(),
}),
defineField({
name: 'slug',
title: 'Slug',
type: 'slug',
options: { source: 'title' },
validation: (Rule) => Rule.required(),
}),
// ... autres champs
],
preview: {
select: {
title: 'title',
subtitle: 'publishedAt',
media: 'mainImage',
},
},
});
*[_type == "[schemaName]" && status == "published"] {
_id,
title,
slug,
publishedAt,
mainImage,
excerpt
} | order(publishedAt desc)
*[_type == "[schemaName]" && slug.current == $slug][0] {
...,
author->{name, image},
categories[]->{title, slug}
}

4.3. Types TypeScript (génération automatique)

Section titled “4.3. Types TypeScript (génération automatique)”
// src/types/sanity.d.ts (généré via sanity-typegen)
export type [SchemaName] = {
_id: string;
_type: '[schemaName]';
title: string;
slug: { _type: 'slug'; current: string };
publishedAt: string;
status: 'draft' | 'published' | 'archived';
mainImage?: ImageAsset;
excerpt?: string;
seo?: SeoObject;
};

Scénario Description Résultat attendu
Validation du titre Créer un document sans titre Erreur de validation
Génération du slug Créer un document avec titre Slug généré automatiquement
Publication Changer le statut de draft à published Document passe en published
Scénario Dépendances Description Résultat attendu
Consommation Astro Route Astro Récupération des données via GROQ Données typées correctement
Indexation Pagefind Build Astro Indexation du contenu généré Contenu indexé et searchable
Scénario Parcours utilisateur Description Résultat attendu
Création → Publication Sanity Studio → Build → Site Créer et publier un document Document visible sur le site

Composant Type Rôle Méthode d’intégration
Route Astro L2 Rendu du contenu Requête GROQ via getSanityClient()
Pagefind L2 Indexation Indexation du HTML généré
Webhook L3 Déclenchement rebuild Événement publish
  • Le schéma doit être compatible avec sanity-typegen
  • Les requêtes GROQ doivent utiliser les projections explicites
  • Le statut published doit être filtré en production
  • Le schéma ne casse aucun schéma existant
  • Les requêtes GROQ retournent les données attendues
  • Les types TypeScript sont générés correctement
  • Les tests E2E passent

  • ✅ Les documents draft ne sont accessibles qu’en mode preview
  • ✅ Les permissions Sanity sont configurées par rôle
  • ✅ Les tokens API ont les permissions minimales nécessaires
  • ✅ Les champs obligatoires sont validés côté Sanity
  • ✅ Les slugs sont uniques et valides
  • ✅ Les statuts suivent le cycle draft → published → archived

Limite Valeur Stratégie d’optimisation
Taille du document 16 MB Éviter les champs trop volumineux
Profondeur des références 10 niveaux Limiter les références imbriquées
  • ✅ Utilisation de projections GROQ pour réduire la taille des réponses
  • ✅ Mise en cache CDN pour les requêtes en production

Symptôme Cause probable Solution
Schéma non visible dans Studio Cache du navigateur Vider le cache et rafraîchir
Types TypeScript incorrects Schéma modifié sans régénération Exécuter sanity typegen generate
Requête GROQ vide Filtre incorrect Vérifier la syntaxe GROQ
Terminal window
# Extraire le schéma depuis Sanity
npx sanity schema extract
# Générer les types TypeScript
npx sanity typegen generate

  • ✅ Toujours utiliser des types générés par sanity-typegen
  • ✅ Centraliser les requêtes GROQ dans src/lib/queries.ts
  • ✅ Documenter les champs et leurs validations
  • ✅ Utiliser defineField pour chaque champ
  • ✅ Configurer le preview pour une meilleure UX dans Studio
  • ✅ Utiliser des validations appropriées
  • ✅ Mettre à jour ce fichier lors de toute modification du schéma
  • ✅ Régénérer les types après modification
  • ✅ Tester les requêtes GROQ après modification

  • [Évolution 1]
  • [Évolution 2]
  • ❌ [Limitation 1]
  • ❌ [Limitation 2]

  • Documentation Sanity : [Lien vers docs officielles]
  • DAT L1 : §4 - Modélisation et Schémas des Données
  • Schémas dépendants : [Liste]
  • Pages Astro consommatrices : [Liste des fichiers .astro]

Date Version Description Auteur
YYYY-MM-DD 1.0 Création initiale [Nom]
Edit page

Last updated: