Spaces:
Configuration error
Configuration error
/* | |
from https://github.com/substack/vm-browserify/blob/bfd7c5f59edec856dc7efe0b77a4f6b2fa20f226/index.js | |
MIT license no Copyright holder mentioned | |
*/ | |
function Object_keys(obj) { | |
if (Object.keys) return Object.keys(obj) | |
else { | |
var res = []; | |
for (var key in obj) res.push(key) | |
return res; | |
} | |
} | |
function forEach(xs, fn) { | |
if (xs.forEach) return xs.forEach(fn) | |
else | |
for (var i = 0; i < xs.length; i++) { | |
fn(xs[i], i, xs); | |
} | |
} | |
var _defineProp; | |
function defineProp(obj, name, value) { | |
if (typeof _defineProp !== 'function') { | |
_defineProp = createDefineProp; | |
} | |
_defineProp(obj, name, value); | |
} | |
function createDefineProp() { | |
try { | |
Object.defineProperty({}, '_', {}); | |
return function(obj, name, value) { | |
Object.defineProperty(obj, name, { | |
writable: true, | |
enumerable: false, | |
configurable: true, | |
value: value | |
}) | |
}; | |
} catch (e) { | |
return function(obj, name, value) { | |
obj[name] = value; | |
}; | |
} | |
} | |
var globals = ['Array', 'Boolean', 'Date', 'Error', 'EvalError', 'Function', | |
'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError', | |
'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError', | |
'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', | |
'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'undefined', 'unescape' | |
]; | |
function Context() {} | |
Context.prototype = {}; | |
export function Script(code) { | |
if (!(this instanceof Script)) return new Script(code); | |
this.code = code; | |
} | |
function otherRunInContext(code, context) { | |
var args = Object_keys(global); | |
args.push('with (this.__ctx__){return eval(this.__code__)}'); | |
var fn = Function.apply(null, args); | |
return fn.apply({ | |
__code__: code, | |
__ctx__: context | |
}); | |
} | |
Script.prototype.runInContext = function(context) { | |
if (!(context instanceof Context)) { | |
throw new TypeError('needs a \'context\' argument.'); | |
} | |
if (global.document) { | |
var iframe = global.document.createElement('iframe'); | |
if (!iframe.style) iframe.style = {}; | |
iframe.style.display = 'none'; | |
global.document.body.appendChild(iframe); | |
var win = iframe.contentWindow; | |
var wEval = win.eval, | |
wExecScript = win.execScript; | |
if (!wEval && wExecScript) { | |
// win.eval() magically appears when this is called in IE: | |
wExecScript.call(win, 'null'); | |
wEval = win.eval; | |
} | |
forEach(Object_keys(context), function(key) { | |
win[key] = context[key]; | |
}); | |
forEach(globals, function(key) { | |
if (context[key]) { | |
win[key] = context[key]; | |
} | |
}); | |
var winKeys = Object_keys(win); | |
var res = wEval.call(win, this.code); | |
forEach(Object_keys(win), function(key) { | |
// Avoid copying circular objects like `top` and `window` by only | |
// updating existing context properties or new properties in the `win` | |
// that was only introduced after the eval. | |
if (key in context || indexOf(winKeys, key) === -1) { | |
context[key] = win[key]; | |
} | |
}); | |
forEach(globals, function(key) { | |
if (!(key in context)) { | |
defineProp(context, key, win[key]); | |
} | |
}); | |
global.document.body.removeChild(iframe); | |
return res; | |
} | |
return otherRunInContext(this.code, context); | |
}; | |
Script.prototype.runInThisContext = function() { | |
var fn = new Function('code', 'return eval(code);'); | |
return fn.call(global, this.code); // maybe... | |
}; | |
Script.prototype.runInNewContext = function(context) { | |
var ctx = createContext(context); | |
var res = this.runInContext(ctx); | |
if (context) { | |
forEach(Object_keys(ctx), function(key) { | |
context[key] = ctx[key]; | |
}); | |
} | |
return res; | |
}; | |
export function createScript(code) { | |
return new Script(code); | |
} | |
export function createContext(context) { | |
if (isContext(context)) { | |
return context; | |
} | |
var copy = new Context(); | |
if (typeof context === 'object') { | |
forEach(Object_keys(context), function(key) { | |
copy[key] = context[key]; | |
}); | |
} | |
return copy; | |
} | |
export function runInContext(code, contextifiedSandbox, options) { | |
var script = new Script(code, options); | |
return script.runInContext(contextifiedSandbox, options); | |
} | |
export function runInThisContext(code, options) { | |
var script = new Script(code, options); | |
return script.runInThisContext(options); | |
} | |
export function isContext(context) { | |
return context instanceof Context; | |
} | |
export function runInNewContext(code, sandbox, options) { | |
var script = new Script(code, options); | |
return script.runInNewContext(sandbox, options); | |
} | |
export default { | |
runInContext: runInContext, | |
isContext: isContext, | |
createContext: createContext, | |
createScript: createScript, | |
Script: Script, | |
runInThisContext: runInThisContext, | |
runInNewContext: runInNewContext | |
} | |
/* | |
from indexOf | |
@ author tjholowaychuk | |
@ license MIT | |
*/ | |
var _indexOf = [].indexOf; | |
function indexOf(arr, obj){ | |
if (_indexOf) return arr.indexOf(obj); | |
for (var i = 0; i < arr.length; ++i) { | |
if (arr[i] === obj) return i; | |
} | |
return -1; | |
} | |