Skip to content

Instantly share code, notes, and snippets.

@mlehmk
Created February 17, 2017 16:16
Show Gist options
  • Select an option

  • Save mlehmk/1733ec6cbb8eb747fadc60b5562131c1 to your computer and use it in GitHub Desktop.

Select an option

Save mlehmk/1733ec6cbb8eb747fadc60b5562131c1 to your computer and use it in GitHub Desktop.
/* 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