import { defineCollection, z } from "astro:content"; const linkSchema = z.object({ type: z.enum(["definition", "appui", "transposition"]), target: z.string().min(1), // URL interne (ex: /glossaire/archicratie/) ou slug note: z.string().optional() }); const baseTextSchema = z.object({ title: z.string().min(1), level: z.union([z.literal(1), z.literal(2), z.literal(3)]).default(1), version: z.string().min(1), concepts: z.array(z.string().min(1)).default([]), links: z.array(linkSchema).default([]), // optionnels mais utiles dès maintenant order: z.number().int().nonnegative().optional(), summary: z.string().optional() }); // Éditions (séparation stricte : edition + status verrouillés par collection) const traite = defineCollection({ type: "content", schema: baseTextSchema.extend({ edition: z.literal("traite"), status: z.literal("theorie_fondamentale") }) }); const archicratie = defineCollection({ type: "content", schema: baseTextSchema.extend({ edition: z.literal("archicratie"), status: z.literal("modele_sociopolitique") }) }); const ia = defineCollection({ type: "content", schema: baseTextSchema.extend({ edition: z.literal("ia"), status: z.literal("application") }) }); const atlas = defineCollection({ type: "content", schema: baseTextSchema.extend({ edition: z.literal("atlas"), status: z.literal("cartographie") }) }); // Glossaire (référentiel terminologique) const glossaire = defineCollection({ type: "content", schema: z.object({ title: z.string().min(1), // Titre public (souvent identique au terme) term: z.string().min(1), // Terme canonique aliases: z.array(z.string().min(1)).default([]), edition: z.literal("glossaire"), status: z.literal("referentiel"), version: z.string().min(1), // Micro-définition affichable en popover (courte, stable) definitionShort: z.string().min(1), concepts: z.array(z.string().min(1)).default([]), // Liens typés (vers ouvrages ou autres termes) links: z.array(linkSchema).default([]) }) }); export const collections = { traite, archicratie, ia, glossaire, atlas };