import { dedent } from '../utils.js'; import { io } from './_io.js'; export const loader = new WeakMap(); // REQUIRES INTEGRATION TEST /* c8 ignore start */ export const registerJSModule = (interpreter, name, value) => { if (name === 'polyscript') { value.lazy_py_modules = async (...packages) => { await loader.get(interpreter)(packages); return packages.map(name => interpreter.pyimport(name)); }; } interpreter.registerJsModule(name, value); }; export const getFormat = (path, url) => { if (path.endsWith('/*')) { if (/\.(zip|tar(?:\.gz)?)$/.test(url)) return RegExp.$1; throw new Error(`Unsupported archive ${url}`); } return ''; }; export const run = (interpreter, code, ...args) => { try { return interpreter.runPython(dedent(code), ...args); } catch (error) { io.get(interpreter).stderr(error); } }; export const runAsync = async (interpreter, code, ...args) => { try { return await interpreter.runPythonAsync(dedent(code), ...args); } catch (error) { io.get(interpreter).stderr(error); } }; export const runEvent = async (interpreter, code, event) => { // allows method(event) as well as namespace.method(event) // it does not allow fancy brackets names for now const [name, ...keys] = code.split('.'); let target = interpreter.globals.get(name); let context; for (const key of keys) [context, target] = [target, target[key]]; try { await target.call(context, event); } catch (error) { io.get(interpreter).stderr(error); } }; /* c8 ignore stop */