Download ui-tui/scripts/build.mjs from SaylorTwift/hermes-agent: direct link, hf CLI and curl.
- Browser
- Download file 2.6 kB
-
https://huggingface.co/SaylorTwift/hermes-agent/resolve/main/ui-tui/scripts/build.mjs
- Command line
-
hf download hf://SaylorTwift/hermes-agent/ui-tui/scripts/build.mjs
-
curl -L -o build.mjs https://huggingface.co/SaylorTwift/hermes-agent/resolve/main/ui-tui/scripts/build.mjs
2.6 kB
| // Bundles src/entry.tsx into a single self-contained dist/entry.js. | |
| // No runtime node_modules needed. | |
| import { build } from 'esbuild' | |
| import { readFileSync, writeFileSync } from 'node:fs' | |
| import { fileURLToPath } from 'node:url' | |
| import { dirname, resolve } from 'node:path' | |
| const here = dirname(fileURLToPath(import.meta.url)) | |
| const root = resolve(here, '..') | |
| const out = resolve(root, 'dist/entry.js') | |
| // `react-devtools-core` is only imported when DEV=true at runtime (Ink dev | |
| // mode). Stub it out so the bundle doesn't carry the dep. | |
| const stubDevtools = { | |
| name: 'stub-react-devtools-core', | |
| setup(b) { | |
| b.onResolve({ filter: /^react-devtools-core$/ }, args => ({ | |
| path: args.path, | |
| namespace: 'stub-devtools' | |
| })) | |
| b.onLoad({ filter: /.*/, namespace: 'stub-devtools' }, () => ({ | |
| contents: 'export default { initialize() {}, connectToDevTools() {} }', | |
| loader: 'js' | |
| })) | |
| } | |
| } | |
| await build({ | |
| entryPoints: [resolve(root, 'src/entry.tsx')], | |
| bundle: true, | |
| platform: 'node', | |
| format: 'esm', | |
| target: 'node20', | |
| outfile: out, | |
| jsx: 'automatic', | |
| jsxImportSource: 'react', | |
| // Skip the prebuilt @hermes/ink bundle and inline the source instead: | |
| // (1) esbuild's `__esm` helper does not await nested async init, so the | |
| // prebuilt bundle's lazy `render` would never resolve when nested in | |
| // this top-level Promise.all; (2) bundling from source also lets us | |
| // keep `ink-text-input` and the upstream `ink` graph OUT of the | |
| // bundle entirely — re-exporting them from entry-exports created a | |
| // circular async chain that hung the TUI at startup with only ANSI | |
| // reset bytes on screen (#31227). | |
| alias: { '@hermes/ink': resolve(root, 'packages/hermes-ink/src/entry-exports.ts') }, | |
| plugins: [stubDevtools], | |
| // Some transitive deps use CommonJS `require(...)` at runtime. ESM bundles | |
| // don't get a `require` binding automatically, so we inject one. | |
| banner: { | |
| js: "import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);" | |
| }, | |
| logLevel: 'info' | |
| }) | |
| // esbuild preserves the shebang from src/entry.tsx into the bundle, but Nix's | |
| // patchShebangs phase mangles `/usr/bin/env -S node --foo --bar` (it strips | |
| // the `node` token, leaving a broken interpreter). The hermes_cli launcher | |
| // always invokes this file as `node dist/entry.js` anyway, so the shebang is | |
| // redundant — strip it. | |
| const body = readFileSync(out, 'utf8') | |
| if (body.startsWith('#!')) { | |
| writeFileSync(out, body.slice(body.indexOf('\n') + 1)) | |
| } | |
| console.log(`built ${out}`) | |