Created
February 17, 2017 16:16
-
-
Save mlehmk/1733ec6cbb8eb747fadc60b5562131c1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* minimalistic AMD implementation (experimental) | |
| * put following script as first before all other script tags in the header | |
| <script> | |
| function define(){define.$.push(arguments)}define.$=[];define.amd={}; | |
| </script> | |
| * then load all other scripts in any order with async | |
| */ | |
| //define=define||(function(){var define=function(){define.$.push(arguments);};define.$=[];define.amd={};return define;})(); | |
| (function(global){ | |
| "use strict"; | |
| var modules = {}; | |
| var defer = []; | |
| function resolveAllDeps(names) { | |
| var currentModule = {exports:{}}; | |
| modules['module'] = currentModule; | |
| modules['exports'] = currentModule.exports; | |
| if(!Array.isArray(names) || names.length === 0) { | |
| return [modules['require'], currentModule.exports, currentModule]; | |
| } | |
| var deps = []; | |
| for(var i = 0; i < names.length; ++i) { | |
| var module = modules[names[i]]; | |
| if(module) { | |
| deps.push(module); | |
| } else { | |
| return null; | |
| } | |
| } | |
| return deps; | |
| } | |
| function initiate(deferred, success, fail) { | |
| var deps = resolveAllDeps(deferred.deps); | |
| if(deps) { | |
| var object = deferred.factory.apply({},deps); | |
| if(typeof(deferred.name)==='string') { | |
| modules[deferred.name] = object || modules['module'].exports; | |
| return success(true); | |
| } else { | |
| return success(false); | |
| } | |
| } | |
| return fail(); | |
| } | |
| function resolveDeferred() { | |
| var repeat; | |
| do { | |
| repeat = false; | |
| var i = 0; | |
| while(i < defer.length) { | |
| initiate(defer[i], function success(hasName){ | |
| if(hasName) { | |
| repeat = true; | |
| } | |
| defer.splice(i, 1); | |
| }, function fail() { | |
| ++i; | |
| }); | |
| } | |
| } while(repeat); | |
| } | |
| function findRequires(factory, deps) { | |
| if(typeof(factory)!=='function') return []; | |
| var requires = Array.isArray(deps) ? deps : []; | |
| var re = /require\s*\(\s*('([^']+)'|"([^"]+)")\s*\)/g; | |
| var source = factory.toString(); | |
| var match; | |
| while((match = re.exec(source))!==null) { | |
| var r = match[2] || match[3]; | |
| if(requires.indexOf(r) < 0) { | |
| requires.push(r); | |
| } | |
| } | |
| return requires; | |
| } | |
| function push(args) { | |
| var deferred = { deps: [] }; | |
| var i = 0; | |
| if(typeof(args[i])==='string'){ | |
| deferred.name = args[i++]; | |
| } | |
| if(Array.isArray(args[i])){ | |
| deferred.deps = args[i++]; | |
| } | |
| deferred.factory = args[i]; | |
| if(typeof(deferred.factory)==='function') { | |
| initiate(deferred, function success(hasName){ | |
| if(hasName) { | |
| resolveDeferred(); | |
| } | |
| },function fail(){ | |
| defer.push(deferred); | |
| }); | |
| } else { | |
| if(deferred.name) { | |
| modules[deferred.name] = deferred.factory; | |
| } | |
| } | |
| } | |
| modules['require'] = function (name) { | |
| var module = modules[name]; | |
| if(module) { | |
| return module; | |
| } | |
| throw Error('Module not found'); | |
| }; | |
| if(typeof(global.define)==='function') { | |
| global.define.$.push = push; | |
| while(global.define.$.length>0) { | |
| push(global.define.$.shift()); | |
| } | |
| } else { | |
| global.define = push; | |
| global.define.amd = {}; | |
| } | |
| })(this); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment