// 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;
}