// esbuild build for @hive/dashboard. Output layout (`dist/`): // // dist/index.html served by the Rust router at GET / // dist/static/app.js served at /static/app.js (ESM bundle, // pulls in @hive/shared + marked) // dist/static/app.js.map source map sibling // dist/static/dashboard.css served at /static/dashboard.css // (@import resolved from @hive/shared) // // The Rust binary mounts `dist/` as a `tower_http::ServeDir` fallback; // the layout above keeps every URL the index.html references reachable // without rewriting paths in the HTML. import { build } from 'esbuild'; import { mkdirSync, copyFileSync, rmSync } from 'node:fs'; import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; const here = dirname(fileURLToPath(import.meta.url)); const src = (p) => resolve(here, 'src', p); const dist = (p) => resolve(here, 'dist', p); const staticDir = (p) => resolve(here, 'dist', 'static', p); rmSync(dist(''), { recursive: true, force: true }); mkdirSync(staticDir(''), { recursive: true }); // Bundle the JS entry. ES-module output, browser target, no minify // (line-aligned source aids debugging; minification belongs in a later // follow-up once asset sizes warrant it). await build({ entryPoints: [src('app.js')], outfile: staticDir('app.js'), bundle: true, format: 'esm', platform: 'browser', target: ['es2022'], sourcemap: true, logLevel: 'info', }); // Bundle the CSS — esbuild resolves @import including the package // re-exports from @hive/shared. await build({ entryPoints: [src('dashboard.css')], outfile: staticDir('dashboard.css'), bundle: true, loader: { '.css': 'css' }, logLevel: 'info', }); for (const html of ['index.html', 'flow.html']) { copyFileSync(src(html), dist(html)); } console.log('dashboard build ok →', dist(''));