chamber
Version:
Javascript modules for the node and the browser
86 lines (55 loc) • 2.08 kB
JavaScript
(function() {
function getLastScriptEl() {
var scripts = document.getElementsByTagName( 'script' );
var scriptTag = scripts[ scripts.length - 1 ];
return scriptTag;
}
var currentScript = getLastScriptEl();
var mainModuleName = currentScript.attributes['data-main'].nodeValue;
var baseDir = currentScript.attributes['data-base-dir'].nodeValue;
var modules = window.modules = {};
var loadModule = function loadModule(moduleName, opts) {
opts = opts || {};
modules[moduleName] = Q.defer();
var moduleScriptEl = document.createElement('script');
moduleScriptEl.setAttribute('src', baseDir + '/' + moduleName + '.js');
moduleScriptEl.setAttribute('data-module-name', moduleName);
getLastScriptEl().parentNode.appendChild(moduleScriptEl);
return modules[moduleName].promise;
}
window.chamber = function chamberMain(mainFn) {
var script = getLastScriptEl();
var moduleName = script.attributes['data-module-name'].nodeValue;
var c = {};
c.env = {};
c.env.title = 'Browser';
c.env.browser = {};
c.env.browser.window = window;
c.loadModule = function innerLoadModule(moduleName, opts) {
// new opts object, to prepare for recursive calling of chamber
opts = opts || {};
// the module should refer to other modules relative to itself
opts.baseDir = opts.baseDir || baseDir;
// share the modules
opts.modules = opts.modules || modules;
// recursively call this module loading function
return loadModule(moduleName, opts);
}
c.deferredModule = modules[moduleName];
c.resolve = c.deferredModule.resolve;
c.reject = c.deferredModule.reject;
c.notify = c.deferredModule.notify;
c.Q = Q;
mainFn(c);
return c.deferredModule.promise.then(function(module) {
modules[moduleName] = {
module: module
};
return module;
});
}
loadModule(mainModuleName);
modules[mainModuleName].promise.then(function() {
console.log('MODULES LOADED ON BROWSER');
});
})();