#!/usr/bin/env node /** * Lit chaque slides//meta.json, écrit presentations.json, index featured, liste + fiches. * Retire les fiches portal obsolètes. * * TALKS_ROOT (optionnel) : racine du dépôt — tests. */ import fs from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' import { sitePath } from './site-base.mjs' import { readAllMeta, generateListPageMarkdown, generateDetailPageMarkdown, patchIndexFeaturedContent, } from './presentation-contracts.mjs' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const root = process.env.TALKS_ROOT ? path.resolve(process.env.TALKS_ROOT) : path.resolve(__dirname, '..') const slidesRoot = path.join(root, 'slides') const portalData = path.join(root, 'portal', '.vitepress', 'data') const presentationsDir = path.join(root, 'portal', 'presentations') function pruneStalePresentationDirs(items) { const keep = new Set(items.map((p) => p.slug)) if (!fs.existsSync(presentationsDir)) return for (const d of fs.readdirSync(presentationsDir, { withFileTypes: true })) { if (!d.isDirectory()) continue if (!keep.has(d.name)) { fs.rmSync(path.join(presentationsDir, d.name), { recursive: true, force: true }) console.warn(`[sync] fiche retirée (plus de slides/${d.name}/): presentations/${d.name}/`) } } } function main() { const items = readAllMeta(slidesRoot) fs.mkdirSync(portalData, { recursive: true }) fs.writeFileSync(path.join(portalData, 'presentations.json'), JSON.stringify(items, null, 2), 'utf8') const indexPath = path.join(root, 'portal', 'index.md') if (fs.existsSync(indexPath)) { const raw = fs.readFileSync(indexPath, 'utf8') const { ok, content } = patchIndexFeaturedContent(raw, items, sitePath) if (!ok) { console.warn('[sync] marqueurs FEATURED_START / FEATURED_END absents ou invalides dans portal/index.md') } else { fs.writeFileSync(indexPath, content, 'utf8') } } fs.mkdirSync(presentationsDir, { recursive: true }) fs.writeFileSync(path.join(presentationsDir, 'index.md'), generateListPageMarkdown(items, sitePath), 'utf8') for (const p of items) { const dir = path.join(presentationsDir, p.slug) fs.mkdirSync(dir, { recursive: true }) fs.writeFileSync(path.join(dir, 'index.md'), generateDetailPageMarkdown(p, sitePath), 'utf8') } pruneStalePresentationDirs(items) console.log(`[sync] ${items.length} présentation(s) — portal mis à jour`) } main()