npm install @snelusha/balrunnpx @snelusha/balrun ./main.balAccepts a .bal file, a package directory, or . for the current package.
import { Ballerina } from "@snelusha/balrun";
const ballerina = new Ballerina({ colors: false });
// Returns null on success, or { error: "..." } on failure
const result = await ballerina.run("./main.bal", { colors: true });Options passed to run() override the constructor defaults for that call only.
Diagnostics use ANSI colors by default. Pass colors: false to disable. The CLI auto-detects based on stderr.isTTY.
Redirect runtime output by passing any object that implements StreamWriter:
import type { StreamWriter } from "@snelusha/balrun";
const writer: StreamWriter = { write(chunk: string) {} };Example:
import { Ballerina, type StreamWriter } from "@snelusha/balrun";
const buffer: string[] = [];
const writer: StreamWriter = { write(chunk) { buffer.push(chunk); } };
await new Ballerina({ stdout: writer, stderr: writer }).run("./main.bal");By default, Ballerina reads from disk via NodeFS. Swap it out by implementing the FS interface — useful for in-memory or virtual filesystems.
import { Ballerina, type FS } from "@snelusha/balrun";
class MemFS implements FS {
// When running a single file, only `open` and `stat` are required.
// When running a package, `readDir` is also required.
}
await new Ballerina({ fs: new MemFS() }).run("main.bal");See examples/mem-fs for a full implementation.
- The
FSinterface is synchronous only.
Built on ballerina-lang-go.
