diff --git a/frontend/packages/agent/build.mjs b/frontend/packages/agent/build.mjs index c5b1c59..6b231f3 100644 --- a/frontend/packages/agent/build.mjs +++ b/frontend/packages/agent/build.mjs @@ -1,18 +1,21 @@ -// esbuild build for @hive/agent. Outputs: +// esbuild build for @hive/agent. Output layout (`dist/`): // -// dist/app.js bundled ES module (entrypoint = src/app.js, -// pulls in @hive/shared + marked) -// dist/agent.css bundled stylesheet (entrypoint = src/agent.css, -// @import "@hive/shared/base.css" + terminal.css -// get inlined here) -// dist/stats.js bundled stats page (entrypoint = src/stats.js, -// pulls in chart.js/auto) -// dist/{index,stats,screen}.html copies of src/*.html (esbuild -// doesn't process HTML; the bundled siblings are -// referenced by name) +// dist/index.html served at GET / +// dist/stats.html served at GET /stats +// dist/screen.html served at GET /screen +// 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/stats.js served at /static/stats.js (pulls in +// chart.js/auto) +// dist/static/stats.js.map source map sibling +// dist/static/agent.css served at /static/agent.css (@import +// resolved from @hive/shared) // -// The in-container Rust binary serves `dist/` via tower_http::ServeDir, -// with the per-agent `hyperhive.frontend.extraFiles` layered on top. +// The in-container Rust binary mounts `dist/` (with per-agent +// `hyperhive.frontend.extraFiles` layered on top) as a +// `tower_http::ServeDir` fallback; the layout above keeps every URL +// the HTML references reachable without rewriting paths. import { build } from 'esbuild'; import { mkdirSync, copyFileSync, rmSync } from 'node:fs'; @@ -22,15 +25,16 @@ 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(dist(''), { recursive: true }); +mkdirSync(staticDir(''), { recursive: true }); // Two JS entries: the main app + the stats page. Both bundle their // own deps so each page can be loaded independently. await build({ entryPoints: [src('app.js'), src('stats.js')], - outdir: dist(''), + outdir: staticDir(''), bundle: true, format: 'esm', platform: 'browser', @@ -43,7 +47,7 @@ await build({ // shared/terminal.css from the @hive/shared workspace dep. await build({ entryPoints: [src('agent.css')], - outfile: dist('agent.css'), + outfile: staticDir('agent.css'), bundle: true, loader: { '.css': 'css' }, logLevel: 'info', diff --git a/frontend/packages/dashboard/build.mjs b/frontend/packages/dashboard/build.mjs index 2ea7db0..07097fa 100644 --- a/frontend/packages/dashboard/build.mjs +++ b/frontend/packages/dashboard/build.mjs @@ -1,17 +1,15 @@ -// esbuild build for @hive/dashboard. Outputs: +// esbuild build for @hive/dashboard. Output layout (`dist/`): // -// dist/app.js bundled ES module (entrypoint = src/app.js, -// pulls in @hive/shared + marked) -// dist/dashboard.css bundled stylesheet (entrypoint = src/dashboard.css, -// @import "@hive/shared/base.css" + terminal.css -// get inlined here) -// dist/index.html copy of src/index.html (esbuild doesn't process -// HTML; the script/link tags reference the bundled -// siblings by name) +// 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) // -// Both Rust binaries serve `dist/` via tower_http::ServeDir. The output -// must keep the same filenames the existing index.html references, so -// downstream changes are mechanical. +// 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'; @@ -21,16 +19,17 @@ 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(dist(''), { recursive: 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: dist('app.js'), + outfile: staticDir('app.js'), bundle: true, format: 'esm', platform: 'browser', @@ -43,7 +42,7 @@ await build({ // re-exports from @hive/shared. await build({ entryPoints: [src('dashboard.css')], - outfile: dist('dashboard.css'), + outfile: staticDir('dashboard.css'), bundle: true, loader: { '.css': 'css' }, logLevel: 'info',