Time slots app prototype
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

202 lines
5.0 KiB

/*
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;
}