Add Makefile, package.json, and initial configuration for VitePress and Slidev integration

- Introduced a Makefile for streamlined commands related to building, running, and managing presentations.
- Created package.json to define project metadata, dependencies, and scripts for development and testing.
- Added .gitignore entries to exclude build artifacts and temporary files from version control.
- Included playwright.config.mjs for end-to-end testing setup with Playwright.
- Added README.md for project documentation, outlining setup instructions and development guidelines.
This commit is contained in:
Le Prévost-Corvellec Arnault
2026-04-11 15:59:20 +02:00
parent 10f7798afb
commit 354c8cd9ef
70 changed files with 16388 additions and 2469 deletions
+69
View File
@@ -0,0 +1,69 @@
#!/usr/bin/env node
/**
* Build Slidev pour un slug → dossier dist-<slug>/ à la racine du dépôt.
* Usage : node tools/build-deck.mjs <slug>
*/
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 <slug>')
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/<slug>/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)
}