// esbuild build for @hive/swarm-ui (project-bootstrap scope). Output // layout (`dist/`): // // dist/index.html served at GET / // dist/static/main.js served at /static/main.js (ESM bundle, // Preact + wouter-preact) // dist/static/main.js.map source map sibling // dist/static/main.css every component's own `import // './Foo.css'` (Shell.css, Panel.css, …), // folded by esbuild into one companion // output alongside main.js — no separate // build step, this falls out of bundling // main.tsx with `bundle: true` // dist/static/colors.css served at /static/colors.css // dist/static/theme.css served at /static/theme.css // dist/static/swarm-ui.css served at /static/swarm-ui.css — just the // shared base reset now (@import resolved // from @hive/shared), NOT component styles // // Not yet wired into any Rust binary's `ServeDir` — swarm-controller // only serves `/health` today (see swarm-controller/README.md); this // just makes `dist/` buildable so nix/packages/swarm-ui.nix has // something to package. `.tsx` → JS: esbuild transpiles TypeScript // natively (types stripped, not checked) — run `npm run typecheck` // (plain `tsc --noEmit`) separately for real type errors; not yet // wired into CI. 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 }); await build({ entryPoints: [src('main.tsx')], outfile: staticDir('main.js'), bundle: true, format: 'esm', platform: 'browser', target: ['es2022'], sourcemap: true, logLevel: 'info', jsx: 'automatic', jsxImportSource: 'preact', }); for (const entry of ['colors.css', 'theme.css', 'swarm-ui.css']) { await build({ entryPoints: [src(entry)], outfile: staticDir(entry), bundle: true, loader: { '.css': 'css' }, logLevel: 'info', }); } copyFileSync(src('index.html'), dist('index.html')); console.log('swarm-ui build ok →', dist(''));