@stencila/jesta
Version:
Stencila plugin for executable documents using JavaScript
71 lines (70 loc) • 3.05 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.execute = void 0;
const schema_1 = require("@stencila/schema");
const types_1 = require("./types");
const changes_1 = require("./util/changes");
const session_1 = require("./util/session");
const timer = __importStar(require("./util/timer"));
const walk_1 = require("./util/walk");
async function execute(node, force) {
if (schema_1.isA('CodeChunk', node) || schema_1.isA('CodeExpression', node)) {
const { programmingLanguage, text } = node;
if (['js', 'javascript'].includes(programmingLanguage !== null && programmingLanguage !== void 0 ? programmingLanguage : '')) {
// Ensure node has been built
await this.build(node, force);
const start = timer.start();
// Enter code into REPL
const [outputs, errors] = session_1.session().enter(text);
// Update outputs
if (schema_1.isA('CodeChunk', node)) {
if (outputs.length > 0)
node.outputs = outputs;
else
delete node.outputs;
}
else {
// There should only be one output but in case there are more
// only take the last
if (outputs.length > 0)
node.output = outputs.slice(-1)[0];
else
delete node.output;
}
// Update errors
if (errors.length > 0)
node.errors = errors.map((error) => {
const { name, message, stack } = error;
return schema_1.codeError({
errorType: name,
errorMessage: message,
stackTrace: stack === null || stack === void 0 ? void 0 : stack.split('\n').slice(2).join('\n'),
});
});
else
delete node.errors;
return changes_1.record(node, types_1.Method.execute, timer.seconds(start));
}
}
return walk_1.mutate(node, (node) => this.execute(node, force));
}
exports.execute = execute;