Mon 21 Jul 22:43:21 CEST 2025

This commit is contained in:
sbosse 2025-07-21 23:14:18 +02:00
parent 315c254b59
commit c017215428

146
js/com/evalx.js Normal file
View File

@ -0,0 +1,146 @@
var _eval, isBrowser, isNode, head, Module, base64Encode;
var SOURCE_MAPPING_URL = 'sourceMappingUrl';
var DATA = 'data';
global.ERROR = undefined;
// This causes code to be eval'd in the global scope
_eval = eval;
if ( typeof document !== 'undefined' ) {
isBrowser = true;
head = document.getElementsByTagName( 'head' )[0];
} else if ( typeof process !== 'undefined' ) {
isNode = true;
Module = ( require.nodeRequire || require )( 'module' );
}
if ( typeof btoa === 'function' ) {
base64Encode = function ( str ) {
str = str.replace( /[^\x00-\x7F]/g, function ( char ) {
var hex = char.charCodeAt( 0 ).toString( 16 );
while ( hex.length < 4 ) hex = '0' + hex;
return '\\u' + hex;
});
return btoa( str );
};
} else if ( typeof Buffer === 'function' ) {
base64Encode = function ( str ) {
return new Buffer( str, 'utf-8' ).toString( 'base64' );
};
} else {
base64Encode = function () {};
}
function eval2 ( script, options ) {
var res=undefined;
options = options || {};
if ( options.sourceMap ) {
script += '\n//# ' + SOURCE_MAPPING_URL + '=data:application/json;charset=utf-8;base64,' + base64Encode( JSON.stringify( options.sourceMap ) );
}
else if ( options.sourceURL ) {
script += '\n//# sourceURL=' + options.sourceURL;
}
try {
res = eval( script );
ERROR=undefined;
return res;
} catch ( err ) {
if ( isNode ) {
locateErrorUsingModule( script, options.sourceURL || '' );
return undefined;
}
// In browsers, only locate syntax errors. Other errors can
// be located via the console in the normal fashion
else if ( isBrowser && err.name === 'SyntaxError' ) {
locateErrorUsingDataUri( script );
return undefined;
}
throw err;
}
}
eval2.Function = function () {
var i, args = [], body, wrapped, options;
i = arguments.length;
while ( i-- ) {
args[i] = arguments[i];
}
if ( typeof args[ args.length - 1 ] === 'object' ) {
options = args.pop();
} else {
options = {};
}
// allow an array of arguments to be passed
if ( args.length === 1 && Object.prototype.toString.call( args ) === '[object Array]' ) {
args = args[0];
}
if ( options.sourceMap ) {
options.sourceMap = clone( options.sourceMap );
// shift everything a line down, to accommodate `(function (...) {`
options.sourceMap.mappings = ';' + options.sourceMap.mappings;
}
body = args.pop();
wrapped = '(function (' + args.join( ', ' ) + ') {\n' + body + '\n})';
return eval2( wrapped, options );
};
function locateErrorUsingDataUri ( code ) {
var dataURI, scriptElement;
dataURI = DATA + ':text/javascript;charset=utf-8,' + encodeURIComponent( code );
scriptElement = document.createElement( 'script' );
scriptElement.src = dataURI;
scriptElement.onload = function () {
head.removeChild( scriptElement );
};
head.appendChild( scriptElement );
}
function locateErrorUsingModule ( code, url ) {
var m = new Module();
try {
m._compile( 'module.exports = function () {' + code + '};', url );
} catch ( err ) {
global.ERROR = err;
console.error( ERROR );
return;
}
m.exports();
}
function clone ( obj ) {
var cloned = {}, key;
for ( key in obj ) {
if ( obj.hasOwnProperty( key ) ) {
cloned[ key ] = obj[ key ];
}
}
return cloned;
}
module.exports = {
eval:eval2
}