@scion-scxml/scxml
Version:
An implementation of SCXML in JavaScript.
76 lines (60 loc) • 2.52 kB
JavaScript
;
const Module = require('module'),
pathModule = require('path'),
vm = require('vm');
module.exports = {
eval: function(s,fileName,context){
context = context || {};
fileName = fileName || '';
//TODO: if filename starts with 'http', substitute a default require
// https://247inc.atlassian.net/browse/OMNI-3
// create an isolated sandbox per session
var sandbox = {};
sandbox.global = sandbox;
var ctx = vm.createContext(sandbox);
if(context.isLoadedFromFile){
ctx.__filename = fileName;
ctx.__dirname = pathModule.dirname(ctx.__filename);
//set it up so that require is relative to file
var _module = ctx.module = new Module(fileName);
var _require = ctx.require = function(path) {
return Module._load(path, _module, true);
};
_module.filename = ctx.__filename;
_require.paths = _module.paths = Module._nodeModulePaths(process.cwd());
_require.resolve = function(request) {
return Module._resolveFilename(request, _module);
};
}else{
//otherwise (e.g., loaded via http, or from document string), choose a sensible default
ctx.require =
context.require || //user-specified require
(require.main && //main module's require
require.main.require &&
require.main.require.bind(require.main)) ||
require; //this module's require
}
//set up default require and module.exports
return vm.runInContext(s,ctx,fileName);
},
createLocalExecutionContext : function(docPath, sandbox) {
if (!sandbox) {
sandbox = {console: console};
sandbox.global = sandbox;
}
var ctx = vm.createContext(sandbox);
ctx.__filename = docPath;
ctx.__dirname = pathModule.dirname(ctx.__filename);
//set it up so that require is relative to file
var _module = ctx.module = new Module(docPath);
var _require = ctx.require = function(path) {
return Module._load(path, _module, true);
};
_module.filename = ctx.__filename;
_require.paths = _module.paths = Module._nodeModulePaths(process.cwd());
_require.resolve = function(request) {
return Module._resolveFilename(request, _module);
};
return ctx;
}
};