Solution Starlight - Symlinks avec docsLoader()
DOC : Analyse du problĂšme
Section titled âDOC : Analyse du problĂšmeâProblĂšme initial :
- Sync script complexe qui cassait la structure
- Duplication des fichiers entre
docs/,GettingStarted/etapps/web/src/content/docs/ - Starlight échouait à afficher les docs
Contrainte :
- Starlight nécessite son propre
docsLoader()pour fonctionner correctement - GettingStarted doit ĂȘtre disponible sur GitHub Actions pour le dĂ©ploiement
- Repo privĂ© (pas public internet) mais GettingStarted ignorĂ© pour Ă©viter de âsaturerâ le repo
Documentation officielle :
- Starlight
docsLoader()charge les fichiers depuissrc/content/docs/ - Starlight sidebar autogenerate sâattend Ă ce que les chemins commencent par
src/content/docs/ glob()avec unbaseexterne produit des chemins qui ne commencent pas par ce prĂ©fixe- Lâutilisation de
glob()au lieu dedocsLoader()cause lâerreur âEntry docs â docs was not foundâ
Résultat de recherche GitHub :
âRoot cause: Starlightâs bundled docsLoader() â and its autogenerate sidebar logic â hardcode the docs location as src/content/docs/. Specifically, getRoutePathRelativeToCollectionRoot in utils/navigation.ts strips that prefix from entry.filePath before matching against the autogenerate directory argument. Our bare glob({ base: â../docsâ }) loader served content pages just fine but left every entry.filePath rooted at ../docs/âŠ, so the prefix-strip never fired and the autogenerate filter returned zero matches.â
SPEC : Solution implémentée - Symlinks + docsLoader()
Section titled âSPEC : Solution implĂ©mentĂ©e - Symlinks + docsLoader()âDĂ©cision :
- Revenir Ă
docsLoader()(requis par Starlight) - GettingStarted ne sera plus ignoré par git
- Symlinks pour docs/ et GettingStarted/
- Pas de script de sync nécessaire
- NE PAS utiliser
preserveSymlinks: truedans Vite (cause une erreur de module âpiccoloreâ)
Avantages :
- â Pas de duplication de fichiers
- â Pas de script de sync complexe
- â
Starlight fonctionne avec son
docsLoader()natif - â Ădition directe dans les rĂ©pertoires racine
- â Maintenable et simple
- â Disponible sur GitHub Actions (GettingStarted commitĂ©)
Inconvénients :
- â GettingStarted commitĂ© (peut âsaturerâ le repo)
- â Symlinks peuvent poser des problĂšmes sur Windows (mais GitHub Actions/Linux ok)
CODE : Modifications effectuées
Section titled âCODE : Modifications effectuĂ©esâ1. Modification .gitignore
Section titled â1. Modification .gitignoreâRetirĂ© :
# Initial setup/GettingStartedGettingStarted est maintenant commité sur git.
2. Configuration src/content.config.ts
Section titled â2. Configuration src/content.config.tsâRetour Ă docsLoader() :
import { defineCollection } from 'astro:content';import { glob } from 'astro/loaders';import { docsLoader, i18nLoader } from '@astrojs/starlight/loaders';import { docsSchema, i18nSchema } from '@astrojs/starlight/schema';import { z } from 'astro/zod';
const blog = defineCollection({ loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }), schema: ({ image }) => z.object({ title: z.string(), description: z.string(), pubDate: z.coerce.date(), updatedDate: z.coerce.date().optional(), heroImage: z.optional(image()), }),});
const docs = defineCollection({ loader: docsLoader(), schema: docsSchema(),});
export const collections = { blog, docs, i18n: defineCollection({ loader: i18nLoader(), schema: i18nSchema() }),};Note : Le champ visibility custom a été retiré car non nécessaire pour le moment.
3. Création des symlinks
Section titled â3. CrĂ©ation des symlinksâcd apps/web/src/content/docsln -s ../../../docs docsln -s ../../../GettingStarted getting-startedNote importante sur les chemins :
- Les symlinks doivent utiliser
../../../(3 niveaux) carapps/web/src/content/docs/est à 3 niveaux de profondeur depuis la racine - Structure résultante :
apps/web/src/content/docs/âââ 404.mdâââ docs -> ../../../docsâââ getting-started -> ../../../GettingStarted4. Configuration Starlight
Section titled â4. Configuration StarlightâSidebar avec directory :
sidebar: [ { label: 'Getting Started', items: [{ autogenerate: { directory: 'getting-started' } }], }, { label: 'Documentation Technique', items: [{ autogenerate: { directory: 'docs' } }], },],5. Configuration Vite
Section titled â5. Configuration ViteâNE PAS utiliser preserveSymlinks :
vite: { plugins: [ tailwindcss(), ], // PAS de preserveSymlinks: true - cause une erreur "Cannot find module 'piccolore'" optimizeDeps: { exclude: ['@sanity/client', '@sanity/astro'], }, server: { fs: { allow: ['../../node_modules', '.'], }, watch: { ignored: ['**/sanity.types.ts', '**/schema.json'], }, }, ssr: { noExternal: ['@sanity/preview-url-secret', '@sanity/client', '@sanity/astro', '@sanity/visual-editing', '@sanity/visual-editing/react'], },},6. Workflow GitHub Actions
Section titled â6. Workflow GitHub ActionsâSync-docs.sh retirĂ© :
- LâĂ©tape de sync a Ă©tĂ© supprimĂ©e de
.github/workflows/deploy-dev.yml - Les symlinks sont gérés par git et fonctionnent sur GitHub Actions
TEST : Validation
Section titled âTEST : Validationâ- â Typecheck rĂ©ussi (0 erreurs, 0 warnings)
- â Build rĂ©ussi
- â ïž Pagefind indexation (1 fichier HTML) - Ă vĂ©rifier dans le dev server
- â Sitemap gĂ©nĂ©rĂ©
INTĂG : Documentation et notes
Section titled âINTĂG : Documentation et notesâWorkflow de dĂ©veloppement local :
Section titled âWorkflow de dĂ©veloppement local :â- Ădition : Ăditer directement dans
docs/etGettingStarted/Ă la racine - AccĂšs : Starlight lit les fichiers via symlinks et docsLoader()
- Commit : Committer GettingStarted quand il y a des changements significatifs
Notes importantes :
Section titled âNotes importantes :â- Symlinks sur Windows : Peuvent poser des problĂšmes si vous dĂ©veloppez sur Windows. Git sur Windows suit les symlinks par dĂ©faut mais ils nĂ©cessitent des permissions dâadministrateur.
- GitHub Actions : Les symlinks fonctionnent correctement sur Linux (GitHub Actions)
- preserveSymlinks : NE PAS utiliser
preserveSymlinks: truedans la config Vite - cela cause une erreur âCannot find module âpiccoloreââ lors du typecheck/build - docsLoader() : Starlight exige
docsLoader()pour sa collectiondocs-glob()ne fonctionne pas avec Starlight sidebar autogenerate
Actions recommandées :
Section titled âActions recommandĂ©es :â- Tester le dev server : Lancer
task devet vĂ©rifier lâaccĂšs aux docs - VĂ©rifier Pagefind : Confirmer que les docs sont bien indexĂ©s pour la recherche
- Test sur Windows : Si vous utilisez Windows, vérifier que les symlinks fonctionnent correctement
Conclusion
Section titled âConclusionâCette solution utilise docsLoader() (requis par Starlight) combinĂ© avec des symlinks pour permettre lâĂ©dition dans les rĂ©pertoires racine. Les docs sont maintenant gĂ©rĂ©s comme une source unique de vĂ©ritĂ© dans leurs rĂ©pertoires originaux, avec GettingStarted commitĂ© pour le dĂ©ploiement.