{"_id":"qoopido.demand","_rev":"178-c628fa306229ae9bc4a114af2955f69f","name":"qoopido.demand","time":{"modified":"2022-06-25T05:05:27.757Z","created":"2015-09-08T12:14:46.493Z","1.0.4":"2015-09-08T12:14:46.493Z","1.0.3":"2015-09-08T12:16:20.840Z","1.0.5":"2015-09-11T08:02:02.015Z","1.0.6":"2015-09-11T20:56:21.977Z","1.0.8":"2015-09-14T22:38:17.930Z","1.0.7":"2015-09-14T22:38:31.074Z","1.0.9":"2015-09-16T16:20:13.793Z","1.1.0":"2015-09-18T11:18:33.302Z","1.1.1":"2015-09-20T12:35:48.439Z","1.1.2":"2015-09-21T13:14:15.882Z","1.1.3":"2015-09-22T08:58:31.294Z","2.0.0":"2015-09-26T09:37:12.513Z","2.0.1":"2015-09-26T14:40:55.006Z","2.0.2":"2015-09-27T18:35:58.064Z","2.0.3":"2015-09-29T12:57:16.040Z","2.0.4":"2015-10-01T13:17:10.036Z","2.0.5":"2015-10-02T20:09:07.950Z","2.0.6":"2015-10-05T08:08:04.489Z","2.0.7":"2015-10-06T18:29:50.124Z","2.0.8":"2015-10-13T16:35:47.517Z","2.0.9":"2015-10-21T18:12:35.161Z","2.1.0":"2015-10-22T20:29:25.953Z","2.1.1":"2015-10-29T18:26:47.000Z","2.1.2":"2015-12-15T12:51:37.337Z","2.1.3":"2016-01-30T07:12:14.504Z","3.0.0":"2016-04-12T10:34:21.746Z","3.0.1":"2016-04-14T12:38:07.399Z","3.0.2":"2016-04-19T11:34:12.845Z","3.0.3":"2016-04-21T09:05:09.777Z","3.0.4":"2016-04-25T09:07:18.405Z","3.0.5":"2016-04-25T09:44:16.094Z","3.5.0":"2016-08-03T12:30:09.523Z","3.5.1":"2016-08-05T10:35:40.127Z","3.5.2":"2016-08-18T19:22:01.217Z","3.5.3":"2016-11-19T23:07:03.288Z","3.5.4":"2016-11-21T12:02:33.351Z","3.5.5":"2016-11-24T19:18:19.712Z","3.5.6":"2016-11-24T19:20:06.608Z","3.5.7":"2016-11-26T19:18:15.843Z","4.0.0":"2017-01-06T20:56:47.800Z","4.0.1":"2017-01-07T21:37:25.577Z","4.0.2":"2017-01-07T22:10:54.865Z","4.0.3":"2017-01-10T09:57:51.289Z","4.0.4":"2017-01-11T13:59:44.380Z","4.0.5":"2017-01-11T17:22:35.180Z","4.0.6":"2017-01-12T16:23:45.204Z","4.0.7":"2017-01-13T11:41:01.176Z","4.0.8":"2017-01-20T09:34:59.510Z","4.0.9":"2017-01-20T11:15:00.848Z","4.1.0":"2017-01-20T14:29:23.466Z","4.1.1":"2017-01-21T23:11:43.246Z","4.1.2":"2017-01-25T23:35:43.386Z","4.1.3":"2017-01-26T19:46:18.191Z","4.1.4":"2017-01-30T18:59:45.068Z","4.1.5":"2017-01-30T19:39:26.425Z","4.1.6":"2017-02-01T23:31:13.319Z","4.1.7":"2017-02-02T16:12:52.070Z","4.1.8":"2017-02-02T21:06:45.933Z","4.1.9":"2017-02-02T22:07:42.639Z","4.2.0":"2017-02-23T06:49:36.951Z","4.2.1":"2017-02-25T13:52:22.803Z","4.2.2":"2017-03-11T13:42:43.616Z","4.2.3":"2017-03-24T08:32:17.530Z","4.2.4":"2017-12-22T13:33:33.024Z","4.2.5":"2018-01-03T20:22:14.171Z","4.2.6-alpha.1":"2018-01-10T18:54:14.213Z","4.2.6-alpha.2":"2018-01-16T10:45:12.818Z","4.2.6-alpha.3":"2018-01-16T10:48:22.790Z","4.2.6-alpha.4":"2018-01-30T01:14:49.618Z","4.2.6-alpha.5":"2018-01-30T09:09:03.825Z","4.2.6":"2018-01-30T13:01:40.654Z","4.2.7-alpha.1":"2018-02-05T21:58:19.416Z","4.2.7-alpha.2":"2018-02-05T22:04:51.621Z","4.2.7-alpha.3":"2018-02-05T22:14:06.460Z","4.2.7-alpha.4":"2018-02-05T22:27:15.231Z","4.2.7-alpha.5":"2018-02-05T22:29:14.364Z","4.2.7-alpha.6":"2018-02-05T22:34:58.903Z","4.2.7-alpha.7":"2018-02-05T22:38:42.721Z","4.2.7-alpha.8":"2018-02-05T22:41:56.967Z","4.2.7-alpha.9":"2018-02-05T22:43:59.199Z","4.2.7-alpha.10":"2018-02-05T22:45:07.238Z","4.2.7-alpha.11":"2018-02-05T22:46:00.715Z","4.2.7-alpha.12":"2018-02-05T22:46:55.246Z","4.2.7-alpha.13":"2018-02-05T22:48:16.764Z","4.2.7":"2018-02-06T09:30:10.482Z","4.2.8":"2018-02-08T12:43:21.941Z","4.2.9-alpha.1":"2018-02-08T23:52:17.739Z","4.2.9-alpha.2":"2018-02-09T00:02:53.930Z","4.2.9-alpha.3":"2018-02-09T00:16:42.752Z","4.2.9-alpha.4":"2018-02-09T00:17:54.239Z","4.2.9-alpha.5":"2018-02-09T00:24:14.768Z","5.0.0":"2018-02-09T00:48:09.071Z","5.0.1-alpha.1":"2018-02-19T13:18:28.473Z","5.0.1-alpha.2":"2018-02-19T13:34:36.979Z","5.0.1":"2018-02-19T14:47:58.414Z","5.0.2-alpha.1":"2018-02-22T22:26:36.517Z","5.0.2-alpha.2":"2018-02-22T22:42:09.363Z","5.0.2":"2018-02-22T22:53:30.808Z","5.0.3":"2018-03-02T15:26:11.838Z","5.0.4":"2018-06-13T09:53:04.937Z","5.0.5":"2018-06-29T10:52:32.557Z","5.1.0-rc.1":"2018-10-09T23:28:53.871Z","5.1.0-rc.2":"2018-10-09T23:34:10.293Z","5.1.0-rc.3":"2018-10-10T08:12:31.335Z","5.1.0-rc.4":"2018-10-10T08:16:26.102Z","5.1.0-rc.5":"2018-10-10T08:40:03.014Z","5.1.0-rc.6":"2018-10-10T08:44:12.691Z","5.1.0-rc.7":"2018-10-10T08:49:15.061Z","5.1.0-rc.8":"2018-10-10T12:54:22.778Z","5.1.0":"2018-10-10T13:06:00.348Z","5.1.1":"2018-10-10T21:01:19.359Z","5.2.0-rc.1":"2018-12-19T20:46:07.170Z","5.2.0-rc.2":"2018-12-19T20:59:40.408Z","5.2.0-rc.3":"2018-12-19T21:20:05.562Z","5.2.0-rc.4":"2018-12-19T21:24:35.340Z","5.2.0-rc.5":"2018-12-19T21:28:05.377Z","5.2.0-rc.6":"2018-12-19T21:31:35.526Z","5.2.0-rc.7":"2018-12-19T21:44:43.088Z","5.2.0-rc.8":"2018-12-19T21:49:33.663Z","5.2.0-rc.9":"2018-12-20T07:52:52.872Z","5.2.0-rc.10":"2018-12-20T08:02:00.937Z","5.2.0-rc.11":"2018-12-20T08:03:38.139Z","5.2.0-rc.12":"2018-12-20T08:09:05.749Z","5.2.0-rc.13":"2018-12-20T08:17:52.965Z","5.2.0":"2018-12-20T08:40:54.696Z","5.2.2":"2019-05-14T20:13:17.246Z","5.2.3":"2019-11-19T10:57:05.689Z","5.2.4":"2019-11-19T11:46:04.767Z","5.2.5":"2019-11-21T11:50:22.410Z","5.2.6":"2020-02-26T13:36:01.029Z","5.2.7":"2020-02-27T14:04:54.252Z","5.2.8":"2020-02-28T09:25:38.561Z","5.2.9":"2020-03-18T10:56:39.394Z","5.3.0":"2020-03-31T19:14:35.170Z","6.0.0-alpha.1":"2020-04-16T06:55:06.401Z","6.0.0-alpha.2":"2020-04-16T11:49:29.309Z","6.0.0":"2020-04-17T00:01:19.655Z","6.0.1":"2020-04-20T08:43:55.669Z","6.0.2":"2020-04-20T13:52:50.637Z","6.1.0":"2020-05-11T23:05:37.908Z","6.1.1":"2020-05-12T11:41:55.724Z","6.1.2":"2020-05-12T16:03:29.739Z","7.0.0":"2020-05-29T20:23:11.144Z","7.0.1":"2020-05-29T20:33:37.146Z","7.0.2":"2020-05-30T23:50:06.743Z","7.0.3":"2020-06-04T13:35:43.348Z","7.0.4":"2020-06-05T19:08:03.940Z","7.0.5":"2020-06-10T07:28:26.374Z","7.0.6":"2020-06-12T13:51:05.598Z","7.0.7":"2020-08-05T10:05:24.119Z","7.0.8":"2020-08-07T08:52:47.071Z","7.0.9":"2020-08-13T11:10:47.817Z","7.1.0":"2020-08-27T07:34:50.498Z","7.1.1":"2020-09-01T13:17:23.973Z","7.1.2":"2020-09-03T15:05:16.510Z","7.1.3":"2020-09-09T20:05:06.510Z","7.1.4":"2020-09-29T19:27:12.090Z","7.1.5":"2020-10-04T19:31:47.549Z","7.1.6":"2020-10-06T19:34:27.067Z","7.1.7":"2020-10-22T20:36:10.934Z","7.1.8":"2020-12-23T09:27:18.620Z","7.2.0":"2021-05-04T09:49:08.290Z","7.2.1":"2021-05-04T11:13:07.674Z","7.2.2":"2021-05-28T07:45:06.385Z","7.2.3":"2021-06-03T07:33:14.047Z","8.0.0":"2021-11-03T12:39:06.905Z","8.0.1":"2021-11-03T12:45:06.478Z","7.2.4":"2021-11-19T10:56:00.431Z","8.0.2":"2022-01-07T08:02:38.228Z"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist-tags":{"latest":"8.0.2","next":"5.2.0-rc.13","alpha":"6.0.0-alpha.2"},"description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled.\n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Edge, Opera and IE11+.\n\nActive Support for IE9 and IE10 has been removed in Qoopido.demand 6.0.0 due to upcoming refactorings/cleanups and the lack of market share of these browsers today.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', './app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', './app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to\n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8,\n\n\t// base path from where your relative\n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle\n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('./app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n\nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n\n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ './test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;)\n\n**Sidenote**\n> Starting with Qoopido.demand 7.1.0 a module definition may also return a `thenable` and if it does, demand will resolve/reject the module accordingly.\n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\n**Sidenote**\n> In the past Demand used to interpret paths as being \"relative\" by default. To be able to handle UMD modules natively this was changed lately. Therefore keep in mind that if you declare a relative path you will have to prefix it with any of `./` or `../`.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it.\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n\n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n\nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n\n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules\n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules\n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","versions":{"1.0.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + support for custom handlers","version":"1.0.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true,"console":true}},"gitHead":"824d38e57ef8cbe0305413b529eb6b1e11a6d6ae","_id":"qoopido.demand@1.0.3","scripts":{},"_shasum":"c6cb40516fc2811aa62843541d1905f0e8d53a27","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"c6cb40516fc2811aa62843541d1905f0e8d53a27","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.0.3.tgz","integrity":"sha512-xU2GfKDRk4RpTO59H5/H4JnCnyeiN9rUvnheAII0KyO5AsgjNJKwXd3xrTn4OhGjGD7M6TocqhKIe8jDwKalQA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC5jOxeI8y/2cpdvVtcTZY6WZ2kIVDe3YE3oVQPXFmtfAiALR2OHzo3/bHyyzvk73NpqnyU5mFj7o/tlSnjQJvOV5Q=="}]},"directories":{}},"1.0.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + support for custom handlers","version":"1.0.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true,"console":true}},"gitHead":"d37fe9789f5bcf53f91430d1c8736dbf55462200","_id":"qoopido.demand@1.0.5","scripts":{},"_shasum":"5dddab98ebc9043de1a276291700d24b2735411a","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"5dddab98ebc9043de1a276291700d24b2735411a","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.0.5.tgz","integrity":"sha512-hUFUFjlp4wgVrRzyQAyjoiPeuf05lP+yLEYzGA0/nL6CEHOds0d2U/rYCCbzlA9nHFktDscb0jBBeKpgr9gByg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGtD0UgOM32cg0yhzEfmW8a63sp36rxz4+UryQp5JoEjAiEAo8tPlbUxm03URjyAqTNrVTXHXLQe+FLlacG2ZDzdUbA="}]},"directories":{}},"1.0.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + support for custom handlers","version":"1.0.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true,"console":true}},"gitHead":"ef86831ad3019cbb8f56435920671a08d508dbf8","_id":"qoopido.demand@1.0.6","scripts":{},"_shasum":"50c7c2dcc48a57c0f7fc1587a9df7892743e26df","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"50c7c2dcc48a57c0f7fc1587a9df7892743e26df","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.0.6.tgz","integrity":"sha512-q3e8IzBWbyKJkBkLyVunuMA691xB7X+xd24VDzKAJPR5bGACXX0x1aPFNCq9HMOhH2kcQlzu6OGpmLGXVmj7RA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtcGvs4qabMT214MDp/w9yoUFefYPWvOkEY8XyzqyYQQIhANM5uVhCKxJX0Hp1xg5ge1+cBh0ELyj5VO28Avcu1rUV"}]},"directories":{}},"1.0.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"1.0.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true,"console":true}},"gitHead":"dd18a2bf4a5594ac8117db37010e7e75c33a6356","_id":"qoopido.demand@1.0.8","scripts":{},"_shasum":"5fa010f77761b1851555fbc22b876f77ba92faab","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"5fa010f77761b1851555fbc22b876f77ba92faab","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.0.8.tgz","integrity":"sha512-YszQBK8vtW6OhVhAFu+Saw4Si8WF2Z0xsJRtRQpMwS1P6PlbLR99ZEXMbQOU1E6Iku8jb/8ahvLnVLAnz9PKPA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGGrNgTcGLVti/GEosX88C5t6Qb8DPNZ3dBTGRoezGcJAiBvetGPDGYr7N9bqvK2pOLp+QLYeZakKiHfRvoUTXk2Og=="}]},"directories":{}},"1.0.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"1.0.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true,"console":true}},"gitHead":"353b015c534ffbf9c04619b15d32fedbb01a048f","_id":"qoopido.demand@1.0.7","scripts":{},"_shasum":"065c9e191cb1d0f5949676924e910afb4988d48d","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"065c9e191cb1d0f5949676924e910afb4988d48d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.0.7.tgz","integrity":"sha512-HGjfY+TLYQV+H/SQkMklEDL5Uu/PooJu2NRiiEm5c+VwRUR6WP2YPuOFfRo46X6qLNeGdosJrfcO+TO+WMRSEw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBJystubusnKIlXm/ABv/yuKC6ZNWntiTH26bybYUFYgAiBWSDpr2YVN1xSHa4hEACeD90qmSVvdHXbhO9IoJLEs4w=="}]},"directories":{}},"1.0.9":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"1.0.9","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true,"console":true}},"gitHead":"46cb85396d424dd84933e0eaeac4b4e5d46474c3","_id":"qoopido.demand@1.0.9","scripts":{},"_shasum":"7a422cd7684e97dbeaa59af75be9a5b723311780","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"7a422cd7684e97dbeaa59af75be9a5b723311780","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.0.9.tgz","integrity":"sha512-Zvd1aYvb7qt6F4APHIKdbJYQGFrOq81C8BFNp3NTAC/VLR6mHHvuUw3QueD+gde02nZkaRf4VthGn3K5mUHEGA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCsYGXU625AlO/4q3XewUi8gWy10uMr8heLnQwZbPIxVgIgT3x3cofmTy5YcyioGfJKqEc/qLZ/KsIH8tFGGUwiK6s="}]},"directories":{}},"1.1.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"1.1.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true,"console":true}},"gitHead":"113b05147f727b75ff0cb4579df9bde2e61df46c","_id":"qoopido.demand@1.1.0","scripts":{},"_shasum":"c3bf899f1f28646269aa896d16d7ae066b0b96c7","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"c3bf899f1f28646269aa896d16d7ae066b0b96c7","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.1.0.tgz","integrity":"sha512-pZfca89NJWaQK7hPUYb/uWRogbEmnxKc14DN27v5UBglZ4KeWu4qnCQsNFpowfxtVjkgSzG6atMgxF+rPtTVlQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGCl9ewfP1sKwJfNVIBsgcWQodLqWZ7p0LFADhG5cXCpAiEAps4tP5E3AV9ZInIBu8PrHjzkMwggqglas7SO7dZMenM="}]},"directories":{}},"1.1.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"1.1.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true,"console":true}},"gitHead":"057310f7cfd3827ec5272e8e9a2601aa9a976b0f","_id":"qoopido.demand@1.1.1","scripts":{},"_shasum":"a28e62c79215285518ce145297708c35c6b2eabf","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"a28e62c79215285518ce145297708c35c6b2eabf","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.1.1.tgz","integrity":"sha512-6kQNCrGQgG74NY6OVhvaruXm1CtQIUyRhmWo/NhaF5fQ3+ablugtzyegkUiwPuK0KQv0Tu8PVsFNMTrNN1u1jg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDd7SdyXDR9ICpg9Ch7uyQ6DUn8MO9b9pkZb3NT6TpAWAiB4A/ILnBZkwtU5Mq7t9gSdD/8ptu/ZXzy2/XqmEiX0lA=="}]},"directories":{}},"1.1.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"1.1.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true}},"gitHead":"b40ea30393ea0c65311056d694a4dfb007551a98","_id":"qoopido.demand@1.1.2","scripts":{},"_shasum":"bf24f6b5a043edb4e1b41e0087bd98e3de90fbfb","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"bf24f6b5a043edb4e1b41e0087bd98e3de90fbfb","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.1.2.tgz","integrity":"sha512-NjaKpOoDHsC71ciMVVNQiw0hHvHjFIb1pqKgs8Yb/4ZN9YG5E9YnXQB0H5+ho6Hz+xCOAlGPqnL+Ql37wARFuQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClA3UHpgEHb+G+BQPncSg8rZZZMIqtoQhHwU9ZEe5yoAIhANdiyrI77oX+chQ9xwo39HQwpD0R60VgER/1cYe8I4+1"}]},"directories":{}},"1.1.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"1.1.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true}},"gitHead":"d2a49c20f24cc44b8cbe7816bfb0b65d63af8e7e","_id":"qoopido.demand@1.1.3","scripts":{},"_shasum":"5a81e159ea69a991e2cb1fe0931d6c979f4b90ab","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"5a81e159ea69a991e2cb1fe0931d6c979f4b90ab","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-1.1.3.tgz","integrity":"sha512-8xGP8I+khpAL2PYqcNpsZi8H4fotrdYZ75Zqw9p5qqdsOplMehtBqHHVnKWEolQ8uXOFJ2Op6P8ijmEXjndAHw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVCqpck7F0KEA3gIbCvpdAnnXyiXcBtFmCtzyhy0i3XQIgHMtL7QKHv1iKmalC/kyFi3f2/bylR8bi46fdJzVKdiM="}]},"directories":{}},"2.0.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true}},"gitHead":"8284277fcddd70c8c7beeaaefb3d691770c202ff","_id":"qoopido.demand@2.0.0","scripts":{},"_shasum":"c5b9b2693308f4f7e2975070cbad678b882cc45d","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"c5b9b2693308f4f7e2975070cbad678b882cc45d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.0.tgz","integrity":"sha512-rxB5oMU5L3pLp6rr8kV+E8bExbOEOUolidSJl9DvjbKi07b13bghxmdSWhmqM7iEXnCHgo/xEVLsN4Xtnd3vsw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC6NPRMzj5gK1n4iKpHhSGWBZHdZYZ4ljrMxf8a3/8E8gIhAOobAEla/AjQ0OBpvOC7oxNEJiyS5CKUruSUJD1cbp38"}]},"directories":{}},"2.0.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true}},"gitHead":"a7e6d89ed4a6297c4982def1b0cb19b123db6e3f","_id":"qoopido.demand@2.0.1","scripts":{},"_shasum":"74a342b5b8b2e9490aeb0c6dec2135b2470c208c","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"74a342b5b8b2e9490aeb0c6dec2135b2470c208c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.1.tgz","integrity":"sha512-X6YHLSIMUMeGSGip3pd1xPzfWeKgB7gekZdt3UXQ7lsZySKPoN2f4lY9MmhMTicjkqbBz02zpylI+e/GPqu42g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2c8owsHXDhFwtN3KBPA8iRCK8yondA/Sorg7sXO0N6gIhALawdrHB7G9MGhwZx5KaV7/gRCv7yFtIWXgZtdAmwTSn"}]},"directories":{}},"2.0.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true}},"gitHead":"19b631ee24f98378732814b53db8834f3050fa59","_id":"qoopido.demand@2.0.2","scripts":{},"_shasum":"b50ff4290217f12cd11ea734f096411bd004a622","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"b50ff4290217f12cd11ea734f096411bd004a622","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.2.tgz","integrity":"sha512-X9Ub4ArHgTPuIcwhqCYuOB1JLcZiu8cyfy7mJPmfAgH61oBIIwAPBJASHGmmGhn7VLtGRFSoq63uthfItac3cA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkI/F+0SxEthy8OzewWrl8XATmDrKNYGWAayug5DLsnAIhAIV8z3a8EguQlYTv8sgLfdWQQOsKf/ha1PRBVpPqOEYW"}]},"directories":{}},"2.0.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^0.3.1","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-jshint":"^1.9.0","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","jshint-stylish":"^2.0.1","run-sequence":"^1.0.2"},"jshintConfig":{"lookup":false,"curly":true,"eqeqeq":true,"immed":true,"latedef":true,"newcap":true,"noarg":true,"sub":true,"undef":true,"boss":true,"eqnull":true,"browser":true,"proto":true,"expr":true,"validthis":true,"scripturl":true,"-W030":true,"globals":{"demand":true,"provide":true}},"gitHead":"f925263db67d3f12d3269e9c62c22bf2a7f3cef1","_id":"qoopido.demand@2.0.3","scripts":{},"_shasum":"6ff65d978b203129fb4b97225cc641a3be1cf857","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"6ff65d978b203129fb4b97225cc641a3be1cf857","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.3.tgz","integrity":"sha512-bTd+dspsTmH/R/5dp5hinaRsKwEcOBKAUowlF21lvrDBknIx/rda7ll+mexoKC5I6IrQ9QnHRUv4Xa+249stWw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbxB1/OBsx8XBcR8avRxqknErN4Rg2LXJQrRwR8t3jewIhAMEn2VjLsu72aqTJ2lrRzQgOT/QUUs77Bc6ZQqBHTZMb"}]},"directories":{}},"2.0.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","run-sequence":"^1.0.2"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"ba9f8245a83aa036939413bbfcb176dd499e4f19","_id":"qoopido.demand@2.0.4","scripts":{},"_shasum":"a09552db7218636bdd3aa8f69d375e61ca5f3ecc","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"a09552db7218636bdd3aa8f69d375e61ca5f3ecc","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.4.tgz","integrity":"sha512-TEFJSQhm7nDnPjBxqfi+OGs88rjXEvZnpPaMtwh4tQGk8/ZiP+kwWbf5DRRzh8mpPlLcBmcNEKtJ3o/P2t0LGA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC8faNNAPyq6Os4F4sTAuKfNyRqcYOLdcUAu+n3B1lxjAiAVN6DKWCyJsDcrN0vWpKuvIRgk7jOLnGU1ygO2ULxUQw=="}]},"directories":{}},"2.0.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","run-sequence":"^1.0.2"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"072b04f0b29cca3131bcd90a316e4e90775fdc5c","_id":"qoopido.demand@2.0.5","scripts":{},"_shasum":"d2c2b312a2772d27b1c110097abf9dcf4b2ff94a","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"d2c2b312a2772d27b1c110097abf9dcf4b2ff94a","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.5.tgz","integrity":"sha512-9f9Cu/GSuERhkGHer1jAc9GmYs1ZgBYv+GvzgRAkFqGxXJaj7yBSXdZNohQHS8BeFhvlxUa3lK9R5kADzuKtAg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDU7nH7MsgJ7PQ6gPX3Ijh5uw66hB44yGJQ0plT6kNy0wIgPGmHD2g4nDl73bwyHGwsGNTLQ3kaFF2LnM19rXVSHQI="}]},"directories":{}},"2.0.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","run-sequence":"^1.0.2"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"dcd17504bcb99c33ebf6f27ba35f33db7d6c638d","_id":"qoopido.demand@2.0.6","scripts":{},"_shasum":"4c5cc39cc5b4785870db6b8f9e189971fc90633b","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"4c5cc39cc5b4785870db6b8f9e189971fc90633b","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.6.tgz","integrity":"sha512-HHF4Rgchn3katVUW0YiWkeZQSPw/yYdVDjBk+Cf6jxWWWmbak5WZSjnURmpQhdMz0lPMNzQyq8lbIykaiHWixg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCIl1sLSF7pMU3hEEDL1IFQ5eLiCUPtdhM/KWKH7fXXbgIhAM0yRWqN0IvjWzt0EIrTw/uLxGcK4k3kD4kMCeBr9I81"}]},"directories":{}},"2.0.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.0","gulp":"^3.8.10","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.4.1","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.3","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.2.2","gulp-less":"^3.0.0","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.0","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.5.2","gulp-uglify":"^1.0.1","gulp-util":"^3.0.1","run-sequence":"^1.0.2"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"9d72011c5e38d2bcfa62440838119d1982bff721","_id":"qoopido.demand@2.0.7","scripts":{},"_shasum":"69b63caa258bcc26520c0b47c57763250e28cec2","_from":".","_npmVersion":"2.11.3","_nodeVersion":"0.12.7","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"69b63caa258bcc26520c0b47c57763250e28cec2","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.7.tgz","integrity":"sha512-mVEC7CFjpI2ojGZKZatTcW+wksZ8E7+eWjgo/eeD+X5OvQB0VoGO/d+ZZ3ENNuc+zlnr3nbWkYv9FGnjt0mCGA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgv62n302SHmUFo+SEiJJ2NAZPyLbbFQ7j15qO9WSYoQIgUYkbNGhWaI5mgsn0nfKYRsu9/m3nSmUwk7CbRowmUrw="}]},"directories":{}},"2.0.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"090e2a6a9936acc614eeae1270a25d894400b616","_id":"qoopido.demand@2.0.8","scripts":{},"_shasum":"ca5a1a3dad58e67de059e21b9c4eeb949f76e699","_from":".","_npmVersion":"2.14.7","_nodeVersion":"4.2.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"ca5a1a3dad58e67de059e21b9c4eeb949f76e699","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.8.tgz","integrity":"sha512-FTDwsRfldENsRc9KoxUlWAl9ep8JTJUgiZLkQrassTOwmCgJUhAFt1qQFoP+XTKMNkllzG62Hg0ytkdkP2xiXQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsMv0KinsyR5zwdEE34OaQl3CD19O/Hm1K0xpZC50iwwIgSHsHc3vol1ThVv3xBAKtZEmo0blGYncvXupQgCEjOGU="}]},"directories":{}},"2.0.9":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.0.9","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"8c5ff78e1c842b7955cc1dd943af1d5c2340106e","_id":"qoopido.demand@2.0.9","scripts":{},"_shasum":"3219ed1d8dfed8ef84248938bcfa528db7840f6c","_from":".","_npmVersion":"2.14.7","_nodeVersion":"4.2.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"3219ed1d8dfed8ef84248938bcfa528db7840f6c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.0.9.tgz","integrity":"sha512-r8D6vu0vfkga90Pqbfx81eGpu3G4qEnFXTv1UQBzcX4VcMVJ22Bi1TjBobSqaWr1hsFrqQ73wK5nC+CRCltyRw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHexwWj8ZsLt3AjIWo+iHpqql76Fsm2bmcxnLWc2XRTvAiEAiXF/e3dy1tSEMRz+fsT74QNGNKO8geCjvJJqTU4Csvc="}]},"directories":{}},"2.1.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.1.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"98db9999768a65ddd84e950595bbcfb1bb8634fd","_id":"qoopido.demand@2.1.0","scripts":{},"_shasum":"654ebb3da5cabe11d58601308eefc15ff7a600ce","_from":".","_npmVersion":"2.14.7","_nodeVersion":"4.2.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"654ebb3da5cabe11d58601308eefc15ff7a600ce","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.1.0.tgz","integrity":"sha512-BIfd89nQPnNhWurjBxoa8VspCt95hcC4t81GcQfPVyZmUMZiUB2BAsBzTKLDLJRO+3qlQC61eXEEPZwjFdz5QA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICd8T5k+PVejgZoIV9KsKJGjdfDQNkz4RnKBowBQZ5TCAiBAPgqYx1MegM8ePDVArb0zeRpzGFEuX2iJLp3IqNw8uQ=="}]},"directories":{}},"2.1.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.1.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"9db1daca4be605f6f59052a9ee0dcc1681a9e9bf","_id":"qoopido.demand@2.1.1","scripts":{},"_shasum":"805a572d429764f7ead5eccfc56401e69f6f6cf5","_from":".","_npmVersion":"2.14.7","_nodeVersion":"4.2.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"805a572d429764f7ead5eccfc56401e69f6f6cf5","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.1.1.tgz","integrity":"sha512-zY7dy5nw56BRCG0exK0+xb6CCZGGx+RPZBgaqMY8ovTNMe/xFGvZmzKJn8eZbF/y5aDJxxKauQigx37/Ynfoww==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCd5NSH31LzKixP1O3CvStxCPmYk4i+7l42hr8+6BJqQAIgBMG5TI2OfwFPVrBbpkizQ8IojMUKFjaxJGWWvPJ9XBA="}]},"directories":{}},"2.1.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.1.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"002fb0064ebe496586cb0c07576f1d38d535f7b0","_id":"qoopido.demand@2.1.2","scripts":{},"_shasum":"8798aac66173d0d0df9210cc840ffaad4d19d207","_from":".","_npmVersion":"3.5.0","_nodeVersion":"5.1.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"8798aac66173d0d0df9210cc840ffaad4d19d207","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.1.2.tgz","integrity":"sha512-jaH1brq6AFloC5LWxs90+RYW4lfPPNKxXj8U9uFwh7BpwoqL0jsCWRMnGgpoHrsEVSoGvfCFw/YZ2jjmJS1cgQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC6Z+d4Gs9kkN9IGvgXWUOpbA58HCntPtK5Zcp+Luph0gIgbd+9uwRLO6uSys2EL2YeC1RyfN8dYIoRwKQeeJ+psrs="}]},"directories":{}},"2.1.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"2.1.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^1.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^0.10.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"08956b73f2ce2122bbde4eea8585ef4d8646b3f1","_id":"qoopido.demand@2.1.3","scripts":{},"_shasum":"9caaf63bc71092a6e03c0ee99de2dc4f853a2356","_from":".","_npmVersion":"3.5.0","_nodeVersion":"5.1.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"9caaf63bc71092a6e03c0ee99de2dc4f853a2356","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-2.1.3.tgz","integrity":"sha512-ssm9yP+mnqgub5NI324sb4bdcTu7Kjm2b01I81osfS9+jnqqon15RRUbIMSvC1Pp8etxZaCsaEf2Z3kdzzicEQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPH1WLFpB0NGtFgSV5936Od6J8tQ5jtr2t+lhJ/Av43wIhAPHhL1OGM+xnKr76w7A/kVPRo2HnHEnGPP3AKIKOJwIf"}]},"directories":{}},"3.0.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.0.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^2.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"99d247d52a2a63ab01e858f8fdaade8bcd518093","_id":"qoopido.demand@3.0.0","scripts":{},"_shasum":"56d27edfd50fe3fe362f26e3bcfb35e1fc983851","_from":".","_npmVersion":"3.5.0","_nodeVersion":"5.1.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"56d27edfd50fe3fe362f26e3bcfb35e1fc983851","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.0.0.tgz","integrity":"sha512-IaAUMDcltA7gBWYsx9m8D7FA/xbu5S8YOc1S8Kw2GlMGrTrsmWiwX/Y61TGwfzA7xECAlRsBDHeZhlHAVJDPSA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIESRP/+d77I36oZB7SgAW99Iru+c3+5z5NNBZB3VnHdSAiEAghGc8XPEHEFPd/CRrF41hzkUYSIuSGTOIXAeE0RNLS4="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.0.0.tgz_1460457259221_0.21444660099223256"},"directories":{}},"3.0.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.0.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^2.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"e548ff76f18d839dbc223b472a26cbb2a8584070","_id":"qoopido.demand@3.0.1","scripts":{},"_shasum":"254f1c3b27b0bf798a3af8574e15dafa5c4870d1","_from":".","_npmVersion":"3.5.0","_nodeVersion":"5.1.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"254f1c3b27b0bf798a3af8574e15dafa5c4870d1","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.0.1.tgz","integrity":"sha512-jnYLeKzgZXqwXiwrzKGRzKFOFeBa8jroC1JwtNWSeLKh85FLTYq5eIW/rflTCM8o2CBryS4eqDq1WmTaE8xs6g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFzCa72RaX1R91PQIAoRqjRkSPJetlOVj6l5ZiPKjOGVAiEA1QrcdhfGhvkvr+t/efCEoUTj4HejVzvKk60HVxvdMYM="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.0.1.tgz_1460637485542_0.8002086186315864"},"directories":{}},"3.0.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.0.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^2.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"a486430b755e2ca0a83d710493cb28d603953ef7","_id":"qoopido.demand@3.0.2","scripts":{},"_shasum":"9fe0f8029b43edeb1b1bb5b0d52437f3788b3f6c","_from":".","_npmVersion":"3.5.0","_nodeVersion":"5.1.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"9fe0f8029b43edeb1b1bb5b0d52437f3788b3f6c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.0.2.tgz","integrity":"sha512-wRP94HCnGP3kVlhBk76FUkJRCywTA5ftNuVQMQuuwkIf1ivzh3bMqe3iHKd7TtQJpKUcLcde/9U47/jbfD6Elw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSPOq73iLEdyrhtiIPJ4WevrW5wnZdF1xk0Sd2U4EJ6AIgd8QNDYJIH5c+yOXn/k5CwLuqBCCux9kqB/RoG7tsUGY="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.0.2.tgz_1461065650126_0.44283687393181026"},"directories":{}},"3.0.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.0.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^2.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"e2a3308a7874506737913d3b2932cbc327067005","_id":"qoopido.demand@3.0.3","scripts":{},"_shasum":"e4f2ab02c478ec8a204392aa1cc76d7096bc5f28","_from":".","_npmVersion":"3.5.0","_nodeVersion":"5.1.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"e4f2ab02c478ec8a204392aa1cc76d7096bc5f28","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.0.3.tgz","integrity":"sha512-HtbrF2Vc36udYza6UKFct8UlmdKBJUWa9qTmgt6HpfCkB57sEuiKeER0cdaPiO7IBIU7AOFgkZ6JPMiLTc3ruA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDYcmGSQl1pto8C8aM9Ni6stiddAnyrGo9TxrCGYb/LDQIgMhI+th+mxro7kK3c4pl2TAFLK/cG/kwbu63BW8QzjjU="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.0.3.tgz_1461229508302_0.061382470885291696"},"directories":{}},"3.0.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.0.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^2.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"85524533ce28b6981175b1db6b7b1ca6d1a6c804","_id":"qoopido.demand@3.0.4","scripts":{},"_shasum":"d68f9b3e85bd44c46b80f9559c87e38b8264741b","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.11.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"d68f9b3e85bd44c46b80f9559c87e38b8264741b","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.0.4.tgz","integrity":"sha512-D9pi5lqgWHvfBoRrn9nUXNNHo17/qABaStv7KLkNxjV6Vm09LRZTS+kA8zFIHslGNW4kVi931BTiQlZtta9iUA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB5KutVy6lgU+Jb1JMi8bZhECWSrf3qvoBt79zudyYZeAiEAmAEYGihZAjfc2GfKsZNE/1IWS+JcRAYcboykxszgmJw="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.0.4.tgz_1461575235967_0.1755553176626563"},"directories":{}},"3.0.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.0.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^1.0.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^2.0.0","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"8fa3fddca7c23465b49b4b767496b418042503b1","_id":"qoopido.demand@3.0.5","scripts":{},"_shasum":"c4c25cd27ce7e0ae5ec3a427753d870e9abeddc0","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.11.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"c4c25cd27ce7e0ae5ec3a427753d870e9abeddc0","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.0.5.tgz","integrity":"sha512-rO/i5T95W0ly34iDCN8WT4KErLE2ya4Qn7webC4HODgsoXxdDFk2PD4Wi0DSD/fPXjjzU/zPAbD5FYDs1Tzk+Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYP1TMhlhRLnQpeVpu35Loz6usQ+f9jU7q0Ln50dj5tQIhANP5MpyzJKSJxHXc6QTgxEPiXykc0FzmevmKUuO93Sb1"}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.0.5.tgz_1461577454146_0.3400756432674825"},"directories":{}},"3.5.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.5.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^2.2.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"921f917e701c928da2924ae243941d3bfdb77e33","_id":"qoopido.demand@3.5.0","scripts":{},"_shasum":"d14d41fd64883f9ee882eb46325364f90b4ce25f","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.11.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"d14d41fd64883f9ee882eb46325364f90b4ce25f","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.5.0.tgz","integrity":"sha512-JzEoTVuHwLx7N4IW+BxSc0/DZdDbr4ZSP6Nvxmlq+mznDhBz9GdlnnwBQ9IC+VHRBese0XIWa3vSoznVgcsbgQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFyGDJZCiVChFRnMMi8hDoNyLO6DJ4qJq3zsTNmBlkHkAiAPVIXGgXBUDxBbZmOxcJ/ACXoRuBpszSXSlunQkcdHwQ=="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.5.0.tgz_1470227407363_0.6597229011822492"},"directories":{}},"3.5.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.5.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^2.2.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^1.4.2","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"688fa6d29610041fb416682f6e54db683dfaa747","_id":"qoopido.demand@3.5.1","scripts":{},"_shasum":"90b3c59b6bc35791311b4cebafefb538272d26ea","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.11.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"90b3c59b6bc35791311b4cebafefb538272d26ea","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.5.1.tgz","integrity":"sha512-lC4exju+4Kwkd9gic/hxV7dyl7B2CLNm3Mcjz5R/uqmSP7fxzuN/++X00vo/ZYNmK4PtzAadzgUzDHM7TaSMmg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMMcm1rg0gMt5fz76bL//UpBCF1nG8d/40DvloYxMAyAIgJMFKBOjn0CO9nZZNNhtlIcpqBmCrAWuD09Q4kJPw/O8="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.5.1.tgz_1470393337794_0.30707926861941814"},"directories":{}},"3.5.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.5.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.0","gulp-bump":"^2.2.0","gulp-chmod":"^1.2.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^1.6.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":"off","no-restricted-syntax":["error","DebuggerStatement","LabeledStatement","WithStatement"]},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"c8150b897a773249127683fc7b75aeb5037a2bba","_id":"qoopido.demand@3.5.2","scripts":{},"_shasum":"a24b898792f75bfa5cb7458878ef520d2553cade","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.11.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"a24b898792f75bfa5cb7458878ef520d2553cade","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.5.2.tgz","integrity":"sha512-HYd8cQ2yXrAm/8/zaI8eViFn2eCxdPeVz5yGl2bS9aBJzKc0RpM4x9kigXxDPWLiJTP+jvmYyQJ+JA2zmQodAw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqyn1LGgtkf+AiZ8dufrETtsNpBQ2F8rNrpLl7/r402QIhAMQgUm+ocQrcpX9srIVwhFSbVoMjO4StaQAuNt1weJg3"}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.5.2.tgz_1471548120039_0.28391178674064577"},"directories":{}},"3.5.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.5.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0,"camelcase":["error"],"no-restricted-syntax":["error","ForInStatement","DebuggerStatement","LabeledStatement","WithStatement"]},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"4f9228d2d2d0b30096b631b36f496a129ad969a4","_id":"qoopido.demand@3.5.3","scripts":{},"_shasum":"bc8464b266e3dc08d3cd297412cc4207cb0fdd8d","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"bc8464b266e3dc08d3cd297412cc4207cb0fdd8d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.5.3.tgz","integrity":"sha512-ImMmm+f6OVf2/tD0lWOfKxH7Zogsndd1qJApTnqXPUyTO/EmfqA1QWLb9TDEb0kgVhvuVZed6dqm74gPtnS7Rw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAfQAoML5xmDPQrYphKjizVYVckZvmZs/g8bV/JX48Y4AiEA2Wc35ESL67n1WIjKSWAknzbasOqwhQEOE5247fQIM94="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.5.3.tgz_1479596822574_0.7455409786198288"},"directories":{}},"3.5.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.5.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-less":"^3.0.3","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"eslintConfig":{"extends":"eslint:recommended","rules":{"no-cond-assign":0,"camelcase":["error"],"no-restricted-syntax":["error","ForInStatement","DebuggerStatement","LabeledStatement","WithStatement"]},"env":{"browser":true},"globals":{"demand":true,"provide":true}},"gitHead":"b80c3858488c6777a4a3c767585a072d8b7f5a2e","_id":"qoopido.demand@3.5.4","scripts":{},"_shasum":"c84912b4330d8de19edf8addc9c6bd7a432bf353","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"c84912b4330d8de19edf8addc9c6bd7a432bf353","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.5.4.tgz","integrity":"sha512-JvEvhq6KBgmP1gSnu1slgeqmRI7RlRw8/VWHTuMTitW3MU3vOPLJnE3LF2ucvCQCDGR4VKT+jHxUhdYC1zqrcA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBCidxXS9fym2WaDQ2ZUU+cO1nh/wkVxuK3qgo7oc7suAiBjRYBzR6RNMAjzajCW7/MED/pQmNIX0IlDziYTiy1Lhw=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.5.4.tgz_1479729750886_0.9700253685005009"},"directories":{}},"3.5.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.5.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"gitHead":"ac97195a6d93da539c9889d93b24406e3778b115","_id":"qoopido.demand@3.5.5","scripts":{},"_shasum":"e43205ef166b0997d9e11353f1ee41b32bb513d6","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"e43205ef166b0997d9e11353f1ee41b32bb513d6","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.5.5.tgz","integrity":"sha512-M4TPMyTkbZN1GdIG60KKGcpBmZ2jy0BsraywKSldAu+aEblzaC45Eo5hrtvIGVwkOzgzeG3ul+xGuvDVYBl9jw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDuY7HUJv7c6IXH8jklDxIjQDyp77itQagSzv3X4fW6gIhAO4z8Dacqd41diwEXFxq8dKg5joJqi+9fHmS4+cET43/"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.5.5.tgz_1480015097172_0.11249102861620486"},"directories":{}},"3.5.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.5.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"gitHead":"020810f769d8d12b4cfa36b2334ac18252684d5f","_id":"qoopido.demand@3.5.6","scripts":{},"_shasum":"6aedb85c275e9a4406c6f1a827123843e0700bb5","_from":".","_npmVersion":"3.10.7","_nodeVersion":"6.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"6aedb85c275e9a4406c6f1a827123843e0700bb5","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.5.6.tgz","integrity":"sha512-1xNU18bpF0HUF18vxJ+wPkmvmfwiarPGQim5yP+RILi+C+Tbum/1+p2bakTEJw9URV8NyA/IorvscMXnVc6q2w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBVckem3daVYDfxLOZD9XLncbQW/l+LFTZMHaoy5N0WeAiEA97lLA6Oric+X2g90weZBb5SyR2zFpVniEVYOdTm7a5A="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.5.6.tgz_1480015205860_0.48672066489234567"},"directories":{}},"3.5.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"3.5.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-concat":"^2.6.0","gulp-declare":"^0.3.0","gulp-define-module":"^0.1.4","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-frep":"^0.1.3","gulp-header":"^1.7.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","run-sequence":"^1.1.4"},"gitHead":"1c4b9f0b8d778907257b3011e9f75eea4d9cec2d","_id":"qoopido.demand@3.5.7","scripts":{},"_shasum":"0565b28d430db929fc68c08b6ec7cc69606ecc3b","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.11.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"0565b28d430db929fc68c08b6ec7cc69606ecc3b","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-3.5.7.tgz","integrity":"sha512-3vQidlTTobfPwhHvhGAGmpebQoCZtzT9bH/qGDdzrQNONC2z+U1l0RL7t8IliRpbxp+177sjNgrwCwDMVf62Ig==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNvv6kEjMB69pA12UqiD8yIJhCCADz4DavHOCyxzAjugIgDWRxXLv3JQgI8UV2eajrnqzzepDmeR4MwHCfmPibpoY="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-3.5.7.tgz_1480187893546_0.3119711512699723"},"directories":{}},"4.0.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"01805d51c4fb1b4e3926f01807ed0c54f828f0b3","_id":"qoopido.demand@4.0.0","scripts":{},"_shasum":"fc30e84ac3c6241900491bbed35d64ebeee10fdf","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.11.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"fc30e84ac3c6241900491bbed35d64ebeee10fdf","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.0.tgz","integrity":"sha512-ITB5Jpf4cNKO5WN2E9aQjzq/b7kh7R+2BHH3+YNqMTXaL+4qtjhItCEyUzNp7WZqjjvHRl5DZDPpfJgFS4BsKw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHbkOJ3++BKNkP43p8kA4XA5ZXONDC7p1sAmhvInEJ3xAiBAQuqRf4g9IlauaAcX5GnRuvTa9LHit1c5qB3Sm7Pu9A=="}]},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.0.tgz_1483736207079_0.18499033385887742"},"directories":{}},"4.0.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"8fe6bfe36387d3eb8b963cb6da3f42b063cab2a4","_id":"qoopido.demand@4.0.1","scripts":{},"_shasum":"313476b6e396b2202c81c673c63b76857000557c","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.11.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"313476b6e396b2202c81c673c63b76857000557c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.1.tgz","integrity":"sha512-o9dnkkVcVuBJn7sSUQEFcRKBiKz4zQbgXy1pUFlgaZ09MZ653yvaL+PiXz/AeFzxgqKD1WtyADooux1MBHQC/A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCKAPgKpS0OzZkHupvgTsNwyXsJNKhhBWF+/TTioBNtygIgFVOiwEro3BB2fu6Ovo3Pzno/ooifyIP2j/26AJcrdcw="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.1.tgz_1483825043206_0.2267892963718623"},"directories":{}},"4.0.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"1284ce3526e26efb3438eb35d74ab10b2cd5d99b","_id":"qoopido.demand@4.0.2","scripts":{},"_shasum":"5897f592f3f7a35990ad4f4eb61a3b7588688ea3","_from":".","_npmVersion":"3.8.6","_nodeVersion":"5.11.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"5897f592f3f7a35990ad4f4eb61a3b7588688ea3","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.2.tgz","integrity":"sha512-G6g3997Rdf2g2arLX9xrfy5aytwUPyz/7dMHJW/cM6lvYwo1hr79u5AMtkU30qNkFyN8fwn28HdnG6QammPoJg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGur0WwxSJcgHeIgCgZBPqA+U7De3d2+eSGrCizRJ+rSAiEAqwL2NWjKzlH/XAsmyMkDlSzm6PyUBOiiBF9nkxOi9Ck="}]},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.2.tgz_1483827054001_0.0745749487541616"},"directories":{}},"4.0.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"4e1cd4afdb64f6defbaf3ef1265fff8540f3e3b5","_id":"qoopido.demand@4.0.3","scripts":{},"_shasum":"43ca6f8f03b63f97d0676930c9e9e933b602695c","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"43ca6f8f03b63f97d0676930c9e9e933b602695c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.3.tgz","integrity":"sha512-XoNJWLzt1jRz1we/dzimOQTyECIcuo0toI05Rr76AIW+r2ZeWMHgpPLrJNmB7/MUeB6iMVC0/s4tn0yjm8KdeQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEHOHygGc25eaW/N2DJ8I+xzQWbD7wYWozRMc1gT2zBaAiEAui5N3LFDbdgTzkHUVGifC2+IMA4cOLflndKmH0wAVSU="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.3.tgz_1484042268989_0.7255082530900836"},"directories":{}},"4.0.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"ddbfe1f8f8162a1b16388fc8369684f325db0f06","_id":"qoopido.demand@4.0.4","scripts":{},"_shasum":"fbe03de8fd642a332542794c240ea4f26a3ed23d","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"fbe03de8fd642a332542794c240ea4f26a3ed23d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.4.tgz","integrity":"sha512-ydzoEYm3lDzEyR9Uowx3wzKNR9jX0P9RVrytoOw9Y2qETgYw7Rixm1Xbxv/AzLnkWu7MSUAOqAaqMtamcj978A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfR6dYTPanlqEw1DD+8WQSqzTpoWjc9oa3wl/EQrce5AIhAI6apmGYLBHuxp6LvGBSWJoVrJi6M7JPcg70cWFS/pDV"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.4.tgz_1484143183587_0.19766978733241558"},"directories":{}},"4.0.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"6089dea60def6cce6506e2e336d6540141890959","_id":"qoopido.demand@4.0.5","scripts":{},"_shasum":"5e1996872a5e4e386dd50a6708e521247ae324c0","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"5e1996872a5e4e386dd50a6708e521247ae324c0","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.5.tgz","integrity":"sha512-JQv6veJn7f/FYgYx0N563UFfVAt40LKrD5cHuHRp5/d8wWLZGz6aY0KxtWso+uZpinrJdYijt6DXKXAX65a8/Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqj84TDbsFQCL+l62eN1Q9656jsbUjyzkeLwwHqPllcQIhAOzDf0IaP54L+3e5Ydi5wfTmwaS10lJUvzpdXnkCEp6I"}]},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.5.tgz_1484155354090_0.5637194470036775"},"directories":{}},"4.0.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"a7a9077b809cd838214aef8336318d0b7e49cc7b","_id":"qoopido.demand@4.0.6","scripts":{},"_shasum":"646cf198a657768c465ebae1ad31184332687643","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"646cf198a657768c465ebae1ad31184332687643","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.6.tgz","integrity":"sha512-cjvCJkZQCoq2J7eTllfgaNdWLvyejJhTQ/AldCrG//GVYI32XaBDLcgzfrtLC7GrfF/+PKl89o1mI8Wor0VHVg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIESI//Swsekn3KabA/Y6GOre2wnTmZ8HxMeZUWc+tTDKAiEA8nW0TVpodLzlZPEx/ZXLY9/BLxTr9Ywp+JOaK57WQvk="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.6.tgz_1484238224359_0.8573770683724433"},"directories":{}},"4.0.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"(MIT OR GPL-3.0+)","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"3dc1a98c120663e50011414663dc859c35a04c3c","_id":"qoopido.demand@4.0.7","scripts":{},"_shasum":"ad47afdeed27418ca2c38232efe5d1e9d4aa97a2","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"ad47afdeed27418ca2c38232efe5d1e9d4aa97a2","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.7.tgz","integrity":"sha512-b3rgvc1z8viets1aOC0mcQs18xnpmPeVVIv1eWyrZEKvopvQvCcPUhRnnCwNi2KXTnfdAba1xDnwW7UBHl5emA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB0noxGod63ztJjjKa+mwKB3hGywybwL5ejq2cnkrkhzAiBaAVaMUeGSsU+5f1pV4EEFac5WY074oWPTJYtWM8XGsA=="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.7.tgz_1484307658981_0.2585426226723939"},"directories":{}},"4.0.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"ffb751deb11985262bcdedb730287f15a7535e56","_id":"qoopido.demand@4.0.8","scripts":{},"_shasum":"5bc122a37a8d6d27c6b7412ce50527f65e491d9b","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"5bc122a37a8d6d27c6b7412ce50527f65e491d9b","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.8.tgz","integrity":"sha512-HcWdVhARSU3bDwBXOyGzlZVD70JjaH4THICJgOCZj0bETwn2EgBdHn5rI8r6w+04Uc3LOu6CovQVKc8Rtdt3Xg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDznxjnwj47oCzlSBkImdGEMi0ANrpyhr+rKv8OXwoTHQIgLzkN6zTOwAps/qozjfZxl7hplYfC49cBgltP+sWfj7M="}]},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.8.tgz_1484904898742_0.3504712253343314"},"directories":{}},"4.0.9":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.0.9","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"62e85be8e83233a51cc4a14b608d7c3f4d9830f3","_id":"qoopido.demand@4.0.9","scripts":{},"_shasum":"b841c5246f91151e378020300a7c527939b9e7a1","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"b841c5246f91151e378020300a7c527939b9e7a1","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.0.9.tgz","integrity":"sha512-PeCRsg3iaodo0I+Zde7EPG0oWCoTwAlR0HYvCA7+ymDy/Yr95ofwuPVAj9cBdWuZSPTC6XaPOxES5R5w1nHFUQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDXRuItq8aqQWDzO+RX7xNSgt3j+hWTWYhG60fDrOrRcwIgfZ597k7z2ht9s67RvVrrWlnp5CR4IzzmKfz3+POFdsw="}]},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.0.9.tgz_1484910900042_0.4817453457508236"},"directories":{}},"4.1.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"4b4ca6845cc971a7c399f139c4bbae2f6447f5ef","_id":"qoopido.demand@4.1.0","scripts":{},"_shasum":"11dad6573af1f99a63f1dc3050e4ddac27f0fbc2","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"11dad6573af1f99a63f1dc3050e4ddac27f0fbc2","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.0.tgz","integrity":"sha512-VhxqF55rivxMBu1wRMkQTaOhsNaQzga0zWJnGweg9/Qi6jajPcCtTKJcCsRHT83Uo2l7ABC0xrz83cIqBTJ+Ew==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAXvXF02ymvRNjmiaHyfCvGx740v1o7CuToxTh7qNgrdAiANogydXnCAL5xdD0ti9h4xcXNBXictkd/PS/oBt/GD3g=="}]},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.0.tgz_1484922562590_0.8958300084341317"},"directories":{}},"4.1.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"2d34bca0601576b236244bdb5700e79bb370cd5b","_id":"qoopido.demand@4.1.1","scripts":{},"_shasum":"b870e58d472a0e9f6c34620e9d5ac90431ff4c4c","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"b870e58d472a0e9f6c34620e9d5ac90431ff4c4c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.1.tgz","integrity":"sha512-xCsQNOSTS3Vu0ctCC+p9AV57k5tdUbWuRcnewZ48Z2l2oQJXRcuhxNpGBY1FFdh8YMRzn50kYv+Pfz8qjy70OQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAjIVzVDZssvZn/SvXl9jja7Ck0bszhoe+2//UPvdN6aAiA6fGldtL9wmjpCI2txakRv4O7G7S+ZYoLfGcZrLRmWtw=="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.1.tgz_1485040301074_0.4907572453375906"},"directories":{}},"4.1.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"4b6fa8c3558f801df5daec17f97e7fa82da65646","_id":"qoopido.demand@4.1.2","scripts":{},"_shasum":"06bbc6e267a00b684b4d7298314987e4c4477617","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"06bbc6e267a00b684b4d7298314987e4c4477617","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.2.tgz","integrity":"sha512-9qIPvLTr3soPCRP+5SVyB/sxC75foBf7xabgktYo4vh9i2Q7bv6Zp9lurOnIzCVMMmyWsJSPgl+eOCZc+PfV6w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+yfWEL62MNqFHoLpguFgCwYm/z8Fhfxuz2P56BvdfXgIgAvQKUYD2KiKlcaU09wmNlMtiOBCRj/jxsK+dGzCFBPg="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.2.tgz_1485387342550_0.5238459634128958"},"directories":{}},"4.1.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"d17802d754e6dfd7794e4f8d7578c8fef3709eb2","_id":"qoopido.demand@4.1.3","scripts":{},"_shasum":"6029586a5b4ddbf4c3b7e519f7409b9b6e97fcc9","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"6029586a5b4ddbf4c3b7e519f7409b9b6e97fcc9","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.3.tgz","integrity":"sha512-YDGbviLrIM4/35jyteXcsZZ49e2TrxC+VQtoVQjhCfEpJG8QGUzdhGRpyfYajZu5HCjynZT4MjR7CR0VrpfxYw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEKTKrNNFv5JQtkyeQeyQaN3+gZEP9mD5jpkW7O/XK8eAiEA8TeIqBCJaEF5q4vYtIoG5tUrAcYSsLYr0JmzEPo7DpY="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.3.tgz_1485459975911_0.4746266605798155"},"directories":{}},"4.1.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"eb0f7e6f3b185e2aead91fa8c386f5f7a4f1ac53","_id":"qoopido.demand@4.1.4","scripts":{},"_shasum":"6b46aa6991c43cda8037371f2bdc97232a641a96","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"6b46aa6991c43cda8037371f2bdc97232a641a96","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.4.tgz","integrity":"sha512-kdm5CpGsiNYpAIklaUs0v0zp6rw2MSJOamzfHbW0YYnbt5vxMJQZrfX0g7PzPIuliDLUCctFVH5BNa0ffS1zZw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDkOut6WEOyQfw90B9clk3QCeZS69HOHymp+o2RN7XZVAiBrmJI2PQtqGe+9fWF8ydpcI8Gk8ED7ON7zxZPU/L61iA=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.4.tgz_1485802784258_0.9456876707263291"},"directories":{}},"4.1.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"017d2c04bc40b1874e5bd9f341a72db25ce6f6f7","_id":"qoopido.demand@4.1.5","scripts":{},"_shasum":"84dc6b3992a63c465ef592d8830c4b577877e2d8","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"84dc6b3992a63c465ef592d8830c4b577877e2d8","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.5.tgz","integrity":"sha512-3p/us2JbWvbBudlFDSHOjGDPpANgwFP6YMHqnapIbH0maGrifVHIBW80FvnyFY3IsQyGkmEXOF88ETwGsP2R7w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEI1aaOKkifLliflSkMDfvwIPa8hYcNVPjVHRlKXpKJrAiEA1zUCU51ShhSmjbmhZj7IjmfHDW7U/igpQK3Kid6FU5M="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.5.tgz_1485805165681_0.08936315099708736"},"directories":{}},"4.1.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"f2104aa38d19ef2ff917273219f508c5f16d7e0c","_id":"qoopido.demand@4.1.6","scripts":{},"_shasum":"f9ca276b94f892f3db3e46fe443611778d964229","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"f9ca276b94f892f3db3e46fe443611778d964229","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.6.tgz","integrity":"sha512-yTBXBlytGBsn/kjz/FJGFiRzsmZDhIt9TFrbZa68KGmDwAwW47t4PfXdqmuS1Yp9J3r91wK8rI7CdgwM9S4i3A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVvHUdpkRI/9oTd6pZ0Z4fzNtoPi4oDSCiiHCRHd2e9AIgPnrQmswnn6ZyHVgg8TGLlIzVbU0F63H692XBXug8rqc="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.6.tgz_1485991872516_0.9827011870220304"},"directories":{}},"4.1.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"9be45fc09d1df61c371b1ec5c7e042d5dedbd0aa","_id":"qoopido.demand@4.1.7","scripts":{},"_shasum":"7a2a01b4e41273683a0ec62d422cbabc153b2200","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"7a2a01b4e41273683a0ec62d422cbabc153b2200","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.7.tgz","integrity":"sha512-S2WLqHDXunDQFCobfnxEAtuz2Og2vSnN/yUJqMy1yOz6feszM0pxy7fZtY3kVvSHH9yMvrxPlXlr12/e0/0FHA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICi6K2lrG+F5TPMgUGA1GJFYGT74tDUagNkiIK1pN10pAiAvMWAeZhzaixbr6iYKBaIRz9EYX1Rvb8HP+s4//Gp6rg=="}]},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.7.tgz_1486051971220_0.7353532686829567"},"directories":{}},"4.1.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"8f39ca2465afc4e2ae519369dc3d81648db94643","_id":"qoopido.demand@4.1.8","scripts":{},"_shasum":"b899125074957e24bfe88256a3d9ebd341895239","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"b899125074957e24bfe88256a3d9ebd341895239","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.8.tgz","integrity":"sha512-7gNMAb0/N0BJu9uhZ/Lp4f8LlGQzERMdZGSQeCYQzh7AWhLo4c8/rXAr5y9GOfrTxN0H0KNJp0LLGl9PDTCdbg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF4KZSW0WKf3GrOZpR0StmV2PcQ8Us+hfTsvAaBr/yaLAiBPgZKEqHaCH6nf1EwR8vZDpX79VQImOjIr0tv4EB0wng=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.8.tgz_1486069603555_0.7627835187595338"},"directories":{}},"4.1.9":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.1.9","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"b16c05a38ca8e413ed2f3717ba4ab4cdd3de6ff1","_id":"qoopido.demand@4.1.9","scripts":{},"_shasum":"b7f7b482f7e02f92247ca4553d8d0c84020af7ba","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"b7f7b482f7e02f92247ca4553d8d0c84020af7ba","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.1.9.tgz","integrity":"sha512-945vPdVsBo62RvW63FApFPyRt8woNFL+wKQrRxa/1PhmehkKVnakPmm3KjbDoAVBeBsga8GoOfS60aKRsqZZiQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDagTZBiRKccGlEQOvzNhK84sp2pDR1RAR6zgnS+Ui6EAIhAMtyMwEChm9j5XGDOpuZYxzjYrstaibbxlfI2CI3guMv"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.1.9.tgz_1486073260219_0.8901239293627441"},"directories":{}},"4.2.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"e16da44cbd177855b83c867a9e8da71ae5dfeffc","_id":"qoopido.demand@4.2.0","scripts":{},"_shasum":"549e0c694541ba79cee24d5bceb3edef28d1c380","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"549e0c694541ba79cee24d5bceb3edef28d1c380","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.0.tgz","integrity":"sha512-nJaJ5D6CeVpIZlG/DRITYB6FkrkI4WbAIB9tqPhIoS7bhnR/MNIwLIOKrwtf9s9rY67CpuhxZzfMAS+VBVmQtg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCup1G6EwJRTbKnxpCJkINBSYaL69U3g8g6vxXYby6+UwIgRv0vkGnW+uGy9z/edgrOdqbUkjPrxDb7cZ7rslxg+1I="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.2.0.tgz_1487832574168_0.9268673248589039"},"directories":{}},"4.2.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"80d688e24b93df7bade649e211038553da3a8b61","_id":"qoopido.demand@4.2.1","scripts":{},"_shasum":"a8e6c3704f3f9f33464deab2b6fbfa771304e7fd","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"a8e6c3704f3f9f33464deab2b6fbfa771304e7fd","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.1.tgz","integrity":"sha512-A137WwDqymqxHPv29vqyRs8sE6HBg1t7yoKCjcD07wvAcOPFEyzRhs+fURbTBATOZKPmmUbMgnGKWSMQtAM5RA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIErDWBfJ7UYCk9+msNcEktXKi46NB+ZfeICYxzSnfZuYAiEA6oPqeT9mWAK7VniKRtXh6t5/vkZG0NgF3uvwtWRs+Rs="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.2.1.tgz_1488030740519_0.1253567743115127"},"directories":{}},"4.2.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"yarn install && gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"c30b01fdc2315d64b464d978f0a206e833910bd9","_id":"qoopido.demand@4.2.2","_shasum":"3a542b3d67c162ae23912e2e16486cca5b38f727","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"3a542b3d67c162ae23912e2e16486cca5b38f727","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.2.tgz","integrity":"sha512-SF750s/gqzJ60CAEaTjo+/dOt6jCTSpunbgrWB62MogL9h3V5atHORKWsTesrXh4LN2gB4eQCGsP+3kHiZppwA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtIl4TvbYHAayhKHDwxUmJx+PhdqVxT7ZQPwUo76pwfgIgZBGKehnjOopM4Y+bbnQrj83JHWOp/R6RV+s5Z9u2lUk="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.2.2.tgz_1489239761393_0.2799132445361465"},"directories":{}},"4.2.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"yarn install && gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"^2.0.2","gulp":"^3.9.1","gulp-bump":"^2.2.0","gulp-chmod":"^2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"^3.0.1","gulp-header":"^1.7.1","gulp-include":"^2.3.1","gulp-insert":"^0.5.0","gulp-livereload":"^3.8.1","gulp-load-plugins":"^1.2.0","gulp-plumber":"^1.0.1","gulp-size":"^2.0.0","gulp-sourcemaps":"^2.2.0","gulp-uglify":"^2.0.0","gulp-util":"^3.0.6","require-dir":"^0.3.1","run-sequence":"^1.1.4"},"dependencies":{},"gitHead":"e9a7361e2a3111fa36132f8f87de8181caee8d0e","_id":"qoopido.demand@4.2.3","_shasum":"b6cc06b5e76e8869dbef682bdb144cf4632d5416","_from":".","_npmVersion":"4.0.5","_nodeVersion":"7.4.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"dist":{"shasum":"b6cc06b5e76e8869dbef682bdb144cf4632d5416","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.3.tgz","integrity":"sha512-POl7eUGUjYXTjlhjrqnW2D7YLTI4ojaek4kIWn+1ob+bY8f7f0aZVpHjWJ8OdL85WN451yEAjT65B0KZxXJYzg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtCAd6rle26UnmQQHJX5Z/tFC+ujjYSaq/s0QjuvTW8wIhAIQF/b/YXdzAMXfZdhQIo+FFauY1JQEDVz5mjGNy9Q3B"}]},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/qoopido.demand-4.2.3.tgz_1490344335742_0.6019797220360488"},"directories":{}},"4.2.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"2.9.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.0","gulp-header":"1.8.9","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.1.0","gulp-size":"2.1.0","gulp-sourcemaps":"2.6.1","gulp-uglify":"3.0.0","gulp-util":"3.0.8","require-dir":"0.3.2","run-sequence":"2.2.0"},"dependencies":{},"gitHead":"84f130a61a2b48bf03053b57670a173a8c7869e2","_id":"qoopido.demand@4.2.4","_shasum":"3ca011c80c9e1e43cf170b43c6f53ea2be405f1f","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.12.2","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"3ca011c80c9e1e43cf170b43c6f53ea2be405f1f","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.4.tgz","integrity":"sha512-VUxocowufh2oT+hlso5IRGnYlLZRz0ua3nyhiKO2sGnyrE2FxU278YuwGEglI+owKThfMdIHTWYrmTaNxGibOg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQ047x2wwzxX5jevYls15eCnSwdRerSXXC3+lhM1xMUgIhAPWQQeIbSQSLS+pV496WKW1rpH5YfmHLo9WcfjM1pk48"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.4.tgz_1513949611399_0.7581411832943559"},"directories":{}},"4.2.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.0","gulp-header":"1.8.9","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.1.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.3","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1"},"dependencies":{},"gitHead":"9990cab1fb828581f814002ae75e8e7a899aefb7","_id":"qoopido.demand@4.2.5","_shasum":"66954dc9c07b64ad63bbe68648cb4f04c10d1fe9","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.12.3","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"shasum":"66954dc9c07b64ad63bbe68648cb4f04c10d1fe9","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.5.tgz","integrity":"sha512-cbil+ppx8998s49yqXQxljuZIVSjvhKmkA0nHetqpavn5ZNyJTuIZ99eiG0IrlbY5EPBUbpFf9WawPldZdtB0w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDe6K7DEu8j87qGHbrbQEP1P/iKu2qTiexFTF6e+K8t6gIhAKnebjZnLAkBIom+MdGt6l3eBcWO0Wp+o8mc5iHJbJ4e"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.5.tgz_1515010932828_0.46945526311174035"},"directories":{}},"4.2.6-alpha.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.6-alpha.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.1","gulp-header":"1.8.9","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.3","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1"},"dependencies":{},"gitHead":"140ab38cce850736353c2f69ea8a2d4173dd7ee9","_id":"qoopido.demand@4.2.6-alpha.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-N/muicqnIHMTclZc4odIiPtjSPWgTMZNNFIuS3+JP0PpBn5e8lSaRhAOmSzQnZCi87US7N074HI+3pSLDIqB+Q==","shasum":"9f393faf33b14773135028a9be4833127632aba7","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.6-alpha.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvUR98cMxKHIXAfVzbHA1OX2udR/dRyav4g77TVDbl2AIgbkelMANtjf0Mkwsg4PirvZweA2tSrKVzqgCEMHq49l4="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.6-alpha.1.tgz_1515610452729_0.17159375245682895"},"directories":{}},"4.2.6-alpha.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.6-alpha.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.1","gulp-header":"1.8.9","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.3","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1"},"dependencies":{},"gitHead":"09fcfc1ee78e171e1c1a57ad6ad2a1df7905da0b","_id":"qoopido.demand@4.2.6-alpha.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-q8eN3t6oJjJxMtHnbTXPocx7NyWqGFgY6Z2DpaqQ4vdo7nObt7DTw0+7BUS44FV365hDnS17yaM/A9kcIbFJDQ==","shasum":"ad669a0979e2b274e27b6d49545f9907c3ef39a4","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.6-alpha.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDj39m8w5XHvewH9fp0b94Be0kb1eANhQyLJw+wYPypfQIhAKULC5+1aVNZlUnUcI2DrG4HMKKkB8WayAxOd9yVH4OT"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.6-alpha.2.tgz_1516099512681_0.8459230766166002"},"directories":{}},"4.2.6-alpha.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.6-alpha.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.1","gulp-header":"1.8.9","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.3","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1"},"dependencies":{},"gitHead":"00a86c322ac5767c1da4a74f66d2f8cadbc4dc1a","_id":"qoopido.demand@4.2.6-alpha.3","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-GUYtLPEvZXqUlTI1lfqPDw5kKjrHt9Z7ZfvExPvLSUYMT0OgNsYa3wpkFi1WDHiKmvtmiwaaz4KtsLKJRdS3wQ==","shasum":"ccd9a172c5aae5707daa06745cb947b620a1091a","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.6-alpha.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAX15xEW+hNB4FM87rPWLIYOc6G56reyRHkTcYxxHI+yAiEAmfEHQIjFl6LGW1k6sfjxr2oO5fU2xCix5h63B/YjRR4="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.6-alpha.3.tgz_1516099701333_0.7742389973718673"},"directories":{}},"4.2.6-alpha.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.6-alpha.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.1","gulp-header":"1.8.9","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.3","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1"},"dependencies":{},"gitHead":"322ec4706bef3a5275d36eb4f244d7f86f060b00","_id":"qoopido.demand@4.2.6-alpha.4","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-uqXYzvXs9xf2lWfLsWYFiWsJUR0wBgIg0Z48/gr+tegX8k2UxP/Rh3igLXIJLfQUyTnOLxseX+E7YhiuVlUmOQ==","shasum":"91a0a85a377b06f328cb50374c10b35c8d1198b4","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.6-alpha.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGsBHnaXrULI7h0Et+XW7DtYd1mzBxuCnsZ97af03m41AiEAx0LREvR/Gkh/hVi3wLwMKNjuT1RwWiizK357h2ZC/MU="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.6-alpha.4.tgz_1517274888148_0.07667436357587576"},"directories":{}},"4.2.6-alpha.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.6-alpha.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.1","gulp-header":"1.8.9","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.3","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1"},"dependencies":{},"gitHead":"5999b56b176c0a44a9152ba21bbf9e2d0ff1225b","_id":"qoopido.demand@4.2.6-alpha.5","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-mvw93gukQ7OVHEF/Zd0g+0R/aFXE6+r4YPvBSiLFgDbIeNCo0JfLfUzydc8QJ35geGhMmRzrPG2Q9V8ZwxNYSA==","shasum":"20f03752f440d20afe22faf4d02812466c945c34","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.6-alpha.5.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBRA+jTiI+J7HFpPnR0QNpgPTU8+zAdcOyQ+X5f+jBs1AiBm+MIHhgkCLXu0nwbbey8BhIafcgd+zFuGETMMS78e2g=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.6-alpha.5.tgz_1517303310229_0.049954356625676155"},"directories":{}},"4.2.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.1","gulp-header":"1.8.9","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.3","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1"},"dependencies":{},"gitHead":"4c6fb80e3b35c3ee347afbcc5ba300b08933226b","_id":"qoopido.demand@4.2.6","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-ZyF9UXLy0uD8jH709RynDTWgshmtZC8NjeW+SyZ4qVMdr2NeOkiVbmilwMYnzuzC+PFWlipkD8utGtREEGf34Q==","shasum":"c12e94861534e28b6abf473479028611604eab28","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.6.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEHEDwpeIF1Rs4y9qwcuyqEijvGTS28hJp4JaXnbkS1oAiA0TBjTtz+BeaufD2lIEANX6c2mBXkvJNVwzshKBII/mQ=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.6.tgz_1517317297705_0.43217324768193066"},"directories":{}},"4.2.7-alpha.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.1","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-K0tOZkrql2CsA5mHYpPPUBPO0Ii6eVFTMr82i1FdVTq9e1ILlaRqnbp39iGlWse09H9pdjCZknbv6WVIwvgdiw==","shasum":"783abbd200c1e61b987b2ada29a2b21e070e781e","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCctOEIFmab1Lk//C2UIdiydWzr1fpg5PH2JGY3xidfgAIgPdQ5rs4f17pqYGagWk2CoHjbEnAtti//lN7KNc0inko="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.1.tgz_1517867897969_0.42977197328582406"},"directories":{}},"4.2.7-alpha.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.2","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-CibOdHUFlk9vJ+9xezT4XmDPW9l9YfJJdKUWrKyGU+X6gzd2O7PDYQIzYl/L03nleUAaacKDqgIY0WbWJnZbtQ==","shasum":"fbdd7a2c7089f0b692d7e4ba034d332eaeed03db","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEMLXvI59eZ6JjHXQOtNsPSX2Tkykmeqlh+rOUeLtHTsAiEA/KKLZzMlMjWpj+WqZ33UTMxV2TIVZBG1ZOQuPNRcWY4="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.2.tgz_1517868290145_0.39600841235369444"},"directories":{}},"4.2.7-alpha.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.3","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-6NqyBPSfRQr9cY17cebc90uLVFxTQGzGuJjEHxsFZ5j/upNZw+YeSy95iRAMfzkLaxY7LQHXzspOsy0KKJcIZQ==","shasum":"52d1ca9731c39773866d41064e567e359a288767","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDiDNutje79B/CtcLbYX4Y39ckjnauFKLXAFl1TLplDCgIgffs7JN30F8/hiZwP3xMb9ZkstFtX9W//MhQxOqZ/EFM="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.3.tgz_1517868844487_0.37786676827818155"},"directories":{}},"4.2.7-alpha.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.4","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-qgv9VleZKwEzWlSpwfqPAsbwVEL3IKheHD23gnwHHwbZuSKxLnQdJqlokVtRqL2xPimljwlIHnc4sM4xerhfjA==","shasum":"39dbb6ebb112c171c3a342c505e4f4bb86a3aef6","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDEUzAXg3fsRmi048J/oHt2vp5fTobQQK+/I9w4Mg8UuQIgT4e3gxi49t3sBUQ3etxo7YHX+V/IJKCHgmveZXLvcP4="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.4.tgz_1517869633442_0.19791824696585536"},"directories":{}},"4.2.7-alpha.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.5","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-VUdmrGKU2Jw/H9EmA4lFFW64KP6j66als3HwNWiChYL/wQlU00PUUi+RfZDyf1kETnbkweOALHpqbVp2an/RiA==","shasum":"1ee5ca94e3e1a8a9d3fc2a232e75f4031ea29f30","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.5.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCByghmRFrTGdmVDLs7jSnW/aYA1D91rFVL2njMbm9wAgIhAPfGKCz6XszR8HpnJsuKJZiYZfJAWfobMoX8zaAJ6bfg"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.5.tgz_1517869752928_0.2775497720576823"},"directories":{}},"4.2.7-alpha.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.6","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-MA8uWFcQ34YyIZq/NzAMpA1eNijGGa0CFAb+AHUG1zKihWPGPYow9CrqzNQ4xPA099Y9MB6CJzmPxr12a6ZAxw==","shasum":"1edc8076558ea8b6ddf2fae02251ee20b5841c08","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.6.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDiP+keYJoJoDfJsUeUoMeBwZZq6dDnqQWHw4l8EieUuAIgOwuq+K0Bols3l0M1i1z3drFYCw4gtvJ0x1mqKLzmS9A="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.6.tgz_1517870097463_0.9553740182891488"},"directories":{}},"4.2.7-alpha.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.7","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-IsFw7Qf/k5nF85vU0xwZ94HRJIkC7NQO56jucxAZk88+8VTaeO8ttNgJr1ZObDdATchC596SxWIc3ZrvF2d97Q==","shasum":"7884efdec85c4f252f1dd77f944e2da20bc94f6b","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.7.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBdVNz0WbQSCg+3j/fl41AmGlNqDGOxf0jMWl8+kBUJBAiEAr76wtfY+XD5n1Kp2Tn9jDe3+NrgpYuC86r0NLHVOljc="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.7.tgz_1517870320925_0.5177477200049907"},"directories":{}},"4.2.7-alpha.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.8","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-KHH1iuqRdGYubM7p/cUBeUjEVia3fvhVXTnTDSqGcDjoEl0mMPeblirdh1dP6J3Dy+18aQgONJn4ZzwJDj3ERg==","shasum":"66d93108e89fdcf12711ff67859c75655f783e38","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.8.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDExSkAzUNLd4Bih4KsItRQfurt3X56Hdu/CMA6cdenUQIgW5ruSTYBdnaLpVDqZK1eheavkWMS/v7I5YFWy9NTSmI="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.8.tgz_1517870515457_0.08823464810848236"},"directories":{}},"4.2.7-alpha.9":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.9","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.9","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-6vScaV2ovYzbj1iKtF8SAM/7uiK8cv0HVyFjH5tiRM9YpIt7niKwR6+1jVVsWVF4qrElYNAj9xy7jdN2xYIBIA==","shasum":"5ea3c0320cd5d6feae2b97aa66878a884cf59735","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.9.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFHhcUhtNlWPiMTkWPlA8FVXyVqNeyd8EcGec9Aina8BAiAHXafKymulIz5kcQLo06SINIK0hB+35H8LyYsjxKCCjA=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.9.tgz_1517870637742_0.24642167193815112"},"directories":{}},"4.2.7-alpha.10":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.10","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.10","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-nyOGRQLsi47JuMxa53OOT/ELOJqkoqZSxK1PIYQIxTkJkxOTVQofP93jveNkSpdAnKz7mg86RzSDhGJDbMLeng==","shasum":"402387e7860016c3563e8892e2d42f3873bed12e","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.10.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSkGxebj4LhHQuWx7RKeWQrvyv4e34RKWUz0+17RBfZgIhALnIcfLpxb1KO3vILv7V57dBRleyG1EBRZAytUv16yKd"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.10.tgz_1517870705793_0.7616025123279542"},"directories":{}},"4.2.7-alpha.11":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.11","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.11","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-lxflxrU+3sxPiNkgMHy2Qosjd0JGRRFqGb8j7zc0jxmvwgEMF2pbqjUSC9LVyZSxs1BLZlsK3TGsfikpEuUKhw==","shasum":"98af7d9648d375e6dad662e72e4ab8fdd5fa1785","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.11.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYtOfD9v1kiF1rB/IqWPb9GbOfzsYwfKJTb6FsbA+n9wIgSvPbI19CWFgkwGdZTuhKovt50PlPbHjgTqqooMG3eRE="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.11.tgz_1517870759342_0.8105791134294122"},"directories":{}},"4.2.7-alpha.12":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.12","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.12","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-eyfP/UZZkYdi/SdS0NtiaWU+GWQwg7FT+sIORh+4gDFkU3H4k2tnntK3biLRVs6Fthuf4MVAmUEjb4biolbrMA==","shasum":"2ae1ffd1fa8e6b43268113c211cfe9dcbff2b11d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.12.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLUvm7nIr32S2O/gA20zwfVBNzIsQmkFT59CRApcWxbAIgIMus+QI9CLUGPh8gJsF5036f3Fa3U29k2tBX5CWUqC8="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.12.tgz_1517870813826_0.6940696728415787"},"directories":{}},"4.2.7-alpha.13":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7-alpha.13","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"cc62d2c8b73727098d1157bc991320195f4d690f","_id":"qoopido.demand@4.2.7-alpha.13","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-4iHxkyWfmmhq2xUNns6cWd/MIG2JcGki61TYSwPxgpdaxcUjOQPxUux4OHdoNhHstdPQTxwH+E/LLl21QF4RWA==","shasum":"10713df125337a0212ee6869f29904c185cdf19a","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7-alpha.13.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH2F1SzV0/lI5RhHluVbcHtn6stDiW2fgGhG/t/yVm7cAiEAx5HTK6u2t43onGHLC2H39GM31wxSb+mOmOzhpvsvCX8="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7-alpha.13.tgz_1517870895302_0.3837102500256151"},"directories":{}},"4.2.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"914fecdb28bd030b20b2ab875ca40586f68a346e","_id":"qoopido.demand@4.2.7","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-kD0dWmaSWMml2JuSk4N4ldeJ9HGo2QCaKeJzf2RZvLZZSXKWMGh34Von00EYsll60o58gWYTIe4sSWLfalUD3Q==","shasum":"1b790dfe00c82be164a24eb85bcece97e0c62f9f","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.7.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICgIQhuitR1Y2wu3CFmMviNuzt7g30aVX2FV1mRKa0xHAiEApFrz4VRlzRrW67cObFx1wP7joWqvuSFKoRUCQl6FAzI="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand-4.2.7.tgz_1517909409042_0.8337431820109487"},"directories":{}},"4.2.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.0.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"0.3.2","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"28c3d38ae1733d9032e01299acc0b25ed93cadf6","_id":"qoopido.demand@4.2.8","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-OYD209AYixRqz/orgL0AmyKxjuMIygOhpjxVL1thoL0gG7XHURIH/a8RUhI6S7OyXPOaEgMMWRqb+QXNhUWkPQ==","shasum":"15c438a10f5681be1c5e7e345e014a67947652bf","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.8.tgz","fileCount":132,"unpackedSize":764992,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEr0jPgvV3EZGhyQmfmr5+Yraji3+KF6A21xrPYhhP1GAiEA+gSTQtgS0uwgZXhYVFMQBF6TYmKBv+sn1s1zxe7BDfw="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_4.2.8_1518093800733_0.7469128710769062"},"_hasShrinkwrap":false},"4.2.9-alpha.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.9-alpha.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"1.0.0","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"6e5950929318ae3026c6a6c7a8079a2b49886cb4","_id":"qoopido.demand@4.2.9-alpha.1","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-NrSfYxf1OcOKUVL2PQ2rkVedy7iu+hLal6UBkjIsuLb38Ye3y9xUNgmWtPyarjPlhwFWbZtFL1dPeB1k1fdACg==","shasum":"311c5d3bd0269b5ddde8a24d8af4a3c489d01812","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.9-alpha.1.tgz","fileCount":132,"unpackedSize":761342,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA1mp2LchF2b7Ezwgv0ZtVcvVMUu9oOeGTlURlgymQuhAiEAmLj9vNvwWFYOyZYr1dL1k8tV6zjxNKTWVvYWq/IHn58="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_4.2.9-alpha.1_1518133936623_0.42423340538866317"},"_hasShrinkwrap":false},"4.2.9-alpha.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.9-alpha.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"1.0.0","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"6e5950929318ae3026c6a6c7a8079a2b49886cb4","_id":"qoopido.demand@4.2.9-alpha.2","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-QgjJfBKdd4apb2G71jxLhLvcUj4DmhyEXTXMU8ndCeLd60pih2FUERCvshXLJN7PgtFe3LT9CWc74nLj4pUJ2Q==","shasum":"298340c17b987fbfb87aeb84abc58d752c9a2582","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.9-alpha.2.tgz","fileCount":132,"unpackedSize":761465,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGCfJIbd0Bxuv9E9kfQdk2B2EEhN4W1O58rA+jnY1ngWAiBgni30XXqwzxioAQeKFjQbmT30R+k7OSebY9HhkoIAkw=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_4.2.9-alpha.2_1518134572932_0.1047305604919595"},"_hasShrinkwrap":false},"4.2.9-alpha.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.9-alpha.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"1.0.0","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"6e5950929318ae3026c6a6c7a8079a2b49886cb4","_id":"qoopido.demand@4.2.9-alpha.3","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-J5aDLEBfRRKLXJcxeaN+Qzi0Tx23GvsAsv4avP1AmwpTSRRIammbnDRTRJT7/m75aszZ+09qmhIeA9ZVN04xZA==","shasum":"5d779aeedce109be235ae0dcc7b8e928e6025d6e","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.9-alpha.3.tgz","fileCount":132,"unpackedSize":724257,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBb7UOSfZdscsQqvk6u01L4elkkTXq6eMdjVqznaQsLQAiAT4DkMTFzwDTkNW570gvqwgQjFp4pchlz+S7zeXRmt9w=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_4.2.9-alpha.3_1518135401710_0.572812028715296"},"_hasShrinkwrap":false},"4.2.9-alpha.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.9-alpha.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"1.0.0","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"6e5950929318ae3026c6a6c7a8079a2b49886cb4","_id":"qoopido.demand@4.2.9-alpha.4","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-LSWTw2ip4dNC3OeVur+zbQ13MWAxn5g6Qo2qws/4Nr5bmDKq/eIXPvWguL9XUqqSvizu92pcT/60jjATx3uz+A==","shasum":"d69a834a04d52c08fb2614dc85ddff65c6d01640","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.9-alpha.4.tgz","fileCount":132,"unpackedSize":724688,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDNQBnNAXeXsJ72DhMUaD7YBvbpP4Bm8sB8nJe/Ndfn8AIhAJbr/38bai5VJlcgWxrXMtUqe0dGTL6HymTmuiNrv5oM"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_4.2.9-alpha.4_1518135473151_0.039357094808887716"},"_hasShrinkwrap":false},"4.2.9-alpha.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"4.2.9-alpha.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"1.0.0","run-sequence":"2.2.1","uglify-js":"3.3.9"},"dependencies":{},"gitHead":"06c74fb361b316f53b8800867f849d5c4a36e659","_id":"qoopido.demand@4.2.9-alpha.5","_npmVersion":"5.6.0","_nodeVersion":"7.9.0","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-PSTuKu1EIKCQLJUKWvfwpzEKyPwjhdlNSc/souJW75xLlL1R2HHIFjzTOS9SuRPE8UbXATViyRRAxr3UtKkKfA==","shasum":"5a73d62db710a2e1229fe9170659fdcb6578fd73","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-4.2.9-alpha.5.tgz","fileCount":132,"unpackedSize":666859,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGM10qq9YAfsDSo5bTmS1dUsgPRpxOux7btCAUFiAGBSAiEArlTE5Z2CMsjt0Oh9Lww6A+0aI2jgCVSV5/t6JnC6VsI="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_4.2.9-alpha.5_1518135853659_0.4111733719552537"},"_hasShrinkwrap":false},"5.0.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.0.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","main":"dist/demand.js","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"3.9.1","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-devtools":"0.0.3","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-insert":"0.5.0","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-plumber":"1.2.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-uglify":"3.0.0","gulp-util":"3.0.8","gulp-wrap":"0.13.0","require-dir":"1.0.0","run-sequence":"2.2.1","uglify-js":"3.3.10"},"dependencies":{},"gitHead":"3a25692d75c1833bdb4a07934d52156d7169a33b","_id":"qoopido.demand@5.0.0","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-3jFtvg3bpGFr7uFy1TqxIaVRHSPsI+orI6pRZ4mXYoIWY9oaeV4pWqnTa5OoyOhS5ZZjV0KwS9wKTdTCIJqftw==","shasum":"280dcf5765e8649b783c490d6385664a6afc60de","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.0.0.tgz","fileCount":132,"unpackedSize":666893,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGh7c5c8flsm/IZTWTd/JmxdfQMuvIPUMfF2cdNc5YmKAiAV/FXbEoWCO6eZymLQnsW7Pg6Q1TxUcc+hGtmMPi6Pvw=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.0.0_1518137287937_0.010892174358986484"},"_hasShrinkwrap":false},"5.0.1-alpha.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.0.1-alpha.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.0","gulp-wrap":"0.13.0","require-dir":"1.0.0"},"dependencies":{},"gitHead":"14c104f26c2a36f10723e72d995797e6826c0ade","_id":"qoopido.demand@5.0.1-alpha.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-DWTXgUNhdUIWezxn+sP5/ZyucUk45QXP+wOVNjuf4EdC6TPCSJ5D3u7qOaegb3sxiIrGZ6xCgAyT7F663sjSqw==","shasum":"71b8cf5fe0d70ad77617387ac066c88dc7bfa80e","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.0.1-alpha.2.tgz","fileCount":123,"unpackedSize":759449,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG3Cxq0Cs1wzvvH38mlv1bwS4yZBOxTG+a0df5iZvxNkAiEAmF1xKXjXDYfaA/13T+j1xd+A7lIvvm+fHWH//ZkbKEU="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.0.1-alpha.2_1519047276781_0.16587499703504327"},"_hasShrinkwrap":false},"5.0.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.0.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.0","gulp-wrap":"0.13.0","require-dir":"1.0.0"},"dependencies":{},"gitHead":"6cfd13adbb3c92d4504b6b6a7121cde1a9a438e2","_id":"qoopido.demand@5.0.1","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-PERiYsvCytj+oWaNyfe4woRowJfAABxXcnMWLdW05ffmLQ2gXI8j2dtIOeC2h0xhjcthN5Lw/xaeqUrhHmc6yg==","shasum":"6da25050ac99a88d855dd5f06110eb0a7d3123b8","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.0.1.tgz","fileCount":123,"unpackedSize":759265,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXLFrgKgEDnqnVNPslvIH6rdBSzV9oUEGimirl1uvF8gIgMq3BSlE4Km13BWxaPbfoIa6ua4LEsgFFV3sarxa5F1w="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.0.1_1519051678268_0.8074057413398286"},"_hasShrinkwrap":false},"5.0.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.0.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.0","gulp-wrap":"0.13.0","require-dir":"1.0.0"},"dependencies":{},"gitHead":"8ab879a1b631caddc66151b7c23f06714aadb46b","_id":"qoopido.demand@5.0.2","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-mTG2fb7jZ+PXLMf7XjD/2K1iYj/Lm6uvgQXZnL8skPJUfBOSHlg2OSLW7JMJr3gyyNxeHVOydZMswaPMBZxx3g==","shasum":"3b08efc5e36df11783428e40720a93b5bd057e40","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.0.2.tgz","fileCount":125,"unpackedSize":769074,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCZxuZuu1JjbEEdAjQE5EdEO+WiS0360Ix76z/1Fca7NQIhAMX1Ku9auVbZx37LH8IzgyRl8E/g4REp6NYa2mfFg+sS"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.0.2_1519340010586_0.18723147835129117"},"_hasShrinkwrap":false},"5.0.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.0.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.0","gulp-chmod":"2.0.0","gulp-eslint":"4.0.2","gulp-header":"2.0.1","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.2.2","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.0","gulp-wrap":"0.13.0","require-dir":"1.0.0"},"dependencies":{},"gitHead":"4b313f42c286c799b16e0cada502a40363d8d297","_id":"qoopido.demand@5.0.3","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-nkvocs5n0JVOLtwlsmOQ6/1U0zSh+sK1X+vubEeNQr8pJ9FMiuq9OIQ3RuLdoaXYKFmrB1Su8KEaf0JGusjAtw==","shasum":"7f9e3c73320809ec9584c521c7e2f67f6b873f5d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.0.3.tgz","fileCount":128,"unpackedSize":770273,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFbx0YZ9FHDC/0TuuyHBnJnVBcaCnf9iNhaN5BxXmGXhAiBPY4pybF4HxPmv7q41mCBLU3db9m9mDcG5LTg5usp0pg=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.0.3_1520004371672_0.5701153946800332"},"_hasShrinkwrap":false},"5.0.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.0.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"4.0.2","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.3.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.0","gulp-wrap":"0.14.0","require-dir":"1.0.0"},"dependencies":{},"gitHead":"ae69ddf625e56a5496479d9234036dd9bcd40728","_id":"qoopido.demand@5.0.4","_npmVersion":"6.1.0","_nodeVersion":"8.11.1","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-KiTkcsOiMF44W6gsoy/tF90b+7atMyombTbwtDWutrQDQIlYsjoCTmdLkWGqggnheUI46Xbfjz5fnO2QPJX8TA==","shasum":"ee0b1acfdd68862297007d4d8f39dde8dd8d8e2b","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.0.4.tgz","fileCount":128,"unpackedSize":763085,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbIOmCCRA9TVsSAnZWagAARjMP/1O8YXxuu9nAKX2askNG\nGA1b/GcyN1HiJiakUKgKgNMufbpDI9P59R59dlyn/fBloM+yjfW3qLMkmCfg\nD8ty/Dmt4lC/vXtFDUdx5eqxbibwGQpXUSg//2AQChmNuXv04dr+jYV6Cre3\nW1GVSTXq82xZQYgdBtIQSq8WfAD05TVUMeUMoRH+JUTA4QXaY10JABlyjsK/\nAdid9tgb0lYYjyYXMAuQY/8efdUkGllOe+bZ/7oD0CkafSdpGihGxqq83cjZ\ns3W35SxD/VPUkZ6ZJCjtqYVpbqBPsLtLxvcFworY5U7FnJA/V09RRF6zpBbX\ngyNRW9swxU+dgXLzkWtma0QLaY3Cn2Z5xBdqvLicjjRX+MygqFUwa/FHnHEY\nVHl27MPZ6aD69uPW3hH80KhfZrBfirz0gwzRdVa00FHlswyzGWpVGwFrkJ66\n+cQVFznYX+481yUi9n5X5jESOok8ntmlSC7SHAtHaZxDqRvxrRXexJu19Kc9\nBX6o5XOQSerh6b1E2a+VvXInhBkJjaFjM6dm786tC8QvowUz5Uc7lmgN0phk\nm5NZ7KSe78CZ6r2GjSvhnlQsFfFXUDLAPyfrGaMUR/XhUIFd3v2PqajV4i/g\n7yDHb4ZcjPZHzYsZ5UpqHgltBpiIhz4NAxmULHS0pxac8r0QyND181Kg9mIr\n0fb+\r\n=W4XK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICh/oA2dltlCxfEXCZFYHAlwKwOBxL4nyAcvym8DU9iXAiBjIxLsUIkTGQmUmBGn3UoWjk+z5sEQ98Idsxl6G+ZuFA=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.0.4_1528883584645_0.512467307094324"},"_hasShrinkwrap":false},"5.0.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.0.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"4.0.2","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.3.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.0","gulp-wrap":"0.14.0","require-dir":"1.0.0"},"dependencies":{},"gitHead":"1986734438ad32b287e21f05d99fb117caa55c39","_id":"qoopido.demand@5.0.5","_npmVersion":"6.1.0","_nodeVersion":"8.11.1","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-wDcwN0mSyjfH1Eje61KaK07VLsjADaSkTJMeUtEyX6uxqnlkL+fK8nldRTeVVYRZ042bwRbTocCFLw/R84Qiqw==","shasum":"3d1d2bbd7ba049b4fd3d2f5b791164ac9fe49106","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.0.5.tgz","fileCount":128,"unpackedSize":763443,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbNg9wCRA9TVsSAnZWagAAScEP/R7ajrW4GlEqtIwK3TWC\nSN53EKupTNChcSOMpW8Kk4maKUHp5g7ghfSFumSn+OlsUzmBRWk8iaGpp++H\n4mKwBYADAeGanK/N7v7W2XEOKw8aGU5Dy68YGtutoDCyVp+OGnswS7uX1C0Z\n5rugFx+wNtILkQvJrZau1Ky6ernqp4m6C8Tn+f4fsKKjXb4Ik+ayzvYB2gj/\nJZU267z3+hjfANigWrC+nx3872HMVssshcPiTW/P+mQY7ZjdtsyAhp2xaKt5\n2p4rRLmRlLR+sgoUg+itpX4mzU1oy6+W5+5CXFIjeYfWNfaVL7OXHAycGxoz\nxkSOaTnI9leY6Js26L88qqkIbO3G0JzyMc07pLLBHQYrxCvIOC2tux9+io59\n4WOeUQYuosWCg8zHSkwjupSZmU8Rcawkg6r/Md+yrKEMR7IPNnMGyBvU7pDr\nXrvuyvjKg/7+U8WaAbGKut0HOW9UjANoLq9flmu3gmtVU3k1yd2wO+/xliLJ\neI+H9/adt5TeXIuw2XCh2kx3l1EKCdMCJJXbAuZ4L69cz6PTe6Q5oSe8OwX9\n/Nar/f2B+/a358t42vgdXHDL7HsqzXyRJFz9UZjv423vYFfRisPDFA2Vm9Gz\nbssUWf9JAD9zJ4Gfrp6Ac+hrT/6n6V/dlf7UFNDqSMhU8io690h7QYDeY16e\naA7U\r\n=H2wZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICd11xwpk7pkrnvtsS06qhkXMmKsHZ+JbLU6pV+JMdwgAiEA6ZolVt7+LUGfnoF0YUJWup9s0SBVO1HcmGKa62qL5lE="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.0.5_1530269552453_0.13956052286791976"},"_hasShrinkwrap":false},"5.1.0-rc.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.1.0-rc.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.0","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.1.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"5aebfabbfaaf60961f780c58b67b0ad9c4154aba","_id":"qoopido.demand@5.1.0-rc.2","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-QQhb8MwU73DLvJ+PoRwrDufc/O0id6tUV5BUbUQOsRJSAfZkT82kiouqfzyXuNXj+QZ7NGcxxHc1szlU3zwScg==","shasum":"4308b022bb101560acc3a752be07628b15bcba54","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.1.0-rc.2.tgz","fileCount":129,"unpackedSize":808652,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvTryCRA9TVsSAnZWagAA4mEQAKO9uAP89vujcAsnrhWi\nOgtvY3fvpjOEZUs1I1j7/cJe7mOXh2aDWud3xio+MzSwTjDUw8nGQ6AndJrp\n42enNkfNcZO6yKzYot9HkAfco0l8ccTBwlN0bPkYG3dJoXv7xA1ooShZzl1x\nNzHqDlUe9ZM5Eqp2bKcrOHzpFHFCdetqveNNajsHZjqVhrhjvHSLgi3Opb6g\nNYVn7m2llmH8ZIHqmoWnsDUREHLyV7TB3Zl6wXW9zBF35WxtCf3neNq7xMWQ\nTj7PqIhomnq5X+rSfRnXgvjk9U/Q3oMFwby0EK/dmoHrpYJVmHqgvMd+ev82\nJqlM4mHhx7Z1RqiFXfGjTQrZiQNtUDRwCllYu0aYZqiB/GakrLaJXSTP44DQ\nlo5PKcasgTnlLWydbwNH+LPWF9z9j0ZaxuoT8o1ci8CZW7cTxUht+2SqpQfu\nkDpFUKloE71MTChLiqKWLrttCGXAeMWtj618rqgQ4jyta5zZUW7O5uijV84P\nN9h/BMwW2VUvtKzLaXtpia0uSq6zMshEIuGoi8XMCeVp9c3YnfKsqQHOJcIV\naCSkb1tgOCUgtivbLjVg/Kwz86svGB1CdWpX6jtf9xLdzs5SLPdCOAarvcOA\n11GDf6i4T7EPaZ555J1wwUcVvBTIF2BA5dJo2V+PD2mT1y16h1TzDUvN7CHa\nTP9V\r\n=0AcU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5YLlLWFcuswKbdHjyWKBWgRHNVrvG30PkjQaMoyxiMgIhAL+3sY1CFQZn7h9EKfA/1ZntxDu5K3Z43mchTqapc2ot"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.1.0-rc.2_1539128050154_0.08565116822771413"},"_hasShrinkwrap":false},"5.1.0-rc.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.1.0-rc.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.0","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.1.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"5aebfabbfaaf60961f780c58b67b0ad9c4154aba","_id":"qoopido.demand@5.1.0-rc.3","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-B7cEbJWoQhMGbMzs5EeclHI7hattuL5h9mV0bIxH7rs8hAYCYkNbmsPVzKuFray1vHhVsx8GONihC1EVaanEXA==","shasum":"5acec1df027da0febc74dfc975e29abe5f0b6997","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.1.0-rc.3.tgz","fileCount":129,"unpackedSize":808823,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvbRvCRA9TVsSAnZWagAAnNkQAKGSnDyree23t+P+mgCR\nyDxQtuEfjO2YHB4tf74Dt7smjXZi1bawvjasJq8YG0B5GOwzBEORHnXGm/eh\nrG+DN6Oucx+THd8D3K4doilWz3oigwJzppIzz3OQobimyzGIE7Dv/N2XieSm\nnzNe3uza75JboQB2SOWx2SG2ZVgkRoUT8i4q9cu/jkNdS/93at33Z36JLIXL\nZw/vmZ6lujh2U1qQbJALlbxZKGZvF9dbxuMJmHpaPWQ73bswGlEDl2bkc65c\ntXhix1RyboIcSVao7EVqF2u3zUjSTmVM0bmf4EC/iabZ+foV7IiZfhvZcg3E\n2kCUpmKaVEu5ccIUczX6H0fW6PojeElkKGcEUzp2CU399+YACANQnz4ERzCA\nyJJMo+FHu2PrkPbTFw96Ey4c0rTqkUOOiVKss1pvte5mAP3HzUzpCmgPUQpJ\nK68LJqKXcgYnc8IZYegYN3/mBDwCYqr9Gner2NOrvHDZy5Vz213rvg+9+2dW\nokx/vbl60QGDHe5RB1JO/hBRdcJEIijzoP66N6vmuGc8OssiilaKS68XPo2+\n2d8hOpiIyVSeqVzlzZFPwv+yM4xCbYUGNlpqHzcz5Eyx7/SQEPkUz9jNWEvc\n74hZf0+uF3es7bXT7xmVjTFPiWu339jdUy/n3swylW8m4e0N2dRzatHQK05h\nvsBS\r\n=fbpO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCBvfBnAN3ToNmFYEUvnME8/qlBii6d4dyZIRlT5AqnvQIgW5McWCZOPeyClJugyNYy8gwYKajwyMbCovKizlJbMxY="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.1.0-rc.3_1539159151150_0.991093770714081"},"_hasShrinkwrap":false},"5.1.0-rc.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.1.0-rc.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.0","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.1.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"5aebfabbfaaf60961f780c58b67b0ad9c4154aba","_id":"qoopido.demand@5.1.0-rc.4","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-YQhy8Gs+KoEv/5OKded957hAqAfSWplHnRyFnudpjrqw3r2AJwpE07ty2lLe5g4aTQpElIej/NBIabAgyAd7dA==","shasum":"c4de17f3c148b22da5fd8b2dd1c2d22caebec651","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.1.0-rc.4.tgz","fileCount":129,"unpackedSize":809000,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvbVaCRA9TVsSAnZWagAA5HAP/2zb1cv8sdIK6R38lAcI\nzZDFBzgG/Tul4SOuS1dzrDAJe5EWYvAyzFloGfptu3dSJE7DuQKRIPidG6Mf\nFp1aUCuQaBN5k/RJ//5IADO5lyYBI4aBh+sgdN3ubnehyaq7tPUi25W3lEJi\n+SwdFxtG1/v7v2pH6vbqKz/bwluEBpSqTb2E+mCvXzGvzcufr+ZanvizdoxX\n4qr+gq4qQQhKuOkczQ8sEnEfZbBo4tqoLYQ2uadcwSVN3HO2ij7+byIKQ5XO\naJrlVZzq9yGgUWgepTMrgCXfjp54ydT8BFh/5cnShoQ0jERQgRUUerH4vvJW\n12eD7XVTZXqkT/KxgxFoGzBxAiI4mHzc5ilrE7rUTKJCd5WFNfX9NcGhKSSW\nWTySkeA4y8e694LMXmYFqMRqk1X8rIf6WrW9wfLRh9t/lDyjoIVtUUkJnqPh\nLyWJAyhT4mdE7YKBaIX/Pne0iXRlnw1iHMWN8+41v0OEBhc0+VSDhNG2/5NJ\nMSozH4KBaP0Q0PmPnbbroYZQypJCmLG3AbmSmmfphQn9h0dMdbD0Elqn+Oqq\n+g4v/r6t/6snAMR1f13GoDmDyYg5jiAdaEvmn0DboO0fpLMvZxFB8nC5SBXb\n1SwDo+3uia3wHY7vkqIzN4TZw2yNjdNJSF5Ev7X9zmu8W5tPJ/w5l6yLQ9Wv\n7Gjr\r\n=zyis\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID1LSiZNIJ/3gGNLl443ABIP4c70a9IEX99O3/3o5SJgAiBJICuhD3HCq/rPqTi5AD055Qc8kgT3Yk8g1Ko4DgJOfQ=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.1.0-rc.4_1539159385931_0.4884629796350404"},"_hasShrinkwrap":false},"5.1.0-rc.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.1.0-rc.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.0","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.1.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"5aebfabbfaaf60961f780c58b67b0ad9c4154aba","_id":"qoopido.demand@5.1.0-rc.5","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-d8wJGxxrsMrTFrOtH3WeQH0D1PK+ZAksMYoR3jqRtC22SpW/Or4G5/JlhzooxNyGdl1hrzrPPaD5igWqAjoPAA==","shasum":"136d00057c89c8a245f1521ad83eabdd82b90106","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.1.0-rc.5.tgz","fileCount":129,"unpackedSize":809071,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvbrjCRA9TVsSAnZWagAAcwIP/2XAFz9n70oFV1UMG3IL\nXgIJZutfzkRpp+6ixRbViPjvuIWpddvS59dcEix3TV3DrbUaLuaeJejbvXoK\n3l/EdZoqgkhIVt3uc09wIpJGE/31MN4Boxk857WdhmF22JmXXi6B4SZXwHYr\nLs89a8QJ4l3hdWH9S5fA1b/FX8HN0abQ51tjvlNd+LbPPTbZSgI7qvvqqoGY\nNUHnDiHDY3mbWghWnovQzUFiG9OH/l18x60CYqnysPZn0fDOCBzjfJntYfzC\n/7b2VYzHxngeTYgjtXeqDWwYr4xPR4KgYdYLY1bL+/0xAEvmY5xlQ6Wd5L5k\nVsG7cJAms5XwD80hm0rKIkK9Ubb4L5KJXGt8vFk52pyQyt8gkVq2gAEH0LU5\nYAoUla5cmI5gx6OeqcHlsWNrS9pTkLu1VlUkyZM8KE/Z65HI1d0t/zxwVmDF\nAzH7EslkZlEfMgx38Bt4Rd8Mx7upjkMiNBkLnXHuwN7/xhuslNMcLtvBxVNu\noyuDcqWOmNspmMqGbTgbmOIMbefFRQMVtAJS0esGcfiUOQUt6xJuCbVnL2QQ\n5pNzQv6AD5763s7HXt3uLj1HKWbweZomIDAr2dFlN/VkHY+xaSUhgHjLuEQR\ny+rxrCAmdHl21ZgY+QCD6zjT9EhjAQCrWWbVsv6esoPpb5DzqBf61z8zlpSw\njaby\r\n=8y5a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDakRJmpJlNtT5FhUJ0wpCSA6Q0pvsMLy+qokaUb6R/JQIgLl+BW4X19yy8JwLEzwWRT+uU/DcUnwr0QN3tLXmjLVY="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.1.0-rc.5_1539160802920_0.21260941149517354"},"_hasShrinkwrap":false},"5.1.0-rc.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.1.0-rc.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.0","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.1.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"5aebfabbfaaf60961f780c58b67b0ad9c4154aba","_id":"qoopido.demand@5.1.0-rc.6","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-Xn+5nfimikZhbtWE4dcBCQ4C+F9uyzoYNXiUE3sQggEwC0rIBYNrO5xY/qSDaLNhO/L9NoastWFnQpUDrMTHUg==","shasum":"8b5924998d939e272a401c1f9ff33ecd039e5895","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.1.0-rc.6.tgz","fileCount":129,"unpackedSize":809111,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvbvdCRA9TVsSAnZWagAAccwQAJ7YxU/15KnoIGMQ7jLe\nW0YIH7YUmouTgwwzbM5gttf7TadQ4bnWvTij7TreoCVj+JV7OnqTWIAV0/Is\nE1B7mD2rxbbK1Tm1Xc5DLinLMA5ZRufc9lQks9eTz9WZXCYOQar4ElEkvxTD\nUpPyZlcviXY5gu+7N3n1+x89vQlTOMImy3EcXU8ZG93TKx7i2veNxfyVVp9E\n1Capv7EmXZaTGzgAlwOxICuscby7/KlNN3eXqSGoGAC87Sy4CghN/PCfQDEl\n1BVNMpbyytLd07Vfd5LCQNpaM/hFwWQoqaLLce6cRWgrnZHoHtfiiYLrqph9\nJ1GyL0SiYFfRoX+/DwZe4hzUtkC1vUEEjQo5JdyCz5Gb/SnH7WHNEyXILjUC\nqvbeGQRAF9E5WaXSnow67HXWKWURTs5ReWvsweUm6t5BwkgfKARIqN/e0BsG\nhR6OqKsCAmcTuOgo/UBDb4CLhBQLUV5/8ga9ZZQ7xMI2FY6DhnkHZnLb124F\ntn9IV5Rl2GfaSJwfptZehDWW/Hb75I2gVtJMDLLLLwy9cmWrdVy8DqjtKxf5\n6cTjFEjKhe9V4X3pdtmm952PyCYlU4E4+t3U5u9G+MWe9GzJZjak7XVEkbbi\n+HiE4FujyG89rtDVyFuahFSDQJKNU4TyQ38Yn10XKz3ICPEA5RFFcIteXdIy\nLXPy\r\n=Enwl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGju6dwlPIidjinG6FbtWiatUp/a1ImiP6uVwZs9qjyeAiA1LbcgYTYwBmg+mOBuGQSH/lELV9AUoIkNjrPJrQEaTQ=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.1.0-rc.6_1539161052501_0.06424938656797297"},"_hasShrinkwrap":false},"5.1.0-rc.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.1.0-rc.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.0","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.1.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"5aebfabbfaaf60961f780c58b67b0ad9c4154aba","_id":"qoopido.demand@5.1.0-rc.7","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-X6LcZokAV6XxjbsCU9blkglbp7r4aLuUkbXZpw0i18jDXH1ah6DpmXx0kUE4eTizhD2MyIsUPOm8vbtG8GbmQA==","shasum":"e7c4d45ffe739581a5142d82bdf480bbf451cd66","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.1.0-rc.7.tgz","fileCount":129,"unpackedSize":808652,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvb0LCRA9TVsSAnZWagAA+jEQAKB1u7CsOGIXOsUxmtoM\nAbnAE4ZuJc9mIW3ggJFQ5EmeQbU5JfEhWPfNe8znZ7hxeCsar4g5nejWJLtS\nJcflpnG+liu6E+J9/euY3IRC3FwvOLyS1FjXDtJ/wdI7PsAHttZq5jUGgUte\n0bv0PW10+GtlBIgLwyT5fRea2gHwOznX7NG/hDetxci/ZBsz+T71UhEDuyWs\nNvYw0sDDxCihy9wlvdxm+lSegPfuyEb4/7hv//XoVq0N5yjzL/Iaqj6LzXG2\naDiXWxII1iivTn9rrx1D5Nl9J58lA84hXauk2TzqXqPSEerkKW0jJfkq57r3\ne2NzmAweTf/DHQeSA24mxVdtVjp7rw8rmzH87YYYqeYX+SmY9TuVpa59DDpS\nFHe8cp2qO8odIC4PfVYzx9qjYyW4DUpMuTzZ+Dryq2Xnd8xNRAaaK3SY1oxj\nYtPaglqlQs3P4HS10Zw2S3+k9hhf+uN7Ez0AbeDO0pGObUZuRndCJJsHd1Tj\ntXB1EI9Hk2iia/z4CDBd49ShMM9yXubPywuA81p/kFeMUcZag8uvLlqvzKkV\nUtUQcVb6pXG54hlHf86fKyRUm8pL4vngwMSKQdEk2UiKP5r12pelYHX1/67z\nRMNw8X5ktrVwk9L7DaivmQ3IKuntWMi0v7KJaOwx9PZ7wpXuHVqCU99JzG7q\nlS7v\r\n=bh6c\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGpPS4SXKpUBTw7BM7CnuR4g61J60f0kX+Qn22k5ZFSwIhALWvPh8CgKglEXobeEqbVe13aDQbvDI8HC6dOYmT66Lo"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.1.0-rc.7_1539161354864_0.446239730645013"},"_hasShrinkwrap":false},"5.1.0-rc.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.1.0-rc.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.0","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.1.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"5aebfabbfaaf60961f780c58b67b0ad9c4154aba","_id":"qoopido.demand@5.1.0-rc.8","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-H1gewARyB/Wm3XFCypVhlgl6RBsJbkQOWxIGFydy6qxJWzP0ibbuAwiWvpow5GOJlQCSeYOuzqC7f3JQzu1xyQ==","shasum":"7b47227fc6755413fc24c26eb55ed78c69ba544d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.1.0-rc.8.tgz","fileCount":129,"unpackedSize":808747,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvfZ/CRA9TVsSAnZWagAAohQP/R9rxg2jZANd/6YBLS/u\nx18icUaFaMxuf6cXIq4SIINAN9Ch/sQuBDmDa24YuzazYjgAhljH28aFD+d3\nEk6//cMnTJmOx96DWHbhak+ULvk5PDzrso6c9BBiVt7ak++9ADi46w1BM4b1\n+DXEdZ9weCvlrLc70w/c64Fs729K2sxPniYWSZkRfkHabecgzlAjY3bXtIug\nihUWrL81s9mybP4DrEW0iYdaLFgjAocOFyW6wup3uJCn1p0JIl2e03LAFMN5\nm92Y0DzQIqdqR0xJZl7p4y02ZCP9FzO9p3pDJ31tHqJH/BrhZaHCNXTAt9I+\nl67auTMC0ul9IHfjnCyntUixgOBLt5aMBhoaNmBwF35HBKcIB+AUHNU+Mqdh\nflARBn16ze+ScGjkYZt9CS5PWNJ5B49DDwRapcSgmJ5kYPoDc6pq9VCFJ/hC\nh4F41noExCkNlSElExkB88yVkV2G6kwFrk7C8FBUBS7XTjrVLAd5NdxF9J2U\nFR844a+Y1jP6OJVoPCeccykFzICR/Fiw7ug9XW/3xkqtwmyW+ASCGV1nw+1f\nXKoUmabd5QXIBjJI9ISTHconKCTzSLptlbaf4Lo9O/cSz0vd27WqFSTQQUJf\nDlE1Ecyfd/aXAohWAEwJdNitnk28Bgb/njdGGbmfEf1rsuxbWr4q3NMuoFZ5\nsyJp\r\n=21Ti\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9/kMxiqrEKXYhcJSkhiVUr0woMiEpg97p2yKZR1QATQIgY9x3IMYM+zIHVNu1QNeWILmWOf6w7YDZHCNrPvnh1hU="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.1.0-rc.8_1539176062547_0.8578020011684708"},"_hasShrinkwrap":false},"5.1.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.1.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"4.0.2","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.3.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.0","gulp-wrap":"0.14.0","require-dir":"1.0.0"},"dependencies":{},"gitHead":"3163b497bb04c3d0ff8ad7df9a497667f1efb6ca","_id":"qoopido.demand@5.1.0","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-KBhwN452rinApBs/e1Ejx556WLhP18iKH/A9zXhewRhGgzwZIDgpGmkR/uIMtPz/f0XsCBHvg+5BMXv3qf2uXw==","shasum":"455ce0a2927dea9bb0b199c96044a006c852ac15","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.1.0.tgz","fileCount":129,"unpackedSize":808622,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvfk4CRA9TVsSAnZWagAAEsAP/iwjtU7h1badcy/FtZxg\nDP6a3EHdcUZDIoqdqXajGBMldxkjJb7JEdi2UkKMUJLOs8sRux5qa5KBMsa0\ncGPZiQY7h7eIwFVzajZZ9SnjtpU59EME5bVvaqjJhfi5LKPoxDTb22qa737q\n72fuuKtG82UrzWBAKmc5biK/eTiYtXtOXEnPnFdOvf0n2mnUglOsx3+W9bk8\nwViKxPLNbtpXx+QLG6CXEfHFb0ybLhqR6flDP9zjldI9wYLmpI3ZEI72QKgo\nk0Lbm7b8NHvnKpCERFueuvCK1y/WRdV9y7y6jE3+H5sVkk4AVWdpHGXbFdP5\nLfjO/QzAJr/C0byje08VYMolwFTzSh6mmc3sgroswe2VRm58gZertZjuluSk\nhe2kK2C2fyDpi8ylwxyl+xIcKt49xwaAnq6dkssT2c19NJ2KchnYHvjhiypq\nvm0bHSDEZnvYRsNquE1udNLl1+f/FY6i2UL/9hrsga486tgzSRkKd1g34yvP\nuDnLLWqoYOLnrtVXKik6W+wt5rHTtPZIWeU0xXrAwizVTYxI4jE5Q8S2cq7H\nVDRNQDxR+Q/k/Ea7JfsOM1czNv9bA/gdus5au3rWnVSCjQs8VluSnIltGmhB\nENvdGympkc93qS79bdhcFv2BoVYrRGGirdaTAaADPZt2sRXVwPUceocjwTsM\nhA9r\r\n=eECe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFj4vtqsQ0jq5Vsnkau4qrqscYhvt1IDz0osePtP6uqgIhAIRiM+DT17T0mGK7j84tTvdjvue68qZrZYNM9e3O+rXZ"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.1.0_1539176760147_0.12967834130589573"},"_hasShrinkwrap":false},"5.1.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.1.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"4.0.2","gulp-header":"2.0.5","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"3.8.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.3.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.0","gulp-wrap":"0.14.0","require-dir":"1.0.0"},"dependencies":{},"gitHead":"97e3c0683d7806a35987199ff94bd4e3c91e2857","_id":"qoopido.demand@5.1.1","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-e2bW5ZgVzNFWtBV1bShXs9ByNk4eJp3wOWYt5Wfeh9/NCuBUFoMMQxTMTjHXWjdLr0+nocs2cc4tgiplRAUyRg==","shasum":"f305a22f934b5a010d15bd7d70c72afd8cb8e2fd","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.1.1.tgz","fileCount":129,"unpackedSize":808364,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvmihCRA9TVsSAnZWagAAJEsP+gMVMI1t3O/JpD4BvNN6\n19wPCiDuzd4dxyXUQGdqEwlbC+NhfXAcVAfH4TUjS9vcRVEuCYJT7ZLlBI/G\na/e9DYkOYk5pj5gYA5INAU5Y3kaYBoenCc3HeiCkfmpSQakALFJxKCI3A0AA\nSCpX2aziZiMfbJ8+E6cB0DU4M+AG58WRiZEpoBDnwt2NQQK1xsobExev4u6E\nDyDOc7mvc7SEH9dh8M6OQ2Dm3GGRZNdCwlTMoE25qeQNEdb7yELa0gbts5uS\n50YoBYfBIfICfDnOmj7jmBd5oSXMdIWZObKTG0FYBATi+WaaHgXWIZFNe2Bk\nKtyCQgf/N+kTIUDu4+0vLs6fb832tBDVX9/uMsSdy2+ClMMiP/2pX2Dbl1bi\nj4f7NBMBmOGc9T83GLayxlXvlD9K8QmFtZMoplPV2mrHOwaWvuPaW9uXDFFL\n/i5W7feq9l9jKmbVzyxuphzC3wr4B8nfJv271XfX0Rga/+CE+ekrJDFLaqtU\nPoHgbqEgiiRm/nQ7M+W+amOkLJQtyj7oiqS5w93HJvlGTdFbl2bjZlawPkK1\nwMSQ6AhQQrB0XFdiNzeuuvFMs5lnjrA9YqSjUC+vRd1KFdOwQRkhwPLorX80\npRbHNFat0lMim4+hYAgqjXQJuf+GHUspVENVZ78h6pRoEFatOQdP3d8N76Ck\n3OoW\r\n=rASl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDrHEPQ4QDbWrecgb/pnrktdUQyAL+sNU1Cx9x7V4x+8gIhANTLqQNU7lF6FLB5KfU9uoncf0Mes7FVLmNF109tK33R"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.1.1_1539205279127_0.5849135133614403"},"_hasShrinkwrap":false},"5.2.0-rc.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.1","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-E6vDfkC6Wt+fLxFUZLDg802kfY0rOAZLAC1yKVnbrjy6hizYegNveXGEpUiuuvJqL1vYUxGGFK+PzECULHtZVA==","shasum":"8e8b32a6935e30b94954fe56210484746341ced8","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.1.tgz","fileCount":128,"unpackedSize":630196,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGq4PCRA9TVsSAnZWagAA5tQP/iclW/r3yEPUxYtzKdgQ\ncYwEfjXufRmR1t8tekRPXeHlv/BrwogIB017es/Cns7pi980u4bIzwWws7kA\nETfBcErJgE9C0WfgKW2zd9n4P04YyAzhSkbMKsCRut+q4k27XDf6kVIrs8A/\n86weSw1/YynvZdb7b6d+GJZfcpR/4ekDUlCE4KBXsBWfgJOmUJS0CGDVAOPO\nXAd74qwqYYfh14LpAzbY12gnk1pYZfzo4W9lLeQRSiiVfiz/WZuyV4LBgV2K\n/zZNCFBeeiOA9AsvYXVyvTiXhYFphV2ixzgaylrRSOfc+o5TMhx42KHWL3Ro\nmJREytkILtDrfspo2CWZ4sXpz3yOxZyPz0TXc7EvmPqnhHYA3zY2AXLK1tTn\nhdbO9HtsbzP9gR/VqxCGedyzNt9qPa7aWyDzHCeVJXbmaPa1aE/jR1dMRX8n\ncWcICILuvMEXhn34lDRtHiBsy5/vEFHlHhAWwMhwSfaCQKEbdaZkncwacdZC\nOcKHiXxsDHzaWDxK8SY85crxH6ZSZ5NRkTncKEp+fQ12XpAOtGxITTSeceOS\ndjRs7qt2RX7/6FwDekClWtO1u1K8eLAeXHyHZnTpS0NoVMOftUAu75TQq1Sl\ntMNQQivKXUSU0WebUoktHwVH2o62r/zGpn2uYQOW/dY7gVrfKTT0SBhhpsKH\nbzcz\r\n=4Kk5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID1Y7ye0plJ7Fzoi2e9W9r5Cmf75/9SmNc4UheP+OFUtAiEAmz3uMR+klF8ne8V4lMjOv/uYyjtiuAQ1A9qFNLLH5MU="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.1_1545252366910_0.32519247850077315"},"_hasShrinkwrap":false},"5.2.0-rc.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.2","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-lTPaFloT38GIkbBL1NCtrzk7oG9r79UOpAEserHexZowkT85+t5ZRt6KKmAImFIox1PQt92c4EudrKd20nqJQA==","shasum":"5c90a2db66f6cda10ccec7a3399d0ee5548d7077","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.2.tgz","fileCount":128,"unpackedSize":630322,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGrE8CRA9TVsSAnZWagAAX6wP/1X1QprzA19sWzK6wTs8\n5WJS3GWfrd8vLMlYuKkQ1y5dgaiiPdALlRsc/uPscfYN4QlIw947USxFwMVN\neJlPcUFA9CdEQeOk08COUpO2sfWKqTHr4GXV3XAnZPKEWElXUKImwWyPTaiR\n6vALSq1At0583/4IZ1bydkpXAWmWRGNtaeMPMk0M5p5U/1McyLDLPav+A7fk\nIJlnY0vHKHSOPsqeblMfxBtlzcCffJSRvcxEClzUCTQUADrW6sS0vGfqI600\nAa2nq0yVeEFQtAplPGgbSxNecK1lJcn73/U1LDkk1z6MJwyxV3Ni6ADeuoxK\ns8EeLeILzVYBk1yjHxvBP6lNz54A75OC378PxSbkNKqjtON6Sf3FUvKwba2l\nweMWlresA1F0s4oK+YQthjCukq0mqf284l1/dDqoj6SvC84DLwEwG4QtXShJ\nRQLO5hiA4bvtHP+iiv0x/A4cMdcVn1XLueW9czumwu/z3cq+UI1VS/NMxdnX\nUu/y4NSvg3yBqCDTAZlWWPKGOSOd2+AzOBRc1uuwfetV/ZhUa/V9j4AYZINz\nuY30i2zg+cQDACjbpCG5FVNT74QHLzdOaSznkqyVM4tFvoSanc9/q2cQT5mT\n7y819f6OFr3n9pwNFwgTKJ0MYT4hiym0Di7CUqKJDTle0bCEsAWKaBwy+2D4\nop1n\r\n=C/CS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmLanfdLg5eN5D5Y45KDbEqH++M+9JF1hMJSEDicjQngIhAKEU2ygrTLFzmNk6ezgpFy9Ii9SyP3or9g10PDoNPnBt"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.2_1545253180112_0.4826482487105972"},"_hasShrinkwrap":false},"5.2.0-rc.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.3","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-vkbt6RJjXFxTROZeaKOnPcoIVkjmwcsCXbOO1OXC306c8iwhIJpu/UjzDhv+ulfztvdldQg7G7tC/c1YSN1/HQ==","shasum":"543d67fd28e5b5f651e3124c675a1c3079571c1a","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.3.tgz","fileCount":128,"unpackedSize":630328,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGrYFCRA9TVsSAnZWagAA2gwP/3XcZ4nU1BUTvn8cZPN7\n2RmoLDcoE3vm4fnnXW/SPJlPVa2PgnqmOrJ5M7MmRyk5zxTADHKsopSVBswb\nSg97wTu8jaPgv1hL7CIHQqxLj+bo75yQvi0RKr3ZODSc2zdbIoAaunjffKqM\ntdEO5c/72VYXoYFsT0+NYBfizDa2ewyS/8IHS/ZhcJwCLVrZgfk3r06BT7l6\n95V+pSYEZh1O0CM66esgpdQG+OgTbp6hjAK8LqNvbeFrOh4KXHtg8TElX7sj\njs/mLuHkMnWYkLq2XlfH6d0RYrkZEZyoTx9ogXzGzoSGu8+wDws/upM2HqSh\nUrIa+JbYS4tlMze/SfxsC9J8ibiRTIV6TLWZi0ZPgX1fLavuAhjodoegBrFe\nmFxFia1pe4WaRbPTnVURHiG0oSKJIyxiwaD0XzRlnZDuPyGCJGdrr48n9LKr\nMJv2Hh6UIeD2Gg6Mu87wZYwhlorvJ3khdYdWm5XZiCHVFAvoP8br5eoCzKA7\nwknuTKa+3hH0X3QlkWSC3PCB/erhgfsypaQRcOl+pK2dVYpgVkoT19xMGDlk\nP/hTkGGSD7Uu48Butiy52lko4rFYszoGYK5wTMkBBahd2TyzuBHmUQiqxGqR\n6y0ofA3VZ15yM3PY+H+Kb0WQMwL48HGvHXBYTptVc/6ragoGQGphno6J1Dzb\nbrmA\r\n=+2MG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1EbnQyw5k7uQa+igPPR4IrF+lOijfDFq2A2t4cj4N2AIhAM31raP5cjxXUp0w2HJ+UjaJqh1Sd9fipdm1VpbJ+nLV"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.3_1545254404484_0.18674450933862063"},"_hasShrinkwrap":false},"5.2.0-rc.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.4","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-oHUyzXazIcp2pBSyPWh7C+IA719w5ZcnTI8ElXnCOpoqNIGuS/6y2FC0G8Xk27MO2s/yCELnXkLoqGAxsbbcVA==","shasum":"429e4db9f670993994456dbc1ffbd0ec26d98500","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.4.tgz","fileCount":128,"unpackedSize":630296,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGrcTCRA9TVsSAnZWagAA70wP/RxEHlua4cPrr5h3UwBk\nwZFLpT1gJR0cjOU3PY+B5IriWQ+GQ6SKH58Ja/IvKjIGRFPpcH6Ehjwp6xPy\nE04lERC3UXAxfOzglZ41NumBYF4gsdw0zdxys58iJZYbreakwFGDNYhI7Rge\njQO+bb7RJoWomPqxY0fk5tf29otxKjiNMpUf8o30pW/++fsBTxkk06LpAZhQ\nvy+Sn36Bjxes0Pr9jggKLjncYKZMwDGlJpXJeuPliF9OswMdWeD+/dO4tz2T\nYSNHIpiq50mku6Lkm7vml3PbJH9urikyTpZNyqa28LcBKrFU0gP6ltgq5Mcq\n9Yy79SvJe4gir3NDtXEJMCL06lcP30MxgtQDi7Pg2I+cQrbkZhMu2zm63Wai\n2rcgzcWg8N/VDrRWaV9KCWfWd/qcwr0KQC9NtV8xaPJXPymg7fGoe1EVrbm9\n10y4Da64EOc8ob4yQGipSYcM7LN8eVPNhI4En/22UyABRHvyimKEQHQYdIaV\nU55mwFsC4Xt3XndOZGmpp+QqQerfBfbS+Y3GV2Wg6fv3d7KhgThZZwM23ciA\n3MV06grvD+IEvvtKttWgrXetjeWzihOifJhSdpuD6D1y4WW+RH76LL14HUtq\nKhZkOBScdZRoeI3PAq1ei/9BdETxyZja22iGCOzQ3SJuJ6/Viv9vBumXMmw2\n6ako\r\n=myT9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDA1B2wnsxzMqjwrOha/MfB9yE4k+soZ4W1Y1ufsPdqNAiANR/mpnxmj7XInZGmtX/w91HLoPU0M416oV/xGSOUmjg=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.4_1545254675189_0.4142524206525344"},"_hasShrinkwrap":false},"5.2.0-rc.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.5","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-KPBt7A8EdcsiLAM+L0GQ6s9tZV27OTUD6f6LRN/OIevn3TY8VbusbJ0SMNr8t08udqkBc+RPd38n8YuXPXe6OQ==","shasum":"11f698a53548c9b3f8d92a3f26a847fa1bb8031a","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.5.tgz","fileCount":128,"unpackedSize":630253,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGrflCRA9TVsSAnZWagAAASAP+gPLtm21UmkiJF3PcJgq\ne8QCBXqg5b/3zdMpC+M8KqZpYVUbE5SDA5Tv6CBiBvLMUyvgzrkqzR/8zBwE\ngeXUYx9Ex8+UG3jwBh+jXPgSzxc/FyIolR76umTHSUIDE9tomE+EvWx2H4bO\nMkvXY8p1kEjnTU67k/EMt71WOfmHXB5bTc4yo3K5OVUogIYBBl/pvoDPZ0Jw\nB4MZ/8wOEH0PYpBUtPA6O+1917oV6o4ptP7PV1HdCge6DYbA799q8Yh9rdxj\nzRjsTBpKW5SFudNcpbrwNm4UdaxvEn/BBsL7eZUQ2jYSXihtICQ+g5zY/Qtp\netnAC4anqxQgmcl2gOJaXwGD/txW91H5k5yLdp53yois5D+oL/NmCNjng/6A\nY5+bA3pIKD5bRnNr/l5A7fITxLyLS8FeF3W4kX7qLblsSLiUhWKZAce39Kn9\nip2jxRzR0T4DcETt2MH1A1WMFgxsocACYDmnfZB16fBKi6WnNSHok8FkS8dJ\nGM9cD1T1V1QT3d6V+yR30dVa8fzIKRA59OhTQAV25G7C0me230F/+4kXF1Ja\nBRYwcEAcCaj5qaEo2tGtVnAyZ/h2a7x9xQz19UySXaeB+pIQ//Xu7useN0eu\nf3E3tZZPh/s3LSXOn+8JIWOoYfAd97GOxDA4g8lkCbPjclG4cM8C7ZyhM9ok\nbmbM\r\n=uRud\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFKfVvkMHXVH1+tS1n729llivj54ioVQbKHmwDMmpCHYAiEA20JBs3q2wIKVxRBM/miT29MVFM1yBvhKOlzfghxsFpk="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.5_1545254885213_0.9846493304182826"},"_hasShrinkwrap":false},"5.2.0-rc.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.6","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-i35IAQetJTq9pihWojeFjU9LPvEXqxcqQkP4ijdlIUAh0KpTmB4/B+B49QY2D6rFWrrANQFb3JU/R1pLLCFJHQ==","shasum":"0c01afebe4056cc64c20a259de0394d4bdab81b6","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.6.tgz","fileCount":128,"unpackedSize":630213,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGri3CRA9TVsSAnZWagAAd2sQAJ2+MOLuRuTnN4yC/7c5\nLJSL7jHR2J3EgihCgMTVM0HDlwge5wFh/3mA+8c0q/6SkJgHJea1HGNiBhO1\n22RDxMuC/unKWL7eWXQ4acHywPpDMOQgIpj8lkya6RxJgAVCxTgA3CgzII0a\nahA6aldU8bLr+NdKj3bneUnzr/6ctraw/pgyEL4p2kV5/fCruKFMv9VBqAud\nw3fm/dReu7lPCgE0qncUCzAilYJlAtjPKzDaW1avD77awPsIjUqpnFX2vD0G\nGsNiADnYQ0ae/dbw1oZx99oZr7ZhA4IuJDSjVcC5Oc+l7fWXwuvGD/k6Imli\n53Qp9Pa9oufID8AxFhOk9+NcVmgdfAa17KO9edosANfqlNq9pB9d1+OdKWMl\noAG4qXFN/ePXSAjIxa4Pnc+5OIU/X00brZmOqMZ+LvX5eRDOVKLAdLj13n8b\nxJZG45yfAqZwqb0qeE/10Et8BaJMLmiCx3S/+NwV0tdopW5CvRRhtuGikcCe\nQSt00iHLuyFI3Xfho3Wwrx/2jcFeu28wxfeZay5p1LOLEGDWXArrj9XXVp6n\njC1HIFbaVvyN98wdfZN3LAiOCc0LoW1zZwKphgh9uyI2LnGupALH+Hd1bePN\nBVPxEy8BeE2OY2+GzHIYd6FoJCEV77LyBdSzOnM+QeNz15WHtaXlnmJVLJTz\nEsaj\r\n=Yaxx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCExdvZAfe7ddhZta56yLAv8EccK/Rq+wXztxzXnCP/EwIhAOuXpvSOfzRZQlo/BEAp3eDpvPOvpwMAa05rlM0V6U3W"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.6_1545255095298_0.13847569786749947"},"_hasShrinkwrap":false},"5.2.0-rc.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.7","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-lZSGc86JePBEUwmOtsTc98jvEvP2dhGXysCGl4azn5B3Z1STwKpzIIftYzZLlWe91oxrCHa4uMKJyOGtjg+QuQ==","shasum":"9e21e13b31629992de0c147b13f363ccbd0782e4","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.7.tgz","fileCount":128,"unpackedSize":630322,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGrvLCRA9TVsSAnZWagAApLwQAIlKnfiYr27d/MHTR7PK\nKJFyINd/ynHUZnelSTP2ZBHuo/WmfanFPOpEyllzY9QEEQmto+Ih6U+U/DhM\nnJ+f0ethnr4MKPq5Kax2gfFkcPaKxOGn5K0nGe1ASyyyq9NXWMrmKYh6w7Q+\nnq8OEjq3xS9d67mr36GTmIDhbl408HGLItG3UfZZTyzYiaiItC8knBsHxgZZ\nJfGXRUlud1idnYzQD9ATy21CQf6Ud3O3C5BoNo0IXLv7zXkZnyU5JNdkeXyf\nZaXh01ygD2MsnQJlNXl0FEEKpIY2++Dp7WYRcv/tnYIVbNFdRKwwBmHI3ppJ\n9S+rY9QUF2R1E26lV+RFhUAhabwOkDG5LWZPS55TGObLLP8ql+ReNxsG9mLp\nlanlO/1jiXzg86TXiee3jtHWNEBslqozxNdPlS1p/kkaHFF4p4sO0gl6XY2o\nhfa5j/ElFXjyjMvVcxKijSNSc74MIZpbVhHE3kOhOzm4pWo8x6dM1aRYh97V\nXYZ0A/0Z0I8C5equRiCaiC1DXtbDqSQZHviKFbDhyD56xAzBPgcVa+tTyDO5\nRoXuhnNmUDRO32Zx7oDxi2poeQz4yFXOCZdPKqUdPEM4pGa7SPZPbJQyBDNj\nCWFRdpsxP/K1P8YCj/HxWjEXjrgoR3VSbMWTU7vsRzgi1TOy6RiPYFPKAxav\nJFe8\r\n=Ysnq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHXckwwiH2RA1oTaeuV3dNpEzmEOrD1H82Ln7fXrzXMyAiEAyKAYCZJRrPqTsMUJ+kU5NR7NNREmniaz+xKxDyho+pk="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.7_1545255882900_0.6258809983897906"},"_hasShrinkwrap":false},"5.2.0-rc.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.8","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-4FcUuaj46awrMlKmMGaF775zXeYv8VdBy5tSINN6fQ9YCOt/dROI5vSshaqGi607mKqp+wRfN+EMMSjASPmv1A==","shasum":"050952baf95222953ee059810460c33b53f70b21","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.8.tgz","fileCount":128,"unpackedSize":630229,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcGrztCRA9TVsSAnZWagAA0GAP/2Jdxvoi4JMhl4CmS4OE\nmhlfjINGwEI4h5tK3znKjYHE02XFDXV+EYTuBWaU7njIPnUZGQfYYD3Tlaob\npjdxdlngsKHUF8kVSfgZSsJICduXnB0IQ11sZs+RqxYOk6cxVrTPHQvHXu9j\nTexZeO1yDtLwGQDOKh9SGDk9hH5fsLw/Fyo9lTlbNYwMAviygjElG797s/7K\n2u8M9K135sa1UUhQb8LZoGB0uKCbBzLTsjImX774N2A2FY8h+qtDd4x08mrl\n0EKv+ywFqBCTOP282s6Hz0gQwNHK8ZMmHqZGlodtL+yZWXMuUud4I7WPeZFw\njaKR6X3mvxER6DIzW22QFeCKIIBPrj/ofO8wEYD4Q3HM2wM0vXs/yEDsQ3Pi\nUInnMgLT+KTFUy4mVZwpw7cCiuz4IgTTb9DAFpNC6im10GOSzQqqa4m3ZTri\nwl3uHr0FbuMcV/JENbutIU85FfUgXJdT8pDFgkab4oPTyee52IdMcfY6Yhs4\ndlwm8vkzhc1BgoJs5jSDRQ248jbOx3UnusjhFUnjb7QA999rpj6YJph81cg9\n4JyFIcD/qUFddtYakk603/W6GW1E+Pp2tuflPXTm1kRQKeCsDTJHX6resYA0\nI5IeP7Oqrl0DeD2if92hP0LqHLjlpmAqjaDvMie7i3OA/mTKD3lM59HqfdJT\n8h8m\r\n=mfCf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBFkGxNcieFf7FXjqpVo73PIbf+rI9aOWwwa4+t6z1igAiEAh4BN/2ftkpDt4VKFm6S8dZQygmGL2FMAcQMO52VfnZ4="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.8_1545256173556_0.9783234141302033"},"_hasShrinkwrap":false},"5.2.0-rc.9":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.9","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.9","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-KzTE8aYiBtUzKTeN8g0Z39uwEeTSmE9w+fA/lc3+nSmQzJpNL4I2HiKIAjyBX9Tx5X2pcjLPr6Rj6wotwEnY0w==","shasum":"b582a6d2344c8e8c06e7dda76b392e593e4e471f","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.9.tgz","fileCount":128,"unpackedSize":630225,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcG0pVCRA9TVsSAnZWagAAE8oP/1q8HjUlfOuxgtnKOeOd\n55+WsRjaxpOak2KmTv5hXbrrLHmeimwnmtwVqexzpsYW34oC8Qxxj789RMwI\n2ClcdEOL9oWgT/cF9NSaD2joY9RkLfct5ab+7yDXaqgKhYCZTi6UYtNyeXB5\nvRnAdfnCo34xhdiPCkHrIjoXySI3FiZo9yiB/+LmKpZL1C4tq9HcMb9TO1qI\n4Auh/iYHOSdaXr84FhCPiNn7trjNpZs5yd1zCA1eFUTonOA2qq3uCbHeLUbr\n4DqiS7neTwHZ/B7hYrl/8IGv6lKxW8GDVCSlV/IIT2qapFf2pWBeZPYE9tIf\nkwKw5VBkdxac35PwnRg8h7h6qyA2/PlFwk/ufO2d1GbdBizr6Sz/qppFbOS2\nMXzE1xmqqJg2AUTHmo60SWQYA1mjjuT+4kLyz0MKraXxV/gQdKe0X5dHC2jP\ndg08b+ZHysUVjz7dM7w3xLL2xE9nllTREJQzZxMpIDKegjfXpeHVtTFbMtjN\nCGlacMiAFSjhTMo0NvEVrLhNvXFZxSGzQFy5XYiHJiphkhRRUE8NrsHBAEoC\nywpoivqmPmR+fioNJgUW34vg01nVAvG5Q7Sg+8Yo1svSyJhUjEsOZHU6zRr1\nSDAMSFm2RMONAhDnKHHi1bf3zlDGfbr+0mteJiOoMqX8m2hx2Bk/GI0rmM1y\nnsDg\r\n=qxCb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICc+M2iQx6GqtJaIlOUlOVHtAcBR4npEkbXsyxEXj8tsAiBSMxXyGZFHqZ604zsjVfpB7gYw5EQJSfA3nMmEKh+hBw=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.9_1545292372588_0.034702147444438225"},"_hasShrinkwrap":false},"5.2.0-rc.10":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.10","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.10","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-O9oaVA4dFHAFmDDt24E7mWYPfKXtB5ygQ7Dkn2K8NC8XgE5RZl3JkXz/mh5ePWCtRPF/i5tTM/znWs4ph/liaw==","shasum":"7691176570f5424ead6bf7e1f0e3e4aa075987e6","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.10.tgz","fileCount":128,"unpackedSize":630177,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcG0x5CRA9TVsSAnZWagAAvD4P/20oyUkLFqCRSXK6nvyV\nN5haxnFxkDcF/GHUmO2ccVGutrj6TfvVvFv/wEQSvtHQLlABohZGq4xWcApg\noswIwVzKVtGsfXtgSD3ILPs/kqn1jYyKjR6KibQeNY3f9FG9F2nl4O0Mr70W\n2kEEYdWt31LKgAlzueHsUn3wM2+uegW38HOxlIYtyRWIcfwywByKVc/2wPKq\nUm3QLBKe2xlwEfnqdi+huOuC/nqodysWeCvA777p56kzEAIJ/I2FuxXnQLFt\ngT9ubrW/XeovtTHKGl4eKlO8MTBT9M79ItYRi3zG6fzrIQkqJuHGtVMMZTLE\nyrUEX/myamT7NIye4jSUv7fQFDysi5oa68e2YdLXuuePdP7e+eICoPeNsktc\nGVG9/Z1bJTax8oA/o25Ju8ot3IF7Wtlz2WzbAMR+buhxkat1AhQPZNP3n0YX\nh1T1cRS2NESOJVoiINGSbBGjlwLk+I1UqVD8vOV4ZT+Xw+b1ldgS36LNOZi+\nvh9vziVZPcGdLyUrmY+pL5CJhuLukoLRpr+1lnkHdpshf5LUPQHH0bOoSGbG\nBz7bhlSUUo9X6kb1WOmcZ6VgwEeKSB1OcaOVvuLBpjGQANYlelJGMOje3P0V\npmAuMxBIJ28cB7FtvPZgJfSStz7/9LYM2l8XoShcOFO9dCbFjpYdSHYJEut0\n754A\r\n=+865\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCHmGyCnPWC/1Yg9XNaPe4UQjGDDj9ElFnH8kAlpdjJAIhAJILlBdJ4SS2X4n/i3wyNqTHDoZ6k8jZkc7c+oQUtNws"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.10_1545292920719_0.9827489156985512"},"_hasShrinkwrap":false},"5.2.0-rc.11":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.11","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.11","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-usX3cpKVKITlWN1k79VyNVy+WyO46hOu9Rk3zXnRd1wkQj1+qN0NWRkPTVufdEcThpp0R856WkL9/jKEphsMRA==","shasum":"c410fdb66be4abf6bad39b6693854dd3f217dbee","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.11.tgz","fileCount":128,"unpackedSize":630127,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcG0zaCRA9TVsSAnZWagAAPoAQAIg9aBkCC75wPLNgLhKt\nqW+09OkFwSqMkiCQ5z692SUzooFPxA6KHsi/m6EfOtGTRZbJIV7/RbvheKLq\n5OkDQrrP2ZUckhb8hX9XNtmrgsLhIcU58rhSkjalVd9zz3RUVGAXlDvchrT+\nu2ysWG6Yr8rYsot7kUph3o9ItwSF0JlfZE8gKWdwauCbJPkX8rODYgeVdvdZ\nnEMTtp5Q7u7E5A1Ncu5LVSdqX465/I23qQcAaCcBKXbISE18hLsq9bvaKbFf\nEKmKRQVvtCtAVvZIWSk+jW0sevW74CdWYh+XcY0ueyGGZigt/6x2IKy5zUQN\n8wo/buQUpe30pGZhaItD0rK5eQOPmm8DeG2/cF+lBUsq0f8IoOzuSkgSlCsQ\nCc2fcylckFWxhko4rWP7HX30C+jISErBSz+u8qv0sNDZnSQKEzGMH2AvlnSB\n84JHF8WVC9Oue+hovB0XVEQ/dNe9YixAK53+4GpaaGjys7A7ePbz1+k7mS/V\nvqBfJuXgSIgFx7FtGwCfVBHPxP3x5H/yHd1TpcwqOhC1AbInd28nSatp740n\n2SWOnxZryj+TmQ0wWBCkM7mxEQtMUPQipg8FaniM+gPvYN9yjt0RQD3no7Bw\nPGuOwKvzo9yf5VgJ3/Xeok25YQB0XoRQA7Mf5cb8a1gdzqy6dxFu6YrS2Ftz\njb4G\r\n=qhjg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE5SnlEpdJOt2UhqmhzKivY6/tgge5KBned/VPkqM+MPAiEAtE4DM37K64qOJiFHD7o30lnw/IBk/NJbir2Vp4Q8v78="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.11_1545293017933_0.5377673226784991"},"_hasShrinkwrap":false},"5.2.0-rc.12":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.12","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.12","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-PAgHTikiViBd0SGU8wPTVvw1OvQEFLVVcoBbzIZukDlXCEXcRUS1ldvjT2dWOyHomXp/VE9gfjwS6kvgz7bLvw==","shasum":"fe7616949e15d6c434ae544e000dab49b7fdc688","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.12.tgz","fileCount":128,"unpackedSize":630343,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcG04iCRA9TVsSAnZWagAAJ7wP/j7tatYHW+adsRx9dA1y\nDK42WAQ2S8RmbsRTTptQ0CCF3j/J3qtxDF9Od39NA9WOQshWt3nEzfuGHrfX\nLx3pExG3aJmjd+aaTqcXPB8bMZsksHJMP+GX1QWz4WaNeg6dDOSw5CLIi/wv\nubYrSLR64SE0tplzGL6br1F6aD7/8WioPIkg+yQ0ROUGC7BN4jEdh+sTorES\nduQTgsDD8rdlMK4XkemDdV3DuSTOiPzHFbLgZICUWyHI9VBOHUrtu6JxNiCY\noDop15BjzAXaB+0xr5Vh8J3KlyzgXjN5/VMbHxpVb8c5JRvX+s0RquyHXnnl\n/0X4ceFmRlYURO5BVi7TSAwf/3SV+tKvHgYuXHMUOXaMnSYt4XFtC85PRtrm\noFkyljUKwUkRVt1HhDtlV1RpDwwg63gB47YPRDbGPCOtDFCsxGGxt3YSfZCB\nk/6MFr+NCvA3FSc6Ny1sBon037GiXyzty5ptsDvWRXiVXr1STfy8xCFqAptI\nN6TxzCGRT+Mc17KgvpKDN2ZNNq4XToPfQii9ohKytdG4v+sQyKBk+X6+3qkg\nzPjATtK7dJdmOBUo1ULsxgcYrvwRGpGGiiRuHC+wBzhcS+mVYCQiGfek3tq4\nzs4b4Wx/o4UdxcuQ0gE1gUh+asUOZPCAaSVf9Z+qXNe/TwH3OxxbjqGJMLja\nfqUP\r\n=+pm8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfD5Pb+1nH9/sgaVb4StOST/fFDZsrV9kbJemKsO32+gIhAPw6Wg2ZWFQGB00a46q1jl0DmCTcSOobZdloiD+HHINa"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.12_1545293345474_0.8079096196011684"},"_hasShrinkwrap":false},"5.2.0-rc.13":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0-rc.13","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"25be336d3ac76ed43fb8bd079484df7b8824dbe3","_id":"qoopido.demand@5.2.0-rc.13","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-Dx1V3aPz+yVcXgwGSkbO25HlT4qaG1tYGMM32FmLZEEzTMphy0Y2dx7RHD9rVTTHTo6cTi3DK+T8cAxgOapN2A==","shasum":"004be8f3ec8dbe0be6a89dfec6862f8dd0b979c8","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0-rc.13.tgz","fileCount":128,"unpackedSize":629917,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcG1AxCRA9TVsSAnZWagAAodEP/0EKCsmcu3mhRjUa66OF\ncfmh4zz6lJSKdnHM7CR+dWZozcWdtUyEE4f3XrLNHdCkSNocWB6vQ9NsCu45\nBqaKSSh+SCs0KKmX1kN6w/U4P8E+mdB5QvFuDKmSLqci0+QLmDblFi4+h6ch\nDvz7sqxrdgTp8M9sQdDv18CR/a8EyMaGDuQux5MP0/AgyRCFshiUupPlaZyl\nsM9aAKZSRbBTd3QMjxE9+vFn5E3RAi05qkeheTUyHtbvu+oiS1S7GrIzsXJb\nVVuH3dGVUmCVdjQOiFkQcuVVXt9Wx9ZmMI4uehORhuwnl5x2U9+gtqD+nXKx\n7/zeBr0diG7C1gOi1nJ4ZBf0XaHnjqaWTVfx90cmEMmqKhqW2nZy6iaj6LiA\nkXM7tbZs1GQkUNCDHGBREdMH5pGltHw0hlbnPDsUi6KUED7wT3w2ZZzlSuRk\n6U1wNNmjObEfS0VW696NqRLXV7PylcLiACjVvMDUvmbjZLn58NUrJGowyGS0\n8DzALDP+J48baf/4QJcpV/tp2J0Lz8NSXEVVVdhDsTOtFI39LMASEMvsOQBw\nX50zMGx1h7Ps+yMyrPh2kZwhBMyv3UcPwYmh9MOlzK5DM0EThkLVxOSwHgwp\n26JySfbCHyLDkbT/338Ba+6BrMTUlgIxh684he/ib/LOX+QVb2AXorj46v68\nmp6a\r\n=cSBY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAaBxSanAH+Wj5/3E3OLcISIkIYl5o8ud2yFM8f7JPXMAiEA6zB2fM+gzCGVIZT3ySkOqATeQgJxJUeQwSHYRbSZYKQ="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0-rc.13_1545293872718_0.4754514631084208"},"_hasShrinkwrap":false},"5.2.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"3.0.0","gulp":"4.0.0","gulp-bump":"3.1.1","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.3.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"2.1.2","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.4","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.1","gulp-wrap":"0.14.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"42d04dea5cfec39dbe0a3ef57b260f3865de9994","_id":"qoopido.demand@5.2.0","_npmVersion":"6.4.1","_nodeVersion":"8.11.4","_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"dist":{"integrity":"sha512-Sbl1krnItGhbjMe9vhXkHkpJPjwU7BBOuFplZdP+Y5J6F2+kRqzrnI8Tiyr2QxTk1hZZ8tY+o1Xa5Yx8k1Bd4Q==","shasum":"154ea07523bf3ce625bf73832795be810a22eb52","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.0.tgz","fileCount":128,"unpackedSize":629954,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcG1WXCRA9TVsSAnZWagAACS4QAI2jtIIG2sQO4ias0LjJ\nxhRrnxYURm6jDT3OpoyeuNyuzPM0i9sHc9flfdeGczM6EKuIIfFkv00dyh0B\nqJ7pL7QV//YsCISjBXc0NyJ1Ul2kCTUrwAQ+9j6UpOtHF2JbOu1JVtNu5833\nsxwYdd8c59JhggyEX4b2ZLjaWwMItlc0hbPnCwfjr6AMwiKjbk+8dRuxBFVK\nnenzjytqI8pExiY5GqTVFLWyuPYQCRURPP/SLiIXRWICCz1YT0SXyAUkx74v\nHQAuAOOHH1a60t+Qn/5G/vSBHAfklvFosKegiV+6WXIqyosbhuWnSt2LeNq6\nZyuiVez3F4qClMFiBbkKuRK0daL5AuNpIOKkxtMdx+DqJnE/Eovz4Ot7+67t\nleB1iKnFiQNpuG8blOLJlpAF6d0pJTtGxEQz+pTuee2lFBYaOrzwwj+tGEy1\njyVthQD5B2Pd2Ks4PRJnj8sHvCR7gCSwbBkSnRuzCTIxkYAp8O2GtOXOOxZC\nLCCgsVFn/mGKMaf1Shi3ef+ZubAkRDAKKJFalUyHlKv82TAvQNnrxSOGQ5hQ\nQC0xa/V0jOPL7IYVFfHxys83hiolQ6nDJuYtbPpW54k1H7w+jU7CyJvtyb58\nHRxjtQgZloZ4YEmCM/YE3PI2wcY5FGcCy+jPG/ltaIpjZ+e2YUIlmSXWeJ5e\nA3Wi\r\n=ym5F\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID74mH++Z0xanFYlAJ7RTMOCT8Xid0yFsZTLkZjKQTtvAiBpnl1BjXM9//YM0fzNXeW99CZoxn8JhpMXty7pOb62GA=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.0_1545295254420_0.9013647635653679"},"_hasShrinkwrap":false},"5.2.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"4.1.1","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.0","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.1.7","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"f95eb5bc1e616c1227cc3850975a9c2e89606d43","_id":"qoopido.demand@5.2.2","_nodeVersion":"10.15.3","_npmVersion":"6.9.0","dist":{"integrity":"sha512-t+OKDka+sP1DjQAaoJVfBLYk9aye8V6TToroiHOc9wa2nUJ6BNkWhyqbbLc3MvNhOR1IjUVvCgyJVWz+qRSm0w==","shasum":"5d5f3bcc304701b45b516f42515a781a399eae9e","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.2.tgz","fileCount":126,"unpackedSize":523067,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2yFeCRA9TVsSAnZWagAA5zgQAIB+is1dXCzKZQqQtxq4\ngmZiETvp8mEHGbLPt/VVuhTF2/CGWFEnmv4h+sE5dmzuTDaD2xJxN6kTQ29G\nE5AVBIM11WhJqTgrPqC6bLJ3ajFB+AEQYDAxl8/QrbTt16nj3Cx6+JCgg+pv\nGCJtEMGIxXo+DZ+rtg+r8b5PRgFxUeMgZnLWdRj2HZvRf+arLktdO2afcMmj\nE45+jan7uVGwJomdW2AvtWZkmpBTqy6F7hK0umux36IJ9xFaFKeBvoTC86PI\nAt8c4NZqN9NPrBaaTwuTHWLJefY+nNGkiF4XDO2WAMdkCXSlfx+tnnsFQ35K\nhil5jhN9Tcf0ojOVHsPGgvKfAf+AEnfQyzPQwCcqHdCrYhUKpuu//WO4vMwW\n6iF5+wfMFABc9kIISfJQoygGJrmNWhhBLe4+6hfhvcSyKj8g5nigVFhqR7Qg\nw9PppJsb/5htMcTsZeivY2cTZ0JF+551MXXVXLBv/x0lzl3LuesKPZWt0GXe\nGr5D2dHF6jVvR2LTq5GL74msvz1B3TKdVGX/n36RlIzIqZct5q833LhKLgqk\n6UlUw/cUpcmwcFaIwumy3j74dnr5q1wqORGYdPdf9qJW0oJJ3jfWvEQ2JLaY\ntq9qK84L5zrFMrpTafGpM6J72iEJHefUGGBND78zeq8UU89RUaHc7kZIybfl\nnt7N\r\n=INwM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDCcglxcKE0odLVva5llTRxdz2DcGh1YG8fOkg7ixl3OwIhAKCuVj0KAczo1jfldUpsgUKG7GxI1WyiMgN4tkPF5SHh"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.2_1557864797060_0.15678804441184124"},"_hasShrinkwrap":false},"5.2.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"4.1.1","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.0","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.1.7","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"f96f382ae22a3ebec22991d8c275f224afbb5118","_id":"qoopido.demand@5.2.3","_nodeVersion":"12.13.0","_npmVersion":"6.12.0","dist":{"integrity":"sha512-NyWMmKig41IN4vL+TJfYZAafnnfLs/sd+dNuPIqXxFkYDJVMGtrpJZqd7smDcWk5XGKsxE1D5dgDjITHEL4ORw==","shasum":"c300be533f7fe243b37a25267591ff5a19126a6e","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.3.tgz","fileCount":126,"unpackedSize":523009,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd08qCCRA9TVsSAnZWagAA0lAP/1hm8ADnsl53V2bwHqy6\nEHzDdRp3aY03u2b0m9zCDY4vmEhtLGXnHU6YlcGserwvfL5WU4lho7T2Og2/\nQxu22JdZJ9tjPoLA793MCQZ89lEtBigPnbCc/QCM4cv1Zrx28wwouzhwixjM\nY+zH6Lpzy2TNazS93ehC3rH0x0sIx5f+fUxiBuBNltpHk1fykGUodf/zIAz7\nNIw9vSYuuZID6lJv5Uwke0A5q7OBK2yhhCkPsIIWbFaQdpracyq0jXRARQ3k\nOaezdNib2qy+bTXzmty/63icESapbLy9qQAh1zOOc8oG0vSx+zofjAsz45RX\nmb2DS2rpcrS3nRymHSaGFN46ZZNUjWQC82nr812ZaInyI8I/Wv5tIE78m5OR\nGu/PfDM/9sKN8Dl4ke4Lhb6N/LZlCe1j45XjsrrPtU5ROZbPjxHV+Qv5+DCS\n6g0/ny4cKuwVtvx5XUqMQRr3Cu7QLr4foWYs9APNwL8t8uDxj+3HNmd7HCpY\nQ9XgbVF1Xl1s8AkO5LnxuZ391wOeWjga1x2NenKq71JKScCMU69yL9AGrw4Z\n1hXeepQmzyHQgHntpSpv2ZlTdCZ6F/TkpzmmTZq8CtmCs2f7ZBvcJZFbyhXQ\netUsWWOhgr3XePCZYi0MAbr/5/mXybXjh3khyW1LQ/PBl8W2ZEh3rewRDzGx\n5r4y\r\n=LGtw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMsP0Dc4mz6kUwVGixbNKrlidSQf4RJ/OEemwkNXPgaQIhAI7F8vRkr+Cvz17jky8A3CGCmhiHrokgc+J7mxRqWXtB"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.3_1574161025469_0.9069459119907961"},"_hasShrinkwrap":false},"5.2.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"4.1.1","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.0","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.1.7","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"31d458b75d0f587d88aad2b352651c589deec15c","_id":"qoopido.demand@5.2.4","_nodeVersion":"12.13.0","_npmVersion":"6.12.0","dist":{"integrity":"sha512-G9tSdH57qm/WLIByRYaZcB8+A9Bwwhh1ScRkUmkERueOISgtO4j0uhSrmxCbmbrVR5HsJTlXU0AdE3V0BfXaQA==","shasum":"254471687d3405a0700e02e42b13ae7f0208a729","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.4.tgz","fileCount":126,"unpackedSize":522986,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd09X9CRA9TVsSAnZWagAAIWYP/1UBHZm9kfLdIlsOcBfp\nf3os9ICrtDztj+OPdUcVVLRcl12p4owklDGfMbK+1RXfyCeguiHYodarcGtu\n50MKx/zPLzNAhin9b4gDTnjIzj2xqKAWdybF/4Ysnjqv214UkyaQt6FZnJo7\nzIZYS3DYkPwbzh5A8u21/O5jp+dLBJ0UUEHEIaTyyQ4rZlE1qHgQZS9jW2Vl\nesc0o7enLfYzag7LM7MXLCstNycB2tb5nvghc//5oRmCxK/mM0SsrnMJR6Cn\nPt9Kgs2Cp1Vl3cyXSV6dODsGVIYjfaBLJK3K2NEUoTcTNxsBSTXnhzDWO9k1\nrAS8QM2j5+RDXV+GwtvE2wnJxNX0x5KRvRMhgsBZ0s4jmFmMYGzcrfRO4sJ+\nb8kcLSnUqfBmz5kDDADcx5K1F1P8BIlcU3K1QtI0CHDSJ+iJtRMrGHQn9WlS\n7LKcOaHPn920EBXtLO5q/1gvcRcvRMKjtXCkacM2GsRpUvQlsJ6SOipn9lFf\nZXW6Aufb7NKDDqXlC9QYA04hqLAYBNjL2noGbg+t3s1DUpl07PS3kWPEEQuO\nlOv36Jo0w+GKmnDHYdR4RSq158Y/0jZyK6Myzh5bR5dTnBY8qjGDoepCOcYP\n1I2QWrMzaCSDw1ax1vvKuW2r1DAtDppRGaxPP1XaRVUKcs854WjI7G7ii2hn\nsBZ9\r\n=2g3/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDgGWfOjlh9bcjoZ4JmeXdaELlHHwS3ynELH/rr2puolAiA8CfNp2uRDdL2i1GcL2ybN4wllr/O7su0sp5snEaK3+g=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.4_1574163964631_0.48346226807057335"},"_hasShrinkwrap":false},"5.2.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"4.1.1","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"2.0.0","gulp-eslint":"5.0.0","gulp-header":"2.0.7","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.0","gulp-livereload":"4.0.1","gulp-load-plugins":"1.5.0","gulp-rename":"1.4.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.1.7","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"1702ec3446ea69ba58fad1979c2683eaac480866","_id":"qoopido.demand@5.2.5","_nodeVersion":"12.13.0","_npmVersion":"6.12.0","dist":{"integrity":"sha512-FtZumWghMxh57GDGBQh7rl2GSGkEackempsSn7tPBUfVYEa9vSCHSSaoZe6OGsYnp01M8oWwU/WLUFn+7ZcM8Q==","shasum":"a99ec852cb91eb5fbfc8bfa1f8f82585d7feae9e","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.5.tgz","fileCount":126,"unpackedSize":522354,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd1nn+CRA9TVsSAnZWagAAaXwP/A9+qflShdRRrsqOP5NT\n3hyMSrTN3QfnZTrSe5rVAt8fKerL3LWvSqOXd9nrLiqah+tkssAUsfXVZYcH\nOxRyBnr4f7Hur8QqEf6+M38Q0vWsE3fZmk6Jpw636IUj96HYgZ02TmA6wFN9\ngEiDqJzZDSRVAndIsUPXhyUDzm2WDPwua0xwxDW/lsDHOpTLtmr6a4+qcBN2\n2zWq3JZInotRmQ+RdctJwYHTJr242NoXTBpnr1eRdXqcnCaKOyUq2lp7fKe5\n415D390I1qEaWXtjNi1QyZuNzQf+zc6iLaj4W1JrKXoU8rF/pIjez1PL+j0m\nPZkqLHUUvvAnyUDYRsQsHIqePFkH/fQ9kp96F7qwz2qDL9LEQPnf4JPgMHoi\nCIrfAhP7BKYJQoNTCkxeeIDH0YFX5Lqfus/ldbFByNtNSOqe8C8lRJI4ZXXn\nMk5HT4xG2b0e1bkLN9/j9q7fS3Vs9f01Tl7AXwu/n+dlih5Ab9vpQhFY6WTo\n7zj7jQoiMd70iZf9nkY25MtcM37/05sYpOxv98CgpZUpNqp/7mUr2Vftmup8\nSV+GSSU5T2hWO7NPJpQYP3kX6idxt8o5q2CUcT/2PHqJW1lPuL1AdcVHPDqo\nNJqg0bve/sUlmK0LLNrMN1wDanWvenwxMbpU4fw25fegrZd/GfJvGdURlyFg\nKL4g\r\n=Wmib\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA9Nr2ck6XJVSNEWWkyx1KW05g9xoS8ySKJ/EtWVSkb3AiEAyufY3lBZv5rTL+csgFVp9cjy/MRk+YbZOWC47OGX4xc="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.5_1574337022246_0.9880971085145513"},"_hasShrinkwrap":false},"5.2.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.2","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"050db20d35e0e00477e20450af0ec67b74486d56","_id":"qoopido.demand@5.2.6","_nodeVersion":"10.18.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-4XyjrxVmn+bHZ+fqCsn5H3jOlfb/0i/fiZ9YakItZg4O4iJGqfJChHzYcjjY93cVR3Yz7vf5F4/X0l0gODCgag==","shasum":"1e0189cfdfff5fb72b13942070d00d628db5a0c2","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.6.tgz","fileCount":126,"unpackedSize":533513,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeVnRBCRA9TVsSAnZWagAAAckP/0dziFF2AJVZCp1gDkZX\nHqC2l1mD2W3dUYTA111pRw4xtCEf2ra7QGilRcFDNY4TxlnvcMzXmPEOQ72R\n1wkQGMLN5LgI/ST348jq94l4HQyAOTQ5rYsE3a7SP26fJHkj7rTnL/M8td85\nt6Twd3c2vtiYCz/YmzdcL4C+IVwLzd4cWwLlqHTvbMTH5//8qY5V8tFZeSgr\n5s2P/XyuQegRZSSNsnRagR6fGRGBf7kSXu4ma3R2cGGoH35Ayyvm7iuaqnT6\nr0Juyz339mMboZZff+k928/iHoWsZgV6rlMkHI6ZZpuRaMVprHuIrJZG3zeX\npVBOEXD3ANXQHdhpl9NEq6XHzTyo7CV4R8rLVRE7vuF53NtgU/DhUvwYdpGk\ncvwhJiPjUare4yD0G6ludn3TLe5E+OYP73YItjHOOZZ3BqSyj18ad3JijUen\nVcpCOJld68Vx6CXtHM9yARGcJgnbhM1YFiJgynbbcJPbOwsTCAv6JsdB/byy\n7Cxf2/shtmKZ26k4dG4MDWJ9Yh3oTeqmtu1lACTmxRd4XtTip1yy9ltJ4a0+\n9p0qDFAUUJr1Q2xNzCA0T5VuE2Jc38Z48Fot8Vkd6W/OIuq9b7FpDTqRJv6i\nL7sxqCJS5kfUKu6bQ4R6G0Zl7POZmfYShVQUkkIjWCCskCZoR4FVvtSTBJTg\ni1UG\r\n=kXRt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYdaLdsnRcl0oWIYSZ3HO8FhK9wV4eM93vZ8XljPh0vQIhAKxve5QRlZvgTdld1tEAFOowmTht9Uj9dfQpOGCr10Mn"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.6_1582724160867_0.2050831434927518"},"_hasShrinkwrap":false},"5.2.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.2","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"4004c032a9daf8b2337eba33013732de10cae282","_id":"qoopido.demand@5.2.7","_nodeVersion":"10.18.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-qUCKdtm3O3nzSfku/JD3lwL2DMJ2R2wxbwAM0KZ+JiR+SdR00de/iH5pGFCOgw101+c029jfH2gSeDLzixOwuw==","shasum":"a8ce536728d4249b1a7ea05361023fa5734cb044","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.7.tgz","fileCount":126,"unpackedSize":533581,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeV8yGCRA9TVsSAnZWagAAO4EQAIkVyfrmRKjyf4vOsADt\nscwvGL1XaZ0tdVFmqIGytfF4jLhTuhucoeC3F7md9tDq6UQ9KCh0QZS16KL/\nC9ma3cB9iI3wFgem5qA6CFKjY3ZY+I/fn+ByZM7ReXWbvz+N/Vhk2vQIaPBZ\n7eTtOy9QnISzSmggaRdAYY6/0rtixsGD4CMFXBogimJkUjbjaNfjhM3FDtMA\nD6s+haD65oICd6yfCAtiiYl/YIjEvL1g+6ix0SuwIOLrjUIlWW8qfM2mLhdN\n5mfLZtJvdHcQqLDHbWNvXdYQJJMioLNL+Ws0s0iMYzC5m7TqbM3NJ9JHtYXI\nlWff3vxeT3rCIMCXAAu+rq0I4ZPSkbzQ0oJ0Zj6ZWo1D0Ceu9woIimajrrNs\nTeGrcI3OYwj8aYYHPVwpcfx5jNebBPMPAd7yTiajJWd/ihnd3cElxIknhQCm\nehvpU/tbheCyofZ8DYybVzgC+pgCx4jALvVUa1uXhiWufvJflI52iAvg1Kxs\nsqNOHOtgsHumIZytDN6JFP5p6JTvTFtKqqairGbTDQCOoZlahQXVEuy4H+GR\n0UjDO4IXN3BerO1NU2sysZAD+yhDvY3EyU79c5g19XNisYFyQtc6OQLSPvPO\nllMp9YZrgR7uUevqKkieYYR8jIZ3QALTtCF1nTYQuZv666S67ek5LHg/k0I5\nhuki\r\n=HRZf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC5Wgy+d7s1KwMCQ71AorTinQy4wKPIAg/zxFFHaABdyAiAIP7PWN7dTrhTN+YKswsv14zzeHSXB5Dg3SRr1mLktNg=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.7_1582812294064_0.6955440102557915"},"_hasShrinkwrap":false},"5.2.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.2","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"855c4d022151c780f1498bb970cf459f654ece30","_id":"qoopido.demand@5.2.8","_nodeVersion":"10.18.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-75hVsn9Zd+2NOop3WUE1K9c/RU1VU0/nqvpG7HLBrczy9VnxZ3xKE/vivROhPXf2GEDaTRq0eS5D9BaKxVEcoQ==","shasum":"b1361c95afcd5613dbc4e27e177c665df07325b0","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.8.tgz","fileCount":126,"unpackedSize":534251,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeWNySCRA9TVsSAnZWagAAH5UP/AkKg+KbO2esRygDyGRe\n8s+IZB7Qg70Q7YPy/EzBiPqZjmkP21aE5+9zAJ43B1fjoqIn32J2YCGClerz\nXw9b07PUVCC2m2KuqRJNjqy0KWIeG74AV1+xET6aPxX6hY/wB05zkWRJ4lWI\nP+loZCBCFl6JdjuUV2wkbXCD6z6TBmeMgssvsoKOUhcfvqOZ0eNX0v84GD38\n+R8OScDWRJs2hNQljAWjlum3eDq/p7Y3eZ9SjcjUtX/BurGzalw+ENym7HYR\nfB2jSa9wcxP+gcpOyhAcFCMCQ3kkk/abdnckjdc44hLlXaHMKb6FWqX/bvtL\n8kAWcZrvi9lKKS1Q/84jvIppQEs4EbBg9n81GpvKma++rdxOZq5nEiDWPu5O\n2+jcGt296qmnyQJfG59VMdqFuwE6eXzkND6B/mnW4OOc+yNxMCAaP37k/RHs\nfH8PvHlZWS6x7DIJeRfbWUwzEz2CmeRwfkifwy5yXXmtwCmYLo4GNLCmXer6\nUt3LnBAuoMo12+/mPC4JKkmCfMyMEaWv+qv43pVfo8JqWzhsUcMtyFq7kyIL\nvNF3IlkDS3JmxkJ109gDHjiAreGkpdZlbM1K25vSuifoVsi4KNRmwhkVHtvP\ndZDAa+hYsvy2Qseh0l6DV8AM2p0Uy5lScDSmTzNECxBmubFRUflVM2boyXOY\ncrVK\r\n=AH0v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3qe2TXZQ0bJexGe+sMmyNY68Unm9r5HW6S6uEHqHePAIgaGJOmqeCrgrFfrkD4xfnwKLaRDaB1RNkILfZ4ExDRvU="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.8_1582881938359_0.1989448374002265"},"_hasShrinkwrap":false},"5.2.9":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.2.9","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.2","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"0b9094f2a1d1213cab059988c7e0b1dd9fe98a50","_id":"qoopido.demand@5.2.9","_nodeVersion":"10.18.1","_npmVersion":"6.14.2","dist":{"integrity":"sha512-1t2kqYWQEDPOdEinwgXcVA6BW8B8IDExHSGr3Ad+iu23mwEqpphgdkH0+80gu3mTjbbUw1C4xL5yW01usohruA==","shasum":"ac17a028b2d017b876dc5a81461bc87422f72a21","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.2.9.tgz","fileCount":126,"unpackedSize":534251,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJecf5nCRA9TVsSAnZWagAAmnwP/1PSkPQpK/RCoq/xRaaK\n9FlER8Z1NCwhuJG4AZGeqjf+mvzk/x8P+GD/t6FrlQfGY3HUz4B2HnZt9hf0\nDp+KwnyCtxkAmlb6BxjKw8W7NuW4T1Ar6xhh2D8DmuZtOSKiPQSlJhk47siu\nQfzzdLa4fUCQv/xRPXM5U0n9yjUltRRmcOv114WuozVHtx6GA33RBrf9hdh4\naGm6e9+hEaYLiIBU59udHKJZ3neCi79rA04DXHEahhSCYrzyeuVs0bunfQ0q\nBgokkVQKg485/Ybtpd0gPiFpLfA9FV7N3SiGoIDiZpZPgcfO4AMKI4k5p46G\n0QpLugmTd25k/NmJ+bx/cn5hP+OXgLnCUn+s881K2o59PAIE90ef5rm7S9TM\nBjQtMNlCDEi5d+xbbicanB48CbKbqFzrmDXdRSjHk0Kj/WWJJXwzoHxIr/nt\n3zLGm9pKY7eijblcEDObYwREmIaVeB9hPjQROfP79AJK5exdOfldMiJX1DNT\n1Wl0BRzf8HDKWSxvD5YoSKXq3H5LHvH/oBmvQyEjcYUfr2a9ioLYP/T/XW8v\nDEvvRy0kdIgeUhUwtC8Cv1Y0l8trGwBpfvYGhxUTNMRi7gXHPQdDS07fC3oZ\nWvGnv4YvzZFxB4gw8WMWSXLuLYp2kFFU1jlEErGObAV61c4dEUYNhK3+gnC3\nyV86\r\n=c8Bx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA1VdC5yEAAqZorpMO1JY30l8qXUcO381pNweN3Ww9KFAiBXlF5cEhtoeNXgaV+vC7E3OrzhFbtF8AV4z0GECb7b+g=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.2.9_1584528999228_0.0886080829616318"},"_hasShrinkwrap":false},"5.3.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"5.3.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.2","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"0b9094f2a1d1213cab059988c7e0b1dd9fe98a50","_id":"qoopido.demand@5.3.0","_nodeVersion":"10.18.1","_npmVersion":"6.14.4","dist":{"integrity":"sha512-uFBjlsSu/uWa7+wU0jyDjsM5DfC1KX2GzRK74z2FpnmOXORPxIlyUJRhDP1uVg3d90x8G2bAGazGWFH6yk/1pQ==","shasum":"60720f62387b39094561dcd442561e9ac5ddfb1d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-5.3.0.tgz","fileCount":126,"unpackedSize":534843,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeg5abCRA9TVsSAnZWagAARHUP/1XAiupuvHk24kyWU7om\norHa2z4AYMjgPKD92O0ecqzxF1PcZ5cVKysDgnFhtvdCcOMAo16srDp0E08E\nWdUWUfBWgx5pkoZUrvPfD9Wwr7x+CIhNsP3NwdZhXhXIyqTnhc2WRif8hT1T\nHhyffBMXCuAv9bnQSlk4kzadLXV1jVGmshY5cQlk3UupFeBfKWskLVR5kXt0\nKQTNoHmSZ5pywCBBJsOLYd7uwVo4JwT9f1u6jpi+t69C5bNgxpRwi2uvri47\nS3GDb2Ahfw4EVrYqVwuahikq7FoFJ7H/ecMgyQD+hGbxcIq0oBNzvh4lnpMQ\nULqPkcaY0wKeIUi/pDbNF76nY2xLFSqjCrSeRNYA+f+Q9KRV+axb8Dxo9dcE\nVj4ZMajjwylZc3TU94eo+hFV2IjP70VPA/3xaztuupWxp1nDjEQvDaI4Q4+Q\ntUbx+bBqxMJfaxGM7J4HkOh8cwu2WRkRn+NyU4naATztRrAbTTzkzVucfQNz\nU61rw4lRzs5uMdw3rC4WIDx2q7SK1aWpBdLaTEflmK7nx8UCgdBdFlgIvnPT\neGq7VWC3UWuyr36YJetai9RtnIH2C6qma7Tiq/0UsZMGs36iZbVrswcxS2mo\nCiQY8e9hwMtsT0jY0dXVHHn9IuYGo7glUgLApAbXBAXLIIX1vouraQ8OY7zi\n3sKr\r\n=Ilei\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvq8qSFgo0Nf5AlSTFrHesgu+XOEOj2NsR1xr1vacQWwIgCBE5aKLYcuyy2pFvPT96HdiKn61xDiwQg3s1wsbGGbk="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_5.3.0_1585682075027_0.7740883783092762"},"_hasShrinkwrap":false},"6.0.0-alpha.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"6.0.0-alpha.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled. \n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR/XDR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\t\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to \n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\t\t\t\t\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\t\t\t\t\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\t\t\t\t\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8, \n\t\t\t\t\n\t// base path from where your relative \n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\t\t\t\t\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle \n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n            \t\t\t\t\t\t\t\t\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n            \t\t\t\t\t\t\t\t\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\t\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n \nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n \n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;) \n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it. \n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\t\t\t\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\t\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n \n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n \nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n \n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules \n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules \n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\t\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"891e4bf874d30e88b87a2fe559b33acbb9b0e219","_id":"qoopido.demand@6.0.0-alpha.1","_nodeVersion":"10.18.1","_npmVersion":"6.14.4","dist":{"integrity":"sha512-ASDjZ2Zp0jMQB8dwsdrrzlXJbYc9fzD+FmimdLUWFSEF577Q6P5hFEC76iYJmeDmyq0QDT/isoT+yshr/maDPw==","shasum":"6f1aa0385d83c20a2617142e58b4f9b7d53ce2f8","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-6.0.0-alpha.1.tgz","fileCount":127,"unpackedSize":541602,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemAFKCRA9TVsSAnZWagAAqDMP/jl3ZxWe5wzW5i5/4Oc6\n5kPOpHFG1E1Zl/bSuW1Ak5PRVmrbIHsr6eEHA6U0hzb48YKqVbiGQXcc0Ac7\naCpZ111O4+y/QuHdJsllouus7pnouHTQbwykRz3khkvK8ARrAe92hWHH+A6i\n3lqYT73+x09248qC7rsi6caZL6nZoNn4ExbEO9xbP2Axo4VL8RfBkPzoRLuN\nnx80shnGcI8UeTHwTTujm6CcznenOtOmbLefmK9ubUmzwGk35rH73RHD9Y/7\nD7B4ckkjquPBy7lGiZrTeXgWrexLiAja/DNPZWSpzW8+chvKJ60ACJ3R9Wp0\nrUbacS6RjvPRYPYAjPBEUXrTkme59y1TX8yAkP6gAe/R1JroOaCv4FQ4KNFF\nyZskynwB8sAsUCoPzUeJbVk0O12WKWE66Zl1mcZ3Ty0HtyRKfr2yC+26Galj\n3yn/5HZfrWDFzijGgENTkXraZDshRDYS1j3FG+vu0z8oRKqEcQuRMBq4Z1O/\nDQzJy4MmAyCp1U/MUVdsop7NwNUag5K4FBWno6Dt9C/FljzvPoXQpenZSQLg\n5KMdLH8Fs+Ly0ds4/Z2TWWhBFvKR8z32Z2tSu2BMhfM7KllptDIhDZR3r0a+\nwsnfWtVJ+OL0j+wIM9EllLj4w1BXCz2K4xb+XMGEP2qdqB4tvQAvla0QTLxN\nkZMd\r\n=Zzah\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHzPVsFGSlquV0t/fec7PWa7lhzLobpQhX6BtyRJp8NmAiBR0pynlRN7tatRypdui5f6gSbUxKwTHXHGyp/xsbh0hA=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_6.0.0-alpha.1_1587020106180_0.03519687093899271"},"_hasShrinkwrap":false},"6.0.0-alpha.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"6.0.0-alpha.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"readme":"# Qoopido.demand\n\n[![GitHub version](https://img.shields.io/github/tag/dlueth/qoopido.demand.svg?style=flat-square&label=github)](https://github.com/dlueth/qoopido.demand)\n[![NPM version](https://img.shields.io/npm/v/qoopido.demand.svg?style=flat-square&label=npm)](https://www.npmjs.com/package/qoopido.demand)\n[![License](https://img.shields.io/npm/l/qoopido.demand.svg?style=flat-square)](https://github.com/dlueth/qoopido.demand)\n[![NPM downloads](https://img.shields.io/npm/dt/qoopido.demand.svg?style=flat-square&label=npm%20downloads)](https://www.npmjs.org/package/qoopido.demand)\n[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/qoopido.demand/badge)](https://www.jsdelivr.com/package/npm/qoopido.demand)\n\nQoopido.demand is a modular, flexible and 100% async JavaScript module loader with a promise like interface that utilizes localStorage as a caching layer. It comes in a rather tiny package of **~7kB minified and gzipped**.\n\nQoopido.demand originated from my daily use of require.js for the initial development of my Qoopido.nucleus library which is strictly atomic by nature, unbundled.\n\n## Key features in detail\n- promise like interface (no native promise support required)\n- localStorage caching for blazingly fast performance\n- dependency resolution for modules\n- automatic cache invalidation by version or lifetime\n- per module/path/subpath setting of cache parameters\n- relative and absolute module path resolution\n- fallback URLs for any dependency\n- support for handling modules, legacy scripts, bundles (concatenated scripts like from [jsdelivr](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)), text, CSS and JSON included\n- plugins for cookie support, lzstring compression and SRI included\n- support for custom handlers & plugins built in\n- optional support for auto-bundles via ```genie``` included\n\n\n## Compatibility\nQoopido.demand is developed for Chrome, Firefox, Safari, Opera and IE9+.\n\nSupport for IE8 has been actively removed in Qoopido.demand 4.0.0 due to the lack of justifiable polyfills for parts of some underlying pattern.\n\nI do test on MacOS Sierra where Qoopido.demand is fully working on Chrome, Firefox, Safari and Opera. IE9, 10, 11 as well as Edge are testet on the official Microsoft VMs via VirtualBox.\n\n## Requirements\nDue to modules getting loaded via XHR a remote server has to have CORS enabled. Be assured that most of the usual CDNs have CORS enabled by default.\n\n## External dependencies\nNone!\n\n## Availability\nQoopido.demand is available on GitHub as well as jsdelivr, npm and bower at the moment.\n\n## Loading demand\nUse the following minified code snippet in a standalone script tag before the closing body tag to include demand:\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,n,t,r,s){r=n.getElementsByTagName(t)[0],s=n.createElement(t),e.demand={url:url,main:main,settings:settings},s.async=1,s.src=url,r.parentNode.insertBefore(s,r)}(window,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\n\nThe snippet is very similar to Google Analytics. The outer function allows you to specify an URL from which to load demand itself as well as a path to the main module and configuration object for demand. The script tag that actually loads Qoopido.demand will be injected with its async attribute set.\n\nAs an alternative to the above snippet Qoopido.demand can now also be loaded with an alternative snippet that uses an iframe. The async method above, while not blocking rendering, seems to delay the onload event at least on some browsers. The iframe method solves this minor annoyance.\n\n```javascript\n(function(url, main, settings) {\n\t!function(e,t,n,o,i,d,a){e.demand={url:url,main:main,settings:settings},o=t.getElementsByTagName(n)[0],i=t.createElement(\"iframe\"),i.src=\"javascript:void(0)\",i.name=\"demand-loader\",i.title=\"\",i.role=\"presentation\",(i.frameElement||i).style.cssText=\"display:none;width:0;height:0;border:0;\",o.parentNode.insertBefore(i,o);try{i=i.contentWindow.document}catch(e){d=t.domain,i.src='javascript:var d=document.open();d.domain=\"'+d+'\";void(0);',i=i.contentWindow.document}i.open()._=function(){d&&(this.domain=d),a=this.createElement(n),a.src=url,this.body.appendChild(a)},i.write('<body onload=\"document._();\" />'),i.close()}(this,document,\"script\");\n}('../dist/demand.js', 'app/main', { base: './', version: '1.0.0', cache: true }));\n```\nRemember to adjust parameters according to the async method.\n\n## Configuration\nThe last parameter of the above code snippet is a configuration object. It just contains ```base``` and ```version``` as these are the properties you will most likely set. There are some more, less frequently used, options that can be either specified here or as part of a ```demand.configure``` call in your ```main``` module (being described in the next section):\n\n```javascript\n{\n\t// enables or disables caching in general (when true/false)\n\t// optional, defaults to \"true\"\n\tcache: true,\n\n\t// fine grained cache control (when object)\n\t// any path or part of a path can be set to true to\n\t// activate caching or false to disable it.\n\t// The longest matching path wins over others.\n\tcache: {\n\t\t'/demand/':     true,\n\t\t'/app/':        true,\n\t\t'/app/nocache': false\n\t},\n\n\t// cache will be validated against version\n\t// optional, defaults to \"undefined\"\n\tversion: '1.0.0',\n\n\t// cache will be validated against lifetime, if > 0\n\t// optional, defaults to \"0\"\n\t// unit: seconds\n\tlifetime: 60,\n\n\t// sets the timeout for XHR requests\n\t// optional, defaults to \"8\" (limited to \"2\" up to \"20\")\n\t// unit: seconds\n\ttimeout: 8,\n\n\t// base path from where your relative\n\t// dependencies get loaded\n\t// optional, defaults to \"/\"\n\tbase: '[path/url to your scripts]',\n\n\t// optional\n\tpattern: {\n\t\t'/nucleus':   ['[path/url to Qoopido.nucleus]', '[fallback path/url to Qoopido.nucleus]'],\n\t\t'/app':       '[path/url to your modules]',\n\t\t// just an example, loading jQuery + bundle\n\t\t// will not work due to the nature of jQuery\n\t\t'/jquery':    '//cdn.jsdelivr.net/jquery/2.1.4/jquery.min',\n\t\t'/jquery+ui': '//cdn.jsdelivr.net/g/jquery@2.1.4,jquery.ui@1.11.4'\n\t},\n\n\t// per module configuration (if applicable)\n\tmodules: {\n\t\t// configure the legacy handler\n\t\t'/demand/handler/legacy': {\n\t\t\t'/jquery': {\n\t\t\t\tprobe: function() { return global.jQuery; }\n\t\t\t},\n\t\t\t'/jquery/ui': {\n\t\t\t\tprobe:        function() { return global.jQuery.ui; },\n\t\t\t\tdependencies: [ 'legacy!/jquery' ]\n\t\t\t},\n\t\t\t'/velocity': {\n\t\t\t\tprobe: function() { return global.Velocity || (global.jQuery && global.jQuery.fn.velocity); }\n\t\t\t},\n\t\t\t'/leaflet': {\n\t\t\t\tprobe: function() { return global.L; }\n\t\t\t}\n\t\t}\n\t\t// configure the bundle handler\n\t\t'/demand/handler/bundle': {\n\t\t\t// declare which modules are included in the bundle\n\t\t\t// order is important\n\t\t\t'/jquery+ui': [ '/jquery', '/jquery/ui' ]\n\t\t},\n\t\t// configure genie plugin\n\t\t'/demand/plugin/genie': {\n\t\t\t// handle creation of auto-bundle URL for Qoopido.nucleus from jsdelivr\n\t\t\t'/nucleus/': function(dependencies) {\n\t\t\t\tvar fragments = [],\n            \t\ti = 0, dependency;\n\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/nucleus\\//, '') + '.js');\n            \t}\n\n            \treturn '//cdn.jsdelivr.net/g/qoopido.nucleus@2.0.1(' + fragments.join('+') + ')';\n            },\n            // handle creation of auto-bundle URL for your modules from your server\n            '/app/': function(dependencies) {\n            \tvar fragments = [],\n            \t\ti = 0, dependency;\n\n            \tfor(; (dependency = dependencies[i]); i++) {\n            \t\tfragments.push(dependency.id.replace(/^\\/js\\//, '') + '.js');\n            \t}\n\n            \treturn '/genie/?module[]=' + fragments.join('&module[]=');\n            }\n\t\t}\n\t}\n```\n\n## Usage\nThe demanded ```main``` module from the above script might look like the following example:\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide) {\n\t\tdemand\n\t\t\t.configure({\n\t\t\t\t// any option from the previous section\n\t\t\t\t// most likely something like:\n\t\t\t\tpattern: {\n\t\t\t\t},\n\t\t\t\tmodules: {\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn true; // just return true if there really is nothing to return\n\t}\n\n\tprovide([ 'demand', 'provide' ], definition);\n}(this));\n```\nQoopido.demand consists of two components ```demand``` and ```provide``` just like require.js ```require``` and ```define```.\n\nOnce demand is loaded anything that is either explicitly requested via ```demand``` or as a dependency of a ```provide``` call will be loaded via XHR as well as modified and injected into the DOM with the help of a ```handler```. The result will be cached in ```localStorage``` (if caching is enabled and localStorage is available) that will get validated against an optional ```version``` and ```lifetime``` set via ```demand.configure``` or the modules path declaration (more on that later).\n\nAs ```main``` itself is also loaded as a module it will get cached in localStorage as well.\n\n\n## Controlling the cache\nIf caching is enabled, localStorage available and its quota not exceeded chances are good you will never have to manually deal with the cache.\n\nBy default demand will invalidate a modules cache under the following conditions:\n\n- module's ```version``` changed\n- module's ```lifetime``` is exceeded\n\nDemand will, in addition, do its best to keep leftover garbage to a minimum. It does so by starting an automatic garbage collection for expired caches on load. In addition it will also clear a specific cache if it gets requested and is found to be invalid for any reason.\n\nWhen localStorage quota is exceeded while trying to cache yet another module Qoopido.demand will load a special module ```/demand/cache/dispose``` and will try to free the required space by clearing existing caches in order of last access time, from oldest to newest.\n\nBeside the automatic cache invalidation demand still offers manual control by registering a ```demand.cache``` object to the global demand function. This object offers the following methods to control the cache:\n\n```javascript\n// only clear a single module's cache\ndemand.cache.clear('[module path]');\n\n// clear all expired caches\ndemand.cache.clear.expired();\n\n// completely clear the cache\ndemand.cache.clear.all();\n```\n\n**Sidenote**\n> Demand does use a prefix for its localStorage keys to prevent conflicts with other scripts. Each cache will consist of two keys, one to store the ```state``` information and one for the actual ```value``` (source) of the module. By separating the two only a very small string will have to get parsed to retrieve the state.\n\n\n## Demanding modules\nAfter your project is set up accordingly you can load further modules like in the following example:\n\n```javascript\ndemand('app/test', '/nucleus/component/iterator')\n\t.then(\n\t\tfunction(appTest, nucleusComponentIterator) {\n\t\t\tconsole.log('=> success', appTest, nucleusComponentIterator);\n\n\t\t\tnew nucleusComponentIterator();\n\t\t},\n\t\tfunction() {\n\t\t\tconsole.log('=> error', arguments);\n\t\t}\n\t);\n```\n\nRelative module paths will be resolved relative to the base path or the path of an eventual parent module (see section **Path resolution**). The resulting path will afterwards get matched against patterns defined via ```demand.configure``` which will finally lead to an absolute URL to fetch the module from.\n\n**Sidenote**\n> The rejection function will be passed **all** rejected dependencies as arguments, not only the first one rejected.\n\nIf no handler is specified it will default to the module handler. If you would like to load e.g. CSS simply prefix your path with ```css!```.\n\nBeside its global configuration Qoopido.demand also allows per module or subpath configuration for general cacheability, versioning and lifetime. All per module settings are optional parts of its path declaration.\n\nYou already learnt that a prefix of ```css!``` tells Qoopido.demand to use the CSS handler for the module. All other possible options are also part of the path declaration, for example\n\n```javascript\ndemand('css@2.0.4#2000!AnyCssModule').then(\n\tfunction() {}\n);\n```\n\nwill tell Qoopido.demand to load your ```AnyCssModule``` via the CSS handler and cache it at version ```2.0.4``` for ```2000``` seconds if cache is enabled either globally or for this specific module via ```demand.configure```. You may, in rare cases, want to force a module to either be cached or not overriding any global configuration which can be done by:\n\n```javascript\ndemand('-css!AnyCssModule').then(\n\tfunction() {}\n);\n```\nPrefixing the module's path with a ```-``` will completely disable any caching for this specific demand call whereas prefixing it with a ```+``` will force it to be cached disregarding any global cache settings.\n\nAs any parameter that is part of the path declaration is optional you gain total control over when and how Qoopido.demand caches your modules!\n\n\n## Auto-bundling with genie\nQoopido.demand's original idea was (and still is) to not need a server-side built-process to pre-compile static bundles but to directly load any module required on demand. This decision really embraces new technologies like HTTP/2 that do not establish a new connection for each single request but instead are able to handle all requests with a single connection.\n\nWhile this is absolutely great HTTP/2 is not 100% supported by servers and clients yet and even if it is, requesting many assets may still slow down your perceived loading experience.\n\nTo handle this Qoopido.demand has a built-in plugin called ```genie``` which can be configured to create auto-bundle requests for all direct dependencies of a module. To give you a more detailed example think about a module depending on ```/nucleus/dom/element```, ```/nucleus/dom/collection``` and ```/nucleus/component/sense```.\n\nIf ```genie``` is enabled for paths prefixed with```/nucleus/``` it will determine if any of the dependencies are already loaded and if there are at least two left for any auto-bundle configured they will get loaded via a single request.\n\nSo if none of the dependencies of the aforementioned example are yet loaded all three will be loaded by a single request.\n\n**Sidenote**\n> CDNs like jsdelivr allow to request bundles already. A very simple PHP script is part of this repository and can be found under ```/genie/index.php``` (adjust the BASE path accordingly). To be able to adopt ```genie``` for any kind of bundle URL it uses a callback function which is explained in the section **Configuration**.\n\n\n## Providing inline modules\nBeside demanding other modules you can as well provide your own, just like in the following example:\n\n```javascript\nfunction definition(appTest, qoopidoBase) {\n\treturn function appMain() {\n\n\t}\n}\n\nprovide('/app/main', [ 'test', '/qoopido/base' ], definition);\n```\n\nThis is an example for an inline module. The ```provide``` call, in this case, consists of three arguments:\n\n- path of the module\n- dependencies of the module\n- definition of the module\n\nWhen dynamically loading modules ```path``` will have to be omitted and gets internally resolved via loading queue handling instead.\n\n\n## Developing loadable modules\nProviding inline modules is only slightly different from building an external, loadable module.\n\nIn addition to inline modules you just need some minimal boilerplate code and an anynymous ```provide``` call without the ```path``` argument like in the following example:\n\n```javascript\n(function() {\n\t'use strict';\n\n\tfunction definition(nucleusBase) {\n\t\treturn function appTest() {\n\n\t\t}\n\t}\n\n\tprovide([ '/nucleus/base' ], definition);\n}());\n```\n\nThis example illustrates a module named ```/app/test``` which we already know as the first dependency of the prior example. As with the inline module the ```definition``` function will receive all dependencies as arguments passed so they are in scope of the actual module.\n\nSee these [gists](https://gist.github.com/search?utf8=%E2%9C%93&q=Qoopido.demand+user%3Adlueth&ref=searchresults) to find some skeletons for frequently used types of modules ;)\n\n\n## Path resolution\nPath definitions in demand are totally flexible. Relative paths as well as absolute paths starting with a single ```/``` will, by default, be resolved against the ```base``` configuration parameter and might get altered afterwards when matching a certain pattern configured.\n\nThere is only one exception to this rule: when providing a module with dependencies these dependencies will always get resolved against the modules own path, if the dependencies path is relative.\n\nAbsolute URLs starting either with a protocol or ```//``` will not get altered at all.\n\nAs always resolving relative paths against ```base``` might not be desired and you would prefer or need a relative resolution demand provides three special dependencies:\n\nWhenever you request ```demand```, ```provide``` or ```path``` as a dependency of a module your modules definition wil get passed a *localized* version of it.\n\n```javascript\n(function(global) {\n\t'use strict';\n\n\tfunction definition(demand, provide, path) {\n\t\treturn function() {\n\t\t\tdemand('dependency').then(\n\t\t\t\tfunction() {}\n\t\t\t);\n\n\t\t\tprovide('module', function module() {\n\t\t\t})\n\t\t};\n\t}\n\n\tprovide([ 'demand', 'provide', 'path' ], definition);\n}(this));\n```\n\nIf you load the above Module from e.g. the directory ```app/``` and name it ```main.js``` it will get passed a localized version of ```demand``` and ```provide``` for the ```app/``` context. So by demanding ```dependency``` you actually demand ```app/dependency``` and by providing ```module``` you really provide ```app/module```.\n\n\n## Available plugins\nBeside the above mentioned handlers ```demand``` offers a variety of plugins with different aims. Currently ```demand``` provides the following loadable plugins:\n\n - Cookie: store module cache states in cookies to exchange cache states with the server\n - LZString: compress/decompress localStorage content to safe space\n - SRI: adds sub-resource-integrity checks when loading modules\n\nPlugins have to be loaded manually by simply demanding them. They can be configured via ```demand.configure``` just like the bundle handler mentioned above. ```cookie``` as well as ```lzstring``` use the same configuration theme while ```sri```works only slightly different:\n\n ```javascript\n(function(global) {\n\t'use strict';\n\n\tdemand.configure({\n\t\tmodules: {\n\t\t\t'/demand/plugin/cookie': {\n\t\t\t\t// enable cookie plugin for modules\n\t\t\t\t// starting with /app/\n\t\t\t\t'/app/': true\n\t\t\t},\n\t\t\t'/demand/plugin/lzstring': {\n\t\t\t\t// enable compression for all modules ...\n\t\t\t\t'': true,\n\t\t\t\t// ... but disable it for modules\n\t\t\t\t// starting with a certain path\n\t\t\t\t'/app/do/not/compress': false\n\t\t\t},\n\t\t\t'/demand/plugin/sri': {\n\t\t\t\t'/nucleus/dom/element': { type: 'SHA-256', hash: 'pWpW0C5u/YafasONDfkNyRBA4ChXTsRMIk2CGi4wPaU=' }\n\t\t\t}\n\t\t}\n\t});\n}(this));\n ```\n\nThe use-cases for ```lzstring``` as well as ```sri``` should be fairly obvious but ```cookie```most likely requires some explanation:\n\nIn some cases you might want to load (e.g.) a CSS resource via ```demand``` (directly from cache) if it has previously been cached and simply inline it server-side if it is not cached already. The ```cookie``` plugin will allow you to exchange cache-states between ```demand```and your server to make this scenario possible.\n\n\n## More about handlers\n```demand``` comes with handlers for ```modules```, ```components```, ```legacy```scripts, ```bundles```, ```text```, ```html```, ```css``` and ```json```. Handlers have four objectives:\n\n- provide an optional function named ```onPreRequest``` that modifies the final URL (e.g. add a file extension like ```.js```) before requesting it via XHR/XDR\n- provide an optional function named ```onPostRequest``` that, if present, handles necessary conversion of the loaded source (e.g. CSS paths that are normally relative to the CSS-file path)\n- provide an optional function named ```onPreProcess```\n- provide an optional ```process``` function that will handle DOM injection and final resolution of a module via an anonymous ```provide``` call\n\nHandlers can, quite similar to require.js, be explicitly set for a certain module by prefixing the module path by ```[handler]!```. The default handler, e.g., is ```module``` which will automatically be used when no other handler is explicitly specified.\n\nI mentioned earlier that demand comes with handlers for modules, legacy JavaScript, bundles, text, CSS and JSON. This is technically not quite correct. As handlers are also modules the only handlers really built-in are ```module``` and ```bundle```. All other handlers are automatically loaded on demand and, as they are modules as well, get cached in localStorage.\n\nHandlers will automatically get loaded from demand's original location. So if you want to have a handler that is not present there you simply set your own pattern to change the URL to wherever you like. The default pattern is ```/demand/handler``` so if you, e.g., want a handler for ```mytype``` loaded from a custom location just create a pattern for ```/demand/handler/mytype``` via ```demand.configure```.\n\nAll handler methods are called with their context set to the module's instance of ```Loader```.\n\n\n## State of modules\nDemand also provides means to get information of the state of modules. Similar to ```clear``` there is a ```list``` method attached to the global (or local) ```demand``` function.\n\n```javascript\n// get a list of all handlers and their modules ...\n\t// ... regardless of state\n\tdemand.list();\n\n\t// ... being currently loaded/resolved\n\tdemand.list.pending();\n\n\t// ... that could not be loaded/resolved\n\tdemand.list.rejected();\n\n\t// .. that where successfully loaded and resolved\n\tdemand.list.resolved();\n```\n\n\n## Removing loaded modules\nIf you need a possibility to remove an already loaded Module and its cache to force a reload (for, e.g., \"hot reloading\") Qoopido.demand provides a built-in ```demand.remove``` method that accepts a module path as argument. The code snippet\n\n```javascript\ndemand.remove('/nucleus/dom/element');\n```\n\nwill remove any loaded version of this module from demand and will also clear the module's cache if it exists so that the next call of ```demand('/nucleus/dom/element')``` will fetch a fresh copy via XHR.\n","readmeFilename":"README.md","gitHead":"891e4bf874d30e88b87a2fe559b33acbb9b0e219","_id":"qoopido.demand@6.0.0-alpha.2","_nodeVersion":"10.18.1","_npmVersion":"6.14.4","dist":{"integrity":"sha512-WHz9hcK6EzO9LTE5IXHx6flA6jj1K1O4xZsNKcQ7rgX+i6tA/C/WO3xwt0rMTXJvCeSLA4cfkvs5SoamsH+yMw==","shasum":"d310f64b011da86f12d47232512cf0559385268a","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-6.0.0-alpha.2.tgz","fileCount":126,"unpackedSize":540002,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemEZJCRA9TVsSAnZWagAAFxoP+wYHnxB3n7mZj/vxlnpU\nKjmRZZZyDlRAlNlxGUMXrYkjhv8fXp0U6x7B1feivMH1a0uw2dA3CmwbQSDF\nDJcBZGCKgbr26/L+kDyKdyWrt3X3KVBkbtmonWTWdji48N1zvNbQKNQmhMYS\npJRbRfgltv19m5xDZbudcdG3uMHPsAWSRdIu/iU6IRlFfbUEAb6cRayQ88Ej\nLUlcCjEyprfWTSmRUmkf1KzYn6NP1G1AdBLBA35XcgaPDYqsPA4cw6KaBJgq\nvjNCvfayYnNT55ILpGeP+q6tgeysoOucy4rnsYsc173eujLlaYEEfCDR0lTG\nEZWbwvB9IfRcwjaKN+b/MlUfszdnGEfXvC+6ULS+bksjdmuLZvmgnGc1MWfc\nU+sEEXtd4hK85f6iVvapTxmLNaEX5Qlz9VujB7KuJw2cZoAYTRpsDfstO/hq\n1IRKdMspb8+7CJLrINsX5VBlrR0G4tDsHh2Hqpw0aF5ZsT2M6+BglTqo6YYa\ng6ZhdQHoNQiKQLIrLQoNDjMieBfvNX7Aru/NXOPUbZ+9sD08B/Jt3amdFEc7\ngwdu9XcpD9ChZnPHsglnqNIN3CFjbSwP+Mwcb10AklYbIKNpUE7O6BN6lQ5X\nqnKM7pBmibRYzdXLy/cZm1GvW9yPDiweOHzZzUl+IwsMHeJohgsYkBBlBiHl\nW/9s\r\n=++hX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEXTCOx8DD/ZgSps24N0LsluWvk1xPkx2UxkqooIiGfcAiAS3Y9GeREGtei44B4mAqMIclTLF568kPoU3FS62Au5Vw=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_6.0.0-alpha.2_1587037769138_0.7661226771711103"},"_hasShrinkwrap":false},"6.0.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"6.0.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"891e4bf874d30e88b87a2fe559b33acbb9b0e219","_id":"qoopido.demand@6.0.0","_nodeVersion":"10.18.1","_npmVersion":"6.14.4","dist":{"integrity":"sha512-4ZRgBqlVbEeXjPRrF4qKSoMN3WmDkWTa6GInbV5N3LMMjjY1g/ThGFFsUfIftggpnPiXuulu5BOFHf9l+rpiNQ==","shasum":"a22e32a88a261bfd88c0366bc22dbaa7940a3e9b","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-6.0.0.tgz","fileCount":126,"unpackedSize":538398,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemPHQCRA9TVsSAnZWagAA7DgP/jWJ3UTQe9sQ8QBMklth\n8InwcY67yIouXJVvcTM9r6rajPIpnHNwwmlb00dJycElrFOoOVP5v1Xmz0yY\nqj5vlZsCNQgnixiXjvw772/LzU5CRlerrgecXeioRaqErl3cIPQNP91bgSU/\nS3JHJx73hVXb2Cqa6m5hsbVLq1ODNT7odhIFD6cXn7tzQrXjxfqijyV3ak9R\nJ+MeXU4boWx3WTz2enyXasj/Gz1HcKoiT5qr+ONYLpYYHQocpemiH2r1mhpK\nEstH4RmMITK0YmVcW19ij/cn81SrxHqZkIhKhZUlXSsfKTnIb8a8/9CpvCGl\n6pYY3FWen9yVeT5aDPuATOZeH3sANlQ1CWJv7Zb36X0HKtyvt4MyFbXIbewM\n/88HC9F4Co9EGWjGF5kK4/0vGm93/fBdX0fNdSaoXg0sVtI34jXHP+VHGCx1\n2YpqYHDTgDaaUXUkl771PxURaUnicO33xXGEuepuWjqDYAmVdAUSMsI2rl9h\nT+IS13g3PuWXf9myYC45o0MKSGPHGxCmLhptUQNvJH37fqxGL5llwbUP5X3T\nRFeSRFLYbLu7mRpkewyEGd5QBcbf6TUc62r3LxsZOIYPsNnUcp4Ckm7tAyHO\nug/XVD4t18nXPi3Veewkixe4rNV1FxTrcnqcSsbk7OUwfokUfpat/A+eSK85\nIYGE\r\n=7qvw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDyuc8/e/Y0RmESMsYHTB7GIyX7DdWkostz4p0XHgYrsAiA6uf5JXmGoC2y3eo2Uq/Sgjk/lJ5RDnGfE7NTsLgReXA=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_6.0.0_1587081679476_0.9066731288719301"},"_hasShrinkwrap":false},"6.0.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"6.0.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"f06a3cb09dba2be146630f1cfb5f2f2eda531995","_id":"qoopido.demand@6.0.1","_nodeVersion":"10.18.1","_npmVersion":"6.14.4","dist":{"integrity":"sha512-O/3zRsAclAE1DfyHxK5KDhsllGbOcN3Eb+jtWwObrNXAV76db30tdn+NMjaVNKqIGqRLLmIFYFVWigIU1TzRDw==","shasum":"ae004f0464765aa236229e48dda4ddfb0d00d750","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-6.0.1.tgz","fileCount":126,"unpackedSize":539063,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenWDSCRA9TVsSAnZWagAA1rAP/A9tTAzIlsQTLqKCE/xk\nNaGZ4eJR7XPejFsuGg7PkhdU3XxbaenpDX5jRpRTTJisWDMGTC1tCEud2VsE\nOaooTUUzy6cHj9eUKyZGuM9t+15SkBw1BB89zJuB4I9DChLgU7sZ5c22SMWT\nLvqlkrXxlpiqu6XTFMCwFAE6dG933nC9ZQ5n3b2eq/tVTNZsYMB2KfIJGAOZ\n9RM1vCkp42n3cGdls4/017cux9HF3LDTScMsvoTKl/yoeghqncYaltvewd7u\nekHtZsJsLyQ6S/6Ig0+tHNo37IvdzOflRz/DZIQi+aOVjS0Wweq1z1pyE1+m\nO6PmBY167osCOkvNLm6eWNXomHMUKJLidWrv45ooQJ5Gnu7bKCzjSLcWjnUC\n5Cy6yF2bjeWUc6Im21wJOJIsXeqQfwWaHd8Q555cN+Hfi4iQMoi3i9RmvJX8\n1FsFU3PSlPQ29mrDbm2OfYzxRRctJmgXLFaS9nSuv67VrNbKAmlpZWzyQCA4\nHvpj+7N98QEZKK5fIgb1iK1pWYJaLecFpLm97nRpRRJbf5+DDOKQSB74b67U\nrYpR3ByQ95UExxGsItgOHJl8kL1Y/HxgARKquSrZpxL+NRLJNKgpS1FfIsn8\nje+rOPRvgmBDIrAFkwQCt0mibV0uJ2Tux1yqHlnVM+D2WTFyzkX6MBKup1p+\n6KEw\r\n=C2BK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFkv7LIfcI5U2MB9ugPzITYf5Nr3Pkklzs0v8padpo4KAiAIqTzHFw/cskmhayGytYPEHCNz/yQYZcyszqvB29+gfw=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_6.0.1_1587372235308_0.6791775495382757"},"_hasShrinkwrap":false},"6.0.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"6.0.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"f06a3cb09dba2be146630f1cfb5f2f2eda531995","_id":"qoopido.demand@6.0.2","_nodeVersion":"10.18.1","_npmVersion":"6.14.4","dist":{"integrity":"sha512-a6g7ylM4c9xwacOg4ZlwX5CHW0Ww6x/M96zg7zuCKIsg6HG79x/Tpnn85upAve+jD5zvBDi+u0Tb5Rxmb3uoXA==","shasum":"38310835c386c47cee47b00536903393b5183ca4","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-6.0.2.tgz","fileCount":126,"unpackedSize":538420,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenakzCRA9TVsSAnZWagAAa0gP+QH+2p/7KfCIwB1vwWp1\nI+Vc/vrFVOZQQLuyV2jctGthpvG/Uyo/iJKXl3+lyWyopXvZV9oMnZoRafd1\nbEcrkQsrIGSkESBmu2U0hZr/B7QI8amJGhwlZGeYnR+dLnYycp39e1xllBHP\nrI9tbpCYmepnpgwmFU7fQNhhGMJPqA4e73Li2hLB9RPBeB9tR76hxLC3eW4r\nKjmeN8my0L3B46IOKcsC3T+2I5wkiN9pZ5Ze7W6/JTypBOhr9f9Zdrnmx0mU\nmhnX/ez0YeGk3GDqcznHXwRrTqmbT0fezYkVn48KHgAJjRfJY4y1oHIVAuyY\nZfek/bZ5ldyRPw9FZcBpQ5fSMW0v3+JXbB7e1jcCJzwgsefdOge5674UM2ep\nENOONI7RcApwoYj+rAwc2U0FM3Yk0galCYYWsWs4vQgiB7KnNE5vH6oDRF3a\nRWpApZ3JgiA2XG7+5UbRrK8dESxIphGu5OkXF/6bBr11Pmg5FgXQJVe22GIN\nP9ItWJhYF9liJ+ODpdLTW445uRNNcNvTqlfrEcRedB+uzyoO1kccYKBdEm40\nfk7MsgBrd4hyxKypHheVaTexlxyIu2Q9XlfdHGLofp6sJfqcCrJaZQ7o7kfo\nZzdPajUJed0o8ni8faVNtJOvZJP6D2ErfMcFcPUXxIiWq1QvfxDdLs/6z8/8\n93cQ\r\n=SrI9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDqsZVjX2/8yjaEOXMaX9j5DV28AKILTyCuwjOMp2OA8AiEAy4EF/frt9CGKB9TR2J0CVzEmYx2R1SZyfF4B0lyFBx8="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_6.0.2_1587390770462_0.7693621380065054"},"_hasShrinkwrap":false},"6.1.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"6.1.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"bba7593417d6f95a919e4feb4ec74048eafb0edb","_id":"qoopido.demand@6.1.0","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-oE1fJa0rjMkc+hmktgs2xuWSIWfnYIeAvdKAj8Si+M/Qmb1T71leEdK/NYk8Ezn92CXhf8VdoPtF9FXV12xJiQ==","shasum":"df52b56076f80d7a2068035f09dbf33133dfe2c7","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-6.1.0.tgz","fileCount":126,"unpackedSize":539093,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeudpCCRA9TVsSAnZWagAASxIP/2lCystzvH6/0Ns0YeH0\nhigGJ7xR1IABSE6Y6aOH1s1vIIoAuaNTZIjttJ/QcIdSC2rqqf+nooP59xfN\n94YodrD8dE/oqinCkNVBR0u/FtNqdxWjIOPJ3TMYQQUZWaNc4bhWq/9YoQZ5\nW3hhoA6jK2ioWVezZ+OQTjT3K3CcOo+edZZuKzD1vr68mJAbppLX0r6zLVSr\nDS82Wo4EahltfuGuu1klJUGfEKBHjcdEkiUCQQfaJys3dekQ9V8agG4NA8+n\npjYMhi4itn4482CsgdSVoTs9aJEnf4NDEiARP6m/0vsoz8I1i9/JXetKixc2\njP2tANkIM6ZZPaOxI7iWGQS5JwgULd2OZ1NcEZfZWX3VXkkQFzjD9gx+FSBM\nxrEzOiD/inDdrlqaPjMkdYiD9UEpaa+o7nZPD7pU1f48Z5XWz4i4rGNyQTLr\nrnot5ZmqCM2+VI4pt1Iu07w+noMIyL8HFqjLrC3+OvZipOJWCHwofvyiGWj6\nSfYpBS33bch9zeVk3hjBcXpAzKG4zL0SnTuCs92dqTaarC4LtdVRyEfSSeSk\n9/7KkkcJosweCFcl0RjgtCZ6DFKAsDsfjODyBLnUr67CkiNhEZntnZ2aqv5q\n6aw1K1GSfWZGcy1AArJMDG+CD8FMKHKKbenA8rmoM07UCDeqD33ZUTLKPanQ\nlRfT\r\n=Jsya\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTDBkv9w4pe/SrPlvVqrHLgBhFGlzA2Hq3rlLR6lKeyQIgD3v9AK+PUH2YMCQLkgy5y5qK20j+kxGjOiNSMdQiaUk="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_6.1.0_1589238337719_0.18824235381023335"},"_hasShrinkwrap":false},"6.1.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"6.1.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"1c5b6926f9402d5ae1985f224e6398b7324e0563","_id":"qoopido.demand@6.1.1","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-YuH0IJ1j4z/10oqsLp0+TRigjx+chiLTG+Se25pNKsoKwFoIS9EaAULGSGCB3jGeRJsKn+73tN1hXgjeFK62Fw==","shasum":"0417ad7f977d80e1a823ead1ee1cbc66e495c3bb","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-6.1.1.tgz","fileCount":126,"unpackedSize":539311,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeuouECRA9TVsSAnZWagAAB9gP/1TBwnOUJZdR24YgbqnF\nwJq9POkjtit24M/Ijp3KLZXBDxy6sgiLn/RqxEfN8CxPZO92iEQKJi62X2Fc\nrm1woPY9EXRcFzRKa0oFcI/TkUaftOrglX/fF+j4Z2QN7eavFP6lSJqhf6PO\nAm3ZFlc0MEwXBxtdNy9sv1UB4gCnu8CmVP7JP/9PwqehYxwTiWqTT9+25LDE\nVjim5Wc9g8ttpPTkjBSj3tF38uP+HUJo8eyBFUfFMjuC0zC7rrSnf8bKEz2U\nDESionvOw7WEuGlPoUxgGkzVO5SEplfecOKD38tVdQCqoV5pmxGkjDUP71iD\nLR0y6pAQudEWQQiHAO/O7KUrfzoD1nUtiyoEmfB1SpLlUFX3Ih6R3g+ftjoR\nBELubioLATuoDOkEMkgOiv4ElYpxes2tgAdsEnOw6FJg14sox8jhTYc4evnR\nUA2o/9FYhZGj47VkLsreF/cqruZ/vsEhxKoh4IxWLdLTwEYEt6gmpkpgpNPJ\n9Tv5Nua+/dowWcRZfas/co045gmooDcXv55cU8J+XW7UDPdLTk5hgDdzdFIk\n9/Ve8YrcKX0MPqM0efw6LKx+ISkyG24LxRyMRJr0wkOd3y1Dihkm0CYsc8EN\nJIh2Rzd0A+StLVvcIUpCPC1U2ezwOuIMn4nNQBMLhm8rOZvlbKzxIUx/pTpC\n7k0f\r\n=Aaee\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFZVeS7n3ly794ix6WVpxLOHC5+CxmqArm3DYvkTKNIGAiArHcUjBVIA/0Ohzp9+ButT/4ceB3zS0xQQS9GherQsLg=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_6.1.1_1589283715545_0.7715693603098186"},"_hasShrinkwrap":false},"6.1.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"6.1.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"f872cf0e177b56539deedce80d6e8fe31ff12915","_id":"qoopido.demand@6.1.2","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-91cDBpbc0kucF1LdCQLqZ21C1n/s2/mBGzGmf+XL4hgtji5gGt3fPWvwnDFhdqY2orJWvFMAhAePHVdmDvdd/g==","shasum":"f16e6c367cd2d737b18155a14775edf48d43e438","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-6.1.2.tgz","fileCount":125,"unpackedSize":538416,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeusjSCRA9TVsSAnZWagAA/uAP/2qRjIU+wFRevmomaQpp\nEAizWbpJdkYBWdqB0ghVQPXkBlqz/ah865kdplxVBKtRU96M2K9PsUeXiOPT\nqsLmhZ1iEWGfcUQiz4cNED5yKZaFo2/Op1s6xJUnvClK0mwk0MwKecqP5RDg\nAF8+LVuIzsax7YWDTTsovufXceLEYOQAPtJqXmb1stOFQHAomZpPLT1czh87\nRsq8O1LbVMldPRxae6lS5Dzv0PGPGfaKkNXjGdGKsQ/1EKlUqAJsRquA2dI2\nS4dG4B/fxUegnZWVqkdnlV9WM+CZRPNyHoolNlIdQTfPdKNeh6H6wystPFdR\nVjOqUoCiZ6Z9OBDUFLZyjhA04LQGu8dk7x8OMQZULnYdhY7mDo3/X/CNr2nf\nhVxWyIX7V5s+wMbCBulOVqeJ5wYt5cgWCRHHlTZhLt3yCNXIISC96daKIzye\nI8cc/j9L5uPdsr4cSLi3pqHVMsuna+Ovu+0er3VaSDqewWWtt+lzMZ+iNTiM\nQqt1f5CoFtebgfU+y/g75Iwo834rUOQ36HAvBiC/Wzkh+lbw0YFL2k18bUBn\nabKKZ7QxqRKnQ/raZsPQfeYeBP49kO7aAnaUfTfuPgwY1tbmzCroent3co4J\nSTLu/fZj9nHwlifcQFZdOjY3AKkQ93wkqK9cnhoSrOfWA1Vz96MlyDrsytnX\nQU02\r\n=SLkm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPPx+Ef4q5Tv8D16mAfDzY7xszGAZ/MEjaCCdhkrqZnAIhAMVHYIPbWIPt6WlDYcxXQEmqM8scSxyq5L1fSieKpy0t"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_6.1.2_1589299409546_0.44025085602518765"},"_hasShrinkwrap":false},"7.0.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"7a1e6b143d007adc02bf9e4b48e111d61eeb4c53","_id":"qoopido.demand@7.0.0","_nodeVersion":"12.17.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-Zoxr54J8uLgXm2CeNbTWnacApInboWz/CFemOZ30Ra+oEOj944l8JyCWMCpPNv7V+K6se1fxxH//51W7mgH5KA==","shasum":"5734926c6cf8b99912c72a5be3bebb9449917f83","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.0.tgz","fileCount":125,"unpackedSize":537957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0W8vCRA9TVsSAnZWagAAzZYP/AqoetSMTnWaCoJI/cKe\nz8VkCHc4XfNsz0sXGGuK+5kWWjofaqKk9sPHtUis2VMtqmFmGG7cPIDLMwKq\nH3QaTUf8ic8JxzvoMIUyDG9wm00MJKYR4NZsK6zyA5jk+7ZLaAmVlqCfmeD3\nIv8G8iV3EnbvMkPep1cJqSw9268BdttURjLJfgym66PpTdQSOkfQHXZ4lptj\ngdVMHult5vwAyvF1YfD2Ln+k6jc2lv5neOznbUq3kO2DE/7MLet2zoUyhplq\nkudMnzH0i9btvWjVw0P6bMdll8IamY6WK+m9h4t9VMqJoYsD/KK8GI8YeD1b\n5xTkrSb18AlaUQVYxRSJx1JRnob8ZXJDQtjwO7jyYh8zYrfYdhOvcrHU+vCF\neXdsIKk4OR/WGx+XyHgLvKAUIF4YsH6kDVlOTsVoKliOjlW+AyloBrnsXwgb\nx/m5C8NDkGF59nAVp0sOxboeHd3J3JEf7eWeebPdZTuNaHle9g1j07ZzVUF7\ne/r3bvYS9wC2ckfDOXAFEMRnFDS+l9sPiGkJHoACvUke6RBqXKUdkgHDpy3F\nBdz0wf1IEeHOxPhFSTghN5aULoomk8IGuy8MZydfgiOHF7u6bt/EDnCB3BJE\npkkncO+xXTlsUcPl6rqRSsoGWollkajhypBozve4CpPytzO3SihSYzfoRgVP\na2T5\r\n=m7Dc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEynGNowcFxGeWcZwP6IzlBrcdKazKPz6TyCn14nL/JrAiAcYmvRVVUB8FvSc+5VUpbbu97xaoO+bKOT2tGzpm8+bQ=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.0_1590783790965_0.751434247600246"},"_hasShrinkwrap":false},"7.0.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"c67fd376ad4a7e510c867fdfa9142db74936a9b8","_id":"qoopido.demand@7.0.1","_nodeVersion":"12.17.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-KgLH4lk26jLAIqSeVVL+7PsmhKnQBdGEf3niN82zIYpMmUOVUiPDu66mk9ekbSVlXCZsw7EaLmjDy6YPKfsv6A==","shasum":"ac16fe75d7b60c0c6e8e826604596ed9c5212016","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.1.tgz","fileCount":125,"unpackedSize":538199,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0XGhCRA9TVsSAnZWagAAf7AP/3NRmrRjQffv1cV8NhNo\nYvbdPMeA1Xx233mYskdzeB9ro36IQVZT48ROxv1xQyEuXgtqhQPYG2OUmZzV\nKT0b+Nkh+K8+iCnSh0HXd7MSoAqYIsSK7c9fWTodD7SZmQcin+xF0tEKuMKA\nyEIcYeegG1INEqdkXAgrOrxANZcqebbz60ZPbP1GMOn2JagKQKTdI11OlLjr\nv3B43z0HEEx1mue+PBEMr8aVA+6Tvnf09nrhnOIGWkavbLUgSRVqfWDr/WmV\nWJEYsgiyudE/Rq77jL2ut48l1/cWfT3uWS29i7IkGOC39DZTj/g5LXJJuqiD\nOa4EJYeQC2EQtEWXAlytNGioQ22t+eQLWBIoozWUk57AnPXiIM8bRpTNWhSN\ntvQfwlv0osD/9Cd86Qf6R1ct2z2muJSbUn8867wr1IyZ5v1ZdC9Jzj3c24o1\nvEPmmlvynGrD3IQ/ggvl2iBb/W7SdY5BRzuudAB80jApE43q3XEXN8l6upeT\ncS845tvgz+hRtjVtrzNjF09xikbYtrUwkjTilFHtA/hpK9i4ZtF+grdTt03I\nIAlE47oRVfDw9go2pJSNq9UVwj6GSLP0xEZqEcKUGsn1qlVqMY/DSb3O8xJU\nnec1oR7Ug5qgx/qZmmgZK5vlgObQa4dFzuD2g+VDfNU/dtsOtFXWu70PeYsB\nGX71\r\n=ifqb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGpkxeExGd668peYlvPgcVTP3apUwbS4OpxUI04Tm/o7AiEA8vtykY7MiLGqX4kNCUVJA8Vzg0YZxJDVFESZBWNXlNs="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.1_1590784417004_0.7225815278442946"},"_hasShrinkwrap":false},"7.0.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"c67fd376ad4a7e510c867fdfa9142db74936a9b8","_id":"qoopido.demand@7.0.2","_nodeVersion":"12.17.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-oAZ70JFJp+XPmIH2l2dq+d4ZrZ5Oe18k2pZwpJj/7D4Yf3oE0P/zOjLulAwIYF7eWgu1Rwf2+fG73luX1kUphw==","shasum":"7a199696d46029e393f7429478222872241ee3ff","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.2.tgz","fileCount":125,"unpackedSize":538247,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0vEvCRA9TVsSAnZWagAAuEEQAIsBiPhyP7uQrgL+zTMR\nRSHIiq0XmBr8XGDyN19CQ0dFoAywYEK+6xOS62tPN9cig6eELkweWlkbX3lj\niPUcAyx6mDXMqpg1tpDMzGpQ3ELDOSaejwWkZcXOCBe1dJnMuouDbr8nT/gQ\nIdmKFDrYgZhfxPhV2a+R4i1LR/1YA5ttd6xmwBT8x3mWUNbUVcXA7ilyzLeA\nQZURlYTXNIw8QEISHR9geH4toO2svcMCizPKkOVlbIILSXnOsIrFH0ljdIVh\nJ29RpCw4GFSH3qgZ5qGLj7Tt6vMjd3OAziV7CsAxbjz4rm2PUqGh2AZNqFkB\n9uFKWKRqnETxZ06O99fYSbCgcUIsQqGrsD5qnXJsUjeQriNeftXc54i/sZnW\nDrGy5ttTLilqrnZ/PMI78Urt3x5v3vq+QQfbnJ3wlJtK1CEUqerUJzuhSPxx\nMCgZ13F2QnH3AGKsIgfn3AttFbe0PLfJNLgeuNv0NmEcSVUAI9VJrJ0tFMuu\nk6/RFHXFG/6yreKZs9rl3BW49IvwZFrihZBbs5Z6rBGY3dpS0wspuIn4jkyW\nSW1eD7dfcEmqhzvT/UE5GPtvefMqFiRuGllI2dlgbmMjvIaSCj9+eK6qpc19\nvcnMWTsibbcMhaWlnlYJEhVfFT9lu1xylTf3TkxS+WDqgXjSuWily7VpyE5l\n0TCi\r\n=0cdD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC8zEUz+qlsVYy+BCnyZVBPOgQ/E3jKx/OLJWp8e8FQ2gIhAOKNB2RVBShV1ze7Cwur7NGlwnBjfCJrHBj+8Qek/I5x"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.2_1590882606513_0.2953253387743213"},"_hasShrinkwrap":false},"7.0.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"fe800c420171ed3bc6727e68fac5783036af1040","_id":"qoopido.demand@7.0.3","_nodeVersion":"12.18.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-YU7DX/1lKGqz7NGoRPV9iK55YLfrOoooYiXsqjXhMIFj9C7O+Nydf5dbC4zdiqlVy7A9kgDGcsM6ge7TI2xr0g==","shasum":"0974993cf71f9ddc19d8ff40d18ce55716ba7aca","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.3.tgz","fileCount":125,"unpackedSize":538487,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2PivCRA9TVsSAnZWagAALCsP/0l5oz3Xba8/lVSmmXdQ\n69f0P8lrmqykn3qLABwP0CPrFJGLjGREoJNS8YGMhzv+AhEFU/XANmRtFV2P\n4LRBebMrhhHkjh/otGwnm1CYcjZxaAwLlLZTCeRZ0DbAl13C0vQJq56rLabh\nk+UkLB8pSsyVpFwWmy1lo1IBC7RJ3NLbmOFsug8FwujB88z5HLJvqy6gq3II\ngOukAMk5QtPFm0HAJu3LsvgG4yTqZ8IE4E1Q7pQ+EkzBfnqf0UfwgNK3T+2g\nyrZ8tZfNAedOz7jPWTykIcINw8esBMgTiXF6t6ErltGzntcx196ap+U8iNgj\ns4TkInc//fxQTqg2qgExahJZRFDIpmB1eAyJpKGDHPVbFcb9gLgaWpkpWdng\nuwYyWurN6ygGuaF2TL3EshMY2DtEe7PUzj678XL1Cotp5C80WxpdtbEU8+Rr\na4Sg+AztjD1DsCAFSEBk671bCt8Pn4Qlwie2W/d1nWzjGGNh09TIKcGb46BZ\nJP/zSvdi6tg6mYP5AcGbqMADwr8Jssmywx+xpgCyZWv1T9/suai9h/B7S/Js\ncLSUIibIJyyf4f12KJQWmxmjtR6WGYkzHfChX9aFPRlzRt5cTKKN6TU+6tn3\n8L9E5kbV5dWy0QM7JRL+rVN8OYixuyphidfDUhrmgMODjsz4kXvm4ftUGcjy\nRWtU\r\n=2ijL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCBSwyHokOhaIafT8wYohNYQ9z4Jm7XsMYeq6pduSSd8AIgekQTfiUoLZnlwhOmJeEyBegOPqr33JmwSHvVjFBiOAU="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.3_1591277743158_0.7866957472729308"},"_hasShrinkwrap":false},"7.0.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"b4677b324b233b946717f86c964ee97efd997f90","_id":"qoopido.demand@7.0.4","_nodeVersion":"12.18.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-q5EVe5qGTxYlacKvyn9qd8y3D4wQt0oFaUmvECSh0PMn1stWNdsMPaTp40nHv9Oo949A8nE6vub20De/u0rPeA==","shasum":"d374b0b662e056f0df68c4b8f750e4f28b7bfc9c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.4.tgz","fileCount":125,"unpackedSize":537817,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2pgUCRA9TVsSAnZWagAA1KsP/3JMiP+C1sdFgyvP4bZW\n0fytZcd5/2r6OXEw4V0REwZLTHQnklqq3SKXsd7pYZw8Mmge/FWstwCNyZRa\neZbwuLk0AkLJhp+vKJwpZQWyh9TNnknAPokiUB89ZGd/IA1R4Ek670vooZGP\n/J25uH5dPauhuaa0CxkqpbENEATCgTj4tR5hwuMpm+y62tEvXKEPmiPMNV8N\nQNdRHfh/X8FcMcAvFkl4IBhbuIr65VSDHfHypgE07sac+83EH2fI+qwyeoNU\nXlJd8S2iqrRmDXN0XEOMUYS27+e69TjRSQ8j8+C/QSQPg/Fh42/TMieLaeqn\nv718WOXLtFW3rmXwsfU5kE46cgLlvyRpxNmmsbDxYflbAcUH65R+lrEe6Fbf\nSF10UdFGjZJGMa13nqoETwKlnngObNrNKfJ1QzKZF+j5EFaCL4FdRmDJ1SE0\nHsCRb08zS+OB/dc/yOP6Kkdu35q3KZEsqCjFUqLkUjcZg1PKoWOQnkOCKp4Q\nua+63uFWgFI6e6KKxCbdJI1p9UeoiH/0TyP/8uv/tjRIbu4uhogxzqY4Hwd4\n4lz7+at2jbfNjZ/Jc8fDnO0WLT9ikkluq+9WHcXLGUqZe/p7MqFGKCveVFtQ\nhRaO77Xtc6ykl0yf9JXVJ/kh1uYm8ywEE35qO5RodIJG/tsgAq6yAAl+gjre\nB6M9\r\n=QH7J\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICjKAHAG2H7W3pZsAuqbtLwpgXiEP+RKGtWtAu4A6R9nAiARU7zw8cQyP9uCLhowk0Dc1e2pHW6Df6Ypwocx6eCcPg=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.4_1591384083611_0.5560978116991933"},"_hasShrinkwrap":false},"7.0.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"a98f9d943ad74e2dc8a8350c74df9dfbcd8a5821","_id":"qoopido.demand@7.0.5","_nodeVersion":"12.18.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-+LNH39OJHOZuAXfkH75V4icbJdXiK3xoS6/5yh3Yna4eVCgAJSWDUukMFepZxC6WpZfEEwu07+DgYOmkj9eYPw==","shasum":"c66ca23a5a217cf232cabe1b25208b9352d16e94","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.5.tgz","fileCount":125,"unpackedSize":537885,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4IuaCRA9TVsSAnZWagAA0pQP/2KoZxOUcUmP3ckQTMsa\n/4LVLeHXcWQIqnX8R9/EzyHeBq9aZ+W/nXfhvqAg8Vjy+6TazZ+g1ZDqgWWy\ntTngNKqMy/SpSbMQQaFVKohVe8LAIk6lwaK3ZNoharpn3LVaOU0OfRUny+gI\njhGWK9jKPiTkTzBtxYXWaURim+nGzXQueQmIazwr0l3gU7wh/i+bxDGG7r1d\n6op1G0gQZ5I/cGdRuL32JG9H5PxHOqXFRD739lHsr5PRqJCiQ8/eoBPKjFab\nOHbg0F9wlWf/uWak4sOD0BOpYwomlJLhYdB+geekljFSJ60QEp9n2VU+G3qF\nZNPdSgo/PsZnbyTCKlTPNMdAcwdNw+L1/u/OcjdsmOJR0PZtBJffush7T2jj\ny28Iz9w9lPheh2X8TlBm561m7Ep5dtehU95Wx/XizwOBbuHWPdI5h4BWniO9\n67S9Sx3z0jriPTbTwB8EMAyUspXOG8A2N6T58iCS1DKyGbUmdikF7cLBFQIA\nm+MuyCLZyEdyUJvp9h12Nb7lfI2ivIvS6bEbRw0c8kX4NqKK6hgC8ENiVGVN\ncO8x4Q9kvN9o9SgnEE8t6xAJS8LT37sLEvo4VnYTWgXsz5tZ4sJxq5b8cCpP\naFgwQkBbyzaOdvkeuQuN3a3RmIXtDLJ1ZvssQ2uRYNl/L2+IUOrqI3Llug0v\n4bT1\r\n=JgLl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdRjcwjjBsu6Wkiajynip+KRXzuBijvXZ03Ws4OJVp1QIhAORaeLfp1QAGlK9J8MKrTjtZUkntDJ81vM8YiqLRH8Xu"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.5_1591774106226_0.8818766191775229"},"_hasShrinkwrap":false},"7.0.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.1.3","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.2.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"a98f9d943ad74e2dc8a8350c74df9dfbcd8a5821","_id":"qoopido.demand@7.0.6","_nodeVersion":"12.18.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-0mLnxH5MHZgTTtACLZmgtZ1XTH42C9IiYhVgocxMPHPuFmV6fLW9qfQ+/Rg/EseWny4Nqj6AG485FzVRC31Riw==","shasum":"5394e2b13329553eca302adfbc09941b0aba4f44","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.6.tgz","fileCount":125,"unpackedSize":537996,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe44hKCRA9TVsSAnZWagAAerIP/14LjtgRXMyKXKYQXSS0\n1aAg3MBPN5kX87EziIcp1oM09kbe+bjj3WeUJTTxtJglBznOmxwUl3s4y+j1\nra0eY7d3xOkH7DSz6Jl5ZuKMu8rCaprK+S4+T6Qm92f8w4UDvjf/cV7Mq4Vw\nOreQtVbgvVeSUUQvJLO8C/JfbdAA1IaUruCItKZFlh6KFgFBxI6gqTT/20cv\nwZI/0qGi0WaY/pPo8JNOGHQ7KBlK5cK/qjUgK9YMkNDvU6cxzO93Amkoy3oj\nUXERjxWW/vEyHyWloy2yYU7T45RYz260XXrgaKiD0w53qqj3ydkJiK/Kf/oR\nD1snfTd1Foy3O5HTbB18xy7rzNZVY1oauRaxOr2hjn5j6aAwPbKsecdMn5Sr\nb83A7romyVa3Vrx0t4ZAHQYoZqg3+98GSaGoyBoptu+ZF9+rknRoEDwT/9t/\nSfSQQxvWnjVlCy7sdH1F5kYp2Qo2JjPs90nThTF1XftdrFLsi5jHEzCa7wyv\nEa2DpcxA0xbqBOaiC1DltVlJMjntFcb5rtZOlrZJdxxYkdU6RKSV1U4gxvOV\nZ5004jlZlBzP/XIYy3AD6afrX+Kp4ku/+N2EmxrpdfcIY6r3yEM/l6RvItB7\nqTCFYcObfGdWwW66NjXs9LjUqGqAloEEgCIfz4h+MPEESqxGpt6Qtcz/1Q73\nzsSJ\r\n=afcl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHm22FTY6tjl7dKY9oMPMec1tfWj0YC9nsREXyhBkrP6AiEA592ZuM8PfPzEkoFre159wavf6wKpMqdo4sqQpuhGhwQ="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.6_1591969865205_0.9858321754379258"},"_hasShrinkwrap":false},"7.0.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.3.2","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"49c99c94a73934254c5037464974354f730ecf06","_id":"qoopido.demand@7.0.7","_nodeVersion":"12.18.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-mA/2Efd9ZXctXnO8+IFXtHKExdaq8UtQvGnDyDVwEuCvHwRunaGt/vxhy9/rl7CIulBUVOue4YQRJFrum2Id3A==","shasum":"f0a00e668594cca1cfe6d69c8919c6a5d7e0e83c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.7.tgz","fileCount":125,"unpackedSize":537996,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfKoRkCRA9TVsSAnZWagAA1AcP/09KsTXV4CGp6vP5nmvX\nXhBheUUp8Fw88kfwD/Q9IqMtI08+TwvcSIFMHS3RsF0ZbGzL1yrUOQ+B91+k\n0Nr4Z4A47KA5296MSw14aTp71oyY3et88cxmWfL1dBuq1U2nn56VYbZOCta7\nkoV3lT3axVnaRdY2aKgAwwW00DUH6piK8zxG+S1rrL6DmzS6FGAyMxv3lNf9\nOcG4ExBaxu+DzziF3rLDYk+2vtsOFAlOuqgYkigSQ74QSNVudNaJ8EInnyDa\nxEqg+tZ4wB9vmUeh2NkUTHkamqFc+78fKycCtUOndDy3yami/IXisYIcqKUq\nwJ+1P4NpK1I4NYspPklu3uE2+JPTUg23d6WCsNUhTHOmo871oUVpEmYtHh6+\nFZD2xqRr7ytRmDixpaCjVNfGUBet3VVkUgL2zuACNS4VbxsluXU+OTnhx3P+\nGasIcHvufeOlnOOr0bdp5kJq+FaDibiRkXZ/0Tr1ixgHO2MpxqN0hLW3esgm\nbPEnDpXiXZTQZfZ6e5emIbOcXcyJeszZFV58AGr8UWOXFRGYnz3e5cWhtklz\nXvXcaAXcRvxkMID6Ueww5b3M9p3BmDExqIDa4+Cvs4Lu0zOG7rM4n4zDX9ky\nKCmGgzFmOk6/QEYcS2+Kuk8MCGUnH0E7f1ahN/YfI3kG/oEQ+z7Jt+56lH49\n6H+s\r\n=L9WH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5CMjXIvJXVpfNR7qanzyjx+mtkK8UwJaYoT0MCT+GdAIgLclkjmUOBQWYNkFK39JoSCJoVLZz6mLrcVXESd3clGU="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.7_1596621919104_0.14084032416639403"},"_hasShrinkwrap":false},"7.0.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.3.2","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"9c0e34c8850f7972bed95b2ce82b48a9f7ee9fd2","_id":"qoopido.demand@7.0.8","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-xmgmzWjntDemHa2icBebUB14ws92ic6nM8LTrv/YmdYNEhAaX7CmTrNc4TnE+P2jxJ1DnPcIbI9ZN278TqtVnA==","shasum":"8e7752f944c47edf9653a6b5a2a535ae210244bb","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.8.tgz","fileCount":125,"unpackedSize":537904,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLRZfCRA9TVsSAnZWagAAPRYP/j6uakdNxdUrdlELgQk5\n0ZfJEs/x8zO9OVqdSIvo3srpkFXD85zqjB18kKVVGppfiXiFLUYi21dlKAoV\naqeHNPN97KADc1HYGYKVKJh1h71owigP6axxy2sBz8X3TMEYPJOyTsGfAQ9x\nhqy5IGF13o3CR+7VGaqcJMfTIFVm1K/g6bEL2sx8vsz5VylxCVOtL4yCRtE0\npJHdYZROAc5HYku/1xBQ7pBnngmDZrK3tK4R3uC1zBV64OdITCZr2ppNjAE7\nwouEkaL1CVIB1YdSYNLDOWrdlmSqU7kFeBBn9XWh/dmvHQT4CIsRVixeP9pd\n1+yg98L7YuooUMnXleUdolPKdnL+lUPqpjm4TlZcEuf8U1U1leUUQ8F5WOu6\n14EUJ87oroXkt/cGvLkkSDGDzAhQasfwcHqKuce3U5YaMq98Jmb9uOb1Qyit\nJW2Zo+5fm2UW0U5oQ/vO3sDyiC9tN/1V114mbVL0bRgYGzpCugI+CSwMHpo7\n81JJMnxo+qM0oJ52NOFOebXq2i/W4Hv1TM7P5C4PQzK4PbL3g0xHgHGaXEFK\nVUTLAOQFrGYxW6X0sTJep2O6e9iw6LM+YRBAFixzstpW3kRDk5VcEpgIOvYJ\nQ1FV2DJsAhB0oEtunQWj2Ab1CCmS+T3Mxt/j2KlVyR1aK4+5XvJ4ST649FU1\nRPCR\r\n=HtYH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFD/2ncjib/4RsmvW6QAXroAe62maCcRqAivNXW9yligIhAKV9HKzkqKRjLmWJZxQsWdhh397Zv/OqJLGTRKPaN/Ej"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.8_1596790366853_0.15822634186913032"},"_hasShrinkwrap":false},"7.0.9":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.0.9","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.3","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.3.2","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"47009bb19aa82d4c48f221f1c1e0e7ae703ecc78","_id":"qoopido.demand@7.0.9","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-qlO6oz+eicO1JbiLgmANiZAhFKP4R4a6dV3k/NJ0e8U2sHqAqFxr0mzxUDSpE9H4U1pl/XtNaJujfgRR3EeSJg==","shasum":"fafb1bf9a86c1452946b39521e723fe9f0ff5a7a","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.0.9.tgz","fileCount":125,"unpackedSize":537903,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNR+4CRA9TVsSAnZWagAA3aEP/A8Aa6QyBkZ0p9/EQh4a\n1uRniH9gJyrKTUe0bFeVhL2KDX1ClOcDBg4O3XWVUTgB3hYqOHeAkYcSR116\nVMt3mYidBmaNEpd/RKbzEN+/IK7bTyEeIKYrNkYDhrISo9D72qG162KoQdKm\n37rUYeeBwtfVwbR6WInkYYrDHrsBi29ojAFXF1la98+vkPKAAP1ZbyrHffBo\n7GMTZKWwdLFXpFWmhDevwf1Mpl4NjpIP+5cFTSCsihHhmHw81NShe1plbj0T\nkDLZaIzZDXeztdD9beQuy4hDQLV3Ppx4kgpdNUhxwOPMX2Mi6vvF0HE5aTry\nFXdg4v8gLLjo9nmUqu94nZ8KhvbMv8tKpSqXQXJPAHQ9fqN1VmKhngmOe5EN\nmGnDg+TDZKNFjcN1dDBKbGaKrlWSXPkyspq09iasr8EfbZ5X5f7yujro4vwl\nGg/DhENav+OkScY07Q+cLKhWsX9Z4Dg3tkRSTvC5rDHl5VyVaLO4s6lYUAPw\nckR7Ye5FVcGJT3VlxE2TBh//3dQt5ZF37kq+5qo/+r/xYF2IwXQuihnWxtsQ\nF7fv8LuP567l7ZDBCca/78ciCGVf7/MZjwNIvl3rRBhz5GWqAozh4BVhm0rr\nF2ICjmgHPaP1LpvMzA0AluQ4qvq+B/Xe0uZV8S5xBD8afUm4Ys0Ybou1ECW9\nw4Et\r\n=P4WA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH2Kx2ABHHiLIYxLmlrYS8ZIKM3rHIYHnB90o3L1q3nzAiBSWw/LePR1n+45Fy/D/FzK2M7OGLr++TQIJ5SrFiIh2Q=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.0.9_1597317047605_0.27895864424392114"},"_hasShrinkwrap":false},"7.1.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.1.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.4","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.4.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"ae33fdc8d5e888c17b108bde27efa5ba56ecf09f","_id":"qoopido.demand@7.1.0","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-R+n4EDmAU6rWdDdnlFTr+P+czVeC5PUFgdJJEszCJAbzP38kkXM7bZt+SwJbXIQUqYBFEzxMQ+nmk+LXhZAhwQ==","shasum":"136dcadf993f7d86e2787a42a3f2b6f3b6079808","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.1.0.tgz","fileCount":126,"unpackedSize":538640,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfR2IaCRA9TVsSAnZWagAAqxkQAIF5CHZ/RR9l/pRWD39e\n4bJiYsoJMKAp3EwsJ8DksfIMkCsaE2DcGC8UH9F2jrRQzcDDCjaF2N7oSkEK\nfUtcW1r/SQwWdeMGq6/5Ap6fkKA0cJI374pceTkHREBtKJrwANZ+4jiIYCWP\nrMS1ZX1Z//+vFlzUfvmVvPUafq9E1oO0+QFdpziTF9IxPs/nZBDK2vRF0s32\neNG+84MJVLPjCmGU+TjH0hRzPgq6vAxBOSI+k88xqJ1j+CaoWZ9enkAsPbQh\nN4UEMMAtJ+uLomxSZG+1Qtekf1DDol7efFOSl3ZkC8IME86AVzSZartTBFUI\nZuVdzW0kCUrKw5VrZ8z4xejHUPzTE3RCQiuzuDClOXfG8XAp6qn+Qxy/PNOD\nMszKfU68ldCUlvW3ObTeIk/GJBH6ZYf14rUtDv/BT/JR+Wg4Y7vwTtHlfWwt\nyDYCSOJCsQ8PS9Eg7vOgFNho+QcvGavdO44A/r7aO0gTvs9zRz4UxOid3v3M\n2nA5HWdP63+VtCFidaJ+Y7RCLqXV+fhlBd7GAAwjqWHz0zQoERNOaolXimcq\nuTQ7OuoB7t9tsKqID3TquTLMkYvc04/LW8vUNFgir3VAVHCzSwSZAIO69zxX\njH9zkOZ1mBMhP3sy30bwPS/5BMEfPud5QSsQKLpGaq++0zMIhqKnFnFXy5yz\nSw2L\r\n=jSsh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVrH4NjvLj85WjHks3MNFb1+KU4iuJHdbGWxcv6ifrmwIgQEDOgnF8GFKXD/8MEC8HYkrJ6XPCuWfwVQ1wCmMzTsM="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.1.0_1598513690322_0.6601885047993943"},"_hasShrinkwrap":false},"7.1.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.1.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.4","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.4.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"24ef2bc040bf92365b279cbfcede28983440b0cb","_id":"qoopido.demand@7.1.1","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-R1IXOp6enD8XDaucM3izOakiuzxQmOfZJ/gPZXfb9bGICJwl1LMuv6QEtMdZzH79iNbKPUUn8w7kj50YSdVsQA==","shasum":"710c829d1378500eb4b96a3cea5f2982c293d0c2","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.1.1.tgz","fileCount":126,"unpackedSize":538922,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfTknkCRA9TVsSAnZWagAAmYUP/RvfyUzkX1CsbZZOrhqD\nVlZsxzqsrQTO7trCPVi82ISssMDe8eRkR4nGYhoyhZsXzVze8fURQELOkvx2\nk9UNQGh5M25MPWN6yhYJHiFn0+ZGplyCXxMIP3Ds1IPtnJBUWCRvrhBmjcrx\niHs0mRtgbYMgOaTvv1iriCFD0khhPMU6YOdgrcp3VnceOQyGZXcXxRXbMmpZ\n/Vv7UstWQlAWkSC5tRGA93Bqsq6KAqJNmeXibi0NMUlH/ICAQdHFj6Cw1ij+\nj4aHtJWTNiQUkBJ6uxDStjYoKUsseKTps/f7KYP05xSdTCJFVam7XttrFNFd\n+AJVvMaVQdquuCJfT0AVGzxHTDTkr3AUewWY/sWwrrXXLl0n396Rw+Yp953e\nV2Za/5rqNCa3swiDVYiOz6OsdJr0XppC2Az4zPYqX4CgjT1OgfW1bh2N/PxG\n2k13/9AgyWH6gTbBAptWw/LCwzZUvz78E/uhr2uHeMuJLDyeJy2xCmbBESp7\nqV7hQTW+hcin+yoWgsk+M7zoWOI+8LiOJnh5ADw3ubKq+AwAm/OYYR9wASGC\n2D1EOxY4I4t8MvGDHcOjQIF2UFmhJgPSoyWE1SS1dVB7qfy1FzXS0etot9IY\n/2TmIwXgWjFYJe6W6ADPmE119ZKpmOyTuYDmTlNAyQviciJZm/dp2bdvLL0u\npMe3\r\n=QJRw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAeGKnNx2docwDESWInPuhADxcuqHGPe92ewEYMatpXWAiBxBLpZ09uo6juLtC53iTzMCpJkQl/F596zuQiSf49JNQ=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.1.1_1598966243779_0.699627731674344"},"_hasShrinkwrap":false},"7.1.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.1.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.4","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.4.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"184bca6e9b69dc87389ac04be75c8d812a942c7b","_id":"qoopido.demand@7.1.2","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-41NxDqBIHIu/7a6oYZ0nmig3dpMqrbZjgFzn8OZy6B+2Qx+yyqQPhrl67l6U0MzDhyu3a4+kCAm6ia351q7KTw==","shasum":"119bbeea1a41a960c071030d2b7659efd713d5df","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.1.2.tgz","fileCount":126,"unpackedSize":539010,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfUQYsCRA9TVsSAnZWagAAu9AP/j8p9oS/NaMFlos5/HJ9\na5+8nk4bhxrU/pIE5S5Jtk/wyzDNw/b2V99w5kTeqJIEHadZ9RzmVkYhg+Qr\n/6VHBx6BqRv11rNXWNucy0rsoTxTbpsbN1DyoZ0+tALmn39lqX9nx7FhemuC\nq9D8NKdYOX/Ucj8IBMLIcHWYqIxBherJnvZhYThMpMPV3oz6Jjqk70EuVanz\nLrRlTiu1PklIoM/gMz0dXvJ6rcIHUDzhb/eBItD7ZMFBdmPz2o4/ylfHHukv\nmsBrCS3QbmR6UMW/ftvA+YdOPYizH/2RMacd9f8k/OqMAAhTVigMp3WPMIaf\nwB/A6b3ij+dd2mJw8CrravaeW40NnEajHkH8IAGSZ0lVwFQHzT2u7mNpYjw0\nG1harm+dp1QbaSyi8Vs45kkaC5/DvPkvu/3pxZddfEC9Tj1VRyAv7vw7E981\nb5O7m6UEmzmWgj3GaWL0T+zpFHeFEaUhN8ABqPH6kFp/cRD0cJjiB1Yt+9wk\nn3IvGY4yjspcXSjZmtCOUQ1aI86e+TDJ2majjiEiJUcSwbrxDqt6cK6ZVLXc\nRAdIvY+sGeHjOYD3WHYAywKESgKU9RYSW3oUG48NVhc3Vp10MjEwSCFqzAGy\ncVXTFQYyOTlHF0c9LDqYqEiwF4y8LxmenfCw7UAIsvz9C3mn6rvavAKQGIAa\nuja4\r\n=oN4D\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCfaQWJPys1tWmJROw7ZLLBVWycFPw966ihWgf3A2l2dwIhAIv+c8qz5O/t2v5VOK7wMarAHJHlsvP0IO+UqNBoO/No"}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.1.2_1599145516332_0.3383395912574083"},"_hasShrinkwrap":false},"7.1.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.1.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"5.1.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.4","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.4.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"447f9c64023e73fc256a05ed70057c592c778b4c","_id":"qoopido.demand@7.1.3","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","dist":{"integrity":"sha512-ngU14qn6hPxZGLbc+R5hlidIM+RHNiOiHTHIHCXgDS9h6y4m19tv4w70r4hYytb/5xrTLE0WA1j6V/VJqqJNjA==","shasum":"cccd91cc4833195230c5ef9ec8705e64b4df4b1f","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.1.3.tgz","fileCount":126,"unpackedSize":539010,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfWTVyCRA9TVsSAnZWagAAuXUP/ie/8zojAAU3V8ZKzsko\nR7KmSYRceBcJtNZQUrOkY9d5Wm07WIC96RDp9cxmQXjlj6zzHGE2XfE8pOGO\nTbAiH6PUCfFJdEPhTNgv8yk0rcjP+CasyOaTbVcUOkb5ZXT8HJOCMOjYk4NF\n1y1uWRWcp3BJXYOQqEJ6KOgxefsIUhug1jerEh5QOIQ6VTsCVh+1HBnixPB2\nH4RD/T189thri6P+9O0twSCXVjzrduhgMmG4vclFySxFOhPG8t1guYBaMCXw\nNYPbFPkRW2JRUmqoTvlIkx4maLvtnv0r9raR8kodfscwWBc339NW7ZYVrQGC\n4xmtuoRr8AhFSWF/ehrZB9XHZh2Rbs+J6/YqyWn1cRal+G3BXklu2vrj9vzZ\nFNbP/gDsykgVbM6KBE+1sDclWDrT+Or47MP5RzxoMQSaMG3R7H88KiBj1G6p\nJ0GnlLvo4WXkgXKmlg4oDgPcLOsEFBL0SmSzroC8PC6AzWJmeWoOufSyNBwH\nGt/0FoAS0MJdiKQFgMDipzPoJ91TMPSgjj5P1AeGcy3A3RysQGAeHhd+F4XP\nmOXct5cOK+184GjqzKrjOcyxpAa1OZnf8d6+3KbhMNeeGgiaEyqQblXDYTUO\nIfwtprc08bT64PyRSk4m1CUcqgl8k8dxGnFgg1v57yKeyBJVJ+o+U28+yVVJ\nMP3T\r\n=ne/+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFUUGXTKM2upVUkeDTQBR9JFAiDaNEiAOlpUvMFoVclVAiEApTHs1u9RqgCkecow1qRSjchJv4FV51ORuEg5zDtQLwE="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.1.3_1599681906258_0.2321123329613879"},"_hasShrinkwrap":false},"7.1.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.1.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.4","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.4.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"cdcd82fe60e786e1f45a1f580398e1a92d0b08ae","_id":"qoopido.demand@7.1.4","_nodeVersion":"12.18.4","_npmVersion":"6.14.6","dist":{"integrity":"sha512-iPyswjCgCNyTxGqNpludI6CXY51Xf0zJq7lad2l/382+tH5SxW8G1hos/d7tahDMioOIrz+fEcyadljGYzQMmQ==","shasum":"370057ac60e935b8ad85e3930529074d64699bef","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.1.4.tgz","fileCount":126,"unpackedSize":539010,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfc4qQCRA9TVsSAnZWagAAlz0P/AnzJuFRqFCWFce1NzAZ\nwz1W/IzcF+jFZuJI0ovmdxx1Gvz6Lf9CktRbzrvyNyWxLopjY3XIMEz4elf+\nO5tiJbZR8aY4D7rAl/EED7cZt3L518XwWSUV0+hHOvcybUtWdL7PxBw83oDC\nmYUUQLDQWv+jYkWyHxnAwezO+jqIulaRUJz9sSl5CPEt3tukFac3YIrV1wxX\nv3AthtrDYzEC2wEBQLStSN6Eio4+W5l8p7qt6X19TrAmEcZy9OG2LEptIU8e\n8zu3q0bsepE6zCEYWZEPylqAGw//kWh105wdDBCKmTt7u2pkQz3xPaTYNJ9q\n80jsgESZM4j0RVjy2dQ6lQ3aVf0yXjqYkzjvqd4pRy+vgAQggIC4UULM44yA\nJe1NqqkDtHSynS1RGbOv4xV4al3zbGlxE7nkXUqNQz7acEm/YYfpbknWXve/\nxeG/b3xC7XO+Ce8gO1b0mf+knmRZYAD9jvfv1nswU1lI4C7XdNCJfBFQOvk2\niLnPfBS3DiBH17SaXYkC6wQXPU5UH398a7cDaKdLQyHyXon5/DnZhAc0nACG\nzzA+Zj9mI+l1QCBH2SFGzJdIkP4rNwIRbFOnvSlPcOexEv/bCzlBEWVwBkQN\nqM0fZOTQDk6R63oQtGEpOtgNQXVePxadDUA1oZ3a9/iXI6NmJ0Lk84u1iwBW\ndn58\r\n=5kkg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBR9Eg0XpGbk0ODhE5oOSGAfUs61twz9ocsJvez2C6mlAiBOWEmcTrr4RjLUzdCWaVWKgbMBHUaZv7JJ4RRD7iafLQ=="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.1.4_1601407631926_0.011085304459988343"},"_hasShrinkwrap":false},"7.1.5":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.1.5","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.4","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.4.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"0c4cbb197f47557a62d7fd26b7cb627e0fb182e2","_id":"qoopido.demand@7.1.5","_nodeVersion":"12.18.4","_npmVersion":"6.14.6","dist":{"integrity":"sha512-1Cizn+l7jIeqNhoPdb29ygExBHga08+C+Qbb1kT+QjOBqN449fS/1l2u6Tc4sru+0A+z7y0bcuXsGtZrHUiLhA==","shasum":"08ff681154a92be7267bed4c62c0a803a562468d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.1.5.tgz","fileCount":126,"unpackedSize":539061,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfeiMjCRA9TVsSAnZWagAAkUQP/2HfnNL6hN9laUk4TAhJ\nL5ycFqqw7XI9NKYIjBXi3Q1u2hUFJSuizqv8hwAM6wb1/OL8veoBJPkY1LYR\n8TjMgY3V9acrDCnsK37MgZlqq5asOgZqn5l2sDgq3ALKFh2HdZyUi3G9+KCR\nDp73R1w0FSpLSXBezLaGILqWsBx0FHhAxCKxxD4qUQ/BFA+OJ39S2iDHD0bu\nHBxI5SyAPkhXGLbHLLO7izKJm6O0lMcbgXcz+zq2ESquKV5JFTTSLSXKO12W\nHPT2NHzaNHlMrubAWcQ8wevbr2qBO77Su9qqSOhomEeUuZCRD5k9En8rEpEV\nxQEVF8qwUgW+FK9nV+hJTddOqhejwIO3dGqm1PxBfKyyKhiIk2E91APRTBnn\nLC0aGGrIgZLcrxvWfl13EoKeYJ2j/Yj0iPu5NlEREDBRCxhAbVl2eHpyLHLB\nOIKEdt3RN+AA6BfcSvvBl2Sb1gl5yHBk9EKRnm3xa/QQP7fHZymuKuMat2Mg\ndf36xMpAMPBvDGfP2Wv8nW5pWignbnjPGuuC4lpctdd8GTbkVogsO+syJydg\nnpu4teX4VoBWbC1vDrV7WssC+mP2KyUxzd1WY5caM76nEFcqp9/7sCh/1hfY\nLMaZtx3+XnWnRrdflEx9D3t0QMR61xuMr+0w76HhMAL74Q/FE/kokTXGE4Xk\nHpmA\r\n=Ejmd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBpX16hlnEEpsxoxESc7/mB5jcknVDHEsVOffHF76c7TAiEAjSVIPSJWDf1W7KWknNO041Loj/IYlUp0J3mjI8clJC4="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.1.5_1601839907381_0.7904195032706718"},"_hasShrinkwrap":false},"7.1.6":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.1.6","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.4","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.4.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"7aef0acedd760aef0403343da3e3f6eaf11a1c23","_id":"qoopido.demand@7.1.6","_nodeVersion":"12.18.4","_npmVersion":"6.14.6","dist":{"integrity":"sha512-Qi17I0f95UVI8nOey9YfsKqlegyeWIjFWTzFqq1Gt0Ou+bTw3JpP6J53IulGpxglEgdWxgiC7YPTMTCAPICRSQ==","shasum":"25620806584d9c9df3781ecaf8fb315224bfe88b","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.1.6.tgz","fileCount":126,"unpackedSize":539533,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJffMbDCRA9TVsSAnZWagAA47MQAIaork295lmZhCmB37UQ\neGUkl6PPUnf/izqo4JWzF9x2GhTKI39BjzlaaJ3vMd6eBVQwh/pUsfYyYMbD\nc/MMR6jpKf0FJwO4WNuAQKHqtcggf29qgKMJvzsgbQ0O1GFs7eT/Sjg9HjGY\nyzvzXJnsB2kzXEzaYSH081vtgo1ugRaK2Xc2BzA4efEYM84yGq3cHzbaz04Q\n93BBQhv2cYzjZ22jt4mKeXe3kyFo+7RDiI5UM5hwvXEQotSPV1IPeZU08U1K\nEQw49aFlruvoYAZlVL2jSj6TDHMoISeMeXYlAjlqmmet6UiSvuFTSXL4nfGj\n7ireZqhGMoQQpaJa5hmTcAyDjnjXRjGfbu0mDrz/4966yrP7YuHp6rVwMkMl\nIAcQkrnxWvpOpsuWSPptpTr/P/hdO9S2b775rwt6LAu9PHyvW93lKU1nXYO8\ntUBknBTz1urrT0p9KCEet+1KvQ95M3AfCHm0LnakvmJ2SqJPujPpfPoyGQec\nk4tn/8Z5OvbUX3N7yoQJ7UIePoyqITaK78BmBpA+HKXmBwOMVK27ZZxiPnvR\n4UXaqImuuh+U+ONXEX0aWVeNccGvXM6OEPsZ7SKf70X8SYIUJZTO73UU9myw\nh+AUXRPMpQzK98TjDW3NlGwzOQ3vxw1i8dJ/tVpI/cCksG5Zz/vQvZH/qxSB\ncMDu\r\n=OrAQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLqIPS48gdD+aGZBoAosXdINN0RAsuNI6grQodXDpX6QIgBuYu7HXLOWTdaRXIHx79uAUoFncjwKhtvC9KwlHdrKo="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.1.6_1602012866890_0.500750362766472"},"_hasShrinkwrap":false},"7.1.7":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.1.7","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.5","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"2.6.5","gulp-terser":"1.4.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"a48a4145b6735fc4b3a5aa1877f1c0073283c5db","_id":"qoopido.demand@7.1.7","_nodeVersion":"12.18.4","_npmVersion":"6.14.8","dist":{"integrity":"sha512-euExcjJOrsi5nKblp4BGFJ/I3NyTiRsyQjHazn6DpeGuKNahu7BnXg8RHc4yrUFO2Xwk7+Jssbcu/+VRx6uKJQ==","shasum":"f6e59c106c823e428f21220ff78bd89be3d592e2","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.1.7.tgz","fileCount":126,"unpackedSize":539611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfke07CRA9TVsSAnZWagAArTgQAIUPbfavZVmWevqOXOxY\nwAhkrf04dTHzOVG24drIqm/YbOTSyzHJkbtrnWFD9PWVOxqqVXLpekECA8Wy\naRv2qWu+CnjpUpjd20fFi5lKZP5BAuwA/U8K2DFl+04sv/9v2F6d4O7kLIgk\n4i+Pv3t7crE/70hJ/Icn9GOe+H5awhGshLV3YC8fUgfAFGBAi/N8+47MiGAk\n4lQ80ppgTPT0hRkXtkldW0qdS4GkwH7Zi/JIAMIRsevaZME/v5bQkGn2JpAc\nAeMJCdodGOzFE6LuM5LVEdmVZcrnHJhf3+s113OVediFzNb/qwl4u9BcnL3i\nTHV1DrDI342MLrc+myrSzXZGkMfwNvwu1swtdZi7RCBy2nAWOZErd5Uf/xEg\nKAm/c1J8v9Cs5MHSr05FYWHZJwrEYffZEgclwq+5QZ9+722+/Q6QrAcN992q\ndfmzkoryUJLWAJklKe/btLxAlpaba2Q/AeyX2ZgZKD0Rp9tohHTCWsRm/jte\nkXUfUzayhElqVpEyqbzuhnlGYnFWuedwEmI8Fh/HPUZn9LWtUWqQz/Z+DV4Z\nrrNw1rgfTB8vXy6k70sdtowAGbqjy345eYAkH8aqziYBLVTy1I3q4okK/YrM\nhqwffYL68hLY00xWfLz+p1Rj4Mzzeu/IuEBRqq33k0WpJnxkWOKHrgkBUsrn\n51za\r\n=+2xL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9RukV6baOenjsQ3vY52WY3iLslOMI92nfVVaAbXwRHQIgNznNdCzIPREJ6Zyb/zzpAEYrJMuebdm7dyHoUZ3JLWo="}]},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.1.7_1603398970723_0.3628202756344352"},"_hasShrinkwrap":false},"7.1.8":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.1.8","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.6","gulp-rename":"2.0.0","gulp-size":"3.0.0","gulp-sourcemaps":"3.0.0","gulp-terser":"2.0.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"dependencies":{},"gitHead":"c2942b92cc372dcb5e6185ebbf09652428840fd7","_id":"qoopido.demand@7.1.8","_nodeVersion":"14.15.3","_npmVersion":"6.14.10","dist":{"integrity":"sha512-5QSK8tIXEcMQLN71gZIJz1KNJ4uEY4EXLeLWhoJBmclJcNFcSPvJNJU9fFClnfZXOJdDuUm16JHvzeKzP3z6jw==","shasum":"2f1e03ab4fa7b3c629790f1c127a928ab17de448","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.1.8.tgz","fileCount":126,"unpackedSize":539611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf4w12CRA9TVsSAnZWagAAk0kP/A+zLmL/x7EbTD7WumTP\nbEUOHP0sVrJIBclqjIP4+sXip2J89B7GR38akHkjTqBd8S5aR5hglAofRbtN\nRlTTOD76MLxmAZUHEoCt/YwzA4r9xHpLNO13rY5raUG07mXKaXFytRVO3hpd\nwQCvGt1LaIJ51PPcOvV5fd3K69EsTCaDwVWmdntu89Vm9i751PXLW+XzU3M5\nRGqSmWx/odgPxD7RdesU5vjm1nZQ91yebY6aA5brUHTsfeLNdG/clhRR9tQB\niVmuv0a+57az/w96fS7MZPE2jqI/fCAZPwTnvOj1FIJ7rM5LoafID2nMBcBR\nGxBJ0nldqUjLKOhtc6Ez90mOjZQ/xV7enQqtmbglWzI7UHkb5qKVfEfPELW7\nJ4lgsRx/2/n1NkTBflBPokR24MZu/NSeuGDMmOPOlQ7SAbiQCZnkkoEc8O1D\n7E4KBVRftWfS08YPvnAqztjItcBNL8GtGIidDtaRJTuut32XGI+j/8WPX5X7\nCfp5IRv8XaFR37lWW/TvpzhJAbjzjvLIsZlDYUEZjep+MiLZlTOY2ddYkCtF\n6chT3716P8pSO6vcjJIF6Jb1H1WShX369e1MQwiByDqURMLgc5kk2jZXqmZf\nu4iigzWAYIWxU24mOD4ezm3SIHSvngkezHIcyTiQ7NdT43JLi4knS0Z99XcD\nPydR\r\n=ZFE8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCeAZTPKrl6m9DXVMtldkiaFBxntUtN+/pC34GsxvjSSgIgBVHxbwTQMHRQep/2rKf1dVI7EJ3wTwyknmehHYwVcRs="}]},"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.1.8_1608715638350_0.6098241444657229"},"_hasShrinkwrap":false},"7.2.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.2.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.6","gulp-rename":"2.0.0","gulp-size":"4.0.0","gulp-sourcemaps":"3.0.0","gulp-terser":"2.0.1","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"gitHead":"2a4e742c9d17c907f4349b85274f200cc78bb2ea","_id":"qoopido.demand@7.2.0","_nodeVersion":"14.16.0","_npmVersion":"7.7.5","dist":{"integrity":"sha512-xrpo3FkkT7J2PbjvBroGNlr8tJMX7pa+5QlyLrWpzAMS3cDEQQvK6ZwORroAT4FMPV36qvX4E8WSjsED0UUzuw==","shasum":"f682e91375c1f6324c0c780ea400fdd7c327edc8","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.2.0.tgz","fileCount":128,"unpackedSize":543894,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgkRiUCRA9TVsSAnZWagAAXN0P/1AE8MvFQdoTt0dltsgJ\nPNiFh2zjcCtHNDBg8jEJIPLFcIGzm6y86QU6k/brO8E9TdW98LLIia6YF+ue\nBDcVLfLAJ2KzGnnfEiC+OfQm2J7mJPVJ81jupHFel/Y4nGXQClAZPPLQ1dhH\n44Vy7FACAVTJ5zU6eFopbdfnIC4IDgoKtDZS07caeH3eXnigNAzKJdqK9Bui\nxy8VE8kAXYpW6RuCR+KqrqtrgxX4+m2f+pKLpVmRezIz5Asgs/iyI69p4rtm\nOg5aEowO0PUcc0Qc3b3mz360ePuYGAuAVyQcnwppkxF6xkYLoMNdH00WLToR\n4n0QrwyVclL7kwXY23tlBxcwoR2U5e3Mcs9qDLp+ZsukZWOjsB5jOPo5O4E9\n/yWtwrTEl0bhMwKdcvgkCau6Hmwv9VuVducbLhRiZbid+RA9z8ScQcNyCdIr\nTIU57FHRDlF0TamcC82z9o+7sEvJqSjjpJ0PMCzI9H8VWdbf5Cvw6tbIW2Cx\nX5ASyJRMSyDS1N7vkEH1SODvkeQW3HsMP+krmqUMEqXZ8cQyGHZGE4h7p4CH\nNkkmQxdBSwJPYE5NIc+4u97V4yTffgBMwTdWJiJzut6hbKC4vHih2pPjF6pa\nis6tF7TnqDWz50SRNZ+FAPlKv/l1jumlXdfrZAAvfXpBi76vGqMj43GdXG0h\ncVg9\r\n=Nc2h\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC4HsMgQcgbpa3U3wSYa8mjcNZGvKLtDESjbGTcjp0uSwIhAMzGSgdo2xCakA3BuQYbX5iGkysli3aKg8gsD2KvXTlQ"}]},"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.2.0_1620121748087_0.6791174727895368"},"_hasShrinkwrap":false},"7.2.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.2.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"browser":"/dist/demand.js","autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.6","gulp-rename":"2.0.0","gulp-size":"4.0.0","gulp-sourcemaps":"3.0.0","gulp-terser":"2.0.1","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"gitHead":"243e037ed75f1f752ef3d74a68dfe541469dc5cd","_id":"qoopido.demand@7.2.1","_nodeVersion":"14.16.0","_npmVersion":"7.7.5","dist":{"integrity":"sha512-kj0T/iZDNC5/kDHySm3CHhl4VnMDMuFFNLl6U5xAGEJFqAGS3q5OiUhdMsO6iXt7ZdxIeB59lbSWBY/2ytpTsg==","shasum":"6bcf2056564419f22e0139ff7f1c6bcb9c294514","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.2.1.tgz","fileCount":127,"unpackedSize":543030,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgkSxECRA9TVsSAnZWagAAWdYQAJlOd9qLOSaEvfXNzFt0\nzpIG3/gCUvbvFHGfyhze0rOh1N5r8oeZcebw90CI0U4QrKKCyQQn3sI0A4p9\nM2qKD6xm05xk4ZwTwllZ5JPj6Cb0YBXQWI1EX41BroY2licc+9wb0uIDa+h/\nMsWYhACfuSv+KBlJaffvMqIiAQfB+sywgFZVOa/vj5pQBufRc3QwYip66pHL\n+E5+1FdU2Av7UNJwMpF/J+024AVkbCBQnNP+g218pQEz0xMzvVyJF8KoqfbF\n4iID77vTkzR8NEbrtNwgnKi1qMk/AZdxW/kpampWZy3ti77ltF9aNe7mdByd\nTnJyHn67hFvdNvz3cWCtiaxG9t7zXgRMxr8h7E1KErkZTVGq6P3BwvY0gk4+\n039O+UnAM4XdJPM7TvJrXaETfaocOfN+4eVOvgpSvPilc2nqXPYN+3iwOQRX\nf0L0InlvGfaQU3fDU/34cFUVjKmCYaYhE9jezduveUDP6I9Ez47N6+yNvVdX\nSq/yGhmaq1j1WmW0Wn0tOzkFTqWD+HZ3mcJ4RZYt76Is20O+KJ+mmzBd56nG\nwcS6lV2UNZh8SxTFcUNzUkgRSroRCRqGCnrtJFPgEZZfLJoNaD1gBNvC3DjH\nItamUVWVKM4JfE2/xNE9JRNno75WLiCDt4OIe4rInXBd3lE2PHf3T215SIpP\n9M5v\r\n=U0zt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDe7Gul5nQePv38pmy8PYHPbZi+wG6xs2RApVEkKMnnPAIgfCBB2RTn2Ed8rjirTJtAknfbDm9Hp2xzV0d0hSxPA+0="}]},"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.2.1_1620126787486_0.12260112424153058"},"_hasShrinkwrap":false},"7.2.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.2.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","main":"dist/demand.js","browser":"/dist/demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.6","gulp-rename":"2.0.0","gulp-size":"4.0.0","gulp-sourcemaps":"3.0.0","gulp-terser":"2.0.1","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"gitHead":"06fc3764b5175af3e255b7c9f31b2b2f0fd7142b","_id":"qoopido.demand@7.2.2","_nodeVersion":"16.1.0","_npmVersion":"7.14.0","dist":{"integrity":"sha512-Z70hc/j/6vi7J/GnSqWuhIqSoMrc3kjFN6BZGGqLAq0o8UZtjOzrm/rNSa3SluQpXQqwOa5IDeyqPjFjO8SQlA==","shasum":"c5df9d94f25a829cbe4f2c4525afd81ff180748f","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.2.2.tgz","fileCount":127,"unpackedSize":543058,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsJ+CCRA9TVsSAnZWagAAidcP/i7zh54cMhrImOQinbAG\nlo3Jvour7hibiPlGh0Rfzf4dPY23Sk57tVc6nkGL1j2zqtxinmvL4wok5lrJ\nozTMrNOJzaXBQEQaeXc+fOolNwLPcdbHgNDoqiA2LDdsNsKY9s06ssNP07nZ\n07MoTnUKXy6Dxj0xihGtH8ZiWr5INxNDiA4er//z8YYWek/nbaUN8TEhsiXT\nxlWrlEA+ny498dQaBB/aInJ8ofbCFTlviieQEFHsK/MCDG4pIqKSRDh2KlvX\newbs91l3rF8HR7TpP9CMpdnJzXUEM3t1/LRJDIEn6s9C1SQPIXOpXeURP2ay\nFxfTeTMuSl03n4ejL/m82BNZaEBdjquiixJdkSFDJkgNGV7ddmI+gs3c37i8\n1CUjXq5HABy1SPmVeqU5aEIN171VxLBR51Tmk6Ioj65NruIXx/usUaqk7tir\n1zhpyga6u+U/ofsopLQMZaCiFq8QugeHyFAn3XbJsA2yLt3xcPvm1/nd3OiY\nI5Upqqy/v8ln4wFsjbqfgyuTiBSNFj5uOlBPcVRIFTEuFepZH56Eimypf6YO\ni2QWJeW/A2XVchnM+R6UdzXku2nKnGgX8XmRCvlDnbva4FGNpFEl9wAF/aYD\ndup3ssNOF0kD8jH06X1YadB0l3PkUQR4DBNLXizv8nQ/wPNIeuxE8ua448NX\nDrGZ\r\n=HgsL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICoLGi11z5LwCs6tgtkFsj+pl9FQvNRFxYd/OE+nZ7DPAiEAkqmlVhdKYrMQH2AO60cFKjHgr+2GnxHxKqn/4l9AKao="}]},"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.2.2_1622187906223_0.905838393956147"},"_hasShrinkwrap":false},"7.2.3":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.2.3","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","main":"dist/demand.js","browser":"/dist/demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.7","gulp-rename":"2.0.0","gulp-size":"4.0.0","gulp-sourcemaps":"3.0.0","gulp-terser":"2.0.1","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"gitHead":"1e275d3d37f92718421436fdf53e1a5482f56373","_id":"qoopido.demand@7.2.3","_nodeVersion":"16.1.0","_npmVersion":"7.15.1","dist":{"integrity":"sha512-MXszbwZHletWlffxOVXBLFgsQ0JgvCkq19ElJv1590GaM35NDHB/P52ioSKzvNLeJcgDVbvsGxTjpGULCZqNCg==","shasum":"d1625fbee67441d15479d57ed1dafaa1c31d68b1","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.2.3.tgz","fileCount":127,"unpackedSize":543076,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJguIW6CRA9TVsSAnZWagAAMS8QAIMDPJZLfPGh+aBFuc20\ndt7KgUsBt0vYCUmGgspuaDeOrK47lWP5kufQ9q/EJL0a0KkZ/G+fdRL4X9/W\nH9EeambvpkVvfG+WbA3yRC3JQodXprFkvjgkEphRYHMZfQW/ND17nwWfxZwb\nXE8+naD+1PYCnYQAjhfVTEJ8tp5b6/07dkgiYS6IGYmRRNwfpE25uimOi6V9\ny6st9dm+K4mxRwYF9Nnc3y/5onqr7IIxuvRyhrsa20AuJduXN3lh/IRCTFZQ\n9qe46NjB6y3nQvgOajRT+YdTjFoVBvT3NqHeBoBQ+6FcjdC9VRFLyEEd/r95\nROOmWaVcVvcWqob4rRjkXTXu1Rrkbcz2NFDePsbxVkCp4Tc6KElgJbGOwP1N\nAfMxbyS/MjaDi01Tnp2xFpU1Ukc0Jr39QJflyzhOpBEdvCxmptgWp6FzvoL3\nx9h2h99u0Fe3eza/PSq9nRmSKXBthXDMTxr98dNor8ZqXwFRBIYjGMyw35eB\nxImF7SyZLTxpWD6BEELisan9ja6w9/IxkJTbNLr88dHL0lkLLAlnBVLreP9y\nEHMs67YhHv9Guq/l83w2RRlw+v85dkNQjpwKH1IaixWf2Zy4LTVdz3ugGzGf\np75IAO6jAa4P070OUwuVxa91STa46nOy0f76FPGPslBeVuBA8QogmRyUVY4K\nil7f\r\n=CLFV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDY1Jes+l8z+Qg4MKWdnknhZmjNyYk2pTNZ+w2UUHWdIAiBNbn9yGQR3M9TFsT4HMHVb2DuEQuf+rxlPRNO4Q2MJvQ=="}]},"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.2.3_1622705593882_0.4582195618824334"},"_hasShrinkwrap":false},"8.0.0":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"8.0.0","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","main":"dist/demand.js","browser":"/dist/demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.7","gulp-rename":"2.0.0","gulp-size":"4.0.1","gulp-sourcemaps":"3.0.0","gulp-terser":"2.1.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"gitHead":"1e275d3d37f92718421436fdf53e1a5482f56373","_id":"qoopido.demand@8.0.0","_nodeVersion":"16.13.0","_npmVersion":"8.1.2","dist":{"integrity":"sha512-vWp59aCPG8RGUsGDFmE8y9Dt6M2BiBSeUyJ/TJWYFuXCxDTt+vZBjXnajBu91fZji+2LrVfjKhJmH43/XU6jSw==","shasum":"babd340f1d81bc8dc1eed72d18ca694cc0c9a91c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-8.0.0.tgz","fileCount":127,"unpackedSize":542867,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIET6BPdCUzoxQ9TAobDBB/wqFcKD6o2UxY3kIMmJHJU5AiEA+Sjoulm+ykXGH+f7LrfHLFoCSxlOoR5vu4HmpLJAb40="}]},"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_8.0.0_1635943146783_0.8750266215250637"},"_hasShrinkwrap":false},"8.0.1":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"8.0.1","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","main":"dist/demand.js","browser":"/dist/demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.7","gulp-rename":"2.0.0","gulp-size":"4.0.1","gulp-sourcemaps":"3.0.0","gulp-terser":"2.1.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"gitHead":"1e275d3d37f92718421436fdf53e1a5482f56373","_id":"qoopido.demand@8.0.1","_nodeVersion":"16.13.0","_npmVersion":"8.1.2","dist":{"integrity":"sha512-Cq6TKsXEpBzUpZb/Mpg5lGjxLqjnIqntgyr3wGNb6o+ucu2xecQwBwIH6fMrzEwMS0VYlHPQbmuCUpPyfmnTkQ==","shasum":"5c155dc7670e46ba7cb9e90fdd5eaaee831e3b0d","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-8.0.1.tgz","fileCount":127,"unpackedSize":542812,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBX7qWvesvNsO0l2uyX7xOTEpPexaSNYfYVVymuXUN2TAiBLBuu5/c/XLHss6M9p37LcqzDAitcNtOwUXzFyNKDeKQ=="}]},"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_8.0.1_1635943506268_0.7633798942949241"},"_hasShrinkwrap":false},"7.2.4":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"7.2.4","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","main":"dist/demand.js","browser":"/dist/demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.7","gulp-rename":"2.0.0","gulp-size":"4.0.0","gulp-sourcemaps":"3.0.0","gulp-terser":"2.0.1","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"gitHead":"1e275d3d37f92718421436fdf53e1a5482f56373","_id":"qoopido.demand@7.2.4","_nodeVersion":"16.13.0","_npmVersion":"8.1.2","dist":{"integrity":"sha512-Sd8Fpt0R8AuzyETDQT7FmE0Ta8MKapEKJz6OWtDrKCkEMZ380l0of1S0YYIqa8sOxCRyYmwqZFuO86x20MOM9w==","shasum":"b6198d5016170e8f2b0d5405b023b627cfee2074","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-7.2.4.tgz","fileCount":127,"unpackedSize":543048,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhl4LACRA9TVsSAnZWagAArycQAJ8V4hPYYYzfv8N6s/yv\ncxSoBa3aYa5CXfFAOWMsG9seH45+331qZcWVinemKF010Yv9WdpLkGwiHduJ\nwIcdlNL/4fRj6m8v0O9NH7ARls5K4Foq9vGrNeAtkZMl79U/h5+rG0pgaDZ3\nDzmLNVPrdHXLs8SqJUispfz8AKGkAKWP031UV9TYPdQ8n3CJ+DnYKHl37Kib\nGbrw93ZjzpLHO9uGos1lzlZmDpFdSWxwccQZ7BxzXLVE45s6AAJ9Gh+IRGGB\ncZ75XcfPLVGOZ/bwhVBDX4kbqfMjwBAMw+nvwM3gAFVOtHShjAqOuH4rKaM8\nBmtAgz+LSKyPn4rsZRc+315sLmNWxlmKvfJV77nmFTLuK8O+L+qn1HFOcOkw\nTJC5sV6mXvV4Ra058Nwz6l1VWio0BKTWu1B8cTDclC5KGdl20O31Z07eNM5K\nwAf4KKBhnU/FIZtcMuhQCQ9pLbWbtqVkxV5c6G/skHyc8UAToKmRfGfYWOHJ\nPJjtRtSiUtpWliJlVZWp8jPUAvxcfUnJdYtd8dIDreFMoZU7CZ3i4KQa6oEO\nh0lWYcFVc1gXoyEfW+HWuPfkGTtht40uyWJydkFnGw4olYZg9q0O7B4LnbIa\nshhPD8B5osb/u0WHzMtgVHzAgaexWsJNmNOXlojJi4jg6nJLx6GtSJTRNEyp\nYZ5j\r\n=M3D3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDITbs9vU/ZIHYLNMY1timS7t2oj0F8bICWmnZh0ZrzpAiEA4ydl1b2HcdAi0n+rJJqlrPi6XvQFxXv9ADqSmU75PaY="}]},"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_7.2.4_1637319360246_0.5361489431210844"},"_hasShrinkwrap":false},"8.0.2":{"name":"qoopido.demand","title":"Qoopido.demand","description":"Promise like module loader using XHR requests and localStorage caching to dynamically load JavaScript and CSS + dynamic dependency resolution + support for custom handlers","version":"8.0.2","homepage":"https://github.com/dlueth/qoopido.demand","author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","filename":"demand.js","main":"dist/demand.js","browser":"/dist/demand.js","scripts":{"build":"gulp:dist","start":"gulp watch"},"autoupdate":{"source":"git","target":"git://github.com/dlueth/qoopido.demand.git","basePath":"/dist","files":["**/*"]},"keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"devDependencies":{"del":"6.0.0","gulp":"4.0.2","gulp-bump":"3.2.0","gulp-chmod":"3.0.0","gulp-eslint":"6.0.0","gulp-header":"2.0.9","gulp-include":"2.4.1","gulp-inject-version":"1.0.1","gulp-jsbeautifier":"3.0.1","gulp-livereload":"4.0.2","gulp-load-plugins":"2.0.7","gulp-rename":"2.0.0","gulp-size":"4.0.1","gulp-sourcemaps":"3.0.0","gulp-terser":"2.1.0","gulp-touch-fd":"2.0.0","gulp-uglify":"3.0.2","gulp-wrap":"0.15.0","require-dir":"1.2.0"},"gitHead":"af82f1c2b5b2d3510239461f4d84e7cd10ae1407","_id":"qoopido.demand@8.0.2","_nodeVersion":"16.13.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-cFtCj02OMagFSklBndpPWD3mSLqPFFQe0BDql+eOJ33PgptoD4guIuwhV3qCib5c1j2pNjhNIDT8tHg5qctHRw==","shasum":"b4f2b233c87af5cf6eec4cd1ee209965b3ff9a6c","tarball":"https://registry.npmjs.org/qoopido.demand/-/qoopido.demand-8.0.2.tgz","fileCount":127,"unpackedSize":542835,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh1/OeCRA9TVsSAnZWagAAjhgP/06FYXtCVYNaSZqBeByp\nJHWei/EwIEW5gSSnfchyjJaiBDj6W0EnbsK9h8ZYeXjKJwEOrHQwn/BlhuC/\nGIS+q5IPrG+7zpqXT3tdF0Tlfq4O+EPboYSgVD83SJnrfHd2mu7Myw3PapND\nCT+AembFLXUPFEVX5uF4l3HTsmUNoDPyhg7T5/mwrKxxLMQ9HO6ZYXOQowrc\n6pKvXJ7MdGAj14y6xih+hT1pZtPgJYS4oz3iEghPgTN7/RRFeXUaJssHZ13J\niRXn3o+mzU8UjFUUBtyNTdUUr8lTSCuRbHIM0kCaFUhm/I1+hxa+bH0TolS6\nV9PPI6XdSRWXDNSQNAonqcUrnyAJLczkV9iMHoXemxiZY+qUb7a5ld9wVuev\nLtzu+YJjnUWAggdnGWTTyjdjYkSLw7eQ9v71Bv+IWACgyQbDlplFJgomEJ7T\nhOYWvcbes7pNjd3Og5pFMy+2ZkfebHB3Ssx/dQ5ZahyDMsL8zzBnB0h+UqPQ\nMfC/eWg6cdkAZIHeHct9Q/Ihi44T3niJhosLcCoebRLNNEswFNkE+oNSpiwo\nC8yCA6BT89tmq7KA0U+Ejhzq7mOYcpy26IHo3shJ3LsrKxf8o+Pt97fTmP7m\nqlNmKMkURfxaBANuBpHSOKfmJduuNz7NQzT5zTLJGDOWvbW4DxfWRy/JZ03I\nk3dq\r\n=UNPm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDonTxlMeS+TEP/CO7zSl3IMXwELUOIdiUZSNZ6ncD7jgIhAK3A7xf1B8866Asqlz2xjmOjpYGKPrKity4zGclvqM/U"}]},"_npmUser":{"name":"qoopido","email":"info@qoopido.com"},"directories":{},"maintainers":[{"name":"qoopido","email":"info@qoopido.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/qoopido.demand_8.0.2_1641542557957_0.10912331365739902"},"_hasShrinkwrap":false}},"homepage":"https://github.com/dlueth/qoopido.demand","keywords":["module","modular","script","loader","javascript","css","promise","xhr","ajax","localStorage","cache","caching","asset","storage","require","basket"],"repository":{"type":"git","url":"git://github.com/dlueth/qoopido.demand.git"},"author":{"name":"Dirk Lueth","email":"info@qoopido.com"},"bugs":{"url":"https://github.com/dlueth/qoopido.demand/issues"},"license":"MIT","readmeFilename":"README.md","users":{"yorts52":true}}