UNPKG

es5-ff-spa-loader

Version:

Javascript Single Page Application Loader

3 lines (2 loc) 17.9 kB
!function(e,t){"use strict";"function"==typeof define&&define.amd?define(t(e)):"object"==typeof exports?module.exports=t(e):e.FFSpaLoader=t(e)}(this||window,function(e){"use strict";var t={boot:{debug:{enable:!1,handler:null,prefix:"FFSpaLoader."},error:{enable:!0,title:"Loader "},cordova:{enable:!0,timeout:-1,flag:"FFCordovaDevice"},angular:{enable:!0,modules:[]},cleanup:{enable:!0,timeout:1e3,tags:[]}},server:{url:null,depath:null,assets:null,timeout:4096,flag:"FFServerUrl",header:{request:{"X-FFSpaLoader":"sync"},response:{}}},question:{transport:"http://",title:"Question",submit:"Start",size:32,text:"Please provide the server name",validate:{min:{value:3,message:"Server name is to short."},max:{value:255,message:"Server name is to long."},regex:{value:"^([a-zA-Z0-9.:])*$",message:"Server name is invalid."}}},loader:{title:"Loading Application",footer:"© FFSpaLoader",await:250,progres:{items:{enable:!0,size:50},bar:{enable:!0,percentage:!0}},delayDss:!1},cache:{meta:null,js:null,css:null,dss:null}},r=null,n=[],a=!1,o=function(e){t.boot.debug.enable===!0&&t.boot.debug.handler(t.boot.debug.prefix+e)},u={detect:{localStorage:function(){try{var t="localStorageDetect";return e.localStorage.setItem(t,t),e.localStorage.removeItem(t),!0}catch(r){return!1}},openDatabase:function(){return"openDatabase"in e},sqlitePlugin:function(){return"sqlitePlugin"in e},cordova:function(){return"cordova"in e},cordovaDevice:function(){return t.boot.cordova.flag in e}},cache:{localStorage:function(){return{cacheGetValue:function(t,r){try{var n=e.localStorage.getItem(t),a=JSON.parse(n);r(null,a)}catch(o){r(o)}},cacheSetValue:function(t,r,n){try{e.localStorage.setItem(t,JSON.stringify(r)),n(null)}catch(a){n(a)}},cacheDeleteValue:function(t,r){try{e.localStorage.removeItem(t),r(null)}catch(n){r(n)}}}},websql:function(t){void 0===t&&(t={}),void 0===t.name&&(t.name="FFSpaLoader"),void 0===t.size&&(t.size=4194304),void 0===t.version&&(t.version="1.0"),void 0===t.table&&(t.table="cache_store"),void 0===t.open&&(t.open=function(t){return e.openDatabase(t.name,t.version,t.name,t.size)});var n=function(e){return function(){e(null)}},a=function(e,t,r,n,a){o("websql.executeSql "+t),e.executeSql(t,r,n,function(e,r){a(new Error("Code: "+r.code+" "+r.message+" by query: "+t))})},u=function(e){r.transaction(function(r){var o="CREATE TABLE "+t.table+"(id INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT NOT NULL, value TEXT NOT NULL)";a(r,o,[],function(r){a(r,"CREATE UNIQUE INDEX "+t.table+"__key__udx ON "+t.table+" (key)",[],n(e),e)},e)})};return{cacheOpen:function(e){if(null!==r)return e(null);o("websql.cacheOpen "+JSON.stringify(t));try{r=t.open(t)}catch(n){return e(n)}r.transaction(function(r){a(r,"SELECT value FROM "+t.table+' WHERE key = "if-err-init"',[],function(){e(null)},function(){u(e)})})},cacheGetValue:function(e,n){r.transaction(function(r){a(r,"SELECT value FROM "+t.table+" WHERE key = ?",[e],function(e,t){if(0===t.rows.length)n(null,null);else{var r=t.rows.item(0).value;n(null,JSON.parse(r))}},n)})},cacheSetValue:function(e,o,u){r.transaction(function(r){a(r,"SELECT value FROM "+t.table+" WHERE key = ?",[e],function(r,l){if(0===l.rows.length){var i="INSERT INTO "+t.table+" (key,value) VALUES (?,?)";a(r,i,[e,JSON.stringify(o)],n(u),u)}else{var s="UPDATE "+t.table+" SET value = ? WHERE key = ?";a(r,s,[JSON.stringify(o),e],n(u),u)}},u)})},cacheDeleteValue:function(e,o){r.transaction(function(r){a(r,"DELETE FROM "+t.table+" WHERE key = ?",[e],n(o),o)})}}}}},l=function(e){e instanceof Error||(e=new Error(e)),o("utilErrorHandler error "+e.name+" "+e.message);var r=document.createElement("div");r.setAttribute("class","ffWrapper"),document.getElementsByTagName("body")[0].appendChild(r);var n=document.createElement("div");n.setAttribute("class","ffTitle"),n.appendChild(document.createTextNode(t.boot.error.title+e.name)),r.appendChild(n);var a=document.createElement("div");a.setAttribute("class","ffError"),r.appendChild(a);var u=document.createElement("p");u.appendChild(document.createTextNode(e.message)),a.appendChild(u);try{var l=e.stack||"";l=l.split("\n").map(function(e){return e.trim()+"\n"});var i=l.splice("Error"===l[0]?2:1);e.stackText=i;var s=document.createElement("pre");s.appendChild(document.createTextNode(i)),a.appendChild(s)}catch(c){o("No stack: "+c)}},i=function(e,r,n){var a=(new Date).getTime(),u=new XMLHttpRequest;u.onreadystatechange=function(){if(4===u.readyState&&200===u.status){o('utilHttpFetch url "'+e+'" done in '+((new Date).getTime()-a)+" ms.");var n=Object.keys(t.server.header.response);for(var l in n){var i=n[l],s=t.server.header.response[i],c=u.getResponseHeader(i);if(null===c)return r("Header missing: "+i);if(null!==s&&s!==c)return r("Header mismatch: "+i)}r(null,u)}else 4===u.readyState&&r("Wrong status "+u.status+" of "+e)},u.open("GET",e,!0),u.timeout=t.server.timeout,u.ontimeout=function(){r("timeout after "+t.server.timeout+" of url "+e)};var l=Object.keys(t.server.header.request);for(var i in l){var s=l[i],c=t.server.header.request[s];u.setRequestHeader(s,c)}n===!0&&u.setRequestHeader("Accept","application/json"),u.send()},s=function(e,t,r,n){if(0===t.length)return n(null);o(e+" start");var a=(new Date).getTime(),u=t,l=function(i){return null!==i?n(i):(u=u.slice(1),void(0===u.length?(o(e+" done "+t.length+" in "+((new Date).getTime()-a)+" ms."),n(null)):r(u[0],l)))};r(u[0],l)},c=function(){var e=t.server.url,r=t.server.url.indexOf("#");r>0&&(t.server.url=t.server.url.substring(0,r));var n=t.server.url.indexOf("?");n>0&&(t.server.url=t.server.url.substring(0,n)),null!==t.server.depath&&t.server.url.indexOf(t.server.depath)>0&&(o("start server.url depathing"),t.server.url=t.server.url.substring(0,t.server.url.indexOf(t.server.depath)-1)),0===t.server.url.indexOf("file://")&&(o("start server.url cleared because is file uri"),t.server.url=null),o('start cleaned server.url "'+t.server.url+'" from "'+e+'"')},d=function(e){return t.cache[e]?t.cache[e]:null},v=function(e){return null!==d(e)},f=function(e,t,r){v(e)?r():t(new Error("No caching for "+e))},p=function(e,t,r){f(e,r,function(){var n=e+"_"+t;o("cacheGetValue key "+n),d(e).cacheGetValue(n,r)})},m=function(e,t,r,n){f(e,n,function(){var a=e+"_"+t;o("cacheSetValue key "+a),d(e).cacheSetValue(a,r,n)})},h=function(e,t,r){f(e,r,function(){var n=e+"_"+t;o("cacheDeleteValue key "+n),d(e).cacheDeleteValue(n,r)})},b=function(e,t,r){var n={};e.forEach(function(e){var t=n[e.type];void 0===t&&(t=[],n[e.type]=t),t.push(e.hash)});var a=[],o=Object.keys(n);for(var u in o){var l=o[u];v(l)&&a.push({keys:n[l],type:l})}s("cleanupCacheKeys",a,function(e,r){p(e.type,"keys",function(n,a){if(null!==n)return r(n);if(null===a)return r(null);for(var o=[],u=0;u<a.length;u++)(t||-1===e.keys.indexOf(a[u]))&&o.push(a[u]);for(var l=a,i=0;i<o.length;i++){var c=l.indexOf(o[i]);-1!==c&&l.splice(c,1)}s("cleanupCacheItems",o,function(t,r){h(e.type,t,r)},function(t){return null!==t?r(t):void(0===o.length?r(null):m(e.type,"keys",l,r))})})},r)},g=function(e,t,r){o("injectResourceData resource "+JSON.stringify(e)+" data "+t.length);var n=null;return("css"===e.type||"dss"===e.type)&&(n=document.createElement("style"),n.type="text/css"),"js"===e.type&&(n=document.createElement("script"),n.type="text/javascript"),null===n?r("Unknown resource type: "+e.type):(n.appendChild(document.createTextNode(t)),document.getElementsByTagName("head")[0].appendChild(n),void r(null))},y=function(e,t){var r="keys";p(e.type,r,function(n,a){return null!==n?t(n):(null===a&&(a=[]),a.push(e.hash),void m(e.type,r,a,t))})},E=function(e,t,r){o("storeResource url "+e.url+" hash "+e.hash);var n={resource:e,data:t.responseText};m(e.type,e.hash,n,function(t){null!==t?r(t):y(e,r)})},T=function(e,r,a){if(t.loader.delayDss===!0&&"dss"===e.type&&void 0===a)return o("loadResource delay "+JSON.stringify(e)),n.push(e),r(null);var u=e.url;-1===u.indexOf("http")&&(u=t.server.url+u),o("loadResource "+JSON.stringify(e)),v(e.type)?p(e.type,e.hash,function(t,n){if(null!==t)return r(t);if(null===n)o("loadResource cache miss");else{if(void 0!==n.resource)return o("loadResource cache hit"),void g(n.resource,n.data,r);o("loadResource cache wrong obj")}i(u,function(t,n){return null!==t?r(t):void E(e,n,function(t){return null!==t?r(t):void g(e,n.responseText,r)})})}):i(u,function(t,n){return null!==t?r(t):void g(e,n.responseText,r)})},C=function(e){var r=null,n=null,a=0,u=e.length,l=0,i=0,s=setTimeout(function(){o("createLoaderBar after timeout: "+t.loader.await),r=document.createElement("div"),r.setAttribute("class","ffWrapper");var n=document.createElement("div");if(n.setAttribute("class","ffTitle"),n.appendChild(document.createTextNode(t.loader.title)),r.appendChild(n),t.loader.progres.items.enable){var a=document.createElement("div");a.setAttribute("class","ffLoaderItem"),r.appendChild(a),e.forEach(function(e){var r=e.url,n=t.loader.progres.items.size;r.length>n&&(r="..."+r.substring(r.length-n,r.length));var o=document.createElement("div");o.setAttribute("id",e.hash),o.setAttribute("class","ffLoaderItemText"),o.appendChild(document.createTextNode(r)),a.appendChild(o)})}if(t.loader.progres.bar.enable){var u=document.createElement("div");u.setAttribute("class","ffLoaderBar"),r.appendChild(u);for(var l=1;10>=l;l++){var i=document.createElement("div");i.setAttribute("id","barStep"+10*l),i.setAttribute("class","ffLoaderBarStep"),t.loader.progres.bar.percentage&&i.appendChild(document.createTextNode(10*l)),u.appendChild(i)}}var s=document.createElement("div");s.setAttribute("class","ffFooter"),s.appendChild(document.createTextNode(t.loader.footer)),r.appendChild(s),document.getElementsByTagName("body")[0].appendChild(r)},t.loader.await);return{nextResource:function(e){var t=document.getElementById(e.hash);if(null!==t&&t.setAttribute("class","ffLoaderItemTextStart"),null!==n){var r=document.getElementById(n.hash);null!==r&&r.setAttribute("class","ffLoaderItemTextDone")}if(n=e,a++,l=Math.round(100*a/u),l>i){i+=10;for(var o=1;10>=o;o++)if(!(10*o>i)){var s=document.getElementById("barStep"+10*o);null!==s&&s.setAttribute("class","ffLoaderBarStepDone")}}},done:function(){clearTimeout(s),null!==r&&(r.setAttribute("class","ffWrapper ffWrapperFadeOut"),setTimeout(function(){document.getElementsByTagName("body")[0].removeChild(r)},500))}}},x=function(r){if(null===t.server.url)return void r(new Error("No url"));if(null===t.server.assets)return void r(new Error("No assets"));e[t.server.flag]=t.server.url;var n=t.server.url+t.server.assets;o('startLoader assets "'+n+'"'),i(n,function(e,n){if(null!==e)return o("startLoader fetch error "+e),void(v("meta")?p("meta","server_resources",function(e,n){null!==e?r(e):null===n?r(new Error("Have no cache of server resouces from "+t.server.url)):s("injectResources",n,function(e,t){p(e.type,e.hash,function(r,n){g(e,n.data,t)})},r)}):r(new Error("Could not fetch server resouces from "+t.server.url)));var a=null;try{var u=JSON.parse(n.responseText);if(void 0===u.data)return r("No data in json");if(void 0===u.data.resources)return r("No resources in json");if(0===u.data.resources.length)return r("Empty resources in json");a=u.data.resources}catch(l){return r(l)}o("startLoader resources "+a.length);var i=C(a),c=function(e,t){T(e,t),i.nextResource(e)};v("meta")?m("meta","server_resources",a,function(e){return null!==e?r(e):void s("loadResources",a,c,function(e){i.done(),null===e?b(a,!1,r):r(e)})}):s("loadResources",a,c,function(e){i.done(),r(e)})},!0)},S=function(e,r){if(a!==!0){a=!0;for(var n=document.getElementById("serverInput"),u=document.getElementById("serverInputError"),l=n.value;u.firstChild;)u.removeChild(u.firstChild);var s=null;s=l.indexOf("://")>=0?l.split("/")[2]:l.split("/")[0];var d=l.split(s)[1];if(t.question.validate.min.value!==!1&&s.length<t.question.validate.min.value)return u.appendChild(document.createTextNode(t.question.validate.min.message)),void(a=!1);if(t.question.validate.max.value!==!1&&s.length>t.question.validate.max.value)return u.appendChild(document.createTextNode(t.question.validate.max.message)),void(a=!1);if(t.question.validate.regex.value!==!1&&0!==t.question.validate.regex.value.length){var f=new RegExp(t.question.validate.regex.value);if(null===s.match(f))return u.appendChild(document.createTextNode(t.question.validate.regex.message)),void(a=!1)}0===l.indexOf("https")?t.server.url="https://"+s:t.server.url=t.question.transport+s,t.server.url=t.server.url+d,c();var p=t.server.url+t.server.assets;o("askUrlStart check assets "+p),i(p,function(n,o){if(null!==n)return u.appendChild(document.createTextNode("Error "+n)),void(a=!1);if(0===o.responseText.length)return u.appendChild(document.createTextNode("Error Got empty data.")),void(a=!1);e.setAttribute("class","ffWrapper ffWrapperFadeOut");var l=function(t){document.getElementsByTagName("body")[0].removeChild(e),r(t)};v("meta")?m("meta","server_url",t.server.url,function(e){return null!==e?r(e):void x(l)}):x(l)},!0)}},N=function(e){o("askUrl create ui");var r=document.createElement("div");r.setAttribute("class","ffWrapper");var n=document.createElement("div");n.setAttribute("class","ffQuestion"),r.appendChild(n);var a=document.createElement("div");a.setAttribute("class","ffQuestionTitle"),a.appendChild(document.createTextNode(t.question.title)),n.appendChild(a);var u=document.createElement("div");u.setAttribute("class","ffQuestionText"),u.appendChild(document.createTextNode(t.question.text)),n.appendChild(u);var l=document.createElement("input");l.setAttribute("type","text"),l.setAttribute("id","serverInput"),l.setAttribute("autofocus",""),l.setAttribute("onkeydown","if (event.keyCode == 13) {document.getElementById('serverSubmit').click()}"),l.setAttribute("size",t.question.size),n.appendChild(l);var i=document.createElement("input");i.setAttribute("id","serverSubmit"),i.setAttribute("type","submit"),i.setAttribute("value",t.question.submit),i.onclick=function(){S(r,e)},n.appendChild(i);var s=document.createElement("div");s.setAttribute("id","serverInputError"),s.setAttribute("class","ffQuestionError"),n.appendChild(s);var c=document.createElement("div");c.setAttribute("class","ffFooter"),c.appendChild(document.createTextNode(t.loader.footer)),r.appendChild(c),document.getElementsByTagName("body")[0].appendChild(r)},A=function(e,r){return null!==t.cache[e]&&t.cache[e]===!1?(o("startCacheType "+e+" disabled"),t.cache[e]=null,r(null)):(null===t.cache[e]&&(u.detect.cordovaDevice()&&u.detect.sqlitePlugin()?(o("startCacheType auto sqlitePlugin for "+e),t.cache[e]=u.cache.websql({open:function(e){return sqlitePlugin.openDatabase(e.name,e.version,e.name,e.size)}})):u.detect.openDatabase()?(o("startCacheType auto openDatabase for "+e),t.cache[e]=u.cache.websql()):u.detect.localStorage()?(o("startCacheType auto localStorage for "+e),t.cache[e]=u.cache.localStorage()):o("startCacheType "+e+" none")),void(null!==t.cache[e]&&"function"==typeof t.cache[e].cacheOpen?t.cache[e].cacheOpen(r):r(null)))},O=function(e){A("meta",function(t){return null!==t?e(t):void A("js",function(t){return null!==t?e(t):void A("css",function(t){return null!==t?e(t):void A("dss",e)})})})},q=function(){if(0!==n.length){var e=function(e,t){T(e,t,!0)};s("loadResources",n,e,function(){})}},w=function(e){return t.boot.angular.enable!==!0?(o("bootAngular disabled by options"),e(null)):0===t.boot.angular.modules.length?(o("bootAngular disabled by no modules"),e(null)):(o("bootAngular start "+t.boot.angular.modules),angular.bootstrap(document,t.boot.angular.modules),void e(null))},R=function(){return t.boot.cleanup.enable!==!0?void o("bootCleanup disabled by options"):0===t.boot.cleanup.tags.length?void o("bootCleanup disabled by no tags ids."):(o("bootCleanup after "+t.boot.cleanup.timeout+" ms."),void setTimeout(function(){for(var e in t.boot.cleanup.tags){var r=t.boot.cleanup.tags[e],n=document.getElementById(r);null!==n&&(n.parentNode.removeChild(n),o("bootCleanup removed "+r))}},t.boot.cleanup.timeout))},k=function(r){if(t.boot.cordova.enable!==!0)return o("bootCordova disabled by options"),r(null);if(u.detect.cordova()!==!0)return o("bootCordova disabled by detect"),r(null);var n=(new Date).getTime(),a=function(){var e=r;r=null,o("bootCordova done in "+((new Date).getTime()-n)+" ms."),e(null)};t.boot.cordova.timeout>0&&(o("bootCordova timeout "+t.boot.cordova.timeout),setTimeout(function(){o("bootCordova timeout"),a()},t.boot.cordova.timeout)),document.addEventListener("deviceready",function(){e[t.boot.cordova.flag]=!0,o("bootCordova "+t.boot.cordova.flag),a()},!1)},D=function(e){var r=(new Date).getTime(),n=function(r){null!==r&&(t.boot.error.enable!==!0?o("bootError disabled by options"):l(r)),"function"==typeof e&&e(r)},a=function(e){null!==e?n(e):(o("start done in "+((new Date).getTime()-r)+" ms."),R(),w(function(e){q(),n(e)}))};if(o("start spa-loader"),null!==t.server.url&&c(),t.boot.debug.enable===!0){var u=Object.keys(t);for(var i in u){var s=u[i];o("start config "+s+" "+JSON.stringify(t[s]))}}k(function(e){return null!==e?a(e):void O(function(e){return null!==e?a(e):null!==t.server.url?void x(a):void(v("meta")?p("meta","server_url",function(e,r){null!==e?a(e):void 0===r||null===r||""===r?N(a):(t.server.url=r,x(a))}):N(a))})})},L=function(e){void 0===e&&(e=function(){}),v("meta")?h("meta","server_url",function(t){return null!==t?e(t):void h("meta","server_resources",function(t){return null!==t?e(t):void setTimeout(function(){e(null)})})}):e(null)},I=function(e){void 0===e&&(e=function(){});var r=function(t){setTimeout(function(){e(t)})};v("meta")?p("meta","server_resources",function(e,t){return null!==e?r(e):null===t?r(new Error("No cache value")):void b(t,!0,r)}):i(t.server.url+t.server.assets,function(e,t){if(null!==e)return r(e);var n=JSON.parse(t.responseText).data.resources;b(n,!1,r)},!0)};return t.boot.debug.handler=function(e){console.log(e)},{options:t,factory:u,start:D,clearServerUrl:L,clearCache:I}}); //# sourceMappingURL=es5-ff-spa-loader.min.js.map