#!/usr/bin/env node /** * Bundle the relay daemon into a single relay.js file per platform. * * The relay runs on remote hosts via `node relay.js`, so it must be a * self-contained CommonJS bundle with no external dependencies beyond * Node.js built-ins. Native addons (node-pty, @parcel/watcher) are * marked external and expected to be installed on the remote or * gracefully degraded. */ import { build } from 'esbuild' import { createHash } from 'crypto' import { mkdirSync, readFileSync, writeFileSync } from 'fs' import { join, dirname } from 'path' import { fileURLToPath } from 'url' const __dirname = dirname(fileURLToPath(import.meta.url)) const ROOT = join(__dirname, '..') const RELAY_ENTRY = join(ROOT, 'src', 'relay', 'relay.ts') const PLATFORMS = ['linux-x64', 'linux-arm64', 'darwin-x64', 'darwin-arm64'] const RELAY_VERSION = '0.1.0' for (const platform of PLATFORMS) { const outDir = join(ROOT, 'out', 'relay', platform) mkdirSync(outDir, { recursive: true }) await build({ entryPoints: [RELAY_ENTRY], bundle: true, platform: 'node', target: 'node18', format: 'cjs', outfile: join(outDir, 'relay.js'), // Native addons cannot be bundled — they must exist on the remote host. // The relay gracefully degrades when they are absent. external: ['node-pty', '@parcel/watcher'], sourcemap: false, minify: true, define: { 'process.env.NODE_ENV': '"production"' } }) // Why: include a content hash so the deploy check detects code changes // even when RELAY_VERSION hasn't been bumped (common during development). const relayContent = readFileSync(join(outDir, 'relay.js')) const hash = createHash('sha256').update(relayContent).digest('hex').slice(0, 12) writeFileSync(join(outDir, '.version'), `${RELAY_VERSION}+${hash}`) console.log(`Built relay for ${platform} → ${outDir}/relay.js`) } console.log('Relay build complete.')