@convo-lang/convo-lang
Version:
The language of AI
61 lines • 1.74 kB
JavaScript
import { defaultConvoVars } from "./convo-default-vars.js";
export const evalConvoMessageAsCodeAsync = async (msg, flat) => {
if (!msg.content) {
return undefined;
}
const codeBlockMatch = /^\s*```([^\n]*)(.*)```\s*$/s.exec(msg.content);
if (!codeBlockMatch) {
return undefined;
}
const lang = codeBlockMatch[1]?.trim().split(' ')[0];
if (!lang) {
return undefined;
}
const code = codeBlockMatch[2];
if (!code) {
return undefined;
}
switch (lang.toLowerCase()) {
case 'js':
case 'javascript':
return await evalJsAsync(code, flat);
default:
return undefined;
}
};
const evalJsAsync = async (js, flat) => {
const argNames = [];
const args = [];
const addVar = (name, value) => {
if (argNames.includes(name)) {
return;
}
argNames.push(name);
args.push(value);
};
addVar('flat', flat);
addVar('convo', flat.conversation);
addVar('ctx', flat.exe);
addVar('setVar', (name, value) => {
if (typeof name !== 'string') {
throw new Error('name must be a string');
}
return flat.exe.setVar(true, value, name);
});
addVar('print', (...args) => flat.exe.print(...args));
for (const e in flat.exe.sharedVars) {
if (e in defaultConvoVars) {
continue;
}
addVar(e, flat.exe.sharedVars[e]);
}
// disable esbuild eval warning
const ev = globalThis['eval'];
const fn = ev(`async (${argNames.join(',')})=>{
let result=undefined;
${js}
return result;
}`);
return await fn(...args);
};
//# sourceMappingURL=convo-eval.js.map