#!/usr/bin/env bun /** * Self-contained build script for elizaOS plugins */ import { spawnSync } from "node:child_process"; import { existsSync } from "node:fs"; import { join } from "node:path"; import { $ } from "bun"; const rmRecursiveScript = join( import.meta.dirname, "..", "..", "scripts", "rm-path-recursive.mjs", ); function rmRecursive(targetPath: string) { const result = spawnSync(process.execPath, [rmRecursiveScript, targetPath], { stdio: "inherit", }); if (result.status !== 0) { throw new Error( `failed to remove generated plugin template build output ${targetPath}`, ); } } async function cleanBuild(outdir = "dist") { if (existsSync(outdir)) { rmRecursive(outdir); console.log(`✓ Cleaned ${outdir} directory`); } } async function build() { const start = performance.now(); console.log("🚀 Building plugin..."); try { // Clean previous build await cleanBuild("dist"); // Run JavaScript build and TypeScript declarations in parallel console.log("Starting build tasks..."); const [buildResult, _tscResult] = await Promise.all([ // Task 1: Build with Bun (async () => { console.log("📦 Bundling with Bun..."); const result = await Bun.build({ entrypoints: ["./src/index.ts"], outdir: "./dist", target: "node", format: "esm", sourcemap: true, minify: false, external: ["dotenv", "node:*", "@elizaos/core", "zod"], naming: { entry: "[dir]/[name].[ext]", }, }); if (!result.success) { console.error("✗ Build failed:", result.logs); return { success: false, outputs: [] }; } const totalSize = result.outputs.reduce( (sum, output) => sum + output.size, 0, ); const sizeMB = (totalSize / 1024 / 1024).toFixed(2); console.log(`✓ Built ${result.outputs.length} file(s) - ${sizeMB}MB`); return result; })(), // Task 2: Generate TypeScript declarations (async () => { console.log("📝 Generating TypeScript declarations..."); await $`tsc --emitDeclarationOnly --incremental --noCheck --project ./tsconfig.build.json`.quiet(); console.log("✓ TypeScript declarations generated"); return { success: true }; })(), ]); if (!buildResult.success) { return false; } const elapsed = ((performance.now() - start) / 1000).toFixed(2); console.log(`✅ Build complete! (${elapsed}s)`); return true; } catch (error) { console.error("Build error:", error); return false; } } // Execute the build build() .then((success) => { if (!success) { process.exit(1); } }) .catch((error) => { console.error("Build script error:", error); process.exit(1); });