UNPKG

chamber

Version:

Javascript modules for the node and the browser

86 lines (55 loc) 2.08 kB
(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'); }); })();