#!/usr/bin/env bun /** * Post-build processing for Vite build output. * * 1. Patch globalThis.Bun destructuring in third-party deps for Node.js compat * 2. Copy native addon files * 3. Generate dual entry points (cli-bun.js, cli-node.js) */ import { readdir, readFile, writeFile, cp } from "node:fs/promises"; import { chmodSync } from "node:fs"; import { join } from "node:path"; import { execSync } from "node:child_process"; const outdir = "dist"; async function postBuild() { // Step 1: Patch globalThis.Bun destructuring from third-party deps const files = await readdir(outdir, { recursive: true }); const BUN_DESTRUCTURE = /var \{([^}]+)\} = globalThis\.Bun;?/g; const BUN_DESTRUCTURE_SAFE = 'var {$1} = typeof globalThis.Bun !== "undefined" ? globalThis.Bun : {};'; let bunPatched = 0; for (const file of files) { const filePath = join(outdir, file); if (typeof file !== "string" || !file.endsWith(".js")) continue; const content = await readFile(filePath, "utf-8"); if (BUN_DESTRUCTURE.test(content)) { await writeFile( filePath, content.replace(BUN_DESTRUCTURE, BUN_DESTRUCTURE_SAFE), ); bunPatched++; } BUN_DESTRUCTURE.lastIndex = 0; } // Step 2: Copy native addon files const vendorDir = join(outdir, "vendor", "audio-capture"); await cp("vendor/audio-capture", vendorDir, { recursive: true } as never); console.log(`Copied vendor/audio-capture/ → ${vendorDir}/`); // Step 3: Generate dual entry points const cliBun = join(outdir, "cli-bun.js"); const cliNode = join(outdir, "cli-node.js"); await writeFile(cliBun, '#!/usr/bin/env bun\nimport "./cli.js"\n'); await writeFile(cliNode, '#!/usr/bin/env node\nimport "./cli.js"\n'); chmodSync(cliBun, 0o755); chmodSync(cliNode, 0o755); console.log( `Post-build complete: patched ${bunPatched} Bun destructure, generated entry points`, ); } postBuild().catch((err) => { console.error("Post-build failed:", err); process.exit(1); });