UNPKG

basic-dependency-injector

Version:

RequireJS-like inyector, lighter and faster than requirejs, with no overhead and build with simplicity in mind.

1 lines 3.96 kB
var req,def;!function(a,b){var c={},d={},e=function(a,b){var c={},d=[],e=[];b=b||{};var g=function(a,b,c,e){f.isEmptyArray(c)||c.forEach(function(a){d.indexOf(a)>-1&&c.slice(c.indexOf(a),1)}),f.isEmptyArray(c)?j(a,b,e):h(a,b,c,e)},h=function(a,b,d,e){c[b]||(c[b]={},c[b].url=a,c[b].pos=e,c[b].deps=d)},i=function(a){for(var b in c)if(c.hasOwnProperty(b)){var d=c[b],e=d.deps.indexOf(a);e>-1&&(c[b].deps.splice(e,1),c[b].deps.length||j(d.url,b,d.pos))}},j=function(a,b,c){var f={};f.name=b,f.url=a,f.pos=c,e.push(f),-1==d.indexOf(b)&&d.push(b),i(b)},k=0;return a.forEach(function(a){var c=a,d=[];b[a]&&(c=b[a].url||c,d=b[a].deps||d),g(c,a,d,k),k+=1}),f.isEmptyObject(c)||d.forEach(function(a){i(a)}),e},f={isArray:function(a){return"[object Array]"==Object.prototype.toString.call(a)},isObject:function(a){return"[object Object]"==Object.prototype.toString.call(a)},isString:function(a){return"[object String]"==Object.prototype.toString.call(a)},isNumber:function(a){return"[object Number]"==Object.prototype.toString.call(a)},isFunction:function(a){return"[object Function]"==Object.prototype.toString.call(a)},isEmptyObject:function(a){return!Object.keys(a).length},isEmptyArray:function(a){return!a.length},objectLen:function(a){return Object.keys(a).length},inObject:function(a,b){var c=!1;for(var d in b)if(b.hasOwnProperty(d)){d==a&&(c=!0);break}return c},shallowClone:function(a){var b={};for(var c in a)b[c]=a[c];return b},deepClone:function(a){return JSON.parse(JSON.stringify(a))},anotherClone:function(a){return new Object(a)}},g=function(a){a=a||{verbose:!1,processOnFail:!1};var e,f,b=[],c=[],d=null,g=function(g,h,i){d--,g?b[i]=h[0]:(c[i]=h[0],a.processOnFail||(d=!1,b=[]),a.verbose&&console.log("The argument in the position number: "+i+" has failed")),d||(c.length&&(c=Array.prototype.slice.call(c),f.apply(null,c)),b.length&&(b=Array.prototype.slice.call(b),e.apply(null,b)))},h=function(a,b){b=Array.prototype.slice.call(b),a.apply(null,b)},i=function(a){return e=a,this},j=function(a){return e=a,this},k=function(a){return f=a,this};return{when:function(){for(var a=d=arguments.length;a--;)arguments[a].self.pos=a,arguments[a].self.resolve=function(){g(!0,arguments,this.pos)},arguments[a].self.reject=function(){g(!1,arguments,this.pos)};return{then:j,fail:k,done:i}},resolve:function(){h(e,arguments)},reject:function(){h(f,arguments)},promise:function(){return{done:i,fail:k,self:this}}}};req=function(h,i){var j=function(){var b=a.createElement("script");return b.type="text/javascript",b.charset="utf-8",b.async=!0,b},k=function(a,b){var c=new g,e=new XMLHttpRequest;return 0===b.indexOf("!")&&(b=b.substring(1,b.length)),e.onreadystatechange=function(){4==e.readyState&&200==e.status?(d[a]||(d[a]=e.responseText),c.resolve()):4==e.readyState&&200!=e.status&&c.reject("Error: "+b+" could not be loaded")},e.open("GET",b,!0),e.send(null),c.promise()},l=function(c,d){var e=new g,h=j();h.src=d;var i=f.shallowClone(b);return h.addEventListener("load",function(a){var d=a.currentTarget,g=n(i,b,c);f.isEmptyArray(g)||g.forEach(function(a){delete b[a]}),e.resolve(),d.parentNode.removeChild(d)}),h.addEventListener("error",function(a){var b=a.currentTarget;b.parentNode.removeChild(b),e.reject("Error: "+c+" could not be loaded")}),a.getElementsByTagName("head")[0].appendChild(h),e.promise()},m=function(a,b){return 0===a.indexOf("!")?k(a,b):l(a,b)},n=function(a,b,c){var e=[];b=f.shallowClone(b);for(var g in b)a[g]||d[c]||(d[c]=b[g],e.push(g));return e},o=[];if(f.isEmptyArray(h))i();else{var p=new e(h,c);p.forEach(function(a){f.inObject(a.name,d)||o.push(m(a.name,a.url))}),(new g).when.apply(null,o).then(function(){var a=[];h.forEach(function(b){a.push(d[b])}),i&&i.apply(null,a)}).fail(function(a){console.log(a)})}},req.setConfig=function(a){c=a},def=function(a,b){return function(){req(a,b)}};for(var j,h=a.getElementsByTagName("script"),i=h.length,k=i;k--;)if(j=h[k].getAttribute("data-main")){req([j]);break}}(document,window);