#!/usr/bin/env node /** * Build Slidev pour un slug → dossier dist-/ à la racine du dépôt. * Usage : node tools/build-deck.mjs */ import fs from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' import { execFileSync } from 'node:child_process' import { sitePath } from './site-base.mjs' const __dirname = path.dirname(fileURLToPath(import.meta.url)) const root = path.resolve(__dirname, '..') function publishBuild(wipDir, finalDir) { fs.mkdirSync(finalDir, { recursive: true }) fs.cpSync(wipDir, finalDir, { recursive: true, force: true }) fs.rmSync(wipDir, { recursive: true, force: true }) } function slidevBin() { const p = path.join(root, 'node_modules', '.bin', 'slidev') if (fs.existsSync(p)) return p return 'slidev' } const slug = process.argv[2] if (!slug || slug.startsWith('wip_')) { console.error('usage: node tools/build-deck.mjs ') process.exit(1) } const entry = path.join(root, 'slides', slug, 'slides.md') const metaPath = path.join(root, 'slides', slug, 'meta.json') if (!fs.existsSync(entry) || !fs.existsSync(metaPath)) { console.error(`[build-deck] slides/${slug}/ incomplet (slides.md + meta.json requis)`) process.exit(1) } const finalDir = path.join(root, `dist-${slug}`) const wipDir = path.join(root, '.slide-wip', slug) const base = sitePath(`/slides/${slug}/`) if (!base.endsWith('/')) throw new Error(`base invalide: ${base}`) fs.rmSync(wipDir, { recursive: true, force: true }) fs.mkdirSync(wipDir, { recursive: true }) /* Ne pas supprimer slides//index.html avant le build : Slidev s’attend à pouvoir unlink ce fichier en fin de build. */ console.log(`[build-deck] ${slug} → dist-${slug}/ (base=${base})`) try { execFileSync( slidevBin(), ['build', entry, '--out', wipDir, '--base', base], { stdio: 'inherit', cwd: root, env: process.env }, ) publishBuild(wipDir, finalDir) /* Slidev peut écrire un index.html à côté de slides.md — inutile et bruyant au build suivant */ try { fs.rmSync(path.join(root, 'slides', slug, 'index.html'), { force: true }) } catch { /* ignore */ } } catch (e) { try { fs.rmSync(wipDir, { recursive: true, force: true }) } catch { /* ignore */ } process.exit(1) }