import { copyFile, mkdir } from 'node:fs/promises'; import { resolve } from 'node:path'; const root = process.cwd(); const outputDirectory = resolve(root, 'dist'); const serverDirectory = resolve(root, 'dist', 'server'); const appShell = resolve(outputDirectory, 'index.html'); const browserRoutes = [ 'encryption', 'privacy', 'proto', 'proto/docs', 'support', 'terms', ]; await mkdir(serverDirectory, { recursive: true }); await copyFile( resolve(root, 'worker', 'index.js'), resolve(serverDirectory, 'index.js'), ); // Emit an extensionless HTML match for every client-side route. This keeps // browser refreshes working even when the asset layer handles navigations // before the Worker gets a chance to return the SPA fallback. await Promise.all( browserRoutes.map(async (route) => { const routeFile = resolve(outputDirectory, `${route}.html`); await mkdir(resolve(routeFile, '..'), { recursive: true }); await copyFile(appShell, routeFile); }), );