From 302e910610c0e1f1ef7a1d15a19a02828715f630 Mon Sep 17 00:00:00 2001 From: bartjoyce Date: Thu, 18 Aug 2016 17:59:36 +0100 Subject: [PATCH] Fixed issue #41 --- lib/VMError.js | 22 ++++++++++++++++++++++ lib/compileToJS.js | 32 ++++++++++++++++++++++++++++++++ lib/main.js | 44 ++------------------------------------------ lib/sandbox.js | 5 ++++- 4 files changed, 60 insertions(+), 43 deletions(-) create mode 100644 lib/VMError.js create mode 100644 lib/compileToJS.js diff --git a/lib/VMError.js b/lib/VMError.js new file mode 100644 index 0000000..f3c766c --- /dev/null +++ b/lib/VMError.js @@ -0,0 +1,22 @@ +/** + * VMError. + * + * @param {String} message Error message. + * + * @class + * @extends {Error} + * @property {String} stack Call stack. + * @property {String} message Error message. + */ + +class VMError extends Error { + constructor(message) { + super(message); + + this.name = 'VMError'; + + Error.captureStackTrace(this, this.constructor); + } +} + +module.exports = VMError; \ No newline at end of file diff --git a/lib/compileToJS.js b/lib/compileToJS.js new file mode 100644 index 0000000..96dc2e3 --- /dev/null +++ b/lib/compileToJS.js @@ -0,0 +1,32 @@ +const VMError = require('./VMError') + +/** + * Compile code to JS + * + * @param {String} code Code to compile. + * @param {*} compiler Compiler to use. + * @return {String} The compiled code. + */ + +const compileToJS = function(code, compiler) { + if ('function' === typeof compiler) return compiler(code); + + switch (compiler) { + case 'coffeescript': + case 'coffee-script': + case 'cs': + case 'text/coffeescript': + return require('coffee-script').compile(code, {header: false, bare: true}); + + case 'javascript': + case 'java-script': + case 'js': + case 'text/javascript': + return code; + + default: + throw new VMError(`Unsupported compiler '${compiler}'.`); + } +}; + +module.exports = compileToJS; \ No newline at end of file diff --git a/lib/main.js b/lib/main.js index 43ad1ac..7b36713 100644 --- a/lib/main.js +++ b/lib/main.js @@ -2,31 +2,12 @@ const fs = require('fs'); const vm = require('vm'); const pa = require('path'); const {EventEmitter} = require('events'); +const VMError = require('./VMError'); +const _compileToJS = require('./compileToJS'); const sb = fs.readFileSync(`${__dirname}/sandbox.js`, 'utf8'); const cf = fs.readFileSync(`${__dirname}/contextify.js`, 'utf8'); -const _compileToJS = function(code, compiler) { - if ('function' === typeof compiler) return compiler(code); - - switch (compiler) { - case 'coffeescript': - case 'coffee-script': - case 'cs': - case 'text/coffeescript': - return require('coffee-script').compile(code, {header: false, bare: true}); - - case 'javascript': - case 'java-script': - case 'js': - case 'text/javascript': - return code; - - default: - throw new VMError(`Unsupported compiler '${compiler}'.`); - } -}; - /** * Class VM. * @@ -356,27 +337,6 @@ class NodeVM extends EventEmitter { } } -/** - * VMError. - * - * @param {String} message Error message. - * - * @class - * @extends {Error} - * @property {String} stack Call stack. - * @property {String} message Error message. - */ - -class VMError extends Error { - constructor(message) { - super(message); - - this.name = 'VMError'; - - Error.captureStackTrace(this, this.constructor); - } -} - exports.VMError = VMError; exports.NodeVM = NodeVM; exports.VM = VM; diff --git a/lib/sandbox.js b/lib/sandbox.js index 3337378..6480012 100644 --- a/lib/sandbox.js +++ b/lib/sandbox.js @@ -2,6 +2,7 @@ const {Script} = host.require('vm'); const fs = host.require('fs'); const pa = host.require('path'); const console = host.console; +const compileToJS = host.require('./compileToJS'); const BUILTIN_MODULES = host.process.binding('natives'); const JSON_PARSE = JSON.parse; @@ -47,7 +48,9 @@ return ((vm, host) => { } else { try { // Load module - var code = `(function (exports, require, module, __filename, __dirname) { 'use strict'; ${fs.readFileSync(filename, "utf8")} \n});`; + var code = fs.readFileSync(filename, "utf8"); + code = compileToJS(code, vm.options.compiler); + code = `(function (exports, require, module, __filename, __dirname) { 'use strict'; ${code} \n});`; // Precompile script let script = new Script(code, {