es5-ff-spa-loader ========= A javascript library providing server defined loading of assets for a single page application. ## Installation npm --save install es5-ff-spa-loader Then use the dist/es5-ff-spa-loader.min.js script inline in the index. ## Features * Assets caching for offline use. * Assets hashing for fast syncing. * Assets types: js,css,cssData * Caching backends: localStorage,webSqlDB,sqllite,none * Server url question ui. * Loader error ui. * Build-in Cordova booting. * Build-in AngularJS booting. ## Usage ### Usage Multi Server (Minimal) FFSpaLoader.options.server.assets = '/api/path/to/spa/client/resources'; FFSpaLoader.start(); ### Usage Single Server FFSpaLoader.options.server.url = 'http://myserver'; FFSpaLoader.options.server.assets = '/api/path/to/spa/client/resources'; FFSpaLoader.start(); ### Usage Angular FFSpaLoader.options.debug.enable = true; FFSpaLoader.options.boot.angular.modules.push('exampleUI'); FFSpaLoader.options.server.url = 'http://myserver'; FFSpaLoader.options.server.assets = '/api/path/to/spa/client/resources'; FFSpaLoader.start(function() { console.log('FFExample.boot done'); }); ## Assets format { "data": { "resources": [ { "url": "/static/js/some-asset.js", "type": "js", "hash": ​-164319899 }, { "url": "/static/css/some-asset.css", "type": "css", "hash": ​1391550981 }, { "url": "/static/css/more-asset-data.css", "type": "cssData", "hash": ​1371811412 }, ] } The hash key is required as only on hash change the resource will be downloaded again, so multiple small files makes updates faster. ## Options The available FFSpaLoader.options.* values; * debug.enable = Enable debug output. (default: false) * debug.handler = Prints/log debug message. (default: console.log) * debug.prefix = Debug message prefix. (default: 'FFSpaLoader.') * error.handler = The error handler. (default: internal error handler ui) * error.title = The error title. (default: 'Loader '); * error.style = The error ui css style. (default: red error) * boot.cordova.enable = Use deviceready event to boot when cordova is detected. (default: true) * boot.cordova.timeout = Boot after (if<0=no-)timeout when deviceready event is not received. (default: -1) * boot.cordova.flag = The window flag which is set when cordova is booted. (default: 'FFCordovaDevice') * boot.angular.enable = Auto bootstrap angular modules. (default: true) * boot.angular.modules = The angular modules to boot. (default: empty) * server.url = The server url like 'https://myhost', when null the user will get promted to input it. (default: null) * server.assets = The server path to the assets resources definition file, is required (default: null) * server.timeout = The timeout to download the server resources. (default: 4096) * server.flag = The window flag which is set when the server.url is know. (default: 'FFServerUrl') * server.header.request = An key value object with the request headers. (default: {'X-FFSpaLoader': 'sync'}) * question.transport = The transport to prefix the server.url with. (default: 'http://') * question.title = The question ui title. (default: 'Server') * question.submit = The start button text. (default: 'Start') * question.text = The question ui text. (default: 'Please provide the server name;') * question.size = The question ui input size. (default: 32) * question.style = The question ui css style. (default: blue input) * question.validate.min.value = The minimal hostname length, false is disabled (default: 3) * question.validate.min.message = The error message (default: 'Server name is to short.') * question.validate.max.value = The maximal hostname length, false is disabled (default: 255) * question.validate.max.message =The error message (default: 'Server name is to long.') * question.validate.regex.value = The regex to validate the hostname, false is disabled. (default: '^([a-zA-Z0-9\.\:])*$') * question.validate.regex.message = The error message (default: 'Server name is invalid.') * cache.meta = The cache backend for the meta information(server.url+content), null is auto select,false is disable. (default: null) * cache.js = The cache backend for for js, null is auto select,false is disable. (default: null) * cache.css = The cache backend for for css, null is auto select,false is disable. (default: null) * cache.cssData = The cache backend for for cssData, null is auto select,false is disable. (default: null) ## Factory The available FFSpaLoader.factory.* functions; * detect.localStorage() = Checks is localStorage is working. * detect.openDatabase() = Checks if openDatabase is defined. * detect.sqlitePlugin() = Checks if sqlitePlugin is defined. * detect.cordova() = Checks if cordova is defined. * detect.cordovaDevice() = Checks if the options.boot.cordova.flag is defined in the window.(NOTE: is always false before calling start();) * cache.localStorage() = Creates an localStorage service. * cache.websql(opt) = Creates an websql service. ## Cache Types The cache types in FFSpaLoader.options.cache.* store different types data; * meta = Stores server.url and server.assets data. * js = Store application javascript data. * css = Stores application css data. * cssData = Stores application css large data like base64 fonts/svg/etc. ## Cache Config Per default all cache types are auto selected in the following order; * detect.sqlitePlugin() and detect.cordovaDevice() * detect.openDatabase() * detect.localStorage() * none More custom schemas are possible like; (todo: needs testing) FFSpaLoader.options.cache.meta = false; FFSpaLoader.options.cache.js = false; FFSpaLoader.options.cache.css = false; FFSpaLoader.options.cache.cssData = false; if (FFSpaLoader.factory.detect.localStorage()) { FFSpaLoader.options.cache.css = FFSpaLoader.factory.cache.localStorage(); FFSpaLoader.options.cache.cssData = FFSpaLoader.factory.cache.localStorage(); } FFSpaLoader.options.server.url = 'http://myserver'; FFSpaLoader.options.server.assets = '/api/path/to/spa/client/resources'; FFSpaLoader.start(); ## Example Application There is a fully working nodejs example application in the example folder. ## Tested Browsers * Chromium 46 * Iceweasel 43 * Opera 12 Presto * IE 11 Edge * Android 5.1.1 in Cordova + Site * Android 4.4.4 in Cordova + Site * Android 4.2.2 in Cordova + Site ## Todo * test in production * Add Loader progress bar * Server header check support * Add table+instance websql options so it can also be used in application code. * Split assets per type so do js first then boot then css + cssData. * Move css to file ? * Add more tests * css: set tag.media = 'only you'; * css: add media in resouces * Add in browser tests * example: rm from dist and add cordova and use gulp ## Contributing In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code. ## Release History ### 0.1.1 * Moved websql delete timeout to cleanServerlUrl for faster boot. * Fixed websql db-size and db-name for older androids. * Added more jsdoc. * Added question.size option. * Changed websql option openDatabase to returning open function. * Fixed sqlitePlugin open function was typo on openDatabase. * Added websql table option. (defaults to 'cache_store') ### 0.1.0 * Moved options.server.question to options.question. * Added question.validate.[min|max|regex].value|message options. * Strip question value to hostname+port before use and validating. * Allow user upgrade to https in question input from default of transport option. * Added server request headers option. * Updated css of question and error ui. * Fixed cordova booting. ### 0.0.4 * Added auto cache clean code. * Disable cordova timeout per default. * Remove unused mobileAgent detect. * Fixed cached resources injection order. ### 0.0.3 * Fixed example script path. * Fixed example size. * Initial release.