UNPKG

instance-js

Version:
169 lines (131 loc) 3.88 kB
(function() { // #Require Inst.require = (function() { var progress = {}; function camelCaseToDashSeparated(str) { return str.replace(/(.)([A-Z])/g, "$1-$2").toLowerCase(); } function appendScript(src) { var script = document.createElement("script"); script.src = src; return document.body.appendChild(script); } function getSrc(ext, extSrc) { extSrc = extSrc ? extSrc : Inst.extSrc; extSrc = extSrc.replace(/[\s\\\/]+$/, ""); return extSrc + "/" + ext + ".js"; } function stringToArray(obj, delimiter) { return isString(obj) ? obj.replace(/^\s+|\s+$/g, "").replace(/\s+/g, " ").split(delimiter||" ") : obj; } return function iRequire(exts, callback) { exts = stringToArray(exts); // exts must be an array if( !Array.isArray(exts) ) { throw new TypeError("first argument is not an array."); } var rem = exts.length, finalMsg = {}, errors = [], errorCallback, extSrc; exts.forEach(function(ext) { var condition = isString(ext) ? true : "condition" in ext ? ext.condition : true; var doneOnLoad = isString(ext) ? false : "wire" in ext ? !ext.wire : false; extSrc = isString(ext) ? null : ext.src; ext = isString(ext) ? ext : ext.name; var extMod = camelCaseToDashSeparated(ext); var src = getSrc(extMod, extSrc); if( progress[src] === undefined ) { progress[src] = []; } else if( Array.isArray(progress[src]) ) { return progress[src] = progress[src].concat(function(error) { done(src, false, error); }); } else { return done(src, false, progress[src]); } if( !condition ) { return done(src, !progress[src].length); } var script = appendScript(src); script.onload = loaded; script.onerror = function(e) { done(src, true, {extMod: extMod, ext: ext, errorObject: e}); } function loaded() { if( doneOnLoad ) { return done(src, true); } var ev; if( I.emitterCheck("require#" + extMod) ) { ev = "require#" + extMod; } else if( I.emitterCheck("require#" + ext) ) { ev = "require#" + ext; } else { done(src, true, {extMod: extMod, ext: ext, errorObject: null}); throw ReferenceError(src + " is not handling require#" + ext ); } I.emit(ev, function(msg) { finalMsg[ext] = 0 in arguments ? msg : null; done(src, true); }); } }); function done(src, first, error) { rem--; errors = error ? errors.concat(error) : errors; if( rem === 0 ) { if( errors.length ) { isFunction(errorCallback) && errorCallback(errors); } else { isFunction(callback) && callback(finalMsg); } } if( first ) { progress[src].forEach(function(update) { update(error); }); progress[src] = error||null; } } return { error: function(hndl) { errorCallback = hndl; return this; } } } })(); Inst.requireIf = function(condition, exts, callback) { exts = stringToArray(exts).map(function(ext) { return {name: ext, condition: condition}; }); return Inst.require(exts, callback); } Inst.requireFrom = function(src, exts, callback) { exts = stringToArray(ext).map(function(ext) { return {name: ext, src: src}; }); return Inst.require(exts, callback); } // #alias Inst.req = Inst.require; Inst.reqIf = Inst.requireIf; Inst.reqFrom = Inst.requireFrom; Inst.src = (function() { var script = Inst('script[src$="instance.js"'); if( script[0] ) { return script[0].src.replace("/instance.js", ""); } else { return "./instance"; } })(); Inst.extSrc = Inst.src + "/ext"; })();