From 402748d1dac86ab7c0d31bf8be740b2a0c9ba0cb Mon Sep 17 00:00:00 2001 From: Chris Wanstrath <2+defunkt@users.noreply.github.com> Date: Mon, 3 Nov 2025 13:26:53 -0800 Subject: [PATCH] start exporting a package API --- package.json | 1 + src/index.ts | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/index.ts diff --git a/package.json b/package.json index daf287e..b728a9a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "shrimp", "version": "0.1.0", + "exports": "./src/index.ts", "private": true, "type": "module", "scripts": { diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..a11508f --- /dev/null +++ b/src/index.ts @@ -0,0 +1,39 @@ +import { readFileSync } from 'fs' +import { VM, fromValue, type Bytecode } from 'reefvm' +import { Compiler } from '#compiler/compiler' +import { globals, colors } from '#prelude' + +export { Compiler } from '#compiler/compiler' +export { parser } from '#parser/shrimp' +export { globals } from '#prelude' + +export async function runFile(path: string): Promise { + const code = readFileSync(path, 'utf-8') + return await runCode(code) +} + +export async function runCode(code: string): Promise { + const compiler = new Compiler(code, Object.keys(globals)) + return await runBytecode(compiler.bytecode) +} + +export async function runBytecode(bytecode: Bytecode): Promise { + try { + const vm = new VM(bytecode, globals) + await vm.run() + return vm.stack.length ? fromValue(vm.stack[vm.stack.length - 1]!) : null + } catch (error: any) { + console.error(`${colors.red}Error:${colors.reset} ${error.message}`) + process.exit(1) + } +} + +export function compileFile(path: string): Bytecode { + const code = readFileSync(path, 'utf-8') + return compileCode(code) +} + +export function compileCode(code: string): Bytecode { + const compiler = new Compiler(code, Object.keys(globals)) + return compiler.bytecode +} \ No newline at end of file