instance-js
Version:
169 lines (131 loc) • 3.88 kB
JavaScript
(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";
})();