hakk
Version:
Interactive programming for Node.js. Speed up your JavaScript development!
40 lines (39 loc) • 1.33 kB
JavaScript
module.exports = {
scopedEvaluator: (exports, require, module, filePath, dirPath, __import) => {
// Create a generator that reads a value on yield
// evaluates it, and sends the result back.
const generator = function * (exports, require, module, __filename, __dirname, __import) {
let valueToSend;
while (true) {
const { code, sourceURL } = yield valueToSend;
if (code === '.end') {
break;
}
const annotatedCode = code + (sourceURL
? `
//# sourceURL=${sourceURL}`
: '');
try {
valueToSend = { result: eval(annotatedCode) }; // eslint-disable-line no-eval
} catch (e) {
valueToSend = { error: e };
}
}
};
// Run the generator.
const iterator = generator(exports, require, module, filePath, dirPath, __import);
// Discard first empty value.
iterator.next();
// Return an evaluation function that takes code and returns the result of
// eval run in the generator scope. If evaluation causes an error, then
// throw that error instead.
return function ({ code, sourceURL }) {
const { result, error } = iterator.next({ code, sourceURL }).value;
if (error) {
throw error;
} else {
return result;
}
};
}
};