fmd.js
Version:
another module writing system
26 lines (25 loc) • 9.33 kB
JavaScript
/*
fmd.js v1.1.0 | http://fmdjs.org/ | MIT */
(function(f){if(!f.fmd){var g={},e=[],c=function(a){return g[a]},d=function(a,b,d){if(!g[a]){d||(d=b,b=[]);if("function"===typeof d){for(var k=[],c=0,h=b.length;c<h;c++)k.push(g[b[c]]);d=d.apply(null,k)}g[a]=d||1;e.push(a)}};d.version="1.1.0";d.cache={parts:e};d("global",f);d("require",function(){return c});d("env",function(){return d});d("cache",function(){return d.cache});f.fmd=d}})("undefined"!==typeof window?window:global);
fmd("lang",function(){var f={}.toString,g=Array.prototype,e={isFunction:function(c){return"[object Function]"===f.call(c)},isArray:Array.isArray||function(c){return"[object Array]"===f.call(c)},isString:function(c){return"string"===typeof c},forEach:g.forEach?function(c,d,a){c.forEach(d,a)}:function(c,d,a){for(var b=0,e=c.length;b<e;b++)d.call(a,c[b],b,c)},map:g.map?function(c,d,a){return c.map(d,a)}:function(c,d,a){var b=[];e.forEach(c,function(c,k,e){b.push(d.call(a,c,k,e))});return b},inArray:g.indexOf?
function(c,d){return c.indexOf(d)}:function(c,d){for(var a=0,b=c.length;a<b;a++)if(c[a]===d)return a;return-1}};return e});fmd("event",["env","cache"],function(f,g){var e=g.events={},c=[].slice,d={on:function(a,b){(e[a]||(e[a]=[])).push(b)},emit:function(a){var b=c.call(arguments,1),d=e[a],k,g=0;if(d)for(;k=d[g++];)k.apply(null,b)},off:function(a,b){var d=e[a];if(d)if(b)for(var c=d.length-1;0<=c;c--)d[c]===b&&d.splice(c,1);else delete e[a]}};f.on=d.on;f.emit=d.emit;f.off=d.off;return d});
fmd("config",["env","cache","lang"],function(f,g,e){var c=g.config={},d=g.configKeys={},a=g.configRules={},b=0,l={get:function(a){return c[a]},set:function(b){for(var e in b){var k=c[e],g=b[e],n=d[e],f;(f=!n)||(k=(n=a[n])?void 0===n.call(c,k,e,g):!1,f=!k);f&&(c[e]=g)}},register:function(c){e.isFunction(c.rule)&&(c.name||(c.name="_rule_"+b++),a[c.name]=c.rule);a[c.name]&&(c.key||c.keys)&&(e.isArray(c.keys)?e.forEach(c.keys,function(a){d[a]=c.name}):d[c.key||c.keys]=c.name);return this}};l.register({name:"object",
rule:function(a,c,b){if(a)for(var d in b)a[d]=b[d];else return!1}}).register({name:"array",rule:function(a,b,c){a?a.push(c):this[b]=[c]}});f.config=function(a){if(e.isString(a))return l.get(a);l.set(a)};return l});
fmd("module","global env cache lang event config".split(" "),function(f,g,e,c,d,a){var b=[],l=0,k=e.modules={},m={require:function(a){a.require||h.makeRequire(a);d.emit("makeRequire",a.require,a);return a.require},exports:function(a){return a.exports},module:function(a){a.module={id:a.id,exports:a.exports};return a.module},"@fmd":function(){return g}},h=function(a,b,c){this.id=a;this.deps=b||[];this.factory=c;this.exports={};this.unnamed()&&(a="_!_fmd_anonymous_"+l,l++);this.uid=a};h.prototype={unnamed:function(){return""===
this.id},extract:function(){var a=this,b=a.deps,d=[];c.isArray(b)&&c.forEach(b,function(b){var c;(c=m[b])?b=c(a):(a.require||h.makeRequire(a),b=a.require(b));d.push(b)});return d},compile:function(){if(a.get("hasCatch"))try{h.compile(this)}catch(n){d.emit("compileFailed",n,this)}else h.compile(this)},autocompile:function(){this.unnamed()&&this.compile()}};h.get=function(a){return k[a]};h.has=function(a,b){if(m[a])return!0;var c={id:a};b&&d.emit("alias",c);return k[c.id]?!0:!1};h.save=function(a){k[a.uid]=
a;d.emit("saved",a);a.autocompile()};h.require=function(a){var b=h.get(a);if(!b)return d.emit("requireFailed",{id:a}),null;b.compiled||(b.compiled=!0,b.compile());d.emit("required",b);return b.exports};h.makeRequire=function(a){a.require=function(b){b={id:b};d.emit("alias",b,a);return h.require(b.id)}};h.define=function(a,e,g){var f=arguments.length;1===f?(g=a,a=""):2===f&&(g=e,e=b,c.isString(a)||(e=a,a=""));if(h.has(a,!0))return d.emit("existed",{id:a}),null;h.save(new h(a,e,g))};h.compile=function(a){if(c.isFunction(a.factory)){var b=
a.extract(),b=a.factory.apply(null,b);void 0!==b?a.exports=b:a.module&&void 0!==a.module.exports&&(a.exports=a.module.exports);a.module&&delete a.module}else void 0!==a.factory&&(a.exports=a.factory);d.emit("compiled",a)};h.define.fmd={};var p=f.define;g.noConflict=function(){f.define=p};g.define=f.define=h.define;return h});
fmd("relative",["lang","event"],function(f,g){var e=/.*\//,c=/\/\.\//,d=/[^\/]+\/\.\.\//,a={cwd:function(a){return a.match(e)[0]},isDotStart:function(a){return"."===a.charAt(0)},hasSlash:function(a){return 0<a.lastIndexOf("/")},resolve:function(a,e){for(var b=(a+e).replace(c,"/");b.match(d);)b=b.replace(d,"");return b}};g.on("alias",function(b,c){c&&c.id&&a.isDotStart(b.id)&&a.hasSlash(c.id)&&(c._cwd||(c._cwd=a.cwd(c.id)),b.id=a.resolve(c._cwd,b.id))});return a});
fmd("alias",["config","event"],function(f,g){f.register({key:"alias",name:"object"});g.on("alias",function(e){var c=f.get("alias"),d;c&&(d=c[e.id])&&(e.nominalId=e.id,e.id=d)})});fmd("resolve",["event","config"],function(f,g){g.register({key:"resolve",name:"array"});f.on("resolve",function(e){var c=g.get("resolve"),d;if(c)for(var a=0,b=c.length;a<b&&(d=c[a](e.id),void 0===d||d===e.id);a++);e.url=d?d:e.id})});
fmd("id2url",["global","event","config"],function(f,g,e){var c=/^https?:\/\//i,d=(new Date).getTime();e.set({baseUrl:function(){var a=/^\w+\:\/\/[\w\-\.:]+\//i,b=f.document.getElementsByTagName("script"),b=b[b.length-1];return(a=(b=b.hasAttribute?b.src:b.getAttribute("src",4))?b.match(a):null)?a[0]:""}()});e.register({key:"stamp",name:"object"});g.on("stamp",function(a){var b=e.get("hasStamp")?d:null,c=e.get("stamp");if(c)for(var g in c)if((new RegExp(g)).test(a.id)){b=c[g];break}b&&(a.url+="?fmd.stamp="+
b)});g.on("id2url",function(a){g.emit("resolve",a);c.test(a.url)||(a.url=e.get("baseUrl")+a.url);var b=a.url;b.lastIndexOf(".")<b.lastIndexOf("/")&&(a.url+=".js");g.emit("stamp",a)})});
fmd("assets",["cache","lang","event","config","module"],function(f,g,e,c,d){var a=f.assets={},b={},l={make:function(c,g){var f={id:c};e.emit("analyze",f);e.emit("alias",f,g);if(b[f.id])return a[b[f.id]];d.has(f.id)?f.url=f.id:e.emit("id2url",f);b[f.id]=f.url;return a[f.url]=f},group:function(a){return g.map(a.deps,function(b){return l.make(b,a)})}};return l});
fmd("when",function(){var f=function(){},g=function(e){var c=this,d=[],a=0,b=0;e=e||0;var g=function(){a+b===e&&k()},k=function(){c.then=b?function(a,b){b&&b()}:function(a,b){a&&a()};k=f;m(b?1:0);m=f;d=[]},m=function(a){for(var b,c=0;b=d[c++];)(b=b[a])&&b()};this.then=function(a,b){d.push([a,b])};this.resolve=function(){a++;g()};this.reject=function(){b++;g()};g()};return function(){for(var e=new g(arguments.length),c,d=0;c=arguments[d++];)c(e);return e}});
fmd("request",["global","config","event"],function(f,g,e){var c=f.document,d=f.setTimeout,a=/\.css(?:\?|$)/i,b=/loaded|complete/,l=/security|denied/i,k=/mobile/;f=f.navigator.userAgent.toLowerCase();var m=f.match(/.*webkit\/?(\d+)\..*/),h=(m?536>1*m[1]:!1)||!m&&k.test(f),p=c&&(c.head||c.getElementsByTagName("head")[0]||c.documentElement),n=function(a,b,c){var g=!1,f,h;try{if(f=a.sheet)g=(h=f.cssRules)?0<h.length:void 0!==h}catch(t){g=l.test(t.message)}d(function(){g?(b&&b(),e.emit("requested",c)):
n(a,b,c)},20)},q=function(a,c,d,f,h){function k(){a.onload=a.onreadystatechange=a.onerror=null;h||g.get("debug")||a.parentNode&&a.parentNode.removeChild(a);a=void 0;c&&c()}d?(a.onload=function(){k();e.emit("requested",f)},a.onerror=function(){k();e.emit("requestError",f)}):a.onreadystatechange=function(){b.test(a.readyState)&&(k(),e.emit("requested",f))}},r=function(a,b,c,e){!c||h?d(function(){n(a,b,e)},1):q(a,b,c,e,!0)};return function(b,d){var f=a.test(b.url),h;f?(h=c.createElement("link"),h.rel=
"stylesheet",h.href=b.url):(h=c.createElement("script"),h.async=!0,h.src=b.url);g.get("charset")&&(h.charset=g.get("charset"));e.emit("createNode",h,b);var k="onload"in h;f?r(h,d,k,b):q(h,d,k,b);p.appendChild(h)}});
fmd("loader",["global","event","config","request"],function(f,g,e,c){var d=function(){};e.set({timeout:1E4});g.on("requestComplete",function(a){var b;a.state="loaded";for(b=a.onload;a=b.shift();)a()});return function(a,b){b||(b=d);"loaded"===a.state?b():"loading"===a.state?a.onload.push(b):(a.state="loading",a.onload=[b],g.emit("request",a,b),a.requested||(a.timer=f.setTimeout(function(){g.emit("requestTimeout",a)},e.get("timeout")),c(a,function(){f.clearTimeout(a.timer);g.emit("requestComplete",
a)})))}});
fmd("remote","lang event module assets when loader".split(" "),function(f,g,e,c,d,a){var b={};b.bring=b.get=function(b,c){d.apply(null,f.map(b,function(b){return function(c){e.has(b.id)?c.resolve():a(b,function(){c.resolve()})}})).then(c)};b.fetch=function(a,k){var l=c.group(a);g.emit("fetch",l);b.bring(l,function(){d.apply(null,f.map(l,function(a){return function(c){var d=e.get(a.id);d&&!d.compiled&&d.deps.length?b.fetch(d,function(){c.resolve()}):c.resolve()}})).then(function(){k.call(null,l)})})};
return b});fmd("use",["lang","event","module","remote"],function(f,g,e,c){g.on("makeRequire",function(d,a){d.use=function(b,d){f.isArray(b)||(b=[b]);c.fetch({id:a.id,deps:b},function(a){a=f.map(a,function(a){return e.require(a.id)});d&&d.apply(null,a)})}})});
fmd("async",["config","module","remote"],function(f,g,e){var c=g.prototype.autocompile,d=function(){var a=this;a.unnamed()&&e.fetch(a,function(){a.compile()})};f.register({key:"async",rule:function(a,b,e){e=!!e;a!==e&&(this.async=e,g.prototype.autocompile=!0===e?d:c)}}).set({async:!0})});