UNPKG

es666

Version:

async front end module loader and code executor

66 lines (62 loc) 2 kB
var detect = require('detective') var endpoint = "https://wzrd.in/multi" var moduleCache = {} global.require = require var _dereq_ = function(module){ if(moduleCache[module]) return moduleCache[module].exports else return require(module) } module.exports = function(str, uri, cb){ if('function' == typeof uri) cb = uri if('string' == typeof uri) endpoint = uri var _fn = new Function(['require'], str) var modules = detect(_fn.toString()) if(modules.length){ var body = {"options":{"standalone":true}, dependencies: {}} var cached = [] var help = {} modules.forEach(function(module){ if(moduleCache[module]) { cached.push(module) return } else{ body.dependencies[module.split('@')[0]] = module.split('@')[1] || '' help[module] = module.split('@')[0] } }) if(cached.length == modules.length) { // all cached var fn = new Function(['require'], str) var x = fn(_dereq_) if(cb) cb(null, x, fn) } else{ var post = new XMLHttpRequest(); post.open('POST', endpoint, true) post.onload = function(e){ if(this.status == 200){ var mods = JSON.parse(this.responseText); var names = Object.keys(mods) names.forEach(function(name){ moduleCache[help[name]] = mods[name] var m = {exports: {}} var e = m.exports var x = new Function(["require", "module", "exports"], mods[name].bundle) x(_dereq_, m, e) moduleCache[help[name]].exports = m.exports }) var x = _fn(_dereq_) if(cb) cb(null, x, _fn) } else console.log(this.status) } post.send(JSON.stringify(body)) } } else{ var fn = new Function(['require'], str) var x = fn(_dereq_) if(cb) cb(null, x, fn) } }