Files
Talks/tools/static-preview.mjs
Le Prévost-Corvellec Arnault 354c8cd9ef 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.
2026-04-11 15:59:20 +02:00

69 lines
1.9 KiB
JavaScript

#!/usr/bin/env node
/**
* Sert dist-portal + chaque dist-<slug> sous /slides/<slug>/ (tests E2E, prod locale).
* Comme le plugin Vite en dev : racine du deck → 302 vers /slides/<slug>/1 ; routes Slidev (/1, /2…) via SPA (sirv single).
*/
import http from 'node:http'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
import sirv from 'sirv'
import { listPresentationSlugs } from './list-slugs.mjs'
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
const port = Number(process.env.PREVIEW_PORT || 4174)
const portalStatic = sirv(path.join(root, 'dist-portal'), { etag: true })
const slideSirv = new Map()
function getSirv(slug) {
if (!slideSirv.has(slug)) {
slideSirv.set(
slug,
sirv(path.join(root, `dist-${slug}`), {
etag: true,
single: 'index.html',
}),
)
}
return slideSirv.get(slug)
}
const server = http.createServer((req, res) => {
const u = new URL(req.url || '/', 'http://127.0.0.1')
const pathname = u.pathname
const m = pathname.match(/^\/slides\/([^/]+)(.*)$/)
if (m) {
const slug = m[1]
const rest = m[2] || '/'
const slugs = new Set(listPresentationSlugs(root))
if (!slugs.has(slug)) {
res.statusCode = 404
res.end('not found')
return
}
const atDeckRoot = rest === '/' || rest === ''
if (atDeckRoot && (req.method === 'GET' || req.method === 'HEAD')) {
res.statusCode = 302
res.setHeader('Location', `/slides/${slug}/1${u.search || ''}`)
res.end()
return
}
const orig = req.url
req.url = rest + (u.search || '')
getSirv(slug)(req, res, () => {
req.url = orig
res.statusCode = 404
res.end()
})
return
}
portalStatic(req, res, () => {
res.statusCode = 404
res.end('not found')
})
})
server.listen(port, '127.0.0.1', () => {
console.log(`[static-preview] http://127.0.0.1:${port}/`)
})