#!/usr/bin/env node /** * DocFast HTML Build Script * Replaces {{> partial_name}} in source files with partial contents. * Source: public/src/*.html → Output: public/*.html * Partials: public/partials/_*.html */ const fs = require('fs'); const path = require('path'); const srcDir = path.join(__dirname, '..', 'public', 'src'); const outDir = path.join(__dirname, '..', 'public'); const partialsDir = path.join(__dirname, '..', 'public', 'partials'); // Load all partials const partials = {}; if (fs.existsSync(partialsDir)) { for (const f of fs.readdirSync(partialsDir)) { if (f.startsWith('_') && f.endsWith('.html')) { const name = f.replace(/^_/, '').replace(/\.html$/, ''); partials[name] = fs.readFileSync(path.join(partialsDir, f), 'utf-8').trimEnd(); } } } console.log(`Loaded partials: ${Object.keys(partials).join(', ')}`); if (!fs.existsSync(srcDir)) { console.error(`Source directory not found: ${srcDir}`); process.exit(1); } // Process each source file const files = fs.readdirSync(srcDir).filter(f => f.endsWith('.html')); for (const file of files) { let content = fs.readFileSync(path.join(srcDir, file), 'utf-8'); // Replace {{> partial_name}} with partial content content = content.replace(/\{\{>\s*(\w+)\s*\}\}/g, (match, name) => { if (partials[name]) return partials[name]; console.warn(` Warning: partial '${name}' not found in ${file}`); return match; }); const outPath = path.join(outDir, file); fs.writeFileSync(outPath, content); console.log(` Built: ${file}`); } console.log('Done.'); // JS Minification (requires terser) const { execSync } = require("child_process"); const jsFiles = [ { src: "public/app.js", out: "public/app.min.js" }, { src: "public/status.js", out: "public/status.min.js" }, ]; console.log("Minifying JS..."); for (const { src, out } of jsFiles) { const srcPath = path.join(__dirname, "..", src); const outPath = path.join(__dirname, "..", out); if (fs.existsSync(srcPath)) { execSync(`npx terser ${srcPath} -o ${outPath} -c -m`, { stdio: "inherit" }); console.log(` Minified: ${src} → ${out}`); } }