Skip to content

SPEC — Indexeur Pagefind Unifié (Sanity + SSR + Docs)

SPEC — Indexeur Pagefind Unifié (Sanity + SSR + Docs)

Documentation technique

Cycle : DOC → SPEC → CODE → TEST
Scope : Indexation complète des contenus Sanity (Page d’accueil, Articles de Blog) et Starlight Docs dans Pagefind avec badges de types précis (PAGE, BLOG, DOC).
Destination Spec : docs/PM/phase0-pagefind-sanity-indexer.spec.md

1. Problèmes Identifiés1/2

  1. Absence de la Page d’accueil & des Articles de Blog dans les résultats de recherche :

    • En mode SSR (output: "server"), Astro ne pré-génère pas de fichiers HTML statiques dans dist/client pour les routes serveur (/ et /blog/[slug]).
    • La commande pagefind --site dist/client seule ne trouvait donc que la page de documentation statique Starlight (/overview/index.html).

1. Problèmes Identifiés2/2

  1. Classification erronée des Badges de Type (PAGE au lieu de DOC) :

    • La page /overview de Starlight recevait le badge PAGE car SearchModal.astro fallbackait sur 'Page' par défaut.

2. Solutions Techniques (CODE)

2.1 Script d’Indexation Unifié (apps/web/scripts/build-pagefind-index.js)

Créer un script Node.js exécuté lors du post-build (node scripts/build-pagefind-index.js) qui :

  1. Crée un index Pagefind via createIndex().
  2. Indexe le répertoire dist/client (inclut la documentation Starlight).
  3. Interroge Sanity API avec les clés d’API .env pour récupérer :
    • La Page d’accueil Sanity (*[_type == "page" && slug.current == "/"][0]) -> ajoute un enregistrement addCustomRecord avec url: '/', filters: { type: ['Page'] }.
    • Tous les articles Sanity (*[_type == "post"]) -> ajoute un enregistrement addCustomRecord pour chaque article avec url: '/blog/${slug}/', filters: { type: ['Blog'] }.
  4. Écrit l’index consolidé dans dist/client/pagefind.

2.2 Classification des Badges dans SearchModal.astro

Mettre à jour la fonction d’affichage des badges dans SearchModal.astro :

  • Si filters.type = Blog OU url commence par /blog/ -> Badge BLOG (style bleu).
  • Si filters.type = Doc OU url commence par /overview/ ou /docs/ -> Badge DOC (style violet/indigo).
  • Si filters.type = Page OU url = / -> Badge PAGE (style vert/émeraude).

3. Matrice de Validation & Critères d’Acceptation (TEST)1/2

  • Recherche Page d’accueil : Chercher un mot présent sur la page d’accueil (ex: "Welcome to Our Site", "Google Cloud", "AWS") retourne le résultat / avec le badge PAGE.
  • Recherche Article de Blog : Chercher un mot présent dans un article Sanity (ex: "OCI", "Premier Article", "Jean Dupont") retourne l’article /blog/<slug>/ avec le badge BLOG.

3. Matrice de Validation & Critères d’Acceptation (TEST)2/2

  • Recherche Doc Starlight : Chercher un mot présent dans la doc Starlight (ex: "Documentation AMN", "Cloudflare") retourne /overview/ avec le badge DOC (et NON PAGE).
  • Build & Typecheck : npx pnpm build s’exécute sans erreur et npx pnpm typecheck donne 0 erreurs.
Switch to normal mode

Contents