#!/usr/bin/env node /** * Build Vite output and lay out www/ for production nginx: * / → spec * /folders/ → stack-folder */ import { cp, mkdir, rm, readFile, writeFile } from 'fs/promises'; import { execSync } from 'child_process'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; const root = join(dirname(fileURLToPath(import.meta.url)), '..'); const dist = join(root, 'dist'); const www = join(root, 'www'); const umamiId = process.env.UMAMI_WEBSITE_ID || '2a3bc7b2-b827-4770-8b31-c94016667734'; const umamiScript = ` \n`; function injectUmami(html) { if (html.includes('stats.levkin.ca')) return html; return html.replace('', `${umamiScript} `); } function patchHtml(html, patches) { let out = html; for (const [from, to] of patches) { out = out.split(from).join(to); } return injectUmami(out); } execSync('npm run build', { cwd: root, stdio: 'inherit' }); await rm(www, { recursive: true, force: true }); await mkdir(join(www, 'assets'), { recursive: true }); await mkdir(join(www, 'folders'), { recursive: true }); await cp(join(dist, 'assets'), join(www, 'assets'), { recursive: true }); await cp(join(root, 'public', 'favicon.svg'), join(www, 'favicon.svg')); const specHtml = await readFile(join(dist, 'spec', 'index.html'), 'utf8'); await writeFile( join(www, 'index.html'), patchHtml(specHtml, [ ['← all options', '← folders'], ]), 'utf8', ); const folderHtml = await readFile(join(dist, 'stack-folder', 'index.html'), 'utf8'); await cp(join(root, 'stack-folder', 'previews'), join(www, 'folders', 'previews'), { recursive: true }); await writeFile( join(www, 'folders', 'index.html'), patchHtml(folderHtml, [ ['href="/spec/"', 'href="/"'], ]), 'utf8', ); console.log(`www/ ready (Umami id: ${umamiId})`);