|
'use strict'; |
|
const { dedent } = require('../utils.js'); |
|
const { io } = require('./_io.js'); |
|
|
|
const loader = new WeakMap(); |
|
exports.loader = loader; |
|
|
|
|
|
|
|
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); |
|
}; |
|
exports.registerJSModule = registerJSModule; |
|
|
|
const getFormat = (path, url) => { |
|
if (path.endsWith('/*')) { |
|
if (/\.(zip|tar(?:\.gz)?)$/.test(url)) |
|
return RegExp.$1; |
|
throw new Error(`Unsupported archive ${url}`); |
|
} |
|
return ''; |
|
}; |
|
exports.getFormat = getFormat; |
|
|
|
const run = (interpreter, code, ...args) => { |
|
try { |
|
return interpreter.runPython(dedent(code), ...args); |
|
} |
|
catch (error) { |
|
io.get(interpreter).stderr(error); |
|
} |
|
}; |
|
exports.run = run; |
|
|
|
const runAsync = async (interpreter, code, ...args) => { |
|
try { |
|
return await interpreter.runPythonAsync(dedent(code), ...args); |
|
} |
|
catch (error) { |
|
io.get(interpreter).stderr(error); |
|
} |
|
}; |
|
exports.runAsync = runAsync; |
|
|
|
const runEvent = async (interpreter, code, event) => { |
|
|
|
|
|
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); |
|
} |
|
}; |
|
exports.runEvent = runEvent; |
|
|
|
|