fantasy-console/runcode.ts
2023-05-04 20:14:48 -07:00

47 lines
866 B
TypeScript

// deno-lint-ignore no-explicit-any
const G: any = {
eval: eval,
};
const context = new Proxy(G, {
get: (target, prop) => {
return target[prop];
},
set: (target, prop, value) => {
target[prop] = value;
return true;
},
has: () => {
return true;
},
});
export const runCode = (code: string) => {
try {
new Function(code);
} catch (err) {
throw err;
}
const fn = new Function("context", `
with (context) {
${code}
}
`);
return fn(context);
}
export const evalCode = (code: string) => {
try {
return runCode(`return eval("(${code.replaceAll('"', '\\"')})");`);
} catch (err) {
if (err.name === "SyntaxError") {
return runCode(`return eval("${code.replaceAll('"', '\\"')}");`);
} else {
throw err;
}
}
}
// deno-lint-ignore no-explicit-any
export const addToContext = (name: string, value: any) => {
G[name] = value;
}