90 lines
2.5 KiB
TypeScript
90 lines
2.5 KiB
TypeScript
import { defineCollection, z } from "astro:content";
|
||
|
||
const linkSchema = z.object({
|
||
type: z.enum(["definition", "appui", "transposition"]),
|
||
target: z.string().min(1),
|
||
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([]),
|
||
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")
|
||
})
|
||
});
|
||
|
||
// ✅ NOUVELLE collection : archicrat-ia (Essai-thèse)
|
||
// NOTE : on accepte temporairement edition/status "archicratie/modele_sociopolitique"
|
||
// si tes MDX n’ont pas encore été normalisés.
|
||
// Quand tu voudras "strict", on passera à edition="archicrat-ia" status="essai_these"
|
||
// + update frontmatter des 7 fichiers.
|
||
const archicratIa = defineCollection({
|
||
type: "content",
|
||
schema: baseTextSchema.extend({
|
||
edition: z.union([z.literal("archicrat-ia"), z.literal("archicratie")]),
|
||
status: z.union([z.literal("essai_these"), z.literal("modele_sociopolitique")])
|
||
})
|
||
});
|
||
|
||
// Glossaire (référentiel terminologique)
|
||
const glossaire = defineCollection({
|
||
type: "content",
|
||
schema: z.object({
|
||
title: z.string().min(1),
|
||
term: z.string().min(1),
|
||
aliases: z.array(z.string().min(1)).default([]),
|
||
edition: z.literal("glossaire"),
|
||
status: z.literal("referentiel"),
|
||
version: z.string().min(1),
|
||
definitionShort: z.string().min(1),
|
||
concepts: z.array(z.string().min(1)).default([]),
|
||
links: z.array(linkSchema).default([])
|
||
})
|
||
});
|
||
|
||
export const collections = {
|
||
traite,
|
||
archicratie,
|
||
ia,
|
||
glossaire,
|
||
atlas,
|
||
|
||
// ⚠️ clé avec tiret => doit être quotée
|
||
"archicrat-ia": archicratIa
|
||
}; |