diff --git a/README.md b/README.md index 6c4d65d..31d12fa 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ app.service('myService', function (CacheFactory) { // Check to make sure the cache doesn't already exist if (!CacheFactory.get('profileCache')) { - profileCache = CacheFactory('profileCache'); + profileCache = CacheFactory.createCache('profileCache'); } }); ``` @@ -109,7 +109,7 @@ Right now, these items will stay in the cache until a page refresh. Let's have items which are added to `profileCache` expire after an hour: ```js -profileCache = CacheFactory('profileCache', { +profileCache = CacheFactory.createCache('profileCache', { maxAge: 60 * 60 * 1000 // 1 hour }); ``` @@ -117,7 +117,7 @@ profileCache = CacheFactory('profileCache', { Perfect. Say we also want the items removed from the cache when they expire: ```js -profileCache = CacheFactory('profileCache', { +profileCache = CacheFactory.createCache('profileCache', { maxAge: 60 * 60 * 1000, // 1 hour deleteOnExpire: 'aggressive' }); @@ -126,7 +126,7 @@ profileCache = CacheFactory('profileCache', { Let's say that when the items do expire, we want to refresh them with new values: ```js -profileCache = CacheFactory('profileCache', { +profileCache = CacheFactory.createCache('profileCache', { maxAge: 60 * 60 * 1000, // 1 hour deleteOnExpire: 'aggressive', onExpire: function (key, value) { @@ -223,9 +223,9 @@ Possible values: - `passive` - Cache will do nothing when an item expires. Expired items will remain in the cache until requested, at which point they are removed, and `undefined` is returned. - `aggressive` - Cache will remove expired items as soon as they are discovered. -##### `disabled` +##### `enabled` -Determines whether a cache is disabled. Default: `false`. +Determines whether a cache is enabled. Default: `true`. ##### `onExpire` @@ -281,7 +281,7 @@ Configure `$http` to use a cache created by `CacheFactory` by default: ```js app.run(function ($http, CacheFactory) { - $http.defaults.cache = CacheFactory('defaultCache', { + $http.defaults.cache = CacheFactory.createCache('defaultCache', { maxAge: 15 * 60 * 1000, // Items added to this cache expire after 15 minutes cacheFlushInterval: 60 * 60 * 1000, // This cache will clear itself every hour deleteOnExpire: 'aggressive' // Items will be deleted from this cache when they expire diff --git a/build_examples/browserify/app.js b/build_examples/browserify/app.js index 6f841e7..f1a1178 100644 --- a/build_examples/browserify/app.js +++ b/build_examples/browserify/app.js @@ -1,4 +1,4 @@ -var angular = require('angular'); +var angular = require('angular') angular.module('app', [ // this is what you would do in a real app @@ -7,5 +7,5 @@ angular.module('app', [ // for the example to work require('../../dist/angular-cache.js') ]).run(function ($rootScope, CacheFactory) { - $rootScope.test = 'It works! Using ' + (CacheFactory ? 'angular-cache' : 'undefined'); -}); + $rootScope.test = 'It works! Using ' + (CacheFactory ? 'angular-cache' : 'undefined') +}) diff --git a/build_examples/r.js/app.js b/build_examples/r.js/app.js index 74cb904..1c48ff0 100644 --- a/build_examples/r.js/app.js +++ b/build_examples/r.js/app.js @@ -1,9 +1,8 @@ define('app', [ - 'angular', - 'angular-cache' + 'angular', 'angular-cache' ], function (angular, angularCacheModuleName) { return angular.module('app', ['angular-cache']) - .run(function ($rootScope) { - $rootScope.test = 'It works! Using ' + angularCacheModuleName; - }); -}); + .run(function ($rootScope) { + $rootScope.test = 'It works! Using ' + angularCacheModuleName + }) +}) diff --git a/build_examples/r.js/main.js b/build_examples/r.js/main.js index 0fb6e49..8585074 100644 --- a/build_examples/r.js/main.js +++ b/build_examples/r.js/main.js @@ -1,22 +1,18 @@ require.config({ - paths: { - angular: '../../bower_components/angular/angular', - 'angular-cache': '../../dist/angular-cache', - }, - shim: { + paths: { + angular: '../../bower_components/angular/angular', 'angular-cache': '../../dist/angular-cache' + }, shim: { 'angular': { exports: 'angular' } } -}); + }) require([ - 'angular', - 'app' - ], function (angular, app) { - angular.element(document.getElementsByTagName('html')[0]).ready(function () { - // bootstrap the app manually - angular.bootstrap(document, ['app']); - }); - } -); + 'angular', 'app' + ], function (angular, app) { + angular.element(document.getElementsByTagName('html')[0]).ready(function () { + // bootstrap the app manually + angular.bootstrap(document, ['app']) + }) +}) diff --git a/build_examples/r.js/require.config.js b/build_examples/r.js/require.config.js index a89ae0f..759593d 100644 --- a/build_examples/r.js/require.config.js +++ b/build_examples/r.js/require.config.js @@ -1,6 +1,3 @@ ({ - name: 'main', - mainConfigFile: 'main.js', - out: 'bundle.js', - optimize: 'none' + name: 'main', mainConfigFile: 'main.js', out: 'bundle.js', optimize: 'none' }) diff --git a/build_examples/webpack/app.js b/build_examples/webpack/app.js index 7b904ee..e611417 100644 --- a/build_examples/webpack/app.js +++ b/build_examples/webpack/app.js @@ -1,8 +1,8 @@ -var angular = require('angular'); -var angularCacheModuleName = require('angular-cache'); +var angular = require('angular') +var angularCacheModuleName = require('angular-cache') var app = angular.module('app', [ angularCacheModuleName ]).run(function ($rootScope) { - $rootScope.test = 'It works, imported ' + angularCacheModuleName; -}); + $rootScope.test = 'It works, imported ' + angularCacheModuleName +}) diff --git a/build_examples/webpack/webpack.config.js b/build_examples/webpack/webpack.config.js index 1b3a6df..3cf8742 100644 --- a/build_examples/webpack/webpack.config.js +++ b/build_examples/webpack/webpack.config.js @@ -1,11 +1,9 @@ module.exports = { - entry: './app.js', - output: { + entry: './app.js', output: { filename: 'bundle.js' - }, - resolve: { + }, resolve: { alias: { 'angular-cache': '../../dist/angular-cache.js' } } -}; +} diff --git a/build_examples/webpack_es6/app.js b/build_examples/webpack_es6/app.js index 78a3d25..d17b809 100644 --- a/build_examples/webpack_es6/app.js +++ b/build_examples/webpack_es6/app.js @@ -1,8 +1,8 @@ -import angular from 'angular'; -import angularCacheModuleName from 'angular-cache'; +import angular from 'angular' +import angularCacheModuleName from 'angular-cache' let app = angular.module('app', [ angularCacheModuleName ]).run($rootScope => { - $rootScope.test = 'It works, imported ' + angularCacheModuleName; -}); + $rootScope.test = 'It works, imported ' + angularCacheModuleName +}) diff --git a/build_examples/webpack_es6/webpack.config.js b/build_examples/webpack_es6/webpack.config.js index 3caf2be..194ceac 100644 --- a/build_examples/webpack_es6/webpack.config.js +++ b/build_examples/webpack_es6/webpack.config.js @@ -1,16 +1,13 @@ module.exports = { - entry: './app.js', - output: { + entry: './app.js', output: { filename: 'bundle.js' - }, - resolve: { + }, resolve: { alias: { 'angular-cache': '../../dist/angular-cache.js' } - }, - module: { + }, module: { loaders: [ { test: /(.+)\.js$/, loader: 'babel-loader?blacklist=useStrict' } ] } -}; +} diff --git a/build_examples/webpack_es6_2/app.js b/build_examples/webpack_es6_2/app.js index c75a0b3..1d0765f 100644 --- a/build_examples/webpack_es6_2/app.js +++ b/build_examples/webpack_es6_2/app.js @@ -1,8 +1,8 @@ -import 'angular'; -import 'angular-cache'; +import 'angular' +import 'angular-cache' let app = angular.module('app', [ 'angular-cache' ]).run(($rootScope, CacheFactory) => { - $rootScope.test = 'It works, imported ' + (CacheFactory ? 'angular-cache' : 'undefined'); -}); + $rootScope.test = 'It works, imported ' + (CacheFactory ? 'angular-cache' : 'undefined') +}) diff --git a/build_examples/webpack_es6_2/webpack.config.js b/build_examples/webpack_es6_2/webpack.config.js index 3caf2be..194ceac 100644 --- a/build_examples/webpack_es6_2/webpack.config.js +++ b/build_examples/webpack_es6_2/webpack.config.js @@ -1,16 +1,13 @@ module.exports = { - entry: './app.js', - output: { + entry: './app.js', output: { filename: 'bundle.js' - }, - resolve: { + }, resolve: { alias: { 'angular-cache': '../../dist/angular-cache.js' } - }, - module: { + }, module: { loaders: [ { test: /(.+)\.js$/, loader: 'babel-loader?blacklist=useStrict' } ] } -}; +} diff --git a/dist/angular-cache.js b/dist/angular-cache.js index 6a62e9b..834ba25 100644 --- a/dist/angular-cache.js +++ b/dist/angular-cache.js @@ -6,1106 +6,1586 @@ * @overview angular-cache is a very useful replacement for Angular's $cacheFactory. */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(typeof angular === 'undefined' ? require('angular') : angular) : - typeof define === 'function' && define.amd ? define('angular-cache', ['angular'], factory) : - (global.angularCacheModuleName = factory(global.angular)); -}(this, function (angular) { 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('angular')) : + typeof define === 'function' && define.amd ? define('angular-cache', ['angular'], factory) : + (global.angularCacheModuleName = factory(global.angular)); +}(this, (function (angular) { 'use strict'; - angular = 'default' in angular ? angular['default'] : angular; +angular = 'default' in angular ? angular['default'] : angular; - var babelHelpers = {}; - babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; - } : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; - }; - - /** - * @method bubbleUp - * @param {array} heap The heap. - * @param {function} weightFunc The weight function. - * @param {number} n The index of the element to bubble up. - */ - var bubbleUp = function bubbleUp(heap, weightFunc, n) { - var element = heap[n]; - var weight = weightFunc(element); - // When at 0, an element can not go up any further. - while (n > 0) { - // Compute the parent element's index, and fetch it. - var parentN = Math.floor((n + 1) / 2) - 1; - var parent = heap[parentN]; - // If the parent has a lesser weight, things are in order and we - // are done. - if (weight >= weightFunc(parent)) { - break; - } else { - heap[parentN] = element; - heap[n] = parent; - n = parentN; - } +var _typeof$1 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + +/** + * CacheFactory + * @version 3.0.0 - Homepage + * @copyright (c) 2015-2017 CacheFactory project authors + * @license MIT + * @overview CacheFactory is a very simple and useful cache for the browser. + */ +var _typeof = typeof Symbol === "function" && _typeof$1(Symbol.iterator) === "symbol" ? function (obj) { + return typeof obj === "undefined" ? "undefined" : _typeof$1(obj); +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof$1(obj); +}; + +var classCallCheck$$1 = function classCallCheck$$1(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass$$1 = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; }; +}(); - /** - * @method bubbleDown +/** + * @private + * @param {array} heap The heap. + * @param {function} weightFunc The weight function. + * @param {number} n The index of the element to bubble up. + */var bubbleUp = function bubbleUp(heap, weightFunc, n) { + var element = heap[n];var weight = weightFunc(element); // When at 0, an element can not go up any further. + while (n > 0) { + // Compute the parent element's index, and fetch it. + var parentN = Math.floor((n + 1) / 2) - 1;var parent = heap[parentN]; // If the parent has a lesser weight, things are in order and we + // are done. + if (weight >= weightFunc(parent)) { + break; + } else { + heap[parentN] = element;heap[n] = parent;n = parentN; + } + } +}; /** + * @private * @param {array} heap The heap. * @param {function} weightFunc The weight function. * @param {number} n The index of the element to sink down. - */ - var bubbleDown = function bubbleDown(heap, weightFunc, n) { - var length = heap.length; - var node = heap[n]; - var nodeWeight = weightFunc(node); - - while (true) { - var child2N = (n + 1) * 2; - var child1N = child2N - 1; - var swap = null; - if (child1N < length) { - var child1 = heap[child1N]; - var child1Weight = weightFunc(child1); - // If the score is less than our node's, we need to swap. - if (child1Weight < nodeWeight) { - swap = child1N; - } - } - // Do the same checks for the other child. - if (child2N < length) { - var child2 = heap[child2N]; - var child2Weight = weightFunc(child2); - if (child2Weight < (swap === null ? nodeWeight : weightFunc(heap[child1N]))) { - swap = child2N; - } + */var bubbleDown = function bubbleDown(heap, weightFunc, n) { + var length = heap.length;var node = heap[n];var nodeWeight = weightFunc(node);while (true) { + var child2N = (n + 1) * 2;var child1N = child2N - 1;var swap = null;if (child1N < length) { + var child1 = heap[child1N];var child1Weight = weightFunc(child1); // If the score is less than our node's, we need to swap. + if (child1Weight < nodeWeight) { + swap = child1N; } - - if (swap === null) { - break; - } else { - heap[n] = heap[swap]; - heap[swap] = node; - n = swap; + } // Do the same checks for the other child. + if (child2N < length) { + var child2 = heap[child2N];var child2Weight = weightFunc(child2);if (child2Weight < (swap === null ? nodeWeight : weightFunc(heap[child1N]))) { + swap = child2N; } + }if (swap === null) { + break; + } else { + heap[n] = heap[swap];heap[swap] = node;n = swap; } - }; - + } +}; /** + * @class BinaryHeap + * @example + * import { BinaryHeap } from 'cachefactory'; + * + * const queue = new BinaryHeap(); + * queue.push(2); + * queue.push(77); + * queue.push(8); + * queue.push(33); + * queue.push(5); + * queue.pop(); // 2 + * queue.pop(); // 5 + * queue.pop(); // 8 + * queue.pop(); // 33 + * queue.pop(); // 77 + * + * const userQueue = new BinaryHeap( + * (user) => user.age, + * (userOne, userTwo) => userOne.id === userTwo.id + * ); + * queue.push({ id: 1, age: 34 }); + * queue.push({ id: 2, age: 29 }); + * queue.push({ id: 3, age: 25 }); + * queue.push({ id: 3, age: 28 }); + * queue.push({ id: 3, age: 27 }); + * queue.push({ id: 4, age: 42 }); + * queue.push({ id: 5, age: 19 }); + * queue.pop(); // { id: 5, age: 19 } + * queue.pop(); // { id: 3, age: 27 } + * queue.pop(); // { id: 2, age: 29 } + * queue.pop(); // { id: 1, age: 34 } + * queue.pop(); // { id: 4, age: 42 } + * + * @param {function} [weightFunc] See {@link BinaryHeap#weightFunc}. + * @param {function} [compareFunc] See {@link BinaryHeap#compareFunc}. + */var BinaryHeap = function () { function BinaryHeap(weightFunc, compareFunc) { - if (!weightFunc) { + classCallCheck$$1(this, BinaryHeap);if (!weightFunc) { weightFunc = function weightFunc(x) { return x; }; - } - if (!compareFunc) { + }if (!compareFunc) { compareFunc = function compareFunc(x, y) { return x === y; }; - } - if (typeof weightFunc !== 'function') { + }if (typeof weightFunc !== 'function') { throw new Error('BinaryHeap([weightFunc][, compareFunc]): "weightFunc" must be a function!'); - } - if (typeof compareFunc !== 'function') { + }if (typeof compareFunc !== 'function') { throw new Error('BinaryHeap([weightFunc][, compareFunc]): "compareFunc" must be a function!'); - } - this.weightFunc = weightFunc; - this.compareFunc = compareFunc; - this.heap = []; - } - - var BHProto = BinaryHeap.prototype; - - BHProto.push = function (node) { - this.heap.push(node); - bubbleUp(this.heap, this.weightFunc, this.heap.length - 1); - }; - - BHProto.peek = function () { - return this.heap[0]; - }; - - BHProto.pop = function () { - var front = this.heap[0]; - var end = this.heap.pop(); - if (this.heap.length > 0) { - this.heap[0] = end; - bubbleDown(this.heap, this.weightFunc, 0); - } - return front; - }; - - BHProto.remove = function (node) { - var length = this.heap.length; - for (var i = 0; i < length; i++) { - if (this.compareFunc(this.heap[i], node)) { - var removed = this.heap[i]; - var end = this.heap.pop(); - if (i !== length - 1) { - this.heap[i] = end; - bubbleUp(this.heap, this.weightFunc, i); - bubbleDown(this.heap, this.weightFunc, i); + } /** + * The heap's configured weight function. + * + * Default: + * ```js + * function (x) { + * return x; + * } + * ``` + * + * @name BinaryHeap#weightFunc + * @type {function} + */this.weightFunc = weightFunc; /** + * The heap's configured compare function. + * + * Default: + * ```js + * function (x, y) { + * return x === y; + * } + * ``` + * + * @name BinaryHeap#compareFunc + * @type {function} + */this.compareFunc = compareFunc; /** + * The heap's data. + * + * @name BinaryHeap#heap + * @type {Array<*>} + */this.heap = []; + } /** + * Push an item into the queue. + * + * @method BinaryHeap#push + * @param {*} node + */createClass$$1(BinaryHeap, [{ key: 'push', value: function push(node) { + this.heap.push(node);bubbleUp(this.heap, this.weightFunc, this.heap.length - 1); + } /** + * Look at the item at the front of the queue. + * + * @method BinaryHeap#peek + * @returns {*} + */ }, { key: 'peek', value: function peek() { + return this.heap[0]; + } /** + * Pop an item off the front of the queue. + * + * @method BinaryHeap#pop + * @returns {*} + */ }, { key: 'pop', value: function pop() { + var front = this.heap[0];var end = this.heap.pop();if (this.heap.length > 0) { + this.heap[0] = end;bubbleDown(this.heap, this.weightFunc, 0); + }return front; + } /** + * Remove the given item from the queue. + * + * @method BinaryHeap#remove + * @param {*} node + */ }, { key: 'remove', value: function remove(node) { + var length = this.heap.length;for (var i = 0; i < length; i++) { + if (this.compareFunc(this.heap[i], node)) { + var removed = this.heap[i];var end = this.heap.pop();if (i !== length - 1) { + this.heap[i] = end;bubbleUp(this.heap, this.weightFunc, i);bubbleDown(this.heap, this.weightFunc, i); + }return removed; } - return removed; + }return null; + } /** + * Clear the heap. + * + * @method BinaryHeap#removeAll + */ }, { key: 'removeAll', value: function removeAll() { + this.heap = []; + } /** + * Return the length of the queue. + * + * @method BinaryHeap#size + * @returns {number} + */ }, { key: 'size', value: function size() { + return this.heap.length; + } }]);return BinaryHeap; +}(); + +var defaults$1 = { capacity: Number.MAX_VALUE, cacheFlushInterval: null, deleteOnExpire: 'none', enabled: true, onExpire: null, maxAge: Number.MAX_VALUE, recycleFreq: 1000, storageMode: 'memory', storageImpl: null, storagePrefix: 'cachefactory.caches.', storeOnReject: false, storeOnResolve: false }; + +var _Promise = null;try { + _Promise = window.Promise; +} catch (e) {} /** + * Utility methods used by CacheFactory. + * + * @example + * import { utils } from 'cachefactory' + * console.log(utils.isString('foo')) // true + * + * @namespace utils + * @type {object} + */var utils = { /** + * Returns whether the two values are strictly equal. + * + * @example + * import { utils } from 'cachefactory' + * + * console.log(utils.equals(4, 4) // true + * console.log(utils.equals(4, '4') // false + * + * @method utils.equals + * @param {*} a The first value. + * @param {*} a The second value. + * @returns {booleal} Whether the two values are strictly equal. + */equals: function equals(a, b) { + return a === b; + }, /** + * Proxy for `JSON.parse`. + * + * @example + * import { utils } from 'cachefactory' + * + * const a = utils.fromJson('{"name":"John"}') + * console.log(a) // { name: 'John' } + * + * @method utils.fromJson + * @param {string} json JSON to parse. + * @returns {object} The parsed object. + * @see utils.toJson + */fromJson: function fromJson(value) { + return JSON.parse(value); + }, /** + * Returns whether the provided value is a function. + * + * @example + * import { utils } from 'cachefactory' + * const a = function (){ console.log('foo bar')} + * const b = { foo: "bar" } + * console.log(utils.isFunction(a)) // true + * console.log(utils.isFunction(b)) // false + * + * @method utils.isFunction + * @param {*} value The value to test. + * @returns {boolean} Whether the provided value is a function. + */isFunction: function isFunction(value) { + return typeof value === 'function'; + }, /** + * Returns whether the provided value is a number. + * + * @example + * import { utils } from 'js-data' + * const a = 1 + * const b = -1.25 + * const c = '1' + * console.log(utils.isNumber(a)) // true + * console.log(utils.isNumber(b)) // true + * console.log(utils.isNumber(c)) // false + * + * @method utils.isNumber + * @param {*} value The value to test. + * @returns {boolean} Whether the provided value is a number. + */isNumber: function isNumber(value) { + return typeof value === 'number'; + }, /** + * Returns whether the provided value is an object. + * + * @example + * import { utils } from 'cachefactory' + * const a = { foo: "bar" } + * const b = 'foo bar' + * console.log(utils.isObject(a)) // true + * console.log(utils.isObject(b)) // false + * + * @method utils.isObject + * @param {*} value The value to test. + * @returns {boolean} Whether the provided value is an object. + */isObject: function isObject(value) { + return value !== null && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object'; + }, isPromise: function isPromise(value) { + return value && utils.isFunction(value.then); + }, /** + * Returns whether the provided value is a string. + * + * @example + * import { utils } from 'cachefactory' + * console.log(utils.isString('')) // true + * console.log(utils.isString('my string')) // true + * console.log(utils.isString(100)) // false + * console.log(utils.isString([1,2,4])) // false + * + * @method utils.isString + * @param {*} value The value to test. + * @returns {boolean} Whether the provided value is a string. + */isString: function isString(value) { + return typeof value === 'string'; + }, /** + * Proxy for `JSON.stringify`. + * + * @example + * import { utils } from 'cachefactory' + * + * const a = { name: 'John' } + * console.log(utils.toJson(a)) // '{"name":"John"}' + * + * @method utils.toJson + * @param {*} value Value to serialize to JSON. + * @returns {string} JSON string. + * @see utils.fromJson + */toJson: function toJson(value) { + return JSON.stringify(value); + }, Promise: _Promise }; + +var assignMsg = 'Cannot assign to read only property'; /** + * Provide a custom storage medium, e.g. a polyfill for `localStorage`. Default: `null`. + * + * Must implement: + * + * - `setItem` - Same API as `localStorage.setItem(key, value)` + * - `getItem` - Same API as `localStorage.getItem(key)` + * - `removeItem` - Same API as `localStorage.removeItem(key)` + * + * @name Cache~StorageImpl + * @type {object} + * @property {function} setItem Implementation of `setItem(key, value)`. + * @property {function} getItem Implementation of `getItem(key)`. + * @property {function} removeItem Implementation of `removeItem(key)`. + */ /** + * Instances of this class represent a "cache"—a synchronous key-value store. + * Each instance holds the settings for the cache, and provides methods for + * manipulating the cache and its data. + * + * Generally you don't creates instances of `Cache` directly, but instead create + * instances of `Cache` via {@link CacheFactory#createCache}. + * + * @example + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const options = {...}; + * const cache = cacheFactory.createCache('my-cache', options); + * + * cache.put('foo', 'bar'); + * console.log(cache.get('foo')); // "bar" + * + * @class Cache + * @param {string} id A unique identifier for the cache. + * @param {object} [options] Configuration options. + * @param {number} [options.cacheFlushInterval=null] See {@link Cache#cacheFlushInterval}. + * @param {number} [options.capacity=Number.MAX_VALUE] See {@link Cache#capacity}. + * @param {string} [options.deleteOnExpire="none"] See {@link Cache#deleteOnExpire}. + * @param {boolean} [options.enabled=true] See {@link Cache#enabled}. + * @param {number} [options.maxAge=Number.MAX_VALUE] See {@link Cache#maxAge}. + * @param {function} [options.onExpire=null] See {@link Cache#onExpire}. + * @param {number} [options.recycleFreq=1000] See {@link Cache#recycleFreq}. + * @param {Cache~StorageImpl} [options.storageImpl=null] See {@link Cache~StorageImpl}. + * @param {string} [options.storageMode="memory"] See {@link Cache#storageMode}. + * @param {string} [options.storagePrefix="cachefactory.caches."] See {@link Cache#storagePrefix}. + * @param {boolean} [options.storeOnReject=false] See {@link Cache#storeOnReject}. + * @param {boolean} [options.storeOnResolve=false] See {@link Cache#storeOnResolve}. + */var Cache = function () { + function Cache(id) { + var _this = this;var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};classCallCheck$$1(this, Cache);if (!utils.isString(id)) { + throw new TypeError('"id" must be a string!'); + }Object.defineProperties(this, { // Writable + $$cacheFlushInterval: { writable: true, value: undefined }, $$cacheFlushIntervalId: { writable: true, value: undefined }, $$capacity: { writable: true, value: undefined }, $$data: { writable: true, value: {} }, $$deleteOnExpire: { writable: true, value: undefined }, $$enabled: { writable: true, value: undefined }, $$expiresHeap: { writable: true, value: new BinaryHeap(function (x) { + return x.accessed; + }, utils.equals) }, $$initializing: { writable: true, value: true }, $$lruHeap: { writable: true, value: new BinaryHeap(function (x) { + return x.accessed; + }, utils.equals) }, $$maxAge: { writable: true, value: undefined }, $$onExpire: { writable: true, value: undefined }, $$prefix: { writable: true, value: '' }, $$promises: { writable: true, value: {} }, $$recycleFreq: { writable: true, value: undefined }, $$recycleFreqId: { writable: true, value: undefined }, $$storage: { writable: true, value: undefined }, $$storageMode: { writable: true, value: undefined }, $$storagePrefix: { writable: true, value: undefined }, $$storeOnReject: { writable: true, value: undefined }, $$storeOnResolve: { writable: true, value: undefined }, // Read-only + $$parent: { value: options.parent }, /** + * The interval (in milliseconds) on which the cache should remove all of + * its items. Setting this to `null` disables the interval. The default is + * `null`. + * + * @example Create a cache the clears itself every 15 minutes + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * cacheFlushInterval: 15 * 60 * 1000 + * }); + * + * @name Cache#cacheFlushInterval + * @default null + * @public + * @readonly + * @type {number|null} + */cacheFlushInterval: { enumerable: true, get: function get$$1() { + return _this.$$cacheFlushInterval; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'cacheFlushInterval\''); + } }, /** + * The maximum number of items that can be stored in the cache. When the + * capacity is exceeded the least recently accessed item will be removed. + * The default is `Number.MAX_VALUE`. + * + * @example Create a cache with a capacity of 100 + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * capacity: 100 + * }); + * + * @name Cache#capacity + * @default Number.MAX_VALUE + * @public + * @readonly + * @type {number} + */capacity: { enumerable: true, get: function get$$1() { + return _this.$$capacity; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'capacity\''); + } }, /** + * Determines the behavior of a cache when an item expires. The default is + * `"none"`. + * + * Possible values: + * + * - `"none"` - Cache will do nothing when an item expires. + * - `"passive"` - Cache will do nothing when an item expires. Expired + * items will remain in the cache until requested, at which point they are + * removed, and `undefined` is returned. + * - `"aggressive"` - Cache will remove expired items as soon as they are + * discovered. + * + * @example Create a cache that deletes items as soon as they expire + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * deleteOnExpire: 'aggressive' + * }); + * + * @example Create a cache that doesn't delete expired items until they're accessed + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * deleteOnExpire: 'passive' + * }); + * + * @name Cache#deleteOnExpire + * @default "none" + * @public + * @readonly + * @type {string} + */deleteOnExpire: { enumerable: true, get: function get$$1() { + return _this.$$deleteOnExpire; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'deleteOnExpire\''); + } }, /** + * Marks whether the cache is enabled or not. For a disabled cache, + * {@link Cache#put} is a no-op. The default is `true`. + * + * @example Create a cache that starts out disabled + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * enabled: false + * }); + * + * // The cache is disabled, this is a no-op + * cache.put('foo', 'bar'); + * console.log(cache.get('foo')); // undefined + * + * @name Cache#enabled + * @default true + * @public + * @readonly + * @type {boolean} + */enabled: { enumerable: true, get: function get$$1() { + return _this.$$enabled; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'enabled\''); + } }, /** + * Then unique identifier given to this cache when it was created. + * + * @name Cache#id + * @public + * @readonly + * @type {string} + */id: { enumerable: true, value: id }, /** + * Represents how long an item can be in the cache before expires. The + * cache's behavior toward expired items is determined by + * {@link Cache#deleteOnExpire}. The default value for `maxAge` is + * `Number.MAX_VALUE`. + * + * @example Create a cache where items expire after 15 minutes + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * // Items expire after 15 minutes + * maxAge: 15 * 60 * 1000 + * }); + * const cache2 = cacheFactory.createCache('my-cache2', { + * // Items expire after 15 minutes + * maxAge: 15 * 60 * 1000, + * // Expired items will only be deleted once they are accessed + * deleteOnExpire: 'passive' + * }); + * const cache3 = cacheFactory.createCache('my-cache3', { + * // Items expire after 15 minutes + * maxAge: 15 * 60 * 1000, + * // Items will be deleted from the cache as soon as they expire + * deleteOnExpire: 'aggressive' + * }); + * + * @name Cache#maxAge + * @default Number.MAX_VALUE + * @public + * @readonly + * @type {number} + */maxAge: { enumerable: true, get: function get$$1() { + return _this.$$maxAge; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'maxAge\''); + } }, /** + * The `onExpire` callback. + * + * @callback Cache~onExpireCallback + * @param {string} key The key of the expired item. + * @param {*} value The value of the expired item. + * @param {function} [done] If in `"passive"` mode and you pass an + * `onExpire` callback to {@link Cache#get}, then the `onExpire` callback + * you passed to {@link Cache#get} will be passed to your global + * `onExpire` callback. + */ /** + * A callback to be executed when expired items are removed from the + * cache when the cache is in `"passive"` or `"aggressive"` mode. The + * default is `null`. See {@link Cache~onExpireCallback} for the signature + * of the `onExpire` callback. + * + * @example Create a cache where items expire after 15 minutes + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * // Items expire after 15 minutes + * maxAge: 15 * 60 * 1000, + * // Expired items will only be deleted once they are accessed + * deleteOnExpire: 'passive', + * // Try to rehydrate cached items as they expire + * onExpire: function (key, value, done) { + * // Do something with key and value + * + * // Will received "done" callback if in "passive" mode and passing + * // an onExpire option to Cache#get. + * if (done) { + * done(); // You can pass whatever you want to done + * } + * } + * }); + * + * @name Cache#onExpire + * @default null + * @public + * @readonly + * @see Cache~onExpireCallback + * @type {function} + */onExpire: { enumerable: true, get: function get$$1() { + return _this.$$onExpire; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'onExpire\''); + } }, /** + * The frequency (in milliseconds) with which the cache should check for + * expired items. The default is `1000`. The value of this interval only + * matters if {@link Cache#deleteOnExpire} is set to `"aggressive"`. + * + * @example Create a cache where items expire after 15 minutes checking every 10 seconds + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * // Items expire after 15 minutes + * maxAge: 15 * 60 * 1000, + * // Items will be deleted from the cache as soon as they expire + * deleteOnExpire: 'aggressive', + * // Check for expired items every 10 seconds + * recycleFreq: 10 * 1000 + * }); + * + * @name Cache#recycleFreq + * @default 1000 + * @public + * @readonly + * @type {number|null} + */recycleFreq: { enumerable: true, get: function get$$1() { + return _this.$$recycleFreq; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'recycleFreq\''); + } }, /** + * Determines the storage medium used by the cache. The default is + * `"memory"`. + * + * Possible values: + * + * - `"memory"` + * - `"localStorage"` + * - `"sessionStorage"` + * + * @example Create a cache that stores its data in localStorage + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * storageMode: 'localStorage' + * }); + * + * @example Provide a custom storage implementation + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * storageMode: 'localStorage', + * storageImpl: { + * setItem: function (key, value) { + * console.log('setItem', key, value); + * localStorage.setItem(key, value); + * }, + * getItem: function (key) { + * console.log('getItem', key); + * localStorage.getItem(key); + * }, + * removeItem: function (key) { + * console.log('removeItem', key); + * localStorage.removeItem(key); + * } + * } + * }); + * + * @name Cache#storageMode + * @default "memory" + * @public + * @readonly + * @type {string} + */storageMode: { enumerable: true, get: function get$$1() { + return _this.$$storageMode; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'storageMode\''); + } }, /** + * The prefix used to namespace the keys for items stored in + * `localStorage` or `sessionStorage`. The default is + * `"cachefactory.caches."` which is conservatively long in order any + * possible conflict with other data in storage. Set to a shorter value + * to save storage space. + * + * @example + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * storageMode: 'localStorage', + * // Completely remove the prefix to save the most space + * storagePrefix: '' + * }); + * cache.put('foo', 'bar'); + * console.log(localStorage.get('my-cache.data.foo')); // "bar" + * + * @name Cache#storagePrefix + * @default "cachefactory.caches." + * @public + * @readonly + * @type {string} + */storagePrefix: { enumerable: true, get: function get$$1() { + return _this.$$storagePrefix; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'storagePrefix\''); + } }, /** + * If set to `true`, when a promise is inserted into the cache and is then + * rejected, then the rejection value will overwrite the promise in the + * cache. The default is `false`. + * + * @name Cache#storeOnReject + * @default false + * @public + * @readonly + * @type {boolean} + */storeOnReject: { enumerable: true, get: function get$$1() { + return _this.$$storeOnReject; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'storeOnReject\''); + } }, /** + * If set to `true`, when a promise is inserted into the cache and is then + * resolved, then the resolution value will overwrite the promise in the + * cache. The default is `false`. + * + * @name Cache#storeOnResolve + * @default false + * @public + * @readonly + * @type {boolean} + */storeOnResolve: { enumerable: true, get: function get$$1() { + return _this.$$storeOnResolve; + }, set: function set$$1() { + throw new Error(assignMsg + ' \'storeOnResolve\''); + } } });this.setOptions(options, true);this.$$initializing = false; + } /** + * Destroys this cache and all its data and renders it unusable. + * + * @example + * cache.destroy(); + * + * @method Cache#destroy + */createClass$$1(Cache, [{ key: 'destroy', value: function destroy() { + clearInterval(this.$$cacheFlushIntervalId);clearInterval(this.$$recycleFreqId);this.removeAll();if (this.$$storage) { + this.$$storage().removeItem(this.$$prefix + '.keys');this.$$storage().removeItem(this.$$prefix); + }this.$$storage = null;this.$$data = null;this.$$lruHeap = null;this.$$expiresHeap = null;this.$$prefix = null;if (this.$$parent) { + this.$$parent.caches[this.id] = undefined; } - } - return null; - }; - - BHProto.removeAll = function () { - this.heap = []; - }; - - BHProto.size = function () { - return this.heap.length; - }; - - var _Promise = null; - try { - _Promise = window.Promise; - } catch (e) {} - - var utils = { - isNumber: function isNumber(value) { - return typeof value === 'number'; - }, - isString: function isString(value) { - return typeof value === 'string'; - }, - isObject: function isObject(value) { - return value !== null && (typeof value === 'undefined' ? 'undefined' : babelHelpers.typeof(value)) === 'object'; - }, - isFunction: function isFunction(value) { - return typeof value === 'function'; - }, - fromJson: function fromJson(value) { - return JSON.parse(value); - }, - equals: function equals(a, b) { - return a === b; - }, - - Promise: _Promise - }; - - function _keys(collection) { - var keys = []; - var key = void 0; - if (!utils.isObject(collection)) { - return keys; - } - for (key in collection) { - if (collection.hasOwnProperty(key)) { - keys.push(key); - } - } - return keys; - } - - function _isPromiseLike(value) { - return value && typeof value.then === 'function'; - } - - function _stringifyNumber(number) { - if (utils.isNumber(number)) { - return number.toString(); - } - return number; - } - - function _keySet(collection) { - var keySet = {}; - var key = void 0; - if (!utils.isObject(collection)) { - return keySet; - } - for (key in collection) { - if (collection.hasOwnProperty(key)) { - keySet[key] = key; - } - } - return keySet; - } - - var defaults = { - capacity: Number.MAX_VALUE, - maxAge: Number.MAX_VALUE, - deleteOnExpire: 'none', - onExpire: null, - cacheFlushInterval: null, - recycleFreq: 1000, - storageMode: 'memory', - storageImpl: null, - disabled: false, - storagePrefix: 'cachefactory.caches.', - storeOnResolve: false, - storeOnReject: false - }; - - var caches = {}; - - function createCache(cacheId, options) { - if (cacheId in caches) { - throw new Error(cacheId + ' already exists!'); - } else if (!utils.isString(cacheId)) { - throw new Error('cacheId must be a string!'); - } - - var $$data = {}; - var $$promises = {}; - var $$storage = null; - var $$expiresHeap = new BinaryHeap(function (x) { - return x.expires; - }, utils.equals); - var $$lruHeap = new BinaryHeap(function (x) { - return x.accessed; - }, utils.equals); - - var cache = caches[cacheId] = { - - $$id: cacheId, - - destroy: function destroy() { - clearInterval(this.$$cacheFlushIntervalId); - clearInterval(this.$$recycleFreqId); - this.removeAll(); - if ($$storage) { - $$storage().removeItem(this.$$prefix + '.keys'); - $$storage().removeItem(this.$$prefix); - } - $$storage = null; - $$data = null; - $$lruHeap = null; - $$expiresHeap = null; - this.$$prefix = null; - delete caches[this.$$id]; - }, - disable: function disable() { - this.$$disabled = true; - }, - enable: function enable() { - delete this.$$disabled; - }, - get: function get(key, options) { - var _this2 = this; - - if (Array.isArray(key)) { - var _ret = function () { - var keys = key; - var values = []; - - keys.forEach(function (key) { - var value = _this2.get(key, options); - if (value !== null && value !== undefined) { - values.push(value); - } - }); - - return { - v: values - }; - }(); - - if ((typeof _ret === 'undefined' ? 'undefined' : babelHelpers.typeof(_ret)) === "object") return _ret.v; - } else { - key = _stringifyNumber(key); - - if (this.$$disabled) { - return; + } /** + * Disables this cache. For a disabled cache, {@link Cache#put} is a no-op. + * + * @example + * cache.disable(); + * + * @method Cache#disable + */ }, { key: 'disable', value: function disable() { + this.$$enabled = false; + } /** + * Enables this cache. For a disabled cache, {@link Cache#put} is a no-op. + * + * @example + * cache.enable(); + * + * @method Cache#enable + */ }, { key: 'enable', value: function enable() { + this.$$enabled = true; + } /** + * Retrieve an item from the cache, it it exists. + * + * @example Retrieve an item from the cache + * cache.put('foo', 'bar'); + * cache.get('foo'); // "bar" + * + * @example Retrieve a possibly expired item while in passive mode + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * deleteOnExpire: 'passive', + * maxAge: 15 * 60 * 1000 + * }); + * cache.get('foo', { + * // Called if "foo" is expired + * onExpire: function (key, value) { + * // Do something with key and value + * } + * }); + * + * @example Retrieve a possibly expired item while in passive mode with global onExpire callback + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const cache = cacheFactory.createCache('my-cache', { + * deleteOnExpire: 'passive', + * maxAge: 15 * 60 * 1000 + * onExpire: function (key, value, done) { + * console.log('Expired item:', key); + * if (done) { + * done('foo', key, value); + * } + * } + * }); + * cache.get('foo', { + * // Called if "foo" is expired + * onExpire: function (msg, key, value) { + * console.log(msg); // "foo" + * // Do something with key and value + * } + * }); + * + * @method Cache#get + * @param {string|string[]} key The key of the item to retrieve. + * @param {object} [options] Configuration options. + * @param {function} [options.onExpire] TODO + * @returns {*} The value for the specified `key`, if any. + */ }, { key: 'get', value: function get$$1(key) { + var _this2 = this;var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};if (Array.isArray(key)) { + var keys = key;var values = [];keys.forEach(function (key) { + var value = _this2.get(key, options);if (value !== null && value !== undefined) { + values.push(value); } + });return values; + } else { + if (utils.isNumber(key)) { + key = '' + key; + }if (!this.enabled) { + return; } - - options = options || {}; - if (!utils.isString(key)) { - throw new Error('key must be a string!'); - } else if (options && !utils.isObject(options)) { - throw new Error('options must be an object!'); - } else if (options.onExpire && !utils.isFunction(options.onExpire)) { - throw new Error('options.onExpire must be a function!'); + }if (!utils.isString(key)) { + throw new TypeError('"key" must be a string!'); + } else if (!options || !utils.isObject(options)) { + throw new TypeError('"options" must be an object!'); + } else if (options.onExpire && !utils.isFunction(options.onExpire)) { + throw new TypeError('"options.onExpire" must be a function!'); + }var item = void 0;if (this.$$storage) { + if (this.$$promises[key]) { + return this.$$promises[key]; + }var itemJson = this.$$storage().getItem(this.$$prefix + '.data.' + key);if (itemJson) { + item = utils.fromJson(itemJson); } - - var item = void 0; - - if ($$storage) { - if ($$promises[key]) { - return $$promises[key]; - } - - var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key); - - if (itemJson) { + } else if (utils.isObject(this.$$data)) { + item = this.$$data[key]; + }if (!item) { + return; + }var value = item.value;var now = new Date().getTime();if (this.$$storage) { + this.$$lruHeap.remove({ key: key, accessed: item.accessed });item.accessed = now;this.$$lruHeap.push({ key: key, accessed: now }); + } else { + this.$$lruHeap.remove(item);item.accessed = now;this.$$lruHeap.push(item); + }if (this.$$deleteOnExpire === 'passive' && 'expires' in item && item.expires < now) { + this.remove(key);if (this.$$onExpire) { + this.$$onExpire(key, item.value, options.onExpire); + } else if (options.onExpire) { + options.onExpire.call(this, key, item.value); + }value = undefined; + } else if (this.$$storage) { + this.$$storage().setItem(this.$$prefix + '.data.' + key, utils.toJson(item)); + }return value; + } /** + * Retrieve information about the whole cache or about a particular item in + * the cache. + * + * @example Retrieve info about the cache + * const info = cache.info(); + * info.id; // "my-cache" + * info.capacity; // 100 + * info.maxAge; // 600000 + * info.deleteOnExpire; // "aggressive" + * info.cacheFlushInterval; // null + * info.recycleFreq; // 10000 + * info.storageMode; // "localStorage" + * info.enabled; // false + * info.size; // 1234 + * + * @example Retrieve info about an item in the cache + * const info = cache.info('foo'); + * info.created; // 1234567890 + * info.accessed; // 1234567990 + * info.expires; // 1234569999 + * info.isExpired; // false + * + * @method Cache#info + * @param {string} [key] If specified, retrieve info for a particular item in + * the cache. + * @returns {*} The information object. + */ }, { key: 'info', value: function info(key) { + if (key) { + var item = void 0;if (this.$$storage) { + var itemJson = this.$$storage().getItem(this.$$prefix + '.data.' + key);if (itemJson) { item = utils.fromJson(itemJson); - } else { - return; - } - } else if (utils.isObject($$data)) { - if (!(key in $$data)) { - return; } - - item = $$data[key]; + } else if (utils.isObject(this.$$data)) { + item = this.$$data[key]; + }if (item) { + return { created: item.created, accessed: item.accessed, expires: item.expires, isExpired: new Date().getTime() - item.created > (item.maxAge || this.$$maxAge) }; } - - var value = item.value; - var now = new Date().getTime(); - - if ($$storage) { - $$lruHeap.remove({ - key: key, - accessed: item.accessed - }); - item.accessed = now; - $$lruHeap.push({ - key: key, - accessed: now - }); + } else { + return { id: this.id, capacity: this.capacity, maxAge: this.maxAge, deleteOnExpire: this.deleteOnExpire, onExpire: this.onExpire, cacheFlushInterval: this.cacheFlushInterval, recycleFreq: this.recycleFreq, storageMode: this.storageMode, storageImpl: this.$$storage ? this.$$storage() : undefined, enabled: this.enabled, size: this.$$lruHeap && this.$$lruHeap.size() || 0 }; + } + } /** + * Retrieve a list of the keys of items currently in the cache. + * + * @example + * const keys = cache.keys(); + * + * @method Cache#keys + * @returns {string[]} The keys of the items in the cache + */ }, { key: 'keys', value: function keys() { + var _this3 = this;if (this.$$storage) { + var keysJson = this.$$storage().getItem(this.$$prefix + '.keys');if (keysJson) { + return utils.fromJson(keysJson); } else { - $$lruHeap.remove(item); - item.accessed = now; - $$lruHeap.push(item); - } - - if (this.$$deleteOnExpire === 'passive' && 'expires' in item && item.expires < now) { - this.remove(key); - - if (this.$$onExpire) { - this.$$onExpire(key, item.value, options.onExpire); - } else if (options.onExpire) { - options.onExpire.call(this, key, item.value); - } - value = undefined; - } else if ($$storage) { - $$storage().setItem(this.$$prefix + '.data.' + key, JSON.stringify(item)); + return []; } - - return value; - }, - info: function info(key) { - if (key) { - var item = void 0; - if ($$storage) { - var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key); - - if (itemJson) { - item = utils.fromJson(itemJson); - return { - created: item.created, - accessed: item.accessed, - expires: item.expires, - isExpired: new Date().getTime() - item.created > (item.maxAge || this.$$maxAge) - }; + } else { + return Object.keys(this.$$data).filter(function (key) { + return _this3.$$data[key]; + }); + } + } /** + * Retrieve an object of the keys of items currently in the cache. + * + * @example + * const keySet = cache.keySet(); + * + * @method Cache#keySet + * @returns {object} The keys of the items in the cache. + */ }, { key: 'keySet', value: function keySet() { + var set$$1 = {};this.keys().forEach(function (key) { + set$$1[key] = key; + });return set$$1; + } /** + * Insert an item into the cache. + * + * @example + * const inserted = cache.put('foo', 'bar'); + * + * @method Cache#put + * @param {string} key The key under which to insert the item. + * @param {*} value The value to insert. + * @param {object} [options] Configuration options. + * @param {boolean} [options.storeOnReject] See {@link Cache#storeOnReject}. + * @param {boolean} [options.storeOnResolve] See {@link Cache#storeOnResolve}. + * @returns {*} The inserted value. + */ }, { key: 'put', value: function put(key, value) { + var _this4 = this;var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};var storeOnResolve = options.storeOnResolve !== undefined ? !!options.storeOnResolve : this.$$storeOnResolve;var storeOnReject = options.storeOnReject !== undefined ? !!options.storeOnReject : this.$$storeOnReject;var getHandler = function getHandler(shouldStore, isError) { + return function (v) { + if (shouldStore) { + _this4.$$promises[key] = undefined;if (utils.isObject(v) && 'status' in v && 'data' in v) { + _this4.put(key, [v.status, v.data, v.headers(), v.statusText]); } else { - return undefined; - } - } else if (utils.isObject($$data) && key in $$data) { - item = $$data[key]; - - return { - created: item.created, - accessed: item.accessed, - expires: item.expires, - isExpired: new Date().getTime() - item.created > (item.maxAge || this.$$maxAge) - }; - } else { - return undefined; - } - } else { - return { - id: this.$$id, - capacity: this.$$capacity, - maxAge: this.$$maxAge, - deleteOnExpire: this.$$deleteOnExpire, - onExpire: this.$$onExpire, - cacheFlushInterval: this.$$cacheFlushInterval, - recycleFreq: this.$$recycleFreq, - storageMode: this.$$storageMode, - storageImpl: $$storage ? $$storage() : undefined, - disabled: !!this.$$disabled, - size: $$lruHeap && $$lruHeap.size() || 0 - }; - } - }, - keys: function keys() { - if ($$storage) { - var keysJson = $$storage().getItem(this.$$prefix + '.keys'); - - if (keysJson) { - return utils.fromJson(keysJson); - } else { - return []; - } - } else { - return _keys($$data); - } - }, - keySet: function keySet() { - if ($$storage) { - var keysJson = $$storage().getItem(this.$$prefix + '.keys'); - var kSet = {}; - - if (keysJson) { - var keys = utils.fromJson(keysJson); - - for (var i = 0; i < keys.length; i++) { - kSet[keys[i]] = keys[i]; - } - } - return kSet; - } else { - return _keySet($$data); - } - }, - put: function put(key, value, options) { - var _this3 = this; - - options || (options = {}); - - var storeOnResolve = 'storeOnResolve' in options ? !!options.storeOnResolve : this.$$storeOnResolve; - var storeOnReject = 'storeOnReject' in options ? !!options.storeOnReject : this.$$storeOnReject; - - var getHandler = function getHandler(store, isError) { - return function (v) { - if (store) { - delete $$promises[key]; - if (utils.isObject(v) && 'status' in v && 'data' in v) { - v = [v.status, v.data, v.headers(), v.statusText]; - _this3.put(key, v); - } else { - _this3.put(key, v); - } + _this4.put(key, v); } - if (isError) { - if (utils.Promise) { - return utils.Promise.reject(v); - } else { - throw v; - } + }if (isError) { + if (utils.Promise) { + return utils.Promise.reject(v); } else { - return v; - } - }; - }; - - if (this.$$disabled || !utils.isObject($$data) || value === null || value === undefined) { - return; - } - key = _stringifyNumber(key); - - if (!utils.isString(key)) { - throw new Error('key must be a string!'); - } - - var now = new Date().getTime(); - var item = { - key: key, - value: _isPromiseLike(value) ? value.then(getHandler(storeOnResolve, false), getHandler(storeOnReject, true)) : value, - created: options.created === undefined ? now : options.created, - accessed: options.accessed === undefined ? now : options.accessed - }; - if (options.maxAge) { - item.maxAge = options.maxAge; - } - - if (options.expires === undefined) { - item.expires = item.created + (item.maxAge || this.$$maxAge); - } else { - item.expires = options.expires; - } - - if ($$storage) { - if (_isPromiseLike(item.value)) { - $$promises[key] = item.value; - return $$promises[key]; - } - var keysJson = $$storage().getItem(this.$$prefix + '.keys'); - var keys = keysJson ? utils.fromJson(keysJson) : []; - var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key); - - // Remove existing - if (itemJson) { - this.remove(key); - } - // Add to expires heap - $$expiresHeap.push({ - key: key, - expires: item.expires - }); - // Add to lru heap - $$lruHeap.push({ - key: key, - accessed: item.accessed - }); - // Set item - $$storage().setItem(this.$$prefix + '.data.' + key, JSON.stringify(item)); - var exists = false; - for (var i = 0; i < keys.length; i++) { - if (keys[i] === key) { - exists = true; - break; - } - } - if (!exists) { - keys.push(key); - } - $$storage().setItem(this.$$prefix + '.keys', JSON.stringify(keys)); - } else { - // Remove existing - if ($$data[key]) { - this.remove(key); - } - // Add to expires heap - $$expiresHeap.push(item); - // Add to lru heap - $$lruHeap.push(item); - // Set item - $$data[key] = item; - delete $$promises[key]; - } - - // Handle exceeded capacity - if ($$lruHeap.size() > this.$$capacity) { - this.remove($$lruHeap.peek().key); - } - - return value; - }, - remove: function remove(key) { - key += ''; - delete $$promises[key]; - if ($$storage) { - var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key); - - if (itemJson) { - var item = utils.fromJson(itemJson); - $$lruHeap.remove({ - key: key, - accessed: item.accessed - }); - $$expiresHeap.remove({ - key: key, - expires: item.expires - }); - $$storage().removeItem(this.$$prefix + '.data.' + key); - var keysJson = $$storage().getItem(this.$$prefix + '.keys'); - var keys = keysJson ? utils.fromJson(keysJson) : []; - var index = keys.indexOf(key); - - if (index >= 0) { - keys.splice(index, 1); + throw v; } - $$storage().setItem(this.$$prefix + '.keys', JSON.stringify(keys)); - return item.value; - } - } else if (utils.isObject($$data)) { - var value = $$data[key] ? $$data[key].value : undefined; - $$lruHeap.remove($$data[key]); - $$expiresHeap.remove($$data[key]); - $$data[key] = null; - delete $$data[key]; - return value; - } - }, - removeAll: function removeAll() { - if ($$storage) { - $$lruHeap.removeAll(); - $$expiresHeap.removeAll(); - var keysJson = $$storage().getItem(this.$$prefix + '.keys'); - - if (keysJson) { - var keys = utils.fromJson(keysJson); - - for (var i = 0; i < keys.length; i++) { - this.remove(keys[i]); - } - } - $$storage().setItem(this.$$prefix + '.keys', JSON.stringify([])); - } else if (utils.isObject($$data)) { - $$lruHeap.removeAll(); - $$expiresHeap.removeAll(); - for (var key in $$data) { - $$data[key] = null; - } - $$data = {}; - } else { - $$lruHeap.removeAll(); - $$expiresHeap.removeAll(); - $$data = {}; - } - $$promises = {}; - }, - removeExpired: function removeExpired() { - var now = new Date().getTime(); - var expired = {}; - var key = void 0; - var expiredItem = void 0; - - while ((expiredItem = $$expiresHeap.peek()) && expiredItem.expires <= now) { - expired[expiredItem.key] = expiredItem.value ? expiredItem.value : null; - $$expiresHeap.pop(); - } - - if ($$storage) { - for (key in expired) { - var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key); - if (itemJson) { - expired[key] = utils.fromJson(itemJson).value; - this.remove(key); - } - } - } else { - for (key in expired) { - this.remove(key); + } else { + return v; } - } - - if (this.$$onExpire) { - for (key in expired) { - this.$$onExpire(key, expired[key]); + }; + };if (!this.$$enabled || !utils.isObject(this.$$data) || value === null || value === undefined) { + return; + }if (utils.isNumber(key)) { + key = '' + key; + }if (!utils.isString(key)) { + throw new TypeError('"key" must be a string!'); + }var now = new Date().getTime();var item = { key: key, value: utils.isPromise(value) ? value.then(getHandler(storeOnResolve, false), getHandler(storeOnReject, true)) : value, created: options.created === undefined ? now : options.created, accessed: options.accessed === undefined ? now : options.accessed };if (utils.isNumber(options.maxAge)) { + item.maxAge = options.maxAge; + }if (options.expires === undefined) { + item.expires = item.created + (item.maxAge || this.$$maxAge); + } else { + item.expires = options.expires; + }if (this.$$storage) { + if (utils.isPromise(item.value)) { + this.$$promises[key] = item.value;return this.$$promises[key]; + }var keysJson = this.$$storage().getItem(this.$$prefix + '.keys');var keys = keysJson ? utils.fromJson(keysJson) : [];var itemJson = this.$$storage().getItem(this.$$prefix + '.data.' + key); // Remove existing + if (itemJson) { + this.remove(key); + } // Add to expires heap + this.$$expiresHeap.push({ key: key, expires: item.expires }); // Add to lru heap + this.$$lruHeap.push({ key: key, accessed: item.accessed }); // Set item + this.$$storage().setItem(this.$$prefix + '.data.' + key, utils.toJson(item));var exists = false;keys.forEach(function (_key) { + if (_key === key) { + exists = true;return false; } + });if (!exists) { + keys.push(key); + }this.$$storage().setItem(this.$$prefix + '.keys', utils.toJson(keys)); + } else { + // Remove existing + if (this.$$data[key]) { + this.remove(key); + } // Add to expires heap + this.$$expiresHeap.push(item); // Add to lru heap + this.$$lruHeap.push(item); // Set item + this.$$data[key] = item;this.$$promises[key] = undefined; + } // Handle exceeded capacity + if (this.$$lruHeap.size() > this.$$capacity) { + this.remove(this.$$lruHeap.peek().key); + }return value; + } /** + * Remove an item from the cache. + * + * @example + * const removed = cache.remove('foo'); + * + * @method Cache#remove + * @param {string} key The key of the item to remove. + * @returns {*} The value of the removed item, if any. + */ }, { key: 'remove', value: function remove(key) { + if (utils.isNumber(key)) { + key = '' + key; + }this.$$promises[key] = undefined;if (this.$$storage) { + var itemJson = this.$$storage().getItem(this.$$prefix + '.data.' + key);if (itemJson) { + var item = utils.fromJson(itemJson);this.$$lruHeap.remove({ key: key, accessed: item.accessed });this.$$expiresHeap.remove({ key: key, expires: item.expires });this.$$storage().removeItem(this.$$prefix + '.data.' + key);var keysJson = this.$$storage().getItem(this.$$prefix + '.keys');var keys = keysJson ? utils.fromJson(keysJson) : [];var index = keys.indexOf(key);if (index >= 0) { + keys.splice(index, 1); + }this.$$storage().setItem(this.$$prefix + '.keys', utils.toJson(keys));return item.value; } - - return expired; - }, - setCacheFlushInterval: function setCacheFlushInterval(cacheFlushInterval) { - var _this = this; - if (cacheFlushInterval === null) { - delete _this.$$cacheFlushInterval; - } else if (!utils.isNumber(cacheFlushInterval)) { - throw new Error('cacheFlushInterval must be a number!'); - } else if (cacheFlushInterval < 0) { - throw new Error('cacheFlushInterval must be greater than zero!'); - } else if (cacheFlushInterval !== _this.$$cacheFlushInterval) { - _this.$$cacheFlushInterval = cacheFlushInterval; - - clearInterval(_this.$$cacheFlushIntervalId); // eslint-disable-line - - _this.$$cacheFlushIntervalId = setInterval(function () { - _this.removeAll(); - }, _this.$$cacheFlushInterval); - } - }, - setCapacity: function setCapacity(capacity) { - if (capacity === null) { - delete this.$$capacity; - } else if (!utils.isNumber(capacity)) { - throw new Error('capacity must be a number!'); - } else if (capacity < 0) { - throw new Error('capacity must be greater than zero!'); - } else { - this.$$capacity = capacity; - } - var removed = {}; - while ($$lruHeap.size() > this.$$capacity) { - removed[$$lruHeap.peek().key] = this.remove($$lruHeap.peek().key); - } - return removed; - }, - setDeleteOnExpire: function setDeleteOnExpire(deleteOnExpire, setRecycleFreq) { - if (deleteOnExpire === null) { - delete this.$$deleteOnExpire; - } else if (!utils.isString(deleteOnExpire)) { - throw new Error('deleteOnExpire must be a string!'); - } else if (deleteOnExpire !== 'none' && deleteOnExpire !== 'passive' && deleteOnExpire !== 'aggressive') { - throw new Error('deleteOnExpire must be "none", "passive" or "aggressive"!'); - } else { - this.$$deleteOnExpire = deleteOnExpire; - } - if (setRecycleFreq !== false) { - this.setRecycleFreq(this.$$recycleFreq); - } - }, - setMaxAge: function setMaxAge(maxAge) { - if (maxAge === null) { - this.$$maxAge = Number.MAX_VALUE; - } else if (!utils.isNumber(maxAge)) { - throw new Error('maxAge must be a number!'); - } else if (maxAge < 0) { - throw new Error('maxAge must be greater than zero!'); - } else { - this.$$maxAge = maxAge; - } - var i = void 0, - keys = void 0, - key = void 0; - - $$expiresHeap.removeAll(); - - if ($$storage) { - var keysJson = $$storage().getItem(this.$$prefix + '.keys'); - - keys = keysJson ? utils.fromJson(keysJson) : []; - - for (i = 0; i < keys.length; i++) { - key = keys[i]; - var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key); - - if (itemJson) { - var item = utils.fromJson(itemJson); - if (this.$$maxAge === Number.MAX_VALUE) { - item.expires = Number.MAX_VALUE; - } else { - item.expires = item.created + (item.maxAge || this.$$maxAge); - } - $$expiresHeap.push({ - key: key, - expires: item.expires - }); - } + } else if (utils.isObject(this.$$data)) { + var value = this.$$data[key] ? this.$$data[key].value : undefined;this.$$lruHeap.remove(this.$$data[key]);this.$$expiresHeap.remove(this.$$data[key]);this.$$data[key] = undefined;return value; + } + } /** + * Remove all items from the cache. + * + * @example + * cache.removeAll(); + * + * @method Cache#removeAll + */ }, { key: 'removeAll', value: function removeAll() { + var _this5 = this;var storage = this.$$storage;var keys = this.keys();this.$$lruHeap.removeAll();this.$$expiresHeap.removeAll();if (storage) { + storage().setItem(this.$$prefix + '.keys', utils.toJson([]));keys.forEach(function (key) { + storage().removeItem(_this5.$$prefix + '.data.' + key); + }); + } else if (utils.isObject(this.$$data)) { + this.$$data = {}; + }this.$$promises = {}; + } /** + * Remove expired items from the cache, if any. + * + * @example + * const expiredItems = cache.removeExpired(); + * + * @method Cache#removeExpired + * @returns {object} The expired items, if any. + */ }, { key: 'removeExpired', value: function removeExpired() { + var _this6 = this;var now = new Date().getTime();var expired = {};var expiredItem = void 0;while ((expiredItem = this.$$expiresHeap.peek()) && expiredItem.expires <= now) { + expired[expiredItem.key] = expiredItem.value ? expiredItem.value : null;this.$$expiresHeap.pop(); + }Object.keys(expired).forEach(function (key) { + _this6.remove(key); + });if (this.$$onExpire) { + Object.keys(expired).forEach(function (key) { + _this6.$$onExpire(key, expired[key]); + }); + }return expired; + } /** + * Update the {@link Cache#cacheFlushInterval} for the cache. Pass in `null` + * to disable the interval. + * + * @example + * cache.setCacheFlushInterval(60 * 60 * 1000); + * + * @method Cache#setCacheFlushInterval + * @param {number|null} cacheFlushInterval The new {@link Cache#cacheFlushInterval}. + */ }, { key: 'setCacheFlushInterval', value: function setCacheFlushInterval(cacheFlushInterval) { + var _this7 = this;if (cacheFlushInterval === null) { + this.$$cacheFlushInterval = null; + } else if (!utils.isNumber(cacheFlushInterval)) { + throw new TypeError('"cacheFlushInterval" must be a number!'); + } else if (cacheFlushInterval <= 0) { + throw new Error('"cacheFlushInterval" must be greater than zero!'); + }this.$$cacheFlushInterval = cacheFlushInterval;clearInterval(this.$$cacheFlushIntervalId);this.$$cacheFlushIntervalId = undefined;if (this.$$cacheFlushInterval) { + this.$$cacheFlushIntervalId = setInterval(function () { + return _this7.removeAll(); + }, this.$$cacheFlushInterval); + } + } /** + * Update the {@link Cache#capacity} for the cache. Pass in `null` to reset + * to `Number.MAX_VALUE`. + * + * @example + * cache.setCapacity(1000); + * + * @method Cache#setCapacity + * @param {number|null} capacity The new {@link Cache#capacity}. + */ }, { key: 'setCapacity', value: function setCapacity(capacity) { + if (capacity === null) { + this.$$capacity = Number.MAX_VALUE; + } else if (!utils.isNumber(capacity)) { + throw new TypeError('"capacity" must be a number!'); + } else if (capacity <= 0) { + throw new Error('"capacity" must be greater than zero!'); + } else { + this.$$capacity = capacity; + }var removed = {};while (this.$$lruHeap.size() > this.$$capacity) { + removed[this.$$lruHeap.peek().key] = this.remove(this.$$lruHeap.peek().key); + }return removed; + } /** + * Update the {@link Cache#deleteOnExpire} for the cache. Pass in `null` to + * reset to `"none"`. + * + * @example + * cache.setDeleteOnExpire('passive'); + * + * @method Cache#setDeleteOnExpire + * @param {string|null} deleteOnExpire The new {@link Cache#deleteOnExpire}. + */ }, { key: 'setDeleteOnExpire', value: function setDeleteOnExpire(deleteOnExpire, setRecycleFreq) { + if (deleteOnExpire === null) { + deleteOnExpire = 'none'; + } else if (!utils.isString(deleteOnExpire)) { + throw new TypeError('"deleteOnExpire" must be a string!'); + } else if (deleteOnExpire !== 'none' && deleteOnExpire !== 'passive' && deleteOnExpire !== 'aggressive') { + throw new Error('"deleteOnExpire" must be "none", "passive" or "aggressive"!'); + }this.$$deleteOnExpire = deleteOnExpire;if (setRecycleFreq !== false) { + this.setRecycleFreq(this.$$recycleFreq); + } + } /** + * Update the {@link Cache#maxAge} for the cache. Pass in `null` to reset to + * to `Number.MAX_VALUE`. + * + * @example + * cache.setMaxAge(60 * 60 * 1000); + * + * @method Cache#setMaxAge + * @param {number|null} maxAge The new {@link Cache#maxAge}. + */ }, { key: 'setMaxAge', value: function setMaxAge(maxAge) { + var _this8 = this;if (maxAge === null) { + this.$$maxAge = Number.MAX_VALUE; + } else if (!utils.isNumber(maxAge)) { + throw new TypeError('"maxAge" must be a number!'); + } else if (maxAge <= 0) { + throw new Error('"maxAge" must be greater than zero!'); + } else { + this.$$maxAge = maxAge; + }var keys = this.keys();this.$$expiresHeap.removeAll();if (this.$$storage) { + keys.forEach(function (key) { + var itemJson = _this8.$$storage().getItem(_this8.$$prefix + '.data.' + key);if (itemJson) { + var item = utils.fromJson(itemJson);if (_this8.$$maxAge === Number.MAX_VALUE) { + item.expires = Number.MAX_VALUE; + } else { + item.expires = item.created + (item.maxAge || _this8.$$maxAge); + }_this8.$$expiresHeap.push({ key: key, expires: item.expires }); } - } else { - keys = _keys($$data); - - for (i = 0; i < keys.length; i++) { - key = keys[i]; - if (this.$$maxAge === Number.MAX_VALUE) { - $$data[key].expires = Number.MAX_VALUE; + }); + } else { + keys.forEach(function (key) { + var item = _this8.$$data[key];if (item) { + if (_this8.$$maxAge === Number.MAX_VALUE) { + item.expires = Number.MAX_VALUE; } else { - $$data[key].expires = $$data[key].created + ($$data[key].maxAge || this.$$maxAge); - } - $$expiresHeap.push($$data[key]); + item.expires = item.created + (item.maxAge || _this8.$$maxAge); + }_this8.$$expiresHeap.push(item); } - } - if (this.$$deleteOnExpire === 'aggressive') { - return this.removeExpired(); - } else { - return {}; - } - }, - setOnExpire: function setOnExpire(onExpire) { - if (onExpire === null) { - delete this.$$onExpire; - } else if (!utils.isFunction(onExpire)) { - throw new Error('onExpire must be a function!'); - } else { - this.$$onExpire = onExpire; - } - }, - setOptions: function setOptions(cacheOptions, strict) { - cacheOptions = cacheOptions || {}; - strict = !!strict; - if (!utils.isObject(cacheOptions)) { - throw new Error('cacheOptions must be an object!'); - } - - if ('storagePrefix' in cacheOptions) { - this.$$storagePrefix = cacheOptions.storagePrefix; - } else if (strict) { - this.$$storagePrefix = defaults.storagePrefix; - } - - this.$$prefix = this.$$storagePrefix + this.$$id; - - if ('disabled' in cacheOptions) { - this.$$disabled = !!cacheOptions.disabled; - } else if (strict) { - this.$$disabled = defaults.disabled; - } - - if ('deleteOnExpire' in cacheOptions) { - this.setDeleteOnExpire(cacheOptions.deleteOnExpire, false); - } else if (strict) { - this.setDeleteOnExpire(defaults.deleteOnExpire, false); - } - - if ('recycleFreq' in cacheOptions) { - this.setRecycleFreq(cacheOptions.recycleFreq); - } else if (strict) { - this.setRecycleFreq(defaults.recycleFreq); - } - - if ('maxAge' in cacheOptions) { - this.setMaxAge(cacheOptions.maxAge); - } else if (strict) { - this.setMaxAge(defaults.maxAge); - } - - if ('storeOnResolve' in cacheOptions) { - this.$$storeOnResolve = !!cacheOptions.storeOnResolve; - } else if (strict) { - this.$$storeOnResolve = defaults.storeOnResolve; - } - - if ('storeOnReject' in cacheOptions) { - this.$$storeOnReject = !!cacheOptions.storeOnReject; - } else if (strict) { - this.$$storeOnReject = defaults.storeOnReject; - } - - if ('capacity' in cacheOptions) { - this.setCapacity(cacheOptions.capacity); - } else if (strict) { - this.setCapacity(defaults.capacity); - } - - if ('cacheFlushInterval' in cacheOptions) { - this.setCacheFlushInterval(cacheOptions.cacheFlushInterval); - } else if (strict) { - this.setCacheFlushInterval(defaults.cacheFlushInterval); - } - - if ('onExpire' in cacheOptions) { - this.setOnExpire(cacheOptions.onExpire); - } else if (strict) { - this.setOnExpire(defaults.onExpire); - } - - if ('storageMode' in cacheOptions || 'storageImpl' in cacheOptions) { - this.setStorageMode(cacheOptions.storageMode || defaults.storageMode, cacheOptions.storageImpl || defaults.storageImpl); - } else if (strict) { - this.setStorageMode(defaults.storageMode, defaults.storageImpl); - } - }, - setRecycleFreq: function setRecycleFreq(recycleFreq) { - if (recycleFreq === null) { - delete this.$$recycleFreq; - } else if (!utils.isNumber(recycleFreq)) { - throw new Error('recycleFreq must be a number!'); - } else if (recycleFreq < 0) { - throw new Error('recycleFreq must be greater than zero!'); - } else { - this.$$recycleFreq = recycleFreq; - } - clearInterval(this.$$recycleFreqId); - if (this.$$deleteOnExpire === 'aggressive') { - (function (self) { - self.$$recycleFreqId = setInterval(function () { - self.removeExpired(); - }, self.$$recycleFreq); - })(this); - } else { - delete this.$$recycleFreqId; - } - }, - setStorageMode: function setStorageMode(storageMode, storageImpl) { - if (!utils.isString(storageMode)) { - throw new Error('storageMode must be a string!'); - } else if (storageMode !== 'memory' && storageMode !== 'localStorage' && storageMode !== 'sessionStorage') { - throw new Error('storageMode must be "memory", "localStorage" or "sessionStorage"!'); - } - - var prevStorage = $$storage; - var prevData = $$data; - var shouldReInsert = false; - var items = {}; - - function load(prevStorage, prevData) { - var keys = this.keys(); - var length = keys.length; - if (length) { - var _key = void 0; - var prevDataIsObject = utils.isObject(prevData); - for (var i = 0; i < length; i++) { - _key = keys[i]; - if (prevStorage) { - var itemJson = prevStorage().getItem(this.$$prefix + '.data.' + _key); - if (itemJson) { - items[_key] = utils.fromJson(itemJson); - } - } else if (prevDataIsObject) { - items[_key] = prevData[_key]; - } - this.remove(_key); + }); + }if (this.$$deleteOnExpire === 'aggressive') { + return this.removeExpired(); + } else { + return {}; + } + } /** + * Update the {@link Cache#onExpire} for the cache. Pass in `null` to unset + * the global `onExpire` callback of the cache. + * + * @example + * cache.setOnExpire(function (key, value, done) { + * // Do something + * }); + * + * @method Cache#setOnExpire + * @param {function|null} onExpire The new {@link Cache#onExpire}. + */ }, { key: 'setOnExpire', value: function setOnExpire(onExpire) { + if (onExpire === null) { + this.$$onExpire = null; + } else if (!utils.isFunction(onExpire)) { + throw new TypeError('"onExpire" must be a function!'); + } else { + this.$$onExpire = onExpire; + } + } /** + * Update multiple cache options at a time. + * + * @example + * cache.setOptions({ + * maxAge: 60 * 60 * 1000, + * deleteOnExpire: 'aggressive' + * }); + * + * @example Set two options, and reset the rest to the configured defaults + * cache.setOptions({ + * maxAge: 60 * 60 * 1000, + * deleteOnExpire: 'aggressive' + * }, true); + * + * @method Cache#setOptions + * @param {object} options The options to set. + * @param {boolean} [strict] Reset options not passed to `options` to the + * configured defaults. + */ }, { key: 'setOptions', value: function setOptions() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};var strict = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;if (!utils.isObject(options)) { + throw new TypeError('"options" must be an object!'); + }if (options.storagePrefix !== undefined) { + this.$$storagePrefix = options.storagePrefix; + } else if (strict) { + this.$$storagePrefix = defaults$1.storagePrefix; + }this.$$prefix = this.$$storagePrefix + this.id;if (options.enabled !== undefined) { + this.$$enabled = !!options.enabled; + } else if (strict) { + this.$$enabled = defaults$1.enabled; + }if (options.deleteOnExpire !== undefined) { + this.setDeleteOnExpire(options.deleteOnExpire, false); + } else if (strict) { + this.setDeleteOnExpire(defaults$1.deleteOnExpire, false); + }if (options.recycleFreq !== undefined) { + this.setRecycleFreq(options.recycleFreq); + } else if (strict) { + this.setRecycleFreq(defaults$1.recycleFreq); + }if (options.maxAge !== undefined) { + this.setMaxAge(options.maxAge); + } else if (strict) { + this.setMaxAge(defaults$1.maxAge); + }if (options.storeOnResolve !== undefined) { + this.$$storeOnResolve = !!options.storeOnResolve; + } else if (strict) { + this.$$storeOnResolve = defaults$1.storeOnResolve; + }if (options.storeOnReject !== undefined) { + this.$$storeOnReject = !!options.storeOnReject; + } else if (strict) { + this.$$storeOnReject = defaults$1.storeOnReject; + }if (options.capacity !== undefined) { + this.setCapacity(options.capacity); + } else if (strict) { + this.setCapacity(defaults$1.capacity); + }if (options.cacheFlushInterval !== undefined) { + this.setCacheFlushInterval(options.cacheFlushInterval); + } else if (strict) { + this.setCacheFlushInterval(defaults$1.cacheFlushInterval); + }if (options.onExpire !== undefined) { + this.setOnExpire(options.onExpire); + } else if (strict) { + this.setOnExpire(defaults$1.onExpire); + }if (options.storageMode !== undefined || options.storageImpl !== undefined) { + this.setStorageMode(options.storageMode || defaults$1.storageMode, options.storageImpl || defaults$1.storageImpl); + } else if (strict) { + this.setStorageMode(defaults$1.storageMode, defaults$1.storageImpl); + } + } /** + * Update the {@link Cache#recycleFreq} for the cache. Pass in `null` to + * disable the interval. + * + * @example + * cache.setRecycleFreq(10000); + * + * @method Cache#setRecycleFreq + * @param {number|null} recycleFreq The new {@link Cache#recycleFreq}. + */ }, { key: 'setRecycleFreq', value: function setRecycleFreq(recycleFreq) { + var _this9 = this;if (recycleFreq === null) { + this.$$recycleFreq = null; + } else if (!utils.isNumber(recycleFreq)) { + throw new TypeError('"recycleFreq" must be a number!'); + } else if (recycleFreq <= 0) { + throw new Error('"recycleFreq" must be greater than zero!'); + } else { + this.$$recycleFreq = recycleFreq; + }clearInterval(this.$$recycleFreqId);if (this.$$deleteOnExpire === 'aggressive' && this.$$recycleFreq) { + this.$$recycleFreqId = setInterval(function () { + return _this9.removeExpired(); + }, this.$$recycleFreq); + } else { + this.$$recycleFreqId = undefined; + } + } /** + * Update the {@link Cache#storageMode} for the cache. + * + * @method Cache#setStorageMode + * @param {string} storageMode The new {@link Cache#storageMode}. + * @param {object} storageImpl The new {@link Cache~StorageImpl}. + */ }, { key: 'setStorageMode', value: function setStorageMode(storageMode, storageImpl) { + var _this10 = this;if (!utils.isString(storageMode)) { + throw new TypeError('"storageMode" must be a string!'); + } else if (storageMode !== 'memory' && storageMode !== 'localStorage' && storageMode !== 'sessionStorage') { + throw new Error('"storageMode" must be "memory", "localStorage", or "sessionStorage"!'); + }var prevStorage = this.$$storage;var prevData = this.$$data;var shouldReInsert = false;var items = {};var load = function load(prevStorage, prevData) { + var keys = _this10.keys();var prevDataIsObject = utils.isObject(prevData);keys.forEach(function (key) { + if (prevStorage) { + var itemJson = prevStorage().getItem(_this10.$$prefix + '.data.' + key);if (itemJson) { + items[key] = utils.fromJson(itemJson); } - shouldReInsert = true; - } - } - - if (!this.$$initializing) { - load.call(this, prevStorage, prevData); - } - - this.$$storageMode = storageMode; - - if (storageImpl) { - if (!utils.isObject(storageImpl)) { - throw new Error('storageImpl must be an object!'); - } else if (!('setItem' in storageImpl) || typeof storageImpl.setItem !== 'function') { - throw new Error('storageImpl must implement "setItem(key, value)"!'); - } else if (!('getItem' in storageImpl) || typeof storageImpl.getItem !== 'function') { - throw new Error('storageImpl must implement "getItem(key)"!'); - } else if (!('removeItem' in storageImpl) || typeof storageImpl.removeItem !== 'function') { - throw new Error('storageImpl must implement "removeItem(key)"!'); - } - $$storage = function $$storage() { - return storageImpl; + } else if (prevDataIsObject) { + items[key] = prevData[key]; + }_this10.remove(key);shouldReInsert || (shouldReInsert = true); + }); + };if (!this.$$initializing) { + load(prevStorage, prevData); + }this.$$storageMode = storageMode;if (storageImpl) { + if (!utils.isObject(storageImpl)) { + throw new TypeError('"storageImpl" must be an object!'); + } else if (typeof storageImpl.setItem !== 'function') { + throw new Error('"storageImpl" must implement "setItem(key, value)"!'); + } else if (typeof storageImpl.getItem !== 'function') { + throw new Error('"storageImpl" must implement "getItem(key)"!'); + } else if (typeof storageImpl.removeItem !== 'function') { + throw new Error('"storageImpl" must implement "removeItem(key)"!'); + }this.$$storage = function () { + return storageImpl; + }; + } else if (this.$$storageMode === 'localStorage') { + try { + localStorage.setItem('cachefactory', 'cachefactory');localStorage.removeItem('cachefactory');this.$$storage = function () { + return localStorage; }; - } else if (this.$$storageMode === 'localStorage') { - try { - localStorage.setItem('cachefactory', 'cachefactory'); - localStorage.removeItem('cachefactory'); - $$storage = function $$storage() { - return localStorage; - }; - } catch (e) { - $$storage = null; - this.$$storageMode = 'memory'; - } - } else if (this.$$storageMode === 'sessionStorage') { - try { - sessionStorage.setItem('cachefactory', 'cachefactory'); - sessionStorage.removeItem('cachefactory'); - $$storage = function $$storage() { - return sessionStorage; - }; - } catch (e) { - $$storage = null; - this.$$storageMode = 'memory'; - } - } else { - $$storage = null; - this.$$storageMode = 'memory'; - } - - if (this.$$initializing) { - load.call(this, $$storage, $$data); + } catch (e) { + this.$$storage = null;this.$$storageMode = 'memory'; } - - if (shouldReInsert) { - var item = void 0; - for (var key in items) { - item = items[key]; - this.put(key, item.value, { - created: item.created, - accessed: item.accessed, - expires: item.expires - }); - } + } else if (this.$$storageMode === 'sessionStorage') { + try { + sessionStorage.setItem('cachefactory', 'cachefactory');sessionStorage.removeItem('cachefactory');this.$$storage = function () { + return sessionStorage; + }; + } catch (e) { + this.$$storage = null;this.$$storageMode = 'memory'; } - }, - touch: function touch(key, options) { - var _this4 = this; - - if (key) { - var val = this.get(key, { - onExpire: function onExpire(k, v) { - return _this4.put(k, v); - } - }); - if (val) { - this.put(key, val, options); - } - } else { - var keys = this.keys(); - for (var i = 0; i < keys.length; i++) { - this.touch(keys[i], options); - } + } else { + this.$$storage = null;this.$$storageMode = 'memory'; + }if (this.$$initializing) { + load(this.$$storage, this.$$data); + }if (shouldReInsert) { + Object.keys(items).forEach(function (key) { + var item = items[key];_this10.put(key, item.value, { created: item.created, accessed: item.accessed, expires: item.expires }); + }); + } + } /** + * Reset an item's age in the cache, or if `key` is unspecified, touch all + * items in the cache. + * + * @example + * cache.touch('foo'); + * + * @method Cache#touch + * @param {string} [key] The key of the item to touch. + * @param {object} [options] Options to pass to {@link Cache#put} if + * necessary. + */ }, { key: 'touch', value: function touch(key, options) { + var _this11 = this;if (key) { + var val = this.get(key, { onExpire: function onExpire(k, v) { + return _this11.put(k, v); + } });if (val) { + this.put(key, val, options); } - }, - values: function values() { - var keys = this.keys(); - var items = []; - for (var i = 0; i < keys.length; i++) { - items.push(this.get(keys[i])); + } else { + var keys = this.keys();for (var i = 0; i < keys.length; i++) { + this.touch(keys[i], options); } - return items; } - }; - - cache.$$initializing = true; - cache.setOptions(options, true); - cache.$$initializing = false; - - return cache; - } - - function CacheFactory(cacheId, options) { - return createCache(cacheId, options); - } - - CacheFactory.createCache = createCache; - CacheFactory.defaults = defaults; - - CacheFactory.info = function () { - var keys = _keys(caches); - var info = { - size: keys.length, - caches: {} - }; - for (var opt in defaults) { - if (defaults.hasOwnProperty(opt)) { - info[opt] = defaults[opt]; - } - } - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - info.caches[key] = caches[key].info(); - } - return info; - }; - - CacheFactory.get = function (cacheId) { - return caches[cacheId]; - }; - CacheFactory.keySet = function () { - return _keySet(caches); - }; - CacheFactory.keys = function () { - return _keys(caches); + } /** + * Retrieve the values of all items in the cache. + * + * @example + * const values = cache.values(); + * + * @method Cache#values + * @returns {array} The values of the items in the cache. + */ }, { key: 'values', value: function values() { + var _this12 = this;return this.keys().map(function (key) { + return _this12.get(key); + }); + } }]);return Cache; +}(); + +var CacheFactory = function () { + function CacheFactory() { + classCallCheck$$1(this, CacheFactory);Object.defineProperty(this, 'caches', { writable: true, value: {} }); + } /** + * Calls {@link Cache#removeAll} on each {@link Cache} in this + * {@link CacheFactory}. + * + * @example + * cacheFactory.clearAll(); + * + * @method CacheFactory#clearAll + */createClass$$1(CacheFactory, [{ key: 'clearAll', value: function clearAll() { + var _this = this;this.keys().forEach(function (cacheId) { + _this.get(cacheId).removeAll(); + }); + } /** + * Create a new {@link Cache}. If a cache with the same `id` had been created + * in a previous browser session, then it will attempt to load any data that + * had been saved previously. + * + * @example + * import CacheFactory from 'cachefactory'; + * + * const cacheFactory = new CacheFactory(); + * const options = {...}; + * const cache = cacheFactory.createCache('my-cache', options); + * + * cache.put('foo', 'bar'); + * console.log(cache.get('foo')); // "bar" + * + * @method CacheFactory#createCache + * @param {string} id A unique identifier for the new {@link Cache}. + * @param {object} [options] Configuration options. See {@link Cache}. + * @returns {Cache} The new {@link Cache} instance. + */ }, { key: 'createCache', value: function createCache(id) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};if (this.caches[id]) { + throw new Error('cache "' + id + '" already exists!'); + }options.parent = this;this.caches[id] = new CacheFactory.Cache(id, options);return this.caches[id]; + } /** + * Calls {@link Cache#destroy} on the {@link Cache} in this + * {@link CacheFactory} that has the specified `id`. + * + * @example + * cacheFactory.destroy('my-cache'); + * + * @method CacheFactory#destroy + * @param {string} id TODO + */ }, { key: 'destroy', value: function destroy(id) { + this.get(id).destroy();this.caches[id] = undefined; + } /** + * Calls {@link Cache#destroy} on each {@link Cache} in this + * {@link CacheFactory}. + * + * @example + * cacheFactory.destroyAll(); + * + * @method CacheFactory#destroyAll + */ }, { key: 'destroyAll', value: function destroyAll() { + var _this2 = this;this.keys().forEach(function (id) { + _this2.get(id).destroy(); + });this.caches = {}; + } /** + * Calls {@link Cache#disable} on each {@link Cache} in this + * {@link CacheFactory}. + * + * @example + * cacheFactory.disableAll(); + * + * @method CacheFactory#disableAll + */ }, { key: 'disableAll', value: function disableAll() { + var _this3 = this;this.keys().forEach(function (cacheId) { + _this3.get(cacheId).disable(); + }); + } /** + * Calls {@link Cache#enable} on each {@link Cache} in this + * {@link CacheFactory}. + * + * @example + * cacheFactory.enableAll(); + * + * @method CacheFactory#enableAll + */ }, { key: 'enableAll', value: function enableAll() { + var _this4 = this;this.keys().forEach(function (cacheId) { + _this4.get(cacheId).enable(); + }); + } /** + * Returns whether the {@link Cache} with the specified `id` exists in this + * {@link CacheFactory}. + * + * @example + * const exists = cacheFactory.exists('my-cache'); + * + * @method CacheFactory#exists + * @returns {boolean} Whether the {@link Cache} with the specified `id` exists + * in this {@link CacheFactory}. + */ }, { key: 'exists', value: function exists(id) { + return !!this.caches[id]; + } /** + * Returns a reference to the {@link Cache} in this {@link CacheFactory} that + * has the specified `id`. + * + * @example + * const cache = cacheFactory.get('my-cache'); + * + * @method CacheFactory#get + * @param {string} id The `id` of the {@link Cache} to retrieve. + * @returns {Cache} The {@link Cache} instance. + * @throws {ReferenceError} Throws a `ReferenceError` if the {@link Cache} + * does not exist. + */ }, { key: 'get', value: function get$$1(id) { + var cache = this.caches[id];if (!cache) { + throw new ReferenceError('Cache "' + id + '" does not exist!'); + }return cache; + } /** + * Returns information on this {@link CacheFactory} and its {@link Cache} + * instance. + * + * @example + * const info = cacheFactory.info(); + * info.size; // 3 + * info.caches['my-cache']; // { size: 1234, ... } + * info.caches['my-cache2']; // { size: 51, ... } + * info.caches['my-cache3']; // { size: 43, ... } + * + * @method CacheFactory#info + * @returns {object} The detailed information. + */ }, { key: 'info', value: function info() { + var _this5 = this;var keys = this.keys();var info = { size: keys.length, caches: {} };keys.forEach(function (cacheId) { + info.caches[cacheId] = _this5.get(cacheId).info(); + });Object.keys(defaults$1).forEach(function (key, value) { + info[key] = defaults$1[key]; + });return info; + } /** + * Returns an array of identifiers of the {@link Cache} instances in this + * {@link CacheFactory}. + * + * @example + * const keys = cacheFactory.keys(); + * + * @method CacheFactory#keys + * @returns {string[]} The {@link Cache} identifiers. + */ }, { key: 'keys', value: function keys() { + var _this6 = this;return Object.keys(this.caches).filter(function (key) { + return _this6.caches[key]; + }); + } /** + * Returns an object of key-value pairs representing the identifiers of the + * {@link Cache} instances in this {@link CacheFactory}. + * + * @example + * const keySet = cacheFactory.keySet(); + * + * @method CacheFactory#keySet + * @returns {object} The {@link Cache} identifiers. + */ }, { key: 'keySet', value: function keySet() { + var set$$1 = {};this.keys().forEach(function (key) { + set$$1[key] = key; + });return set$$1; + } /** + * Calls {@link Cache#removeExpired} on each {@link Cache} in this + * {@link CacheFactory} and returns the removed items, if any. + * + * @example + * const expired = cacheFactory.removeExpiredFromAll(); + * + * @method CacheFactory#removeExpiredFromAll + * @returns {object} The removed items, if any. + */ }, { key: 'removeExpiredFromAll', value: function removeExpiredFromAll() { + var _this7 = this;var expired = {};this.keys().forEach(function (id) { + expired[id] = _this7.get(id).removeExpired(); + });return expired; + } /** + * Calls {@link Cache#touch} on each {@link Cache} in this + * {@link CacheFactory}. + * + * @example + * cacheFactory.touchAll(); + * + * @method CacheFactory#touchAll + */ }, { key: 'touchAll', value: function touchAll() { + var _this8 = this;this.keys().forEach(function (cacheId) { + _this8.get(cacheId).touch(); + }); + } }]);return CacheFactory; +}(); + +CacheFactory.Cache = Cache; + +utils.equals = angular.equals; +utils.isObject = angular.isObject; +utils.fromJson = angular.fromJson; + +function BinaryHeapProvider() { + this.$get = function () { + return BinaryHeap; }; - CacheFactory.destroy = function (cacheId) { - if (caches[cacheId]) { - caches[cacheId].destroy(); - delete caches[cacheId]; - } - }; - CacheFactory.destroyAll = function () { - for (var cacheId in caches) { - caches[cacheId].destroy(); - } - caches = {}; - }; - CacheFactory.clearAll = function () { - for (var cacheId in caches) { - caches[cacheId].removeAll(); - } - }; - CacheFactory.removeExpiredFromAll = function () { - var expired = {}; - for (var cacheId in caches) { - expired[cacheId] = caches[cacheId].removeExpired(); - } - return expired; - }; - CacheFactory.enableAll = function () { - for (var cacheId in caches) { - caches[cacheId].$$disabled = false; - } - }; - CacheFactory.disableAll = function () { - for (var cacheId in caches) { - caches[cacheId].$$disabled = true; - } - }; - CacheFactory.touchAll = function () { - for (var cacheId in caches) { - caches[cacheId].touch(); - } - }; - - CacheFactory.utils = utils; - CacheFactory.BinaryHeap = BinaryHeap; +} - CacheFactory.utils.equals = angular.equals; - CacheFactory.utils.isObject = angular.isObject; - CacheFactory.utils.fromJson = angular.fromJson; +function CacheFactoryProvider() { + this.defaults = defaults$1; + this.defaults.storagePrefix = 'angular-cache.caches.'; - function BinaryHeapProvider() { - this.$get = function () { - return CacheFactory.BinaryHeap; - }; - } - - function CacheFactoryProvider() { - this.defaults = CacheFactory.defaults; - this.defaults.storagePrefix = 'angular-cache.caches.'; - - this.$get = ['$q', function ($q) { - CacheFactory.utils.Promise = $q; - return CacheFactory; - }]; - } + this.$get = ['$q', function ($q) { + utils.Promise = $q; + return new CacheFactory(); + }]; +} - angular.module('angular-cache', []).provider('BinaryHeap', BinaryHeapProvider).provider('CacheFactory', CacheFactoryProvider); +angular.module('angular-cache', []).provider('BinaryHeap', BinaryHeapProvider).provider('CacheFactory', CacheFactoryProvider); - var index = 'angular-cache'; +var index = 'angular-cache'; - return index; +return index; -})); -//# sourceMappingURL=angular-cache.js.map \ No newline at end of file +}))); +//# sourceMappingURL=angular-cache.js.map diff --git a/dist/angular-cache.js.map b/dist/angular-cache.js.map index ca27a6f..ef31322 100644 --- a/dist/angular-cache.js.map +++ b/dist/angular-cache.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-cache.js","sources":["../node_modules/cachefactory/dist/cachefactory.es2015.js","../src/index.js"],"sourcesContent":["/**\n * CacheFactory\n * @version 1.5.1 - Homepage \n * @copyright (c) 2013-2016 CacheFactory project authors\n * @license MIT \n * @overview CacheFactory is a very simple and useful cache for the browser.\n */\nvar babelHelpers = {};\nbabelHelpers.typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n};\nbabelHelpers;\n\n/**\n * @method bubbleUp\n * @param {array} heap The heap.\n * @param {function} weightFunc The weight function.\n * @param {number} n The index of the element to bubble up.\n */\nvar bubbleUp = function bubbleUp(heap, weightFunc, n) {\n var element = heap[n];\n var weight = weightFunc(element);\n // When at 0, an element can not go up any further.\n while (n > 0) {\n // Compute the parent element's index, and fetch it.\n var parentN = Math.floor((n + 1) / 2) - 1;\n var parent = heap[parentN];\n // If the parent has a lesser weight, things are in order and we\n // are done.\n if (weight >= weightFunc(parent)) {\n break;\n } else {\n heap[parentN] = element;\n heap[n] = parent;\n n = parentN;\n }\n }\n};\n\n/**\n * @method bubbleDown\n * @param {array} heap The heap.\n * @param {function} weightFunc The weight function.\n * @param {number} n The index of the element to sink down.\n */\nvar bubbleDown = function bubbleDown(heap, weightFunc, n) {\n var length = heap.length;\n var node = heap[n];\n var nodeWeight = weightFunc(node);\n\n while (true) {\n var child2N = (n + 1) * 2;\n var child1N = child2N - 1;\n var swap = null;\n if (child1N < length) {\n var child1 = heap[child1N];\n var child1Weight = weightFunc(child1);\n // If the score is less than our node's, we need to swap.\n if (child1Weight < nodeWeight) {\n swap = child1N;\n }\n }\n // Do the same checks for the other child.\n if (child2N < length) {\n var child2 = heap[child2N];\n var child2Weight = weightFunc(child2);\n if (child2Weight < (swap === null ? nodeWeight : weightFunc(heap[child1N]))) {\n swap = child2N;\n }\n }\n\n if (swap === null) {\n break;\n } else {\n heap[n] = heap[swap];\n heap[swap] = node;\n n = swap;\n }\n }\n};\n\nfunction BinaryHeap(weightFunc, compareFunc) {\n if (!weightFunc) {\n weightFunc = function weightFunc(x) {\n return x;\n };\n }\n if (!compareFunc) {\n compareFunc = function compareFunc(x, y) {\n return x === y;\n };\n }\n if (typeof weightFunc !== 'function') {\n throw new Error('BinaryHeap([weightFunc][, compareFunc]): \"weightFunc\" must be a function!');\n }\n if (typeof compareFunc !== 'function') {\n throw new Error('BinaryHeap([weightFunc][, compareFunc]): \"compareFunc\" must be a function!');\n }\n this.weightFunc = weightFunc;\n this.compareFunc = compareFunc;\n this.heap = [];\n}\n\nvar BHProto = BinaryHeap.prototype;\n\nBHProto.push = function (node) {\n this.heap.push(node);\n bubbleUp(this.heap, this.weightFunc, this.heap.length - 1);\n};\n\nBHProto.peek = function () {\n return this.heap[0];\n};\n\nBHProto.pop = function () {\n var front = this.heap[0];\n var end = this.heap.pop();\n if (this.heap.length > 0) {\n this.heap[0] = end;\n bubbleDown(this.heap, this.weightFunc, 0);\n }\n return front;\n};\n\nBHProto.remove = function (node) {\n var length = this.heap.length;\n for (var i = 0; i < length; i++) {\n if (this.compareFunc(this.heap[i], node)) {\n var removed = this.heap[i];\n var end = this.heap.pop();\n if (i !== length - 1) {\n this.heap[i] = end;\n bubbleUp(this.heap, this.weightFunc, i);\n bubbleDown(this.heap, this.weightFunc, i);\n }\n return removed;\n }\n }\n return null;\n};\n\nBHProto.removeAll = function () {\n this.heap = [];\n};\n\nBHProto.size = function () {\n return this.heap.length;\n};\n\nvar _Promise = null;\ntry {\n _Promise = window.Promise;\n} catch (e) {}\n\nvar utils = {\n isNumber: function isNumber(value) {\n return typeof value === 'number';\n },\n isString: function isString(value) {\n return typeof value === 'string';\n },\n isObject: function isObject(value) {\n return value !== null && (typeof value === 'undefined' ? 'undefined' : babelHelpers.typeof(value)) === 'object';\n },\n isFunction: function isFunction(value) {\n return typeof value === 'function';\n },\n fromJson: function fromJson(value) {\n return JSON.parse(value);\n },\n equals: function equals(a, b) {\n return a === b;\n },\n\n\n Promise: _Promise\n};\n\nfunction _keys(collection) {\n var keys = [];\n var key = void 0;\n if (!utils.isObject(collection)) {\n return keys;\n }\n for (key in collection) {\n if (collection.hasOwnProperty(key)) {\n keys.push(key);\n }\n }\n return keys;\n}\n\nfunction _isPromiseLike(value) {\n return value && typeof value.then === 'function';\n}\n\nfunction _stringifyNumber(number) {\n if (utils.isNumber(number)) {\n return number.toString();\n }\n return number;\n}\n\nfunction _keySet(collection) {\n var keySet = {};\n var key = void 0;\n if (!utils.isObject(collection)) {\n return keySet;\n }\n for (key in collection) {\n if (collection.hasOwnProperty(key)) {\n keySet[key] = key;\n }\n }\n return keySet;\n}\n\nvar defaults = {\n capacity: Number.MAX_VALUE,\n maxAge: Number.MAX_VALUE,\n deleteOnExpire: 'none',\n onExpire: null,\n cacheFlushInterval: null,\n recycleFreq: 1000,\n storageMode: 'memory',\n storageImpl: null,\n disabled: false,\n storagePrefix: 'cachefactory.caches.',\n storeOnResolve: false,\n storeOnReject: false\n};\n\nvar caches = {};\n\nfunction createCache(cacheId, options) {\n if (cacheId in caches) {\n throw new Error(cacheId + ' already exists!');\n } else if (!utils.isString(cacheId)) {\n throw new Error('cacheId must be a string!');\n }\n\n var $$data = {};\n var $$promises = {};\n var $$storage = null;\n var $$expiresHeap = new BinaryHeap(function (x) {\n return x.expires;\n }, utils.equals);\n var $$lruHeap = new BinaryHeap(function (x) {\n return x.accessed;\n }, utils.equals);\n\n var cache = caches[cacheId] = {\n\n $$id: cacheId,\n\n destroy: function destroy() {\n clearInterval(this.$$cacheFlushIntervalId);\n clearInterval(this.$$recycleFreqId);\n this.removeAll();\n if ($$storage) {\n $$storage().removeItem(this.$$prefix + '.keys');\n $$storage().removeItem(this.$$prefix);\n }\n $$storage = null;\n $$data = null;\n $$lruHeap = null;\n $$expiresHeap = null;\n this.$$prefix = null;\n delete caches[this.$$id];\n },\n disable: function disable() {\n this.$$disabled = true;\n },\n enable: function enable() {\n delete this.$$disabled;\n },\n get: function get(key, options) {\n var _this2 = this;\n\n if (Array.isArray(key)) {\n var _ret = function () {\n var keys = key;\n var values = [];\n\n keys.forEach(function (key) {\n var value = _this2.get(key, options);\n if (value !== null && value !== undefined) {\n values.push(value);\n }\n });\n\n return {\n v: values\n };\n }();\n\n if ((typeof _ret === 'undefined' ? 'undefined' : babelHelpers.typeof(_ret)) === \"object\") return _ret.v;\n } else {\n key = _stringifyNumber(key);\n\n if (this.$$disabled) {\n return;\n }\n }\n\n options = options || {};\n if (!utils.isString(key)) {\n throw new Error('key must be a string!');\n } else if (options && !utils.isObject(options)) {\n throw new Error('options must be an object!');\n } else if (options.onExpire && !utils.isFunction(options.onExpire)) {\n throw new Error('options.onExpire must be a function!');\n }\n\n var item = void 0;\n\n if ($$storage) {\n if ($$promises[key]) {\n return $$promises[key];\n }\n\n var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key);\n\n if (itemJson) {\n item = utils.fromJson(itemJson);\n } else {\n return;\n }\n } else if (utils.isObject($$data)) {\n if (!(key in $$data)) {\n return;\n }\n\n item = $$data[key];\n }\n\n var value = item.value;\n var now = new Date().getTime();\n\n if ($$storage) {\n $$lruHeap.remove({\n key: key,\n accessed: item.accessed\n });\n item.accessed = now;\n $$lruHeap.push({\n key: key,\n accessed: now\n });\n } else {\n $$lruHeap.remove(item);\n item.accessed = now;\n $$lruHeap.push(item);\n }\n\n if (this.$$deleteOnExpire === 'passive' && 'expires' in item && item.expires < now) {\n this.remove(key);\n\n if (this.$$onExpire) {\n this.$$onExpire(key, item.value, options.onExpire);\n } else if (options.onExpire) {\n options.onExpire.call(this, key, item.value);\n }\n value = undefined;\n } else if ($$storage) {\n $$storage().setItem(this.$$prefix + '.data.' + key, JSON.stringify(item));\n }\n\n return value;\n },\n info: function info(key) {\n if (key) {\n var item = void 0;\n if ($$storage) {\n var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key);\n\n if (itemJson) {\n item = utils.fromJson(itemJson);\n return {\n created: item.created,\n accessed: item.accessed,\n expires: item.expires,\n isExpired: new Date().getTime() - item.created > (item.maxAge || this.$$maxAge)\n };\n } else {\n return undefined;\n }\n } else if (utils.isObject($$data) && key in $$data) {\n item = $$data[key];\n\n return {\n created: item.created,\n accessed: item.accessed,\n expires: item.expires,\n isExpired: new Date().getTime() - item.created > (item.maxAge || this.$$maxAge)\n };\n } else {\n return undefined;\n }\n } else {\n return {\n id: this.$$id,\n capacity: this.$$capacity,\n maxAge: this.$$maxAge,\n deleteOnExpire: this.$$deleteOnExpire,\n onExpire: this.$$onExpire,\n cacheFlushInterval: this.$$cacheFlushInterval,\n recycleFreq: this.$$recycleFreq,\n storageMode: this.$$storageMode,\n storageImpl: $$storage ? $$storage() : undefined,\n disabled: !!this.$$disabled,\n size: $$lruHeap && $$lruHeap.size() || 0\n };\n }\n },\n keys: function keys() {\n if ($$storage) {\n var keysJson = $$storage().getItem(this.$$prefix + '.keys');\n\n if (keysJson) {\n return utils.fromJson(keysJson);\n } else {\n return [];\n }\n } else {\n return _keys($$data);\n }\n },\n keySet: function keySet() {\n if ($$storage) {\n var keysJson = $$storage().getItem(this.$$prefix + '.keys');\n var kSet = {};\n\n if (keysJson) {\n var keys = utils.fromJson(keysJson);\n\n for (var i = 0; i < keys.length; i++) {\n kSet[keys[i]] = keys[i];\n }\n }\n return kSet;\n } else {\n return _keySet($$data);\n }\n },\n put: function put(key, value, options) {\n var _this3 = this;\n\n options || (options = {});\n\n var storeOnResolve = 'storeOnResolve' in options ? !!options.storeOnResolve : this.$$storeOnResolve;\n var storeOnReject = 'storeOnReject' in options ? !!options.storeOnReject : this.$$storeOnReject;\n\n var getHandler = function getHandler(store, isError) {\n return function (v) {\n if (store) {\n delete $$promises[key];\n if (utils.isObject(v) && 'status' in v && 'data' in v) {\n v = [v.status, v.data, v.headers(), v.statusText];\n _this3.put(key, v);\n } else {\n _this3.put(key, v);\n }\n }\n if (isError) {\n if (utils.Promise) {\n return utils.Promise.reject(v);\n } else {\n throw v;\n }\n } else {\n return v;\n }\n };\n };\n\n if (this.$$disabled || !utils.isObject($$data) || value === null || value === undefined) {\n return;\n }\n key = _stringifyNumber(key);\n\n if (!utils.isString(key)) {\n throw new Error('key must be a string!');\n }\n\n var now = new Date().getTime();\n var item = {\n key: key,\n value: _isPromiseLike(value) ? value.then(getHandler(storeOnResolve, false), getHandler(storeOnReject, true)) : value,\n created: options.created === undefined ? now : options.created,\n accessed: options.accessed === undefined ? now : options.accessed\n };\n if (options.maxAge) {\n item.maxAge = options.maxAge;\n }\n\n if (options.expires === undefined) {\n item.expires = item.created + (item.maxAge || this.$$maxAge);\n } else {\n item.expires = options.expires;\n }\n\n if ($$storage) {\n if (_isPromiseLike(item.value)) {\n $$promises[key] = item.value;\n return $$promises[key];\n }\n var keysJson = $$storage().getItem(this.$$prefix + '.keys');\n var keys = keysJson ? utils.fromJson(keysJson) : [];\n var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key);\n\n // Remove existing\n if (itemJson) {\n this.remove(key);\n }\n // Add to expires heap\n $$expiresHeap.push({\n key: key,\n expires: item.expires\n });\n // Add to lru heap\n $$lruHeap.push({\n key: key,\n accessed: item.accessed\n });\n // Set item\n $$storage().setItem(this.$$prefix + '.data.' + key, JSON.stringify(item));\n var exists = false;\n for (var i = 0; i < keys.length; i++) {\n if (keys[i] === key) {\n exists = true;\n break;\n }\n }\n if (!exists) {\n keys.push(key);\n }\n $$storage().setItem(this.$$prefix + '.keys', JSON.stringify(keys));\n } else {\n // Remove existing\n if ($$data[key]) {\n this.remove(key);\n }\n // Add to expires heap\n $$expiresHeap.push(item);\n // Add to lru heap\n $$lruHeap.push(item);\n // Set item\n $$data[key] = item;\n delete $$promises[key];\n }\n\n // Handle exceeded capacity\n if ($$lruHeap.size() > this.$$capacity) {\n this.remove($$lruHeap.peek().key);\n }\n\n return value;\n },\n remove: function remove(key) {\n key += '';\n delete $$promises[key];\n if ($$storage) {\n var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key);\n\n if (itemJson) {\n var item = utils.fromJson(itemJson);\n $$lruHeap.remove({\n key: key,\n accessed: item.accessed\n });\n $$expiresHeap.remove({\n key: key,\n expires: item.expires\n });\n $$storage().removeItem(this.$$prefix + '.data.' + key);\n var keysJson = $$storage().getItem(this.$$prefix + '.keys');\n var keys = keysJson ? utils.fromJson(keysJson) : [];\n var index = keys.indexOf(key);\n\n if (index >= 0) {\n keys.splice(index, 1);\n }\n $$storage().setItem(this.$$prefix + '.keys', JSON.stringify(keys));\n return item.value;\n }\n } else if (utils.isObject($$data)) {\n var value = $$data[key] ? $$data[key].value : undefined;\n $$lruHeap.remove($$data[key]);\n $$expiresHeap.remove($$data[key]);\n $$data[key] = null;\n delete $$data[key];\n return value;\n }\n },\n removeAll: function removeAll() {\n if ($$storage) {\n $$lruHeap.removeAll();\n $$expiresHeap.removeAll();\n var keysJson = $$storage().getItem(this.$$prefix + '.keys');\n\n if (keysJson) {\n var keys = utils.fromJson(keysJson);\n\n for (var i = 0; i < keys.length; i++) {\n this.remove(keys[i]);\n }\n }\n $$storage().setItem(this.$$prefix + '.keys', JSON.stringify([]));\n } else if (utils.isObject($$data)) {\n $$lruHeap.removeAll();\n $$expiresHeap.removeAll();\n for (var key in $$data) {\n $$data[key] = null;\n }\n $$data = {};\n } else {\n $$lruHeap.removeAll();\n $$expiresHeap.removeAll();\n $$data = {};\n }\n $$promises = {};\n },\n removeExpired: function removeExpired() {\n var now = new Date().getTime();\n var expired = {};\n var key = void 0;\n var expiredItem = void 0;\n\n while ((expiredItem = $$expiresHeap.peek()) && expiredItem.expires <= now) {\n expired[expiredItem.key] = expiredItem.value ? expiredItem.value : null;\n $$expiresHeap.pop();\n }\n\n if ($$storage) {\n for (key in expired) {\n var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key);\n if (itemJson) {\n expired[key] = utils.fromJson(itemJson).value;\n this.remove(key);\n }\n }\n } else {\n for (key in expired) {\n this.remove(key);\n }\n }\n\n if (this.$$onExpire) {\n for (key in expired) {\n this.$$onExpire(key, expired[key]);\n }\n }\n\n return expired;\n },\n setCacheFlushInterval: function setCacheFlushInterval(cacheFlushInterval) {\n var _this = this;\n if (cacheFlushInterval === null) {\n delete _this.$$cacheFlushInterval;\n } else if (!utils.isNumber(cacheFlushInterval)) {\n throw new Error('cacheFlushInterval must be a number!');\n } else if (cacheFlushInterval < 0) {\n throw new Error('cacheFlushInterval must be greater than zero!');\n } else if (cacheFlushInterval !== _this.$$cacheFlushInterval) {\n _this.$$cacheFlushInterval = cacheFlushInterval;\n\n clearInterval(_this.$$cacheFlushIntervalId); // eslint-disable-line\n\n _this.$$cacheFlushIntervalId = setInterval(function () {\n _this.removeAll();\n }, _this.$$cacheFlushInterval);\n }\n },\n setCapacity: function setCapacity(capacity) {\n if (capacity === null) {\n delete this.$$capacity;\n } else if (!utils.isNumber(capacity)) {\n throw new Error('capacity must be a number!');\n } else if (capacity < 0) {\n throw new Error('capacity must be greater than zero!');\n } else {\n this.$$capacity = capacity;\n }\n var removed = {};\n while ($$lruHeap.size() > this.$$capacity) {\n removed[$$lruHeap.peek().key] = this.remove($$lruHeap.peek().key);\n }\n return removed;\n },\n setDeleteOnExpire: function setDeleteOnExpire(deleteOnExpire, setRecycleFreq) {\n if (deleteOnExpire === null) {\n delete this.$$deleteOnExpire;\n } else if (!utils.isString(deleteOnExpire)) {\n throw new Error('deleteOnExpire must be a string!');\n } else if (deleteOnExpire !== 'none' && deleteOnExpire !== 'passive' && deleteOnExpire !== 'aggressive') {\n throw new Error('deleteOnExpire must be \"none\", \"passive\" or \"aggressive\"!');\n } else {\n this.$$deleteOnExpire = deleteOnExpire;\n }\n if (setRecycleFreq !== false) {\n this.setRecycleFreq(this.$$recycleFreq);\n }\n },\n setMaxAge: function setMaxAge(maxAge) {\n if (maxAge === null) {\n this.$$maxAge = Number.MAX_VALUE;\n } else if (!utils.isNumber(maxAge)) {\n throw new Error('maxAge must be a number!');\n } else if (maxAge < 0) {\n throw new Error('maxAge must be greater than zero!');\n } else {\n this.$$maxAge = maxAge;\n }\n var i = void 0,\n keys = void 0,\n key = void 0;\n\n $$expiresHeap.removeAll();\n\n if ($$storage) {\n var keysJson = $$storage().getItem(this.$$prefix + '.keys');\n\n keys = keysJson ? utils.fromJson(keysJson) : [];\n\n for (i = 0; i < keys.length; i++) {\n key = keys[i];\n var itemJson = $$storage().getItem(this.$$prefix + '.data.' + key);\n\n if (itemJson) {\n var item = utils.fromJson(itemJson);\n if (this.$$maxAge === Number.MAX_VALUE) {\n item.expires = Number.MAX_VALUE;\n } else {\n item.expires = item.created + (item.maxAge || this.$$maxAge);\n }\n $$expiresHeap.push({\n key: key,\n expires: item.expires\n });\n }\n }\n } else {\n keys = _keys($$data);\n\n for (i = 0; i < keys.length; i++) {\n key = keys[i];\n if (this.$$maxAge === Number.MAX_VALUE) {\n $$data[key].expires = Number.MAX_VALUE;\n } else {\n $$data[key].expires = $$data[key].created + ($$data[key].maxAge || this.$$maxAge);\n }\n $$expiresHeap.push($$data[key]);\n }\n }\n if (this.$$deleteOnExpire === 'aggressive') {\n return this.removeExpired();\n } else {\n return {};\n }\n },\n setOnExpire: function setOnExpire(onExpire) {\n if (onExpire === null) {\n delete this.$$onExpire;\n } else if (!utils.isFunction(onExpire)) {\n throw new Error('onExpire must be a function!');\n } else {\n this.$$onExpire = onExpire;\n }\n },\n setOptions: function setOptions(cacheOptions, strict) {\n cacheOptions = cacheOptions || {};\n strict = !!strict;\n if (!utils.isObject(cacheOptions)) {\n throw new Error('cacheOptions must be an object!');\n }\n\n if ('storagePrefix' in cacheOptions) {\n this.$$storagePrefix = cacheOptions.storagePrefix;\n } else if (strict) {\n this.$$storagePrefix = defaults.storagePrefix;\n }\n\n this.$$prefix = this.$$storagePrefix + this.$$id;\n\n if ('disabled' in cacheOptions) {\n this.$$disabled = !!cacheOptions.disabled;\n } else if (strict) {\n this.$$disabled = defaults.disabled;\n }\n\n if ('deleteOnExpire' in cacheOptions) {\n this.setDeleteOnExpire(cacheOptions.deleteOnExpire, false);\n } else if (strict) {\n this.setDeleteOnExpire(defaults.deleteOnExpire, false);\n }\n\n if ('recycleFreq' in cacheOptions) {\n this.setRecycleFreq(cacheOptions.recycleFreq);\n } else if (strict) {\n this.setRecycleFreq(defaults.recycleFreq);\n }\n\n if ('maxAge' in cacheOptions) {\n this.setMaxAge(cacheOptions.maxAge);\n } else if (strict) {\n this.setMaxAge(defaults.maxAge);\n }\n\n if ('storeOnResolve' in cacheOptions) {\n this.$$storeOnResolve = !!cacheOptions.storeOnResolve;\n } else if (strict) {\n this.$$storeOnResolve = defaults.storeOnResolve;\n }\n\n if ('storeOnReject' in cacheOptions) {\n this.$$storeOnReject = !!cacheOptions.storeOnReject;\n } else if (strict) {\n this.$$storeOnReject = defaults.storeOnReject;\n }\n\n if ('capacity' in cacheOptions) {\n this.setCapacity(cacheOptions.capacity);\n } else if (strict) {\n this.setCapacity(defaults.capacity);\n }\n\n if ('cacheFlushInterval' in cacheOptions) {\n this.setCacheFlushInterval(cacheOptions.cacheFlushInterval);\n } else if (strict) {\n this.setCacheFlushInterval(defaults.cacheFlushInterval);\n }\n\n if ('onExpire' in cacheOptions) {\n this.setOnExpire(cacheOptions.onExpire);\n } else if (strict) {\n this.setOnExpire(defaults.onExpire);\n }\n\n if ('storageMode' in cacheOptions || 'storageImpl' in cacheOptions) {\n this.setStorageMode(cacheOptions.storageMode || defaults.storageMode, cacheOptions.storageImpl || defaults.storageImpl);\n } else if (strict) {\n this.setStorageMode(defaults.storageMode, defaults.storageImpl);\n }\n },\n setRecycleFreq: function setRecycleFreq(recycleFreq) {\n if (recycleFreq === null) {\n delete this.$$recycleFreq;\n } else if (!utils.isNumber(recycleFreq)) {\n throw new Error('recycleFreq must be a number!');\n } else if (recycleFreq < 0) {\n throw new Error('recycleFreq must be greater than zero!');\n } else {\n this.$$recycleFreq = recycleFreq;\n }\n clearInterval(this.$$recycleFreqId);\n if (this.$$deleteOnExpire === 'aggressive') {\n (function (self) {\n self.$$recycleFreqId = setInterval(function () {\n self.removeExpired();\n }, self.$$recycleFreq);\n })(this);\n } else {\n delete this.$$recycleFreqId;\n }\n },\n setStorageMode: function setStorageMode(storageMode, storageImpl) {\n if (!utils.isString(storageMode)) {\n throw new Error('storageMode must be a string!');\n } else if (storageMode !== 'memory' && storageMode !== 'localStorage' && storageMode !== 'sessionStorage') {\n throw new Error('storageMode must be \"memory\", \"localStorage\" or \"sessionStorage\"!');\n }\n\n var prevStorage = $$storage;\n var prevData = $$data;\n var shouldReInsert = false;\n var items = {};\n\n function load(prevStorage, prevData) {\n var keys = this.keys();\n var length = keys.length;\n if (length) {\n var _key = void 0;\n var prevDataIsObject = utils.isObject(prevData);\n for (var i = 0; i < length; i++) {\n _key = keys[i];\n if (prevStorage) {\n var itemJson = prevStorage().getItem(this.$$prefix + '.data.' + _key);\n if (itemJson) {\n items[_key] = utils.fromJson(itemJson);\n }\n } else if (prevDataIsObject) {\n items[_key] = prevData[_key];\n }\n this.remove(_key);\n }\n shouldReInsert = true;\n }\n }\n\n if (!this.$$initializing) {\n load.call(this, prevStorage, prevData);\n }\n\n this.$$storageMode = storageMode;\n\n if (storageImpl) {\n if (!utils.isObject(storageImpl)) {\n throw new Error('storageImpl must be an object!');\n } else if (!('setItem' in storageImpl) || typeof storageImpl.setItem !== 'function') {\n throw new Error('storageImpl must implement \"setItem(key, value)\"!');\n } else if (!('getItem' in storageImpl) || typeof storageImpl.getItem !== 'function') {\n throw new Error('storageImpl must implement \"getItem(key)\"!');\n } else if (!('removeItem' in storageImpl) || typeof storageImpl.removeItem !== 'function') {\n throw new Error('storageImpl must implement \"removeItem(key)\"!');\n }\n $$storage = function $$storage() {\n return storageImpl;\n };\n } else if (this.$$storageMode === 'localStorage') {\n try {\n localStorage.setItem('cachefactory', 'cachefactory');\n localStorage.removeItem('cachefactory');\n $$storage = function $$storage() {\n return localStorage;\n };\n } catch (e) {\n $$storage = null;\n this.$$storageMode = 'memory';\n }\n } else if (this.$$storageMode === 'sessionStorage') {\n try {\n sessionStorage.setItem('cachefactory', 'cachefactory');\n sessionStorage.removeItem('cachefactory');\n $$storage = function $$storage() {\n return sessionStorage;\n };\n } catch (e) {\n $$storage = null;\n this.$$storageMode = 'memory';\n }\n } else {\n $$storage = null;\n this.$$storageMode = 'memory';\n }\n\n if (this.$$initializing) {\n load.call(this, $$storage, $$data);\n }\n\n if (shouldReInsert) {\n var item = void 0;\n for (var key in items) {\n item = items[key];\n this.put(key, item.value, {\n created: item.created,\n accessed: item.accessed,\n expires: item.expires\n });\n }\n }\n },\n touch: function touch(key, options) {\n var _this4 = this;\n\n if (key) {\n var val = this.get(key, {\n onExpire: function onExpire(k, v) {\n return _this4.put(k, v);\n }\n });\n if (val) {\n this.put(key, val, options);\n }\n } else {\n var keys = this.keys();\n for (var i = 0; i < keys.length; i++) {\n this.touch(keys[i], options);\n }\n }\n },\n values: function values() {\n var keys = this.keys();\n var items = [];\n for (var i = 0; i < keys.length; i++) {\n items.push(this.get(keys[i]));\n }\n return items;\n }\n };\n\n cache.$$initializing = true;\n cache.setOptions(options, true);\n cache.$$initializing = false;\n\n return cache;\n}\n\nfunction CacheFactory(cacheId, options) {\n return createCache(cacheId, options);\n}\n\nCacheFactory.createCache = createCache;\nCacheFactory.defaults = defaults;\n\nCacheFactory.info = function () {\n var keys = _keys(caches);\n var info = {\n size: keys.length,\n caches: {}\n };\n for (var opt in defaults) {\n if (defaults.hasOwnProperty(opt)) {\n info[opt] = defaults[opt];\n }\n }\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n info.caches[key] = caches[key].info();\n }\n return info;\n};\n\nCacheFactory.get = function (cacheId) {\n return caches[cacheId];\n};\nCacheFactory.keySet = function () {\n return _keySet(caches);\n};\nCacheFactory.keys = function () {\n return _keys(caches);\n};\nCacheFactory.destroy = function (cacheId) {\n if (caches[cacheId]) {\n caches[cacheId].destroy();\n delete caches[cacheId];\n }\n};\nCacheFactory.destroyAll = function () {\n for (var cacheId in caches) {\n caches[cacheId].destroy();\n }\n caches = {};\n};\nCacheFactory.clearAll = function () {\n for (var cacheId in caches) {\n caches[cacheId].removeAll();\n }\n};\nCacheFactory.removeExpiredFromAll = function () {\n var expired = {};\n for (var cacheId in caches) {\n expired[cacheId] = caches[cacheId].removeExpired();\n }\n return expired;\n};\nCacheFactory.enableAll = function () {\n for (var cacheId in caches) {\n caches[cacheId].$$disabled = false;\n }\n};\nCacheFactory.disableAll = function () {\n for (var cacheId in caches) {\n caches[cacheId].$$disabled = true;\n }\n};\nCacheFactory.touchAll = function () {\n for (var cacheId in caches) {\n caches[cacheId].touch();\n }\n};\n\nCacheFactory.utils = utils;\nCacheFactory.BinaryHeap = BinaryHeap;\n\nexport default CacheFactory;\n//# sourceMappingURL=cachefactory.es2015.js.map","import angular from 'angular'\nimport CacheFactory from '../node_modules/cachefactory/dist/cachefactory.es2015'\n\nCacheFactory.utils.equals = angular.equals\nCacheFactory.utils.isObject = angular.isObject\nCacheFactory.utils.fromJson = angular.fromJson\n\nfunction BinaryHeapProvider () {\n this.$get = function () { return CacheFactory.BinaryHeap }\n}\n\nfunction CacheFactoryProvider () {\n this.defaults = CacheFactory.defaults\n this.defaults.storagePrefix = 'angular-cache.caches.'\n\n this.$get = ['$q', function ($q) {\n CacheFactory.utils.Promise = $q\n return CacheFactory\n }]\n}\n\nangular.module('angular-cache', [])\n .provider('BinaryHeap', BinaryHeapProvider)\n .provider('CacheFactory', CacheFactoryProvider)\n\nexport default 'angular-cache'\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"angular-cache.js","sources":["../node_modules/cachefactory/dist/cachefactory.es2015.js","../src/index.js"],"sourcesContent":["/**\n * CacheFactory\n * @version 3.0.0 - Homepage \n * @copyright (c) 2015-2017 CacheFactory project authors\n * @license MIT \n * @overview CacheFactory is a very simple and useful cache for the browser.\n */\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n/**\n * @private\n * @param {array} heap The heap.\n * @param {function} weightFunc The weight function.\n * @param {number} n The index of the element to bubble up.\n */var bubbleUp=function bubbleUp(heap,weightFunc,n){var element=heap[n];var weight=weightFunc(element);// When at 0, an element can not go up any further.\nwhile(n>0){// Compute the parent element's index, and fetch it.\nvar parentN=Math.floor((n+1)/2)-1;var parent=heap[parentN];// If the parent has a lesser weight, things are in order and we\n// are done.\nif(weight>=weightFunc(parent)){break;}else{heap[parentN]=element;heap[n]=parent;n=parentN;}}};/**\n * @private\n * @param {array} heap The heap.\n * @param {function} weightFunc The weight function.\n * @param {number} n The index of the element to sink down.\n */var bubbleDown=function bubbleDown(heap,weightFunc,n){var length=heap.length;var node=heap[n];var nodeWeight=weightFunc(node);while(true){var child2N=(n+1)*2;var child1N=child2N-1;var swap=null;if(child1N user.age,\n * (userOne, userTwo) => userOne.id === userTwo.id\n * );\n * queue.push({ id: 1, age: 34 });\n * queue.push({ id: 2, age: 29 });\n * queue.push({ id: 3, age: 25 });\n * queue.push({ id: 3, age: 28 });\n * queue.push({ id: 3, age: 27 });\n * queue.push({ id: 4, age: 42 });\n * queue.push({ id: 5, age: 19 });\n * queue.pop(); // { id: 5, age: 19 }\n * queue.pop(); // { id: 3, age: 27 }\n * queue.pop(); // { id: 2, age: 29 }\n * queue.pop(); // { id: 1, age: 34 }\n * queue.pop(); // { id: 4, age: 42 }\n *\n * @param {function} [weightFunc] See {@link BinaryHeap#weightFunc}.\n * @param {function} [compareFunc] See {@link BinaryHeap#compareFunc}.\n */var BinaryHeap=function(){function BinaryHeap(weightFunc,compareFunc){classCallCheck(this,BinaryHeap);if(!weightFunc){weightFunc=function weightFunc(x){return x;};}if(!compareFunc){compareFunc=function compareFunc(x,y){return x===y;};}if(typeof weightFunc!=='function'){throw new Error('BinaryHeap([weightFunc][, compareFunc]): \"weightFunc\" must be a function!');}if(typeof compareFunc!=='function'){throw new Error('BinaryHeap([weightFunc][, compareFunc]): \"compareFunc\" must be a function!');}/**\n * The heap's configured weight function.\n *\n * Default:\n * ```js\n * function (x) {\n * return x;\n * }\n * ```\n *\n * @name BinaryHeap#weightFunc\n * @type {function}\n */this.weightFunc=weightFunc;/**\n * The heap's configured compare function.\n *\n * Default:\n * ```js\n * function (x, y) {\n * return x === y;\n * }\n * ```\n *\n * @name BinaryHeap#compareFunc\n * @type {function}\n */this.compareFunc=compareFunc;/**\n * The heap's data.\n *\n * @name BinaryHeap#heap\n * @type {Array<*>}\n */this.heap=[];}/**\n * Push an item into the queue.\n *\n * @method BinaryHeap#push\n * @param {*} node\n */createClass(BinaryHeap,[{key:'push',value:function push(node){this.heap.push(node);bubbleUp(this.heap,this.weightFunc,this.heap.length-1);}/**\n * Look at the item at the front of the queue.\n *\n * @method BinaryHeap#peek\n * @returns {*}\n */},{key:'peek',value:function peek(){return this.heap[0];}/**\n * Pop an item off the front of the queue.\n *\n * @method BinaryHeap#pop\n * @returns {*}\n */},{key:'pop',value:function pop(){var front=this.heap[0];var end=this.heap.pop();if(this.heap.length>0){this.heap[0]=end;bubbleDown(this.heap,this.weightFunc,0);}return front;}/**\n * Remove the given item from the queue.\n *\n * @method BinaryHeap#remove\n * @param {*} node\n */},{key:'remove',value:function remove(node){var length=this.heap.length;for(var i=0;i1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,Cache);if(!utils.isString(id)){throw new TypeError('\"id\" must be a string!');}Object.defineProperties(this,{// Writable\n$$cacheFlushInterval:{writable:true,value:undefined},$$cacheFlushIntervalId:{writable:true,value:undefined},$$capacity:{writable:true,value:undefined},$$data:{writable:true,value:{}},$$deleteOnExpire:{writable:true,value:undefined},$$enabled:{writable:true,value:undefined},$$expiresHeap:{writable:true,value:new BinaryHeap(function(x){return x.accessed;},utils.equals)},$$initializing:{writable:true,value:true},$$lruHeap:{writable:true,value:new BinaryHeap(function(x){return x.accessed;},utils.equals)},$$maxAge:{writable:true,value:undefined},$$onExpire:{writable:true,value:undefined},$$prefix:{writable:true,value:''},$$promises:{writable:true,value:{}},$$recycleFreq:{writable:true,value:undefined},$$recycleFreqId:{writable:true,value:undefined},$$storage:{writable:true,value:undefined},$$storageMode:{writable:true,value:undefined},$$storagePrefix:{writable:true,value:undefined},$$storeOnReject:{writable:true,value:undefined},$$storeOnResolve:{writable:true,value:undefined},// Read-only\n$$parent:{value:options.parent},/**\n * The interval (in milliseconds) on which the cache should remove all of\n * its items. Setting this to `null` disables the interval. The default is\n * `null`.\n *\n * @example Create a cache the clears itself every 15 minutes\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * cacheFlushInterval: 15 * 60 * 1000\n * });\n *\n * @name Cache#cacheFlushInterval\n * @default null\n * @public\n * @readonly\n * @type {number|null}\n */cacheFlushInterval:{enumerable:true,get:function get$$1(){return _this.$$cacheFlushInterval;},set:function set$$1(){throw new Error(assignMsg+' \\'cacheFlushInterval\\'');}},/**\n * The maximum number of items that can be stored in the cache. When the\n * capacity is exceeded the least recently accessed item will be removed.\n * The default is `Number.MAX_VALUE`.\n *\n * @example Create a cache with a capacity of 100\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * capacity: 100\n * });\n *\n * @name Cache#capacity\n * @default Number.MAX_VALUE\n * @public\n * @readonly\n * @type {number}\n */capacity:{enumerable:true,get:function get$$1(){return _this.$$capacity;},set:function set$$1(){throw new Error(assignMsg+' \\'capacity\\'');}},/**\n * Determines the behavior of a cache when an item expires. The default is\n * `\"none\"`.\n *\n * Possible values:\n *\n * - `\"none\"` - Cache will do nothing when an item expires.\n * - `\"passive\"` - Cache will do nothing when an item expires. Expired\n * items will remain in the cache until requested, at which point they are\n * removed, and `undefined` is returned.\n * - `\"aggressive\"` - Cache will remove expired items as soon as they are\n * discovered.\n *\n * @example Create a cache that deletes items as soon as they expire\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * deleteOnExpire: 'aggressive'\n * });\n *\n * @example Create a cache that doesn't delete expired items until they're accessed\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * deleteOnExpire: 'passive'\n * });\n *\n * @name Cache#deleteOnExpire\n * @default \"none\"\n * @public\n * @readonly\n * @type {string}\n */deleteOnExpire:{enumerable:true,get:function get$$1(){return _this.$$deleteOnExpire;},set:function set$$1(){throw new Error(assignMsg+' \\'deleteOnExpire\\'');}},/**\n * Marks whether the cache is enabled or not. For a disabled cache,\n * {@link Cache#put} is a no-op. The default is `true`.\n *\n * @example Create a cache that starts out disabled\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * enabled: false\n * });\n *\n * // The cache is disabled, this is a no-op\n * cache.put('foo', 'bar');\n * console.log(cache.get('foo')); // undefined\n *\n * @name Cache#enabled\n * @default true\n * @public\n * @readonly\n * @type {boolean}\n */enabled:{enumerable:true,get:function get$$1(){return _this.$$enabled;},set:function set$$1(){throw new Error(assignMsg+' \\'enabled\\'');}},/**\n * Then unique identifier given to this cache when it was created.\n *\n * @name Cache#id\n * @public\n * @readonly\n * @type {string}\n */id:{enumerable:true,value:id},/**\n * Represents how long an item can be in the cache before expires. The\n * cache's behavior toward expired items is determined by\n * {@link Cache#deleteOnExpire}. The default value for `maxAge` is\n * `Number.MAX_VALUE`.\n *\n * @example Create a cache where items expire after 15 minutes\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * // Items expire after 15 minutes\n * maxAge: 15 * 60 * 1000\n * });\n * const cache2 = cacheFactory.createCache('my-cache2', {\n * // Items expire after 15 minutes\n * maxAge: 15 * 60 * 1000,\n * // Expired items will only be deleted once they are accessed\n * deleteOnExpire: 'passive'\n * });\n * const cache3 = cacheFactory.createCache('my-cache3', {\n * // Items expire after 15 minutes\n * maxAge: 15 * 60 * 1000,\n * // Items will be deleted from the cache as soon as they expire\n * deleteOnExpire: 'aggressive'\n * });\n *\n * @name Cache#maxAge\n * @default Number.MAX_VALUE\n * @public\n * @readonly\n * @type {number}\n */maxAge:{enumerable:true,get:function get$$1(){return _this.$$maxAge;},set:function set$$1(){throw new Error(assignMsg+' \\'maxAge\\'');}},/**\n * The `onExpire` callback.\n *\n * @callback Cache~onExpireCallback\n * @param {string} key The key of the expired item.\n * @param {*} value The value of the expired item.\n * @param {function} [done] If in `\"passive\"` mode and you pass an\n * `onExpire` callback to {@link Cache#get}, then the `onExpire` callback\n * you passed to {@link Cache#get} will be passed to your global\n * `onExpire` callback.\n *//**\n * A callback to be executed when expired items are removed from the\n * cache when the cache is in `\"passive\"` or `\"aggressive\"` mode. The\n * default is `null`. See {@link Cache~onExpireCallback} for the signature\n * of the `onExpire` callback.\n *\n * @example Create a cache where items expire after 15 minutes\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * // Items expire after 15 minutes\n * maxAge: 15 * 60 * 1000,\n * // Expired items will only be deleted once they are accessed\n * deleteOnExpire: 'passive',\n * // Try to rehydrate cached items as they expire\n * onExpire: function (key, value, done) {\n * // Do something with key and value\n *\n * // Will received \"done\" callback if in \"passive\" mode and passing\n * // an onExpire option to Cache#get.\n * if (done) {\n * done(); // You can pass whatever you want to done\n * }\n * }\n * });\n *\n * @name Cache#onExpire\n * @default null\n * @public\n * @readonly\n * @see Cache~onExpireCallback\n * @type {function}\n */onExpire:{enumerable:true,get:function get$$1(){return _this.$$onExpire;},set:function set$$1(){throw new Error(assignMsg+' \\'onExpire\\'');}},/**\n * The frequency (in milliseconds) with which the cache should check for\n * expired items. The default is `1000`. The value of this interval only\n * matters if {@link Cache#deleteOnExpire} is set to `\"aggressive\"`.\n *\n * @example Create a cache where items expire after 15 minutes checking every 10 seconds\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * // Items expire after 15 minutes\n * maxAge: 15 * 60 * 1000,\n * // Items will be deleted from the cache as soon as they expire\n * deleteOnExpire: 'aggressive',\n * // Check for expired items every 10 seconds\n * recycleFreq: 10 * 1000\n * });\n *\n * @name Cache#recycleFreq\n * @default 1000\n * @public\n * @readonly\n * @type {number|null}\n */recycleFreq:{enumerable:true,get:function get$$1(){return _this.$$recycleFreq;},set:function set$$1(){throw new Error(assignMsg+' \\'recycleFreq\\'');}},/**\n * Determines the storage medium used by the cache. The default is\n * `\"memory\"`.\n *\n * Possible values:\n *\n * - `\"memory\"`\n * - `\"localStorage\"`\n * - `\"sessionStorage\"`\n *\n * @example Create a cache that stores its data in localStorage\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * storageMode: 'localStorage'\n * });\n *\n * @example Provide a custom storage implementation\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * storageMode: 'localStorage',\n * storageImpl: {\n * setItem: function (key, value) {\n * console.log('setItem', key, value);\n * localStorage.setItem(key, value);\n * },\n * getItem: function (key) {\n * console.log('getItem', key);\n * localStorage.getItem(key);\n * },\n * removeItem: function (key) {\n * console.log('removeItem', key);\n * localStorage.removeItem(key);\n * }\n * }\n * });\n *\n * @name Cache#storageMode\n * @default \"memory\"\n * @public\n * @readonly\n * @type {string}\n */storageMode:{enumerable:true,get:function get$$1(){return _this.$$storageMode;},set:function set$$1(){throw new Error(assignMsg+' \\'storageMode\\'');}},/**\n * The prefix used to namespace the keys for items stored in\n * `localStorage` or `sessionStorage`. The default is\n * `\"cachefactory.caches.\"` which is conservatively long in order any\n * possible conflict with other data in storage. Set to a shorter value\n * to save storage space.\n *\n * @example\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * storageMode: 'localStorage',\n * // Completely remove the prefix to save the most space\n * storagePrefix: ''\n * });\n * cache.put('foo', 'bar');\n * console.log(localStorage.get('my-cache.data.foo')); // \"bar\"\n *\n * @name Cache#storagePrefix\n * @default \"cachefactory.caches.\"\n * @public\n * @readonly\n * @type {string}\n */storagePrefix:{enumerable:true,get:function get$$1(){return _this.$$storagePrefix;},set:function set$$1(){throw new Error(assignMsg+' \\'storagePrefix\\'');}},/**\n * If set to `true`, when a promise is inserted into the cache and is then\n * rejected, then the rejection value will overwrite the promise in the\n * cache. The default is `false`.\n *\n * @name Cache#storeOnReject\n * @default false\n * @public\n * @readonly\n * @type {boolean}\n */storeOnReject:{enumerable:true,get:function get$$1(){return _this.$$storeOnReject;},set:function set$$1(){throw new Error(assignMsg+' \\'storeOnReject\\'');}},/**\n * If set to `true`, when a promise is inserted into the cache and is then\n * resolved, then the resolution value will overwrite the promise in the\n * cache. The default is `false`.\n *\n * @name Cache#storeOnResolve\n * @default false\n * @public\n * @readonly\n * @type {boolean}\n */storeOnResolve:{enumerable:true,get:function get$$1(){return _this.$$storeOnResolve;},set:function set$$1(){throw new Error(assignMsg+' \\'storeOnResolve\\'');}}});this.setOptions(options,true);this.$$initializing=false;}/**\n * Destroys this cache and all its data and renders it unusable.\n *\n * @example\n * cache.destroy();\n *\n * @method Cache#destroy\n */createClass(Cache,[{key:'destroy',value:function destroy(){clearInterval(this.$$cacheFlushIntervalId);clearInterval(this.$$recycleFreqId);this.removeAll();if(this.$$storage){this.$$storage().removeItem(this.$$prefix+'.keys');this.$$storage().removeItem(this.$$prefix);}this.$$storage=null;this.$$data=null;this.$$lruHeap=null;this.$$expiresHeap=null;this.$$prefix=null;if(this.$$parent){this.$$parent.caches[this.id]=undefined;}}/**\n * Disables this cache. For a disabled cache, {@link Cache#put} is a no-op.\n *\n * @example\n * cache.disable();\n *\n * @method Cache#disable\n */},{key:'disable',value:function disable(){this.$$enabled=false;}/**\n * Enables this cache. For a disabled cache, {@link Cache#put} is a no-op.\n *\n * @example\n * cache.enable();\n *\n * @method Cache#enable\n */},{key:'enable',value:function enable(){this.$$enabled=true;}/**\n * Retrieve an item from the cache, it it exists.\n *\n * @example Retrieve an item from the cache\n * cache.put('foo', 'bar');\n * cache.get('foo'); // \"bar\"\n *\n * @example Retrieve a possibly expired item while in passive mode\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * deleteOnExpire: 'passive',\n * maxAge: 15 * 60 * 1000\n * });\n * cache.get('foo', {\n * // Called if \"foo\" is expired\n * onExpire: function (key, value) {\n * // Do something with key and value\n * }\n * });\n *\n * @example Retrieve a possibly expired item while in passive mode with global onExpire callback\n * import CacheFactory from 'cachefactory';\n *\n * const cacheFactory = new CacheFactory();\n * const cache = cacheFactory.createCache('my-cache', {\n * deleteOnExpire: 'passive',\n * maxAge: 15 * 60 * 1000\n * onExpire: function (key, value, done) {\n * console.log('Expired item:', key);\n * if (done) {\n * done('foo', key, value);\n * }\n * }\n * });\n * cache.get('foo', {\n * // Called if \"foo\" is expired\n * onExpire: function (msg, key, value) {\n * console.log(msg); // \"foo\"\n * // Do something with key and value\n * }\n * });\n *\n * @method Cache#get\n * @param {string|string[]} key The key of the item to retrieve.\n * @param {object} [options] Configuration options.\n * @param {function} [options.onExpire] TODO\n * @returns {*} The value for the specified `key`, if any.\n */},{key:'get',value:function get$$1(key){var _this2=this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};if(Array.isArray(key)){var keys=key;var values=[];keys.forEach(function(key){var value=_this2.get(key,options);if(value!==null&&value!==undefined){values.push(value);}});return values;}else{if(utils.isNumber(key)){key=''+key;}if(!this.enabled){return;}}if(!utils.isString(key)){throw new TypeError('\"key\" must be a string!');}else if(!options||!utils.isObject(options)){throw new TypeError('\"options\" must be an object!');}else if(options.onExpire&&!utils.isFunction(options.onExpire)){throw new TypeError('\"options.onExpire\" must be a function!');}var item=void 0;if(this.$$storage){if(this.$$promises[key]){return this.$$promises[key];}var itemJson=this.$$storage().getItem(this.$$prefix+'.data.'+key);if(itemJson){item=utils.fromJson(itemJson);}}else if(utils.isObject(this.$$data)){item=this.$$data[key];}if(!item){return;}var value=item.value;var now=new Date().getTime();if(this.$$storage){this.$$lruHeap.remove({key:key,accessed:item.accessed});item.accessed=now;this.$$lruHeap.push({key:key,accessed:now});}else{this.$$lruHeap.remove(item);item.accessed=now;this.$$lruHeap.push(item);}if(this.$$deleteOnExpire==='passive'&&'expires'in item&&item.expiresRetrieve info about the cache\n * const info = cache.info();\n * info.id; // \"my-cache\"\n * info.capacity; // 100\n * info.maxAge; // 600000\n * info.deleteOnExpire; // \"aggressive\"\n * info.cacheFlushInterval; // null\n * info.recycleFreq; // 10000\n * info.storageMode; // \"localStorage\"\n * info.enabled; // false\n * info.size; // 1234\n *\n * @example Retrieve info about an item in the cache\n * const info = cache.info('foo');\n * info.created; // 1234567890\n * info.accessed; // 1234567990\n * info.expires; // 1234569999\n * info.isExpired; // false\n *\n * @method Cache#info\n * @param {string} [key] If specified, retrieve info for a particular item in\n * the cache.\n * @returns {*} The information object.\n */},{key:'info',value:function info(key){if(key){var item=void 0;if(this.$$storage){var itemJson=this.$$storage().getItem(this.$$prefix+'.data.'+key);if(itemJson){item=utils.fromJson(itemJson);}}else if(utils.isObject(this.$$data)){item=this.$$data[key];}if(item){return{created:item.created,accessed:item.accessed,expires:item.expires,isExpired:new Date().getTime()-item.created>(item.maxAge||this.$$maxAge)};}}else{return{id:this.id,capacity:this.capacity,maxAge:this.maxAge,deleteOnExpire:this.deleteOnExpire,onExpire:this.onExpire,cacheFlushInterval:this.cacheFlushInterval,recycleFreq:this.recycleFreq,storageMode:this.storageMode,storageImpl:this.$$storage?this.$$storage():undefined,enabled:this.enabled,size:this.$$lruHeap&&this.$$lruHeap.size()||0};}}/**\n * Retrieve a list of the keys of items currently in the cache.\n *\n * @example\n * const keys = cache.keys();\n *\n * @method Cache#keys\n * @returns {string[]} The keys of the items in the cache\n */},{key:'keys',value:function keys(){var _this3=this;if(this.$$storage){var keysJson=this.$$storage().getItem(this.$$prefix+'.keys');if(keysJson){return utils.fromJson(keysJson);}else{return[];}}else{return Object.keys(this.$$data).filter(function(key){return _this3.$$data[key];});}}/**\n * Retrieve an object of the keys of items currently in the cache.\n *\n * @example\n * const keySet = cache.keySet();\n *\n * @method Cache#keySet\n * @returns {object} The keys of the items in the cache.\n */},{key:'keySet',value:function keySet(){var set$$1={};this.keys().forEach(function(key){set$$1[key]=key;});return set$$1;}/**\n * Insert an item into the cache.\n *\n * @example\n * const inserted = cache.put('foo', 'bar');\n *\n * @method Cache#put\n * @param {string} key The key under which to insert the item.\n * @param {*} value The value to insert.\n * @param {object} [options] Configuration options.\n * @param {boolean} [options.storeOnReject] See {@link Cache#storeOnReject}.\n * @param {boolean} [options.storeOnResolve] See {@link Cache#storeOnResolve}.\n * @returns {*} The inserted value.\n */},{key:'put',value:function put(key,value){var _this4=this;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};var storeOnResolve=options.storeOnResolve!==undefined?!!options.storeOnResolve:this.$$storeOnResolve;var storeOnReject=options.storeOnReject!==undefined?!!options.storeOnReject:this.$$storeOnReject;var getHandler=function getHandler(shouldStore,isError){return function(v){if(shouldStore){_this4.$$promises[key]=undefined;if(utils.isObject(v)&&'status'in v&&'data'in v){_this4.put(key,[v.status,v.data,v.headers(),v.statusText]);}else{_this4.put(key,v);}}if(isError){if(utils.Promise){return utils.Promise.reject(v);}else{throw v;}}else{return v;}};};if(!this.$$enabled||!utils.isObject(this.$$data)||value===null||value===undefined){return;}if(utils.isNumber(key)){key=''+key;}if(!utils.isString(key)){throw new TypeError('\"key\" must be a string!');}var now=new Date().getTime();var item={key:key,value:utils.isPromise(value)?value.then(getHandler(storeOnResolve,false),getHandler(storeOnReject,true)):value,created:options.created===undefined?now:options.created,accessed:options.accessed===undefined?now:options.accessed};if(utils.isNumber(options.maxAge)){item.maxAge=options.maxAge;}if(options.expires===undefined){item.expires=item.created+(item.maxAge||this.$$maxAge);}else{item.expires=options.expires;}if(this.$$storage){if(utils.isPromise(item.value)){this.$$promises[key]=item.value;return this.$$promises[key];}var keysJson=this.$$storage().getItem(this.$$prefix+'.keys');var keys=keysJson?utils.fromJson(keysJson):[];var itemJson=this.$$storage().getItem(this.$$prefix+'.data.'+key);// Remove existing\nif(itemJson){this.remove(key);}// Add to expires heap\nthis.$$expiresHeap.push({key:key,expires:item.expires});// Add to lru heap\nthis.$$lruHeap.push({key:key,accessed:item.accessed});// Set item\nthis.$$storage().setItem(this.$$prefix+'.data.'+key,utils.toJson(item));var exists=false;keys.forEach(function(_key){if(_key===key){exists=true;return false;}});if(!exists){keys.push(key);}this.$$storage().setItem(this.$$prefix+'.keys',utils.toJson(keys));}else{// Remove existing\nif(this.$$data[key]){this.remove(key);}// Add to expires heap\nthis.$$expiresHeap.push(item);// Add to lru heap\nthis.$$lruHeap.push(item);// Set item\nthis.$$data[key]=item;this.$$promises[key]=undefined;}// Handle exceeded capacity\nif(this.$$lruHeap.size()>this.$$capacity){this.remove(this.$$lruHeap.peek().key);}return value;}/**\n * Remove an item from the cache.\n *\n * @example\n * const removed = cache.remove('foo');\n *\n * @method Cache#remove\n * @param {string} key The key of the item to remove.\n * @returns {*} The value of the removed item, if any.\n */},{key:'remove',value:function remove(key){if(utils.isNumber(key)){key=''+key;}this.$$promises[key]=undefined;if(this.$$storage){var itemJson=this.$$storage().getItem(this.$$prefix+'.data.'+key);if(itemJson){var item=utils.fromJson(itemJson);this.$$lruHeap.remove({key:key,accessed:item.accessed});this.$$expiresHeap.remove({key:key,expires:item.expires});this.$$storage().removeItem(this.$$prefix+'.data.'+key);var keysJson=this.$$storage().getItem(this.$$prefix+'.keys');var keys=keysJson?utils.fromJson(keysJson):[];var index=keys.indexOf(key);if(index>=0){keys.splice(index,1);}this.$$storage().setItem(this.$$prefix+'.keys',utils.toJson(keys));return item.value;}}else if(utils.isObject(this.$$data)){var value=this.$$data[key]?this.$$data[key].value:undefined;this.$$lruHeap.remove(this.$$data[key]);this.$$expiresHeap.remove(this.$$data[key]);this.$$data[key]=undefined;return value;}}/**\n * Remove all items from the cache.\n *\n * @example\n * cache.removeAll();\n *\n * @method Cache#removeAll\n */},{key:'removeAll',value:function removeAll(){var _this5=this;var storage=this.$$storage;var keys=this.keys();this.$$lruHeap.removeAll();this.$$expiresHeap.removeAll();if(storage){storage().setItem(this.$$prefix+'.keys',utils.toJson([]));keys.forEach(function(key){storage().removeItem(_this5.$$prefix+'.data.'+key);});}else if(utils.isObject(this.$$data)){this.$$data={};}this.$$promises={};}/**\n * Remove expired items from the cache, if any.\n *\n * @example\n * const expiredItems = cache.removeExpired();\n *\n * @method Cache#removeExpired\n * @returns {object} The expired items, if any.\n */},{key:'removeExpired',value:function removeExpired(){var _this6=this;var now=new Date().getTime();var expired={};var expiredItem=void 0;while((expiredItem=this.$$expiresHeap.peek())&&expiredItem.expires<=now){expired[expiredItem.key]=expiredItem.value?expiredItem.value:null;this.$$expiresHeap.pop();}Object.keys(expired).forEach(function(key){_this6.remove(key);});if(this.$$onExpire){Object.keys(expired).forEach(function(key){_this6.$$onExpire(key,expired[key]);});}return expired;}/**\n * Update the {@link Cache#cacheFlushInterval} for the cache. Pass in `null`\n * to disable the interval.\n *\n * @example\n * cache.setCacheFlushInterval(60 * 60 * 1000);\n *\n * @method Cache#setCacheFlushInterval\n * @param {number|null} cacheFlushInterval The new {@link Cache#cacheFlushInterval}.\n */},{key:'setCacheFlushInterval',value:function setCacheFlushInterval(cacheFlushInterval){var _this7=this;if(cacheFlushInterval===null){this.$$cacheFlushInterval=null;}else if(!utils.isNumber(cacheFlushInterval)){throw new TypeError('\"cacheFlushInterval\" must be a number!');}else if(cacheFlushInterval<=0){throw new Error('\"cacheFlushInterval\" must be greater than zero!');}this.$$cacheFlushInterval=cacheFlushInterval;clearInterval(this.$$cacheFlushIntervalId);this.$$cacheFlushIntervalId=undefined;if(this.$$cacheFlushInterval){this.$$cacheFlushIntervalId=setInterval(function(){return _this7.removeAll();},this.$$cacheFlushInterval);}}/**\n * Update the {@link Cache#capacity} for the cache. Pass in `null` to reset\n * to `Number.MAX_VALUE`.\n *\n * @example\n * cache.setCapacity(1000);\n *\n * @method Cache#setCapacity\n * @param {number|null} capacity The new {@link Cache#capacity}.\n */},{key:'setCapacity',value:function setCapacity(capacity){if(capacity===null){this.$$capacity=Number.MAX_VALUE;}else if(!utils.isNumber(capacity)){throw new TypeError('\"capacity\" must be a number!');}else if(capacity<=0){throw new Error('\"capacity\" must be greater than zero!');}else{this.$$capacity=capacity;}var removed={};while(this.$$lruHeap.size()>this.$$capacity){removed[this.$$lruHeap.peek().key]=this.remove(this.$$lruHeap.peek().key);}return removed;}/**\n * Update the {@link Cache#deleteOnExpire} for the cache. Pass in `null` to\n * reset to `\"none\"`.\n *\n * @example\n * cache.setDeleteOnExpire('passive');\n *\n * @method Cache#setDeleteOnExpire\n * @param {string|null} deleteOnExpire The new {@link Cache#deleteOnExpire}.\n */},{key:'setDeleteOnExpire',value:function setDeleteOnExpire(deleteOnExpire,setRecycleFreq){if(deleteOnExpire===null){deleteOnExpire='none';}else if(!utils.isString(deleteOnExpire)){throw new TypeError('\"deleteOnExpire\" must be a string!');}else if(deleteOnExpire!=='none'&&deleteOnExpire!=='passive'&&deleteOnExpire!=='aggressive'){throw new Error('\"deleteOnExpire\" must be \"none\", \"passive\" or \"aggressive\"!');}this.$$deleteOnExpire=deleteOnExpire;if(setRecycleFreq!==false){this.setRecycleFreq(this.$$recycleFreq);}}/**\n * Update the {@link Cache#maxAge} for the cache. Pass in `null` to reset to\n * to `Number.MAX_VALUE`.\n *\n * @example\n * cache.setMaxAge(60 * 60 * 1000);\n *\n * @method Cache#setMaxAge\n * @param {number|null} maxAge The new {@link Cache#maxAge}.\n */},{key:'setMaxAge',value:function setMaxAge(maxAge){var _this8=this;if(maxAge===null){this.$$maxAge=Number.MAX_VALUE;}else if(!utils.isNumber(maxAge)){throw new TypeError('\"maxAge\" must be a number!');}else if(maxAge<=0){throw new Error('\"maxAge\" must be greater than zero!');}else{this.$$maxAge=maxAge;}var keys=this.keys();this.$$expiresHeap.removeAll();if(this.$$storage){keys.forEach(function(key){var itemJson=_this8.$$storage().getItem(_this8.$$prefix+'.data.'+key);if(itemJson){var item=utils.fromJson(itemJson);if(_this8.$$maxAge===Number.MAX_VALUE){item.expires=Number.MAX_VALUE;}else{item.expires=item.created+(item.maxAge||_this8.$$maxAge);}_this8.$$expiresHeap.push({key:key,expires:item.expires});}});}else{keys.forEach(function(key){var item=_this8.$$data[key];if(item){if(_this8.$$maxAge===Number.MAX_VALUE){item.expires=Number.MAX_VALUE;}else{item.expires=item.created+(item.maxAge||_this8.$$maxAge);}_this8.$$expiresHeap.push(item);}});}if(this.$$deleteOnExpire==='aggressive'){return this.removeExpired();}else{return{};}}/**\n * Update the {@link Cache#onExpire} for the cache. Pass in `null` to unset\n * the global `onExpire` callback of the cache.\n *\n * @example\n * cache.setOnExpire(function (key, value, done) {\n * // Do something\n * });\n *\n * @method Cache#setOnExpire\n * @param {function|null} onExpire The new {@link Cache#onExpire}.\n */},{key:'setOnExpire',value:function setOnExpire(onExpire){if(onExpire===null){this.$$onExpire=null;}else if(!utils.isFunction(onExpire)){throw new TypeError('\"onExpire\" must be a function!');}else{this.$$onExpire=onExpire;}}/**\n * Update multiple cache options at a time.\n *\n * @example\n * cache.setOptions({\n * maxAge: 60 * 60 * 1000,\n * deleteOnExpire: 'aggressive'\n * });\n *\n * @example Set two options, and reset the rest to the configured defaults\n * cache.setOptions({\n * maxAge: 60 * 60 * 1000,\n * deleteOnExpire: 'aggressive'\n * }, true);\n *\n * @method Cache#setOptions\n * @param {object} options The options to set.\n * @param {boolean} [strict] Reset options not passed to `options` to the\n * configured defaults.\n */},{key:'setOptions',value:function setOptions(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var strict=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(!utils.isObject(options)){throw new TypeError('\"options\" must be an object!');}if(options.storagePrefix!==undefined){this.$$storagePrefix=options.storagePrefix;}else if(strict){this.$$storagePrefix=defaults$1.storagePrefix;}this.$$prefix=this.$$storagePrefix+this.id;if(options.enabled!==undefined){this.$$enabled=!!options.enabled;}else if(strict){this.$$enabled=defaults$1.enabled;}if(options.deleteOnExpire!==undefined){this.setDeleteOnExpire(options.deleteOnExpire,false);}else if(strict){this.setDeleteOnExpire(defaults$1.deleteOnExpire,false);}if(options.recycleFreq!==undefined){this.setRecycleFreq(options.recycleFreq);}else if(strict){this.setRecycleFreq(defaults$1.recycleFreq);}if(options.maxAge!==undefined){this.setMaxAge(options.maxAge);}else if(strict){this.setMaxAge(defaults$1.maxAge);}if(options.storeOnResolve!==undefined){this.$$storeOnResolve=!!options.storeOnResolve;}else if(strict){this.$$storeOnResolve=defaults$1.storeOnResolve;}if(options.storeOnReject!==undefined){this.$$storeOnReject=!!options.storeOnReject;}else if(strict){this.$$storeOnReject=defaults$1.storeOnReject;}if(options.capacity!==undefined){this.setCapacity(options.capacity);}else if(strict){this.setCapacity(defaults$1.capacity);}if(options.cacheFlushInterval!==undefined){this.setCacheFlushInterval(options.cacheFlushInterval);}else if(strict){this.setCacheFlushInterval(defaults$1.cacheFlushInterval);}if(options.onExpire!==undefined){this.setOnExpire(options.onExpire);}else if(strict){this.setOnExpire(defaults$1.onExpire);}if(options.storageMode!==undefined||options.storageImpl!==undefined){this.setStorageMode(options.storageMode||defaults$1.storageMode,options.storageImpl||defaults$1.storageImpl);}else if(strict){this.setStorageMode(defaults$1.storageMode,defaults$1.storageImpl);}}/**\n * Update the {@link Cache#recycleFreq} for the cache. Pass in `null` to\n * disable the interval.\n *\n * @example\n * cache.setRecycleFreq(10000);\n *\n * @method Cache#setRecycleFreq\n * @param {number|null} recycleFreq The new {@link Cache#recycleFreq}.\n */},{key:'setRecycleFreq',value:function setRecycleFreq(recycleFreq){var _this9=this;if(recycleFreq===null){this.$$recycleFreq=null;}else if(!utils.isNumber(recycleFreq)){throw new TypeError('\"recycleFreq\" must be a number!');}else if(recycleFreq<=0){throw new Error('\"recycleFreq\" must be greater than zero!');}else{this.$$recycleFreq=recycleFreq;}clearInterval(this.$$recycleFreqId);if(this.$$deleteOnExpire==='aggressive'&&this.$$recycleFreq){this.$$recycleFreqId=setInterval(function(){return _this9.removeExpired();},this.$$recycleFreq);}else{this.$$recycleFreqId=undefined;}}/**\n * Update the {@link Cache#storageMode} for the cache.\n *\n * @method Cache#setStorageMode\n * @param {string} storageMode The new {@link Cache#storageMode}.\n * @param {object} storageImpl The new {@link Cache~StorageImpl}.\n */},{key:'setStorageMode',value:function setStorageMode(storageMode,storageImpl){var _this10=this;if(!utils.isString(storageMode)){throw new TypeError('\"storageMode\" must be a string!');}else if(storageMode!=='memory'&&storageMode!=='localStorage'&&storageMode!=='sessionStorage'){throw new Error('\"storageMode\" must be \"memory\", \"localStorage\", or \"sessionStorage\"!');}var prevStorage=this.$$storage;var prevData=this.$$data;var shouldReInsert=false;var items={};var load=function load(prevStorage,prevData){var keys=_this10.keys();var prevDataIsObject=utils.isObject(prevData);keys.forEach(function(key){if(prevStorage){var itemJson=prevStorage().getItem(_this10.$$prefix+'.data.'+key);if(itemJson){items[key]=utils.fromJson(itemJson);}}else if(prevDataIsObject){items[key]=prevData[key];}_this10.remove(key);shouldReInsert||(shouldReInsert=true);});};if(!this.$$initializing){load(prevStorage,prevData);}this.$$storageMode=storageMode;if(storageImpl){if(!utils.isObject(storageImpl)){throw new TypeError('\"storageImpl\" must be an object!');}else if(typeof storageImpl.setItem!=='function'){throw new Error('\"storageImpl\" must implement \"setItem(key, value)\"!');}else if(typeof storageImpl.getItem!=='function'){throw new Error('\"storageImpl\" must implement \"getItem(key)\"!');}else if(typeof storageImpl.removeItem!=='function'){throw new Error('\"storageImpl\" must implement \"removeItem(key)\"!');}this.$$storage=function(){return storageImpl;};}else if(this.$$storageMode==='localStorage'){try{localStorage.setItem('cachefactory','cachefactory');localStorage.removeItem('cachefactory');this.$$storage=function(){return localStorage;};}catch(e){this.$$storage=null;this.$$storageMode='memory';}}else if(this.$$storageMode==='sessionStorage'){try{sessionStorage.setItem('cachefactory','cachefactory');sessionStorage.removeItem('cachefactory');this.$$storage=function(){return sessionStorage;};}catch(e){this.$$storage=null;this.$$storageMode='memory';}}else{this.$$storage=null;this.$$storageMode='memory';}if(this.$$initializing){load(this.$$storage,this.$$data);}if(shouldReInsert){Object.keys(items).forEach(function(key){var item=items[key];_this10.put(key,item.value,{created:item.created,accessed:item.accessed,expires:item.expires});});}}/**\n * Reset an item's age in the cache, or if `key` is unspecified, touch all\n * items in the cache.\n *\n * @example\n * cache.touch('foo');\n *\n * @method Cache#touch\n * @param {string} [key] The key of the item to touch.\n * @param {object} [options] Options to pass to {@link Cache#put} if\n * necessary.\n */},{key:'touch',value:function touch(key,options){var _this11=this;if(key){var val=this.get(key,{onExpire:function onExpire(k,v){return _this11.put(k,v);}});if(val){this.put(key,val,options);}}else{var keys=this.keys();for(var i=0;i1&&arguments[1]!==undefined?arguments[1]:{};if(this.caches[id]){throw new Error('cache \"'+id+'\" already exists!');}options.parent=this;this.caches[id]=new CacheFactory.Cache(id,options);return this.caches[id];}/**\n * Calls {@link Cache#destroy} on the {@link Cache} in this\n * {@link CacheFactory} that has the specified `id`.\n *\n * @example\n * cacheFactory.destroy('my-cache');\n *\n * @method CacheFactory#destroy\n * @param {string} id TODO\n */},{key:'destroy',value:function destroy(id){this.get(id).destroy();this.caches[id]=undefined;}/**\n * Calls {@link Cache#destroy} on each {@link Cache} in this\n * {@link CacheFactory}.\n *\n * @example\n * cacheFactory.destroyAll();\n *\n * @method CacheFactory#destroyAll\n */},{key:'destroyAll',value:function destroyAll(){var _this2=this;this.keys().forEach(function(id){_this2.get(id).destroy();});this.caches={};}/**\n * Calls {@link Cache#disable} on each {@link Cache} in this\n * {@link CacheFactory}.\n *\n * @example\n * cacheFactory.disableAll();\n *\n * @method CacheFactory#disableAll\n */},{key:'disableAll',value:function disableAll(){var _this3=this;this.keys().forEach(function(cacheId){_this3.get(cacheId).disable();});}/**\n * Calls {@link Cache#enable} on each {@link Cache} in this\n * {@link CacheFactory}.\n *\n * @example\n * cacheFactory.enableAll();\n *\n * @method CacheFactory#enableAll\n */},{key:'enableAll',value:function enableAll(){var _this4=this;this.keys().forEach(function(cacheId){_this4.get(cacheId).enable();});}/**\n * Returns whether the {@link Cache} with the specified `id` exists in this\n * {@link CacheFactory}.\n *\n * @example\n * const exists = cacheFactory.exists('my-cache');\n *\n * @method CacheFactory#exists\n * @returns {boolean} Whether the {@link Cache} with the specified `id` exists\n * in this {@link CacheFactory}.\n */},{key:'exists',value:function exists(id){return!!this.caches[id];}/**\n * Returns a reference to the {@link Cache} in this {@link CacheFactory} that\n * has the specified `id`.\n *\n * @example\n * const cache = cacheFactory.get('my-cache');\n *\n * @method CacheFactory#get\n * @param {string} id The `id` of the {@link Cache} to retrieve.\n * @returns {Cache} The {@link Cache} instance.\n * @throws {ReferenceError} Throws a `ReferenceError` if the {@link Cache}\n * does not exist.\n */},{key:'get',value:function get$$1(id){var cache=this.caches[id];if(!cache){throw new ReferenceError('Cache \"'+id+'\" does not exist!');}return cache;}/**\n * Returns information on this {@link CacheFactory} and its {@link Cache}\n * instance.\n *\n * @example\n * const info = cacheFactory.info();\n * info.size; // 3\n * info.caches['my-cache']; // { size: 1234, ... }\n * info.caches['my-cache2']; // { size: 51, ... }\n * info.caches['my-cache3']; // { size: 43, ... }\n *\n * @method CacheFactory#info\n * @returns {object} The detailed information.\n */},{key:'info',value:function info(){var _this5=this;var keys=this.keys();var info={size:keys.length,caches:{}};keys.forEach(function(cacheId){info.caches[cacheId]=_this5.get(cacheId).info();});Object.keys(defaults$1).forEach(function(key,value){info[key]=defaults$1[key];});return info;}/**\n * Returns an array of identifiers of the {@link Cache} instances in this\n * {@link CacheFactory}.\n *\n * @example\n * const keys = cacheFactory.keys();\n *\n * @method CacheFactory#keys\n * @returns {string[]} The {@link Cache} identifiers.\n */},{key:'keys',value:function keys(){var _this6=this;return Object.keys(this.caches).filter(function(key){return _this6.caches[key];});}/**\n * Returns an object of key-value pairs representing the identifiers of the\n * {@link Cache} instances in this {@link CacheFactory}.\n *\n * @example\n * const keySet = cacheFactory.keySet();\n *\n * @method CacheFactory#keySet\n * @returns {object} The {@link Cache} identifiers.\n */},{key:'keySet',value:function keySet(){var set$$1={};this.keys().forEach(function(key){set$$1[key]=key;});return set$$1;}/**\n * Calls {@link Cache#removeExpired} on each {@link Cache} in this\n * {@link CacheFactory} and returns the removed items, if any.\n *\n * @example\n * const expired = cacheFactory.removeExpiredFromAll();\n *\n * @method CacheFactory#removeExpiredFromAll\n * @returns {object} The removed items, if any.\n */},{key:'removeExpiredFromAll',value:function removeExpiredFromAll(){var _this7=this;var expired={};this.keys().forEach(function(id){expired[id]=_this7.get(id).removeExpired();});return expired;}/**\n * Calls {@link Cache#touch} on each {@link Cache} in this\n * {@link CacheFactory}.\n *\n * @example\n * cacheFactory.touchAll();\n *\n * @method CacheFactory#touchAll\n */},{key:'touchAll',value:function touchAll(){var _this8=this;this.keys().forEach(function(cacheId){_this8.get(cacheId).touch();});}}]);return CacheFactory;}();\n\nCacheFactory.Cache=Cache;\n\nexport { CacheFactory, BinaryHeap, Cache, defaults$1 as defaults, utils };\n//# sourceMappingURL=cachefactory.es2015.js.map\n","import angular from 'angular'\nimport { BinaryHeap, CacheFactory, defaults, utils } from 'cachefactory'\n\nutils.equals = angular.equals\nutils.isObject = angular.isObject\nutils.fromJson = angular.fromJson\n\nfunction BinaryHeapProvider () {\n this.$get = function () { return BinaryHeap }\n}\n\nfunction CacheFactoryProvider () {\n this.defaults = defaults\n this.defaults.storagePrefix = 'angular-cache.caches.'\n\n this.$get = [\n '$q', function ($q) {\n utils.Promise = $q\n return new CacheFactory()\n }\n ]\n}\n\nangular.module('angular-cache', [])\n .provider('BinaryHeap', BinaryHeapProvider)\n .provider('CacheFactory', CacheFactoryProvider)\n\nexport default 'angular-cache'\n"],"names":["_typeof","Symbol","babelHelpers.typeof","iterator","obj","constructor","prototype","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","defineProperty","key","protoProps","staticProps","bubbleUp","heap","weightFunc","n","element","weight","parentN","Math","floor","parent","bubbleDown","node","nodeWeight","child2N","child1N","swap","child1","child1Weight","child2","child2Weight","BinaryHeap","compareFunc","x","y","Error","value","push","peek","pop","front","end","remove","removed","removeAll","size","defaults$1","capacity","Number","MAX_VALUE","cacheFlushInterval","deleteOnExpire","enabled","onExpire","maxAge","recycleFreq","storageMode","storageImpl","storagePrefix","storeOnReject","storeOnResolve","_Promise","window","Promise","e","utils","equals","a","b","fromJson","JSON","parse","isFunction","isNumber","isObject","isPromise","then","isString","toJson","stringify","assignMsg","Cache","id","_this","options","arguments","undefined","$$cacheFlushIntervalId","$$capacity","$$data","$$deleteOnExpire","$$enabled","$$expiresHeap","accessed","$$initializing","$$lruHeap","$$maxAge","$$onExpire","$$prefix","$$promises","$$recycleFreq","$$recycleFreqId","$$storage","$$storageMode","$$storagePrefix","$$storeOnReject","$$storeOnResolve","get","get$$1","$$cacheFlushInterval","set","set$$1","setOptions","destroy","clearInterval","removeItem","$$parent","caches","disable","enable","_this2","Array","isArray","keys","values","forEach","item","itemJson","getItem","now","Date","getTime","expires","call","setItem","info","created","isExpired","_this3","keysJson","Object","filter","keySet","put","_this4","getHandler","shouldStore","isError","v","status","data","headers","statusText","reject","exists","_key","index","indexOf","splice","_this5","storage","removeExpired","_this6","expired","expiredItem","setCacheFlushInterval","_this7","setInterval","setCapacity","setDeleteOnExpire","setRecycleFreq","setMaxAge","_this8","setOnExpire","strict","setStorageMode","_this9","_this10","prevStorage","prevData","shouldReInsert","items","load","prevDataIsObject","localStorage","sessionStorage","touch","_this11","val","k","_this12","map","CacheFactory","clearAll","cacheId","createCache","destroyAll","disableAll","enableAll","cache","ReferenceError","removeExpiredFromAll","touchAll","angular","BinaryHeapProvider","$get","CacheFactoryProvider","defaults","$q","module","provider"],"mappings":"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"} \ No newline at end of file diff --git a/dist/angular-cache.min.js b/dist/angular-cache.min.js index ae78ddc..a92cb1b 100644 --- a/dist/angular-cache.min.js +++ b/dist/angular-cache.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t("undefined"==typeof angular?require("angular"):angular):"function"==typeof define&&define.amd?define("angular-cache",["angular"],t):e.angularCacheModuleName=t(e.angular)}(this,function(e){"use strict";function t(e,t){if(e||(e=function(e){return e}),t||(t=function(e,t){return e===t}),"function"!=typeof e)throw new Error('BinaryHeap([weightFunc][, compareFunc]): "weightFunc" must be a function!');if("function"!=typeof t)throw new Error('BinaryHeap([weightFunc][, compareFunc]): "compareFunc" must be a function!');this.weightFunc=e,this.compareFunc=t,this.heap=[]}function r(e){var t=[],r=void 0;if(!d.isObject(e))return t;for(r in e)e.hasOwnProperty(r)&&t.push(r);return t}function i(e){return e&&"function"==typeof e.then}function s(e){return d.isNumber(e)?e.toString():e}function n(e){var t={},r=void 0;if(!d.isObject(e))return t;for(r in e)e.hasOwnProperty(r)&&(t[r]=r);return t}function o(e,o){if(e in g)throw new Error(e+" already exists!");if(!d.isString(e))throw new Error("cacheId must be a string!");var a={},c={},l=null,h=new t(function(e){return e.expires},d.equals),f=new t(function(e){return e.accessed},d.equals),p=g[e]={$$id:e,destroy:function(){clearInterval(this.$$cacheFlushIntervalId),clearInterval(this.$$recycleFreqId),this.removeAll(),l&&(l().removeItem(this.$$prefix+".keys"),l().removeItem(this.$$prefix)),l=null,a=null,f=null,h=null,this.$$prefix=null,delete g[this.$$id]},disable:function(){this.$$disabled=!0},enable:function(){delete this.$$disabled},get:function(e,t){var r=this;if(Array.isArray(e)){var i=function(){var i=e,s=[];return i.forEach(function(e){var i=r.get(e,t);null!==i&&void 0!==i&&s.push(i)}),{v:s}}();if("object"===("undefined"==typeof i?"undefined":u["typeof"](i)))return i.v}else if(e=s(e),this.$$disabled)return;if(t=t||{},!d.isString(e))throw new Error("key must be a string!");if(t&&!d.isObject(t))throw new Error("options must be an object!");if(t.onExpire&&!d.isFunction(t.onExpire))throw new Error("options.onExpire must be a function!");var n=void 0;if(l){if(c[e])return c[e];var o=l().getItem(this.$$prefix+".data."+e);if(!o)return;n=d.fromJson(o)}else if(d.isObject(a)){if(!(e in a))return;n=a[e]}var h=n.value,p=(new Date).getTime();return l?(f.remove({key:e,accessed:n.accessed}),n.accessed=p,f.push({key:e,accessed:p})):(f.remove(n),n.accessed=p,f.push(n)),"passive"===this.$$deleteOnExpire&&"expires"in n&&n.expires(t.maxAge||this.$$maxAge)}):void 0}return d.isObject(a)&&e in a?(t=a[e],{created:t.created,accessed:t.accessed,expires:t.expires,isExpired:(new Date).getTime()-t.created>(t.maxAge||this.$$maxAge)}):void 0}return{id:this.$$id,capacity:this.$$capacity,maxAge:this.$$maxAge,deleteOnExpire:this.$$deleteOnExpire,onExpire:this.$$onExpire,cacheFlushInterval:this.$$cacheFlushInterval,recycleFreq:this.$$recycleFreq,storageMode:this.$$storageMode,storageImpl:l?l():void 0,disabled:!!this.$$disabled,size:f&&f.size()||0}},keys:function(){if(l){var e=l().getItem(this.$$prefix+".keys");return e?d.fromJson(e):[]}return r(a)},keySet:function(){if(l){var e=l().getItem(this.$$prefix+".keys"),t={};if(e)for(var r=d.fromJson(e),i=0;ithis.$$capacity&&this.remove(f.peek().key),t}},remove:function(e){if(e+="",delete c[e],l){var t=l().getItem(this.$$prefix+".data."+e);if(t){var r=d.fromJson(t);f.remove({key:e,accessed:r.accessed}),h.remove({key:e,expires:r.expires}),l().removeItem(this.$$prefix+".data."+e);var i=l().getItem(this.$$prefix+".keys"),s=i?d.fromJson(i):[],n=s.indexOf(e);return n>=0&&s.splice(n,1),l().setItem(this.$$prefix+".keys",JSON.stringify(s)),r.value}}else if(d.isObject(a)){var o=a[e]?a[e].value:void 0;return f.remove(a[e]),h.remove(a[e]),a[e]=null,delete a[e],o}},removeAll:function(){if(l){f.removeAll(),h.removeAll();var e=l().getItem(this.$$prefix+".keys");if(e)for(var t=d.fromJson(e),r=0;re)throw new Error("cacheFlushInterval must be greater than zero!");e!==t.$$cacheFlushInterval&&(t.$$cacheFlushInterval=e,clearInterval(t.$$cacheFlushIntervalId),t.$$cacheFlushIntervalId=setInterval(function(){t.removeAll()},t.$$cacheFlushInterval))}},setCapacity:function(e){if(null===e)delete this.$$capacity;else{if(!d.isNumber(e))throw new Error("capacity must be a number!");if(0>e)throw new Error("capacity must be greater than zero!");this.$$capacity=e}for(var t={};f.size()>this.$$capacity;)t[f.peek().key]=this.remove(f.peek().key);return t},setDeleteOnExpire:function(e,t){if(null===e)delete this.$$deleteOnExpire;else{if(!d.isString(e))throw new Error("deleteOnExpire must be a string!");if("none"!==e&&"passive"!==e&&"aggressive"!==e)throw new Error('deleteOnExpire must be "none", "passive" or "aggressive"!');this.$$deleteOnExpire=e}t!==!1&&this.setRecycleFreq(this.$$recycleFreq)},setMaxAge:function(e){if(null===e)this.$$maxAge=Number.MAX_VALUE;else{if(!d.isNumber(e))throw new Error("maxAge must be a number!");if(0>e)throw new Error("maxAge must be greater than zero!");this.$$maxAge=e}var t=void 0,i=void 0,s=void 0;if(h.removeAll(),l){var n=l().getItem(this.$$prefix+".keys");for(i=n?d.fromJson(n):[],t=0;te)throw new Error("recycleFreq must be greater than zero!");this.$$recycleFreq=e}clearInterval(this.$$recycleFreqId),"aggressive"===this.$$deleteOnExpire?!function(e){e.$$recycleFreqId=setInterval(function(){e.removeExpired()},e.$$recycleFreq)}(this):delete this.$$recycleFreqId},setStorageMode:function(e,t){function r(e,t){var r=this.keys(),i=r.length;if(i){for(var s=void 0,a=d.isObject(t),c=0;i>c;c++){if(s=r[c],e){var l=e().getItem(this.$$prefix+".data."+s);l&&(o[s]=d.fromJson(l))}else a&&(o[s]=t[s]);this.remove(s)}n=!0}}if(!d.isString(e))throw new Error("storageMode must be a string!");if("memory"!==e&&"localStorage"!==e&&"sessionStorage"!==e)throw new Error('storageMode must be "memory", "localStorage" or "sessionStorage"!');var i=l,s=a,n=!1,o={};if(this.$$initializing||r.call(this,i,s),this.$$storageMode=e,t){if(!d.isObject(t))throw new Error("storageImpl must be an object!");if(!("setItem"in t&&"function"==typeof t.setItem))throw new Error('storageImpl must implement "setItem(key, value)"!');if(!("getItem"in t&&"function"==typeof t.getItem))throw new Error('storageImpl must implement "getItem(key)"!');if(!("removeItem"in t)||"function"!=typeof t.removeItem)throw new Error('storageImpl must implement "removeItem(key)"!');l=function(){return t}}else if("localStorage"===this.$$storageMode)try{localStorage.setItem("cachefactory","cachefactory"),localStorage.removeItem("cachefactory"),l=function(){return localStorage}}catch(c){l=null,this.$$storageMode="memory"}else if("sessionStorage"===this.$$storageMode)try{sessionStorage.setItem("cachefactory","cachefactory"),sessionStorage.removeItem("cachefactory"),l=function(){return sessionStorage}}catch(c){l=null,this.$$storageMode="memory"}else l=null,this.$$storageMode="memory";if(this.$$initializing&&r.call(this,l,a),n){var u=void 0;for(var h in o)u=o[h],this.put(h,u.value,{created:u.created,accessed:u.accessed,expires:u.expires})}},touch:function(e,t){var r=this;if(e){var i=this.get(e,{onExpire:function(e,t){return r.put(e,t)}});i&&this.put(e,i,t)}else for(var s=this.keys(),n=0;n0;){var n=Math.floor((r+1)/2)-1,o=e[n];if(s>=t(o))break;e[n]=i,e[r]=o,r=n}},f=function(e,t,r){for(var i=e.length,s=e[r],n=t(s);;){var o=2*(r+1),a=o-1,c=null;if(i>a){var l=e[a],u=t(l);n>u&&(c=a)}if(i>o){var h=e[o],f=t(h);f<(null===c?n:t(e[a]))&&(c=o)}if(null===c)break;e[r]=e[c],e[c]=s,r=c}},p=t.prototype;p.push=function(e){this.heap.push(e),h(this.heap,this.weightFunc,this.heap.length-1)},p.peek=function(){return this.heap[0]},p.pop=function(){var e=this.heap[0],t=this.heap.pop();return this.heap.length>0&&(this.heap[0]=t,f(this.heap,this.weightFunc,0)),e},p.remove=function(e){for(var t=this.heap.length,r=0;t>r;r++)if(this.compareFunc(this.heap[r],e)){var i=this.heap[r],s=this.heap.pop();return r!==t-1&&(this.heap[r]=s,h(this.heap,this.weightFunc,r),f(this.heap,this.weightFunc,r)),i}return null},p.removeAll=function(){this.heap=[]},p.size=function(){return this.heap.length};var m=null;try{m=window.Promise}catch($){}var d={isNumber:function(e){return"number"==typeof e},isString:function(e){return"string"==typeof e},isObject:function(e){return null!==e&&"object"===("undefined"==typeof e?"undefined":u["typeof"](e))},isFunction:function(e){return"function"==typeof e},fromJson:function(e){return JSON.parse(e)},equals:function(e,t){return e===t},Promise:m},v={capacity:Number.MAX_VALUE,maxAge:Number.MAX_VALUE,deleteOnExpire:"none",onExpire:null,cacheFlushInterval:null,recycleFreq:1e3,storageMode:"memory",storageImpl:null,disabled:!1,storagePrefix:"cachefactory.caches.",storeOnResolve:!1,storeOnReject:!1},g={};a.createCache=o,a.defaults=v,a.info=function(){var e=r(g),t={size:e.length,caches:{}};for(var i in v)v.hasOwnProperty(i)&&(t[i]=v[i]);for(var s=0;s0;){var a=Math.floor((r+1)/2)-1,n=e[a];if(s>=t(n))break;e[a]=i,e[r]=n,r=a}},c=function(e,t,r){for(var i=e.length,s=e[r],a=t(s);;){var n=2*(r+1),o=n-1,c=null;if(o0&&(this.heap[0]=t,c(this.heap,this.weightFunc,0)),e}},{key:"remove",value:function(e){for(var t=this.heap.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{};if(a(this,e),!$.isString(t))throw new TypeError('"id" must be a string!');Object.defineProperties(this,{$$cacheFlushInterval:{writable:!0,value:void 0},$$cacheFlushIntervalId:{writable:!0,value:void 0},$$capacity:{writable:!0,value:void 0},$$data:{writable:!0,value:{}},$$deleteOnExpire:{writable:!0,value:void 0},$$enabled:{writable:!0,value:void 0},$$expiresHeap:{writable:!0,value:new u(function(e){return e.accessed},$.equals)},$$initializing:{writable:!0,value:!0},$$lruHeap:{writable:!0,value:new u(function(e){return e.accessed},$.equals)},$$maxAge:{writable:!0,value:void 0},$$onExpire:{writable:!0,value:void 0},$$prefix:{writable:!0,value:""},$$promises:{writable:!0,value:{}},$$recycleFreq:{writable:!0,value:void 0},$$recycleFreqId:{writable:!0,value:void 0},$$storage:{writable:!0,value:void 0},$$storageMode:{writable:!0,value:void 0},$$storagePrefix:{writable:!0,value:void 0},$$storeOnReject:{writable:!0,value:void 0},$$storeOnResolve:{writable:!0,value:void 0},$$parent:{value:i.parent},cacheFlushInterval:{enumerable:!0,get:function(){return r.$$cacheFlushInterval},set:function(){throw new Error(f+" 'cacheFlushInterval'")}},capacity:{enumerable:!0,get:function(){return r.$$capacity},set:function(){throw new Error(f+" 'capacity'")}},deleteOnExpire:{enumerable:!0,get:function(){return r.$$deleteOnExpire},set:function(){throw new Error(f+" 'deleteOnExpire'")}},enabled:{enumerable:!0,get:function(){return r.$$enabled},set:function(){throw new Error(f+" 'enabled'")}},id:{enumerable:!0,value:t},maxAge:{enumerable:!0,get:function(){return r.$$maxAge},set:function(){throw new Error(f+" 'maxAge'")}},onExpire:{enumerable:!0,get:function(){return r.$$onExpire},set:function(){throw new Error(f+" 'onExpire'")}},recycleFreq:{enumerable:!0,get:function(){return r.$$recycleFreq},set:function(){throw new Error(f+" 'recycleFreq'")}},storageMode:{enumerable:!0,get:function(){return r.$$storageMode},set:function(){throw new Error(f+" 'storageMode'")}},storagePrefix:{enumerable:!0,get:function(){return r.$$storagePrefix},set:function(){throw new Error(f+" 'storagePrefix'")}},storeOnReject:{enumerable:!0,get:function(){return r.$$storeOnReject},set:function(){throw new Error(f+" 'storeOnReject'")}},storeOnResolve:{enumerable:!0,get:function(){return r.$$storeOnResolve},set:function(){throw new Error(f+" 'storeOnResolve'")}}}),this.setOptions(i,!0),this.$$initializing=!1}return n(e,[{key:"destroy",value:function(){clearInterval(this.$$cacheFlushIntervalId),clearInterval(this.$$recycleFreqId),this.removeAll(),this.$$storage&&(this.$$storage().removeItem(this.$$prefix+".keys"),this.$$storage().removeItem(this.$$prefix)),this.$$storage=null,this.$$data=null,this.$$lruHeap=null,this.$$expiresHeap=null,this.$$prefix=null,this.$$parent&&(this.$$parent.caches[this.id]=void 0)}},{key:"disable",value:function(){this.$$enabled=!1}},{key:"enable",value:function(){this.$$enabled=!0}},{key:"get",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Array.isArray(e)){var i=e,s=[];return i.forEach(function(e){var i=t.get(e,r);null!==i&&void 0!==i&&s.push(i)}),s}if($.isNumber(e)&&(e=""+e),this.enabled){if(!$.isString(e))throw new TypeError('"key" must be a string!');if(!r||!$.isObject(r))throw new TypeError('"options" must be an object!');if(r.onExpire&&!$.isFunction(r.onExpire))throw new TypeError('"options.onExpire" must be a function!');var a=void 0;if(this.$$storage){if(this.$$promises[e])return this.$$promises[e];var n=this.$$storage().getItem(this.$$prefix+".data."+e);n&&(a=$.fromJson(n))}else $.isObject(this.$$data)&&(a=this.$$data[e]);if(a){var o=a.value,c=(new Date).getTime();return this.$$storage?(this.$$lruHeap.remove({key:e,accessed:a.accessed}),a.accessed=c,this.$$lruHeap.push({key:e,accessed:c})):(this.$$lruHeap.remove(a),a.accessed=c,this.$$lruHeap.push(a)),"passive"===this.$$deleteOnExpire&&"expires"in a&&a.expires(t.maxAge||this.$$maxAge)}:void 0}},{key:"keys",value:function(){var e=this;if(this.$$storage){var t=this.$$storage().getItem(this.$$prefix+".keys");return t?$.fromJson(t):[]}return Object.keys(this.$$data).filter(function(t){return e.$$data[t]})}},{key:"keySet",value:function(){var e={};return this.keys().forEach(function(t){e[t]=t}),e}},{key:"put",value:function(e,t){var r=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=void 0!==i.storeOnResolve?!!i.storeOnResolve:this.$$storeOnResolve,a=void 0!==i.storeOnReject?!!i.storeOnReject:this.$$storeOnReject,n=function(t,i){return function(s){if(t&&(r.$$promises[e]=void 0,$.isObject(s)&&"status"in s&&"data"in s?r.put(e,[s.status,s.data,s.headers(),s.statusText]):r.put(e,s)),i){if($.Promise)return $.Promise.reject(s);throw s}return s}};if(this.$$enabled&&$.isObject(this.$$data)&&null!==t&&void 0!==t){if($.isNumber(e)&&(e=""+e),!$.isString(e))throw new TypeError('"key" must be a string!');var o=(new Date).getTime(),c={key:e,value:$.isPromise(t)?t.then(n(s,!1),n(a,!0)):t,created:void 0===i.created?o:i.created,accessed:void 0===i.accessed?o:i.accessed};if($.isNumber(i.maxAge)&&(c.maxAge=i.maxAge),void 0===i.expires?c.expires=c.created+(c.maxAge||this.$$maxAge):c.expires=i.expires,this.$$storage){if($.isPromise(c.value))return this.$$promises[e]=c.value,this.$$promises[e];var u=this.$$storage().getItem(this.$$prefix+".keys"),h=u?$.fromJson(u):[],l=this.$$storage().getItem(this.$$prefix+".data."+e);l&&this.remove(e),this.$$expiresHeap.push({key:e,expires:c.expires}),this.$$lruHeap.push({key:e,accessed:c.accessed}),this.$$storage().setItem(this.$$prefix+".data."+e,$.toJson(c));var f=!1;h.forEach(function(t){if(t===e)return f=!0,!1}),f||h.push(e),this.$$storage().setItem(this.$$prefix+".keys",$.toJson(h))}else this.$$data[e]&&this.remove(e),this.$$expiresHeap.push(c),this.$$lruHeap.push(c),this.$$data[e]=c,this.$$promises[e]=void 0;return this.$$lruHeap.size()>this.$$capacity&&this.remove(this.$$lruHeap.peek().key),t}}},{key:"remove",value:function(e){if($.isNumber(e)&&(e=""+e),this.$$promises[e]=void 0,this.$$storage){var t=this.$$storage().getItem(this.$$prefix+".data."+e);if(t){var r=$.fromJson(t);this.$$lruHeap.remove({key:e,accessed:r.accessed}),this.$$expiresHeap.remove({key:e,expires:r.expires}),this.$$storage().removeItem(this.$$prefix+".data."+e);var i=this.$$storage().getItem(this.$$prefix+".keys"),s=i?$.fromJson(i):[],a=s.indexOf(e);return a>=0&&s.splice(a,1),this.$$storage().setItem(this.$$prefix+".keys",$.toJson(s)),r.value}}else if($.isObject(this.$$data)){var n=this.$$data[e]?this.$$data[e].value:void 0;return this.$$lruHeap.remove(this.$$data[e]),this.$$expiresHeap.remove(this.$$data[e]),this.$$data[e]=void 0,n}}},{key:"removeAll",value:function(){var e=this,t=this.$$storage,r=this.keys();this.$$lruHeap.removeAll(),this.$$expiresHeap.removeAll(),t?(t().setItem(this.$$prefix+".keys",$.toJson([])),r.forEach(function(r){t().removeItem(e.$$prefix+".data."+r)})):$.isObject(this.$$data)&&(this.$$data={}),this.$$promises={}}},{key:"removeExpired",value:function(){for(var e=this,t=(new Date).getTime(),r={},i=void 0;(i=this.$$expiresHeap.peek())&&i.expires<=t;)r[i.key]=i.value?i.value:null,this.$$expiresHeap.pop();return Object.keys(r).forEach(function(t){e.remove(t)}),this.$$onExpire&&Object.keys(r).forEach(function(t){e.$$onExpire(t,r[t])}),r}},{key:"setCacheFlushInterval",value:function(e){var t=this;if(null===e)this.$$cacheFlushInterval=null;else{if(!$.isNumber(e))throw new TypeError('"cacheFlushInterval" must be a number!');if(e<=0)throw new Error('"cacheFlushInterval" must be greater than zero!')}this.$$cacheFlushInterval=e,clearInterval(this.$$cacheFlushIntervalId),this.$$cacheFlushIntervalId=void 0,this.$$cacheFlushInterval&&(this.$$cacheFlushIntervalId=setInterval(function(){return t.removeAll()},this.$$cacheFlushInterval))}},{key:"setCapacity",value:function(e){if(null===e)this.$$capacity=Number.MAX_VALUE;else{if(!$.isNumber(e))throw new TypeError('"capacity" must be a number!');if(e<=0)throw new Error('"capacity" must be greater than zero!');this.$$capacity=e}for(var t={};this.$$lruHeap.size()>this.$$capacity;)t[this.$$lruHeap.peek().key]=this.remove(this.$$lruHeap.peek().key);return t}},{key:"setDeleteOnExpire",value:function(e,t){if(null===e)e="none";else{if(!$.isString(e))throw new TypeError('"deleteOnExpire" must be a string!');if("none"!==e&&"passive"!==e&&"aggressive"!==e)throw new Error('"deleteOnExpire" must be "none", "passive" or "aggressive"!')}this.$$deleteOnExpire=e,t!==!1&&this.setRecycleFreq(this.$$recycleFreq)}},{key:"setMaxAge",value:function(e){var t=this;if(null===e)this.$$maxAge=Number.MAX_VALUE;else{if(!$.isNumber(e))throw new TypeError('"maxAge" must be a number!');if(e<=0)throw new Error('"maxAge" must be greater than zero!');this.$$maxAge=e}var r=this.keys();return this.$$expiresHeap.removeAll(),this.$$storage?r.forEach(function(e){var r=t.$$storage().getItem(t.$$prefix+".data."+e);if(r){var i=$.fromJson(r);t.$$maxAge===Number.MAX_VALUE?i.expires=Number.MAX_VALUE:i.expires=i.created+(i.maxAge||t.$$maxAge),t.$$expiresHeap.push({key:e,expires:i.expires})}}):r.forEach(function(e){var r=t.$$data[e];r&&(t.$$maxAge===Number.MAX_VALUE?r.expires=Number.MAX_VALUE:r.expires=r.created+(r.maxAge||t.$$maxAge),t.$$expiresHeap.push(r))}),"aggressive"===this.$$deleteOnExpire?this.removeExpired():{}}},{key:"setOnExpire",value:function(e){if(null===e)this.$$onExpire=null;else{if(!$.isFunction(e))throw new TypeError('"onExpire" must be a function!');this.$$onExpire=e}}},{key:"setOptions",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!$.isObject(e))throw new TypeError('"options" must be an object!');void 0!==e.storagePrefix?this.$$storagePrefix=e.storagePrefix:t&&(this.$$storagePrefix=h.storagePrefix),this.$$prefix=this.$$storagePrefix+this.id,void 0!==e.enabled?this.$$enabled=!!e.enabled:t&&(this.$$enabled=h.enabled),void 0!==e.deleteOnExpire?this.setDeleteOnExpire(e.deleteOnExpire,!1):t&&this.setDeleteOnExpire(h.deleteOnExpire,!1),void 0!==e.recycleFreq?this.setRecycleFreq(e.recycleFreq):t&&this.setRecycleFreq(h.recycleFreq),void 0!==e.maxAge?this.setMaxAge(e.maxAge):t&&this.setMaxAge(h.maxAge),void 0!==e.storeOnResolve?this.$$storeOnResolve=!!e.storeOnResolve:t&&(this.$$storeOnResolve=h.storeOnResolve),void 0!==e.storeOnReject?this.$$storeOnReject=!!e.storeOnReject:t&&(this.$$storeOnReject=h.storeOnReject),void 0!==e.capacity?this.setCapacity(e.capacity):t&&this.setCapacity(h.capacity),void 0!==e.cacheFlushInterval?this.setCacheFlushInterval(e.cacheFlushInterval):t&&this.setCacheFlushInterval(h.cacheFlushInterval),void 0!==e.onExpire?this.setOnExpire(e.onExpire):t&&this.setOnExpire(h.onExpire),void 0!==e.storageMode||void 0!==e.storageImpl?this.setStorageMode(e.storageMode||h.storageMode,e.storageImpl||h.storageImpl):t&&this.setStorageMode(h.storageMode,h.storageImpl)}},{key:"setRecycleFreq",value:function(e){var t=this;if(null===e)this.$$recycleFreq=null;else{if(!$.isNumber(e))throw new TypeError('"recycleFreq" must be a number!');if(e<=0)throw new Error('"recycleFreq" must be greater than zero!');this.$$recycleFreq=e}clearInterval(this.$$recycleFreqId),"aggressive"===this.$$deleteOnExpire&&this.$$recycleFreq?this.$$recycleFreqId=setInterval(function(){return t.removeExpired()},this.$$recycleFreq):this.$$recycleFreqId=void 0}},{key:"setStorageMode",value:function(e,t){var r=this;if(!$.isString(e))throw new TypeError('"storageMode" must be a string!');if("memory"!==e&&"localStorage"!==e&&"sessionStorage"!==e)throw new Error('"storageMode" must be "memory", "localStorage", or "sessionStorage"!');var i=this.$$storage,s=this.$$data,a=!1,n={},o=function(e,t){var i=r.keys(),s=$.isObject(t);i.forEach(function(i){if(e){var o=e().getItem(r.$$prefix+".data."+i);o&&(n[i]=$.fromJson(o))}else s&&(n[i]=t[i]);r.remove(i),a||(a=!0)})};if(this.$$initializing||o(i,s),this.$$storageMode=e,t){if(!$.isObject(t))throw new TypeError('"storageImpl" must be an object!');if("function"!=typeof t.setItem)throw new Error('"storageImpl" must implement "setItem(key, value)"!');if("function"!=typeof t.getItem)throw new Error('"storageImpl" must implement "getItem(key)"!');if("function"!=typeof t.removeItem)throw new Error('"storageImpl" must implement "removeItem(key)"!');this.$$storage=function(){return t}}else if("localStorage"===this.$$storageMode)try{localStorage.setItem("cachefactory","cachefactory"),localStorage.removeItem("cachefactory"),this.$$storage=function(){return localStorage}}catch(e){this.$$storage=null,this.$$storageMode="memory"}else if("sessionStorage"===this.$$storageMode)try{sessionStorage.setItem("cachefactory","cachefactory"),sessionStorage.removeItem("cachefactory"),this.$$storage=function(){return sessionStorage}}catch(e){this.$$storage=null,this.$$storageMode="memory"}else this.$$storage=null,this.$$storageMode="memory";this.$$initializing&&o(this.$$storage,this.$$data),a&&Object.keys(n).forEach(function(e){var t=n[e];r.put(e,t.value,{created:t.created,accessed:t.accessed,expires:t.expires})})}},{key:"touch",value:function(e,t){var r=this;if(e){var i=this.get(e,{onExpire:function(e,t){return r.put(e,t)}});i&&this.put(e,i,t)}else for(var s=this.keys(),a=0;a1&&void 0!==arguments[1]?arguments[1]:{};if(this.caches[t])throw new Error('cache "'+t+'" already exists!');return r.parent=this,this.caches[t]=new e.Cache(t,r),this.caches[t]}},{key:"destroy",value:function(e){this.get(e).destroy(),this.caches[e]=void 0}},{key:"destroyAll",value:function(){var e=this;this.keys().forEach(function(t){e.get(t).destroy()}),this.caches={}}},{key:"disableAll",value:function(){var e=this;this.keys().forEach(function(t){e.get(t).disable()})}},{key:"enableAll",value:function(){var e=this;this.keys().forEach(function(t){e.get(t).enable()})}},{key:"exists",value:function(e){return!!this.caches[e]}},{key:"get",value:function(e){var t=this.caches[e];if(!t)throw new ReferenceError('Cache "'+e+'" does not exist!');return t}},{key:"info",value:function e(){var t=this,r=this.keys(),e={size:r.length,caches:{}};return r.forEach(function(r){e.caches[r]=t.get(r).info()}),Object.keys(h).forEach(function(t,r){e[t]=h[t]}),e}},{key:"keys",value:function(){var e=this;return Object.keys(this.caches).filter(function(t){return e.caches[t]})}},{key:"keySet",value:function(){var e={};return this.keys().forEach(function(t){e[t]=t}),e}},{key:"removeExpiredFromAll",value:function(){var e=this,t={};return this.keys().forEach(function(r){t[r]=e.get(r).removeExpired()}),t}},{key:"touchAll",value:function(){var e=this;this.keys().forEach(function(t){e.get(t).touch()})}}]),e}();v.Cache=p,$.equals=e.equals,$.isObject=e.isObject,$.fromJson=e.fromJson,e.module("angular-cache",[]).provider("BinaryHeap",t).provider("CacheFactory",r);var d="angular-cache";return d}); //# sourceMappingURL=angular-cache.min.map \ No newline at end of file diff --git a/dist/angular-cache.min.map b/dist/angular-cache.min.map index cba11d7..86eaf24 100644 --- a/dist/angular-cache.min.map +++ b/dist/angular-cache.min.map @@ -1 +1 @@ -{"version":3,"sources":["dist/angular-cache.js"],"names":["global","factory","exports","module","angular","require","define","amd","angularCacheModuleName","this","BinaryHeap","weightFunc","compareFunc","x","y","Error","heap","_keys","collection","keys","key","utils","isObject","hasOwnProperty","push","_isPromiseLike","value","then","_stringifyNumber","number","isNumber","toString","_keySet","keySet","createCache","cacheId","options","caches","isString","$$data","$$promises","$$storage","$$expiresHeap","expires","equals","$$lruHeap","accessed","cache","$$id","destroy","clearInterval","$$cacheFlushIntervalId","$$recycleFreqId","removeAll","removeItem","$$prefix","disable","$$disabled","enable","get","_this2","Array","isArray","_ret","values","forEach","undefined","v","babelHelpers","onExpire","isFunction","item","itemJson","getItem","fromJson","now","Date","getTime","remove","$$deleteOnExpire","$$onExpire","call","setItem","JSON","stringify","info","created","isExpired","maxAge","$$maxAge","id","capacity","$$capacity","deleteOnExpire","cacheFlushInterval","$$cacheFlushInterval","recycleFreq","$$recycleFreq","storageMode","$$storageMode","storageImpl","disabled","size","keysJson","kSet","i","length","put","_this3","storeOnResolve","$$storeOnResolve","storeOnReject","$$storeOnReject","getHandler","store","isError","status","data","headers","statusText","Promise","reject","exists","peek","index","indexOf","splice","removeExpired","expired","expiredItem","pop","setCacheFlushInterval","_this","setInterval","setCapacity","removed","setDeleteOnExpire","setRecycleFreq","setMaxAge","Number","MAX_VALUE","setOnExpire","setOptions","cacheOptions","strict","$$storagePrefix","storagePrefix","defaults","setStorageMode","self","load","prevStorage","prevData","_key","prevDataIsObject","items","shouldReInsert","$$initializing","localStorage","e","sessionStorage","touch","_this4","val","k","CacheFactory","BinaryHeapProvider","$get","CacheFactoryProvider","$q","Symbol","iterator","obj","constructor","bubbleUp","n","element","weight","parentN","Math","floor","parent","bubbleDown","node","nodeWeight","child2N","child1N","swap","child1","child1Weight","child2","child2Weight","BHProto","prototype","front","end","_Promise","window","parse","a","b","opt","destroyAll","clearAll","removeExpiredFromAll","enableAll","disableAll","touchAll","provider"],"mappings":"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","file":"dist/angular-cache.min.js"} \ No newline at end of file +{"version":3,"sources":["dist/angular-cache.js"],"names":["global","factory","exports","module","require","define","amd","angularCacheModuleName","angular","this","BinaryHeapProvider","$get","BinaryHeap","CacheFactoryProvider","defaults","defaults$1","storagePrefix","$q","utils","Promise","CacheFactory","_typeof$1","Symbol","iterator","obj","constructor","prototype","_typeof","classCallCheck$$1","instance","Constructor","TypeError","createClass$$1","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","bubbleUp","heap","weightFunc","n","element","weight","parentN","Math","floor","parent","bubbleDown","node","nodeWeight","child2N","child1N","swap","child1","child1Weight","child2","child2Weight","compareFunc","x","y","Error","value","push","front","end","pop","removed","capacity","Number","MAX_VALUE","cacheFlushInterval","deleteOnExpire","enabled","onExpire","maxAge","recycleFreq","storageMode","storageImpl","storeOnReject","storeOnResolve","_Promise","window","e","equals","a","b","fromJson","JSON","parse","isFunction","isNumber","isObject","isPromise","then","isString","toJson","stringify","assignMsg","Cache","id","_this","options","arguments","undefined","$$cacheFlushInterval","$$cacheFlushIntervalId","$$capacity","$$data","$$deleteOnExpire","$$enabled","$$expiresHeap","accessed","$$initializing","$$lruHeap","$$maxAge","$$onExpire","$$prefix","$$promises","$$recycleFreq","$$recycleFreqId","$$storage","$$storageMode","$$storagePrefix","$$storeOnReject","$$storeOnResolve","$$parent","get","set","setOptions","clearInterval","removeAll","removeItem","caches","_this2","Array","isArray","keys","values","forEach","item","itemJson","getItem","now","Date","getTime","remove","expires","call","setItem","size","created","isExpired","_this3","keysJson","filter","set$$1","_this4","getHandler","shouldStore","isError","v","put","status","data","headers","statusText","reject","exists","_key","peek","index","indexOf","splice","_this5","storage","_this6","expired","expiredItem","_this7","setInterval","setRecycleFreq","_this8","removeExpired","strict","setDeleteOnExpire","setMaxAge","setCapacity","setCacheFlushInterval","setOnExpire","setStorageMode","_this9","_this10","prevStorage","prevData","shouldReInsert","items","load","prevDataIsObject","localStorage","sessionStorage","_this11","val","k","touch","_this12","map","cacheId","destroy","disable","enable","cache","ReferenceError","info","provider"],"mappings":"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","file":"dist/angular-cache.min.js"} \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 753b515..fdbf72e 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -4,24 +4,13 @@ module.exports = function (config) { frameworks: ['mocha', 'chai', 'sinon'], browsers: ['PhantomJS'], files: [ - 'node_modules/angular/angular.js', - 'node_modules/angular-resource/angular-resource.js', - 'node_modules/angular-mocks/angular-mocks.js', - 'dist/angular-cache.js', - './karma.start.js', - 'test/**/*.js' + 'node_modules/angular/angular.js', 'node_modules/angular-resource/angular-resource.js', 'node_modules/angular-mocks/angular-mocks.js', 'dist/angular-cache.js', 'karma.start.js', 'test/**/*.js' ], captureTimeout: 60000, colors: true, logLevel: config.LOG_INFO, port: 9876, - plugins: [ - 'karma-phantomjs-launcher', - 'karma-mocha', - 'karma-chai', - 'karma-sinon', - 'karma-coverage' - ], + plugins: ['karma-phantomjs-launcher', 'karma-mocha', 'karma-chai', 'karma-sinon', 'karma-spec-reporter', 'karma-coverage'], runnerPort: 9100, singleRun: true, autoWatch: false, @@ -29,9 +18,12 @@ module.exports = function (config) { type: 'lcov', dir: 'coverage/' }, + mochaOpts: { + bail: true + }, preprocessors: { 'dist/angular-cache.js': ['coverage'] }, - reporters: ['progress', 'coverage'] + reporters: ['spec', 'coverage'] }) } diff --git a/karma.start.js b/karma.start.js index 3803f71..3de1e4c 100644 --- a/karma.start.js +++ b/karma.start.js @@ -1,50 +1,66 @@ -/*eslint-disable*/ +/* global before, inject */ +/* eslint-disable no-unused-vars */ var fail = function (msg) { - assert.equal('should not reach this!: ' + msg, 'failure') - }, - TYPES_EXCEPT_STRING = [123, 123.123, null, undefined, {}, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_ARRAY = [123, 123.123, null, undefined, {}, true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_NUMBER = [null, undefined, {}, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER = [null, undefined, {}, true, false, function () { - }], - TYPES_EXCEPT_NUMBER = ['string', null, undefined, {}, [], true, false, function () { - }], - TYPES_EXCEPT_OBJECT = ['string', 123, 123.123, null, undefined, true, false, function () { - }], - TYPES_EXCEPT_BOOLEAN = ['string', 123, 123.123, null, undefined, {}, [], function () { - }], - TYPES_EXCEPT_FUNCTION = ['string', 123, 123.123, null, undefined, {}, [], true, false], - CACHE_DEFAULTS = { - capacity: Number.MAX_VALUE, - maxAge: Number.MAX_VALUE, - deleteOnExpire: 'none', - onExpire: null, - cacheFlushInterval: null, - recycleFreq: 1000, - storageMode: 'memory', - storageImpl: null, - disabled: false, - storagePrefix: 'ac.' + assert.equal('should not reach this!: ' + msg, 'failure') +} +var TYPES_EXCEPT_STRING = [ + 123, 123.123, {}, [], true, false, function () { + } +] +var TYPES_EXCEPT_STRING_OR_ARRAY = [ + 123, 123.123, null, undefined, {}, true, false, function () { + } +] +var TYPES_EXCEPT_STRING_OR_NUMBER = [ + null, undefined, {}, [], true, false, function () { + } +] +var TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER = [ + null, undefined, {}, true, false, function () { + } +] +var TYPES_EXCEPT_NUMBER = [ + 'string', {}, [], true, false, function () { + } +] +var TYPES_EXCEPT_OBJECT = [ + 'string', 123, 123.123, null, undefined, true, false, function () { + } +] +var TYPES_EXCEPT_BOOLEAN = [ + 'string', 123, 123.123, null, undefined, {}, [], function () { } +] +var TYPES_EXCEPT_FUNCTION = ['string', 123, 123.123, null, undefined, {}, [], true, false] +var CACHE_DEFAULTS = { + capacity: Number.MAX_VALUE, + maxAge: Number.MAX_VALUE, + deleteOnExpire: 'none', + onExpire: null, + cacheFlushInterval: null, + recycleFreq: 1000, + storageMode: 'memory', + storageImpl: null, + enabled: true, + storagePrefix: 'ac.' +} assert.objectsEqual = function (a, b, msg) { - assert.equal( - JSON.parse(JSON.stringify(a)), - JSON.parse(JSON.stringify(b)), - msg - ) + assert.equal(JSON.parse(JSON.stringify(a)), JSON.parse(JSON.stringify(b)), msg) } -var app, TestCacheFactoryProvider, TestCacheFactory, $q, $rootScope, $http, $httpBackend, $resource, BinaryHeap +var app, TestCacheFactoryProvider, TestCacheFactory, $q, $rootScope, $httpProvider, $http, $httpBackend, $resource, BinaryHeap app = angular.module('app', ['ngResource']) +before(function () { + localStorage.clear() +}) + beforeEach(module('app')) -beforeEach(module('angular-cache', function (_CacheFactoryProvider_) { +beforeEach(module('angular-cache', function (_CacheFactoryProvider_, _$httpProvider_) { + $httpProvider = _$httpProvider_ TestCacheFactoryProvider = _CacheFactoryProvider_ })) @@ -54,13 +70,15 @@ beforeEach(inject(function (_$resource_) { beforeEach(inject(function (_CacheFactory_, _BinaryHeap_, _$q_, _$rootScope_, _$http_, _$httpBackend_) { TestCacheFactory = _CacheFactory_ - angular.extend(TestCacheFactory.defaults, CACHE_DEFAULTS) + angular.extend(TestCacheFactoryProvider.defaults, CACHE_DEFAULTS) TestCacheFactory.destroyAll() $q = _$q_ $rootScope = _$rootScope_ BinaryHeap = _BinaryHeap_ $rootScope.$safeApply = function () { - var $scope, fn, force = false + var $scope + var fn + var force = false if (arguments.length === 1) { var arg = arguments[0] if (typeof arg === 'function') { @@ -76,8 +94,7 @@ beforeEach(inject(function (_CacheFactory_, _BinaryHeap_, _$q_, _$rootScope_, _$ } } $scope = $scope || this - fn = fn || function () { - } + fn = fn || function () { } if (force || !$scope.$$phase) { if ($scope.$apply) { $scope.$apply(fn) @@ -91,8 +108,9 @@ beforeEach(inject(function (_CacheFactory_, _BinaryHeap_, _$q_, _$rootScope_, _$ $http = _$http_ $httpBackend = _$httpBackend_ })) + afterEach(function () { $httpBackend.verifyNoOutstandingRequest() $httpBackend.verifyNoOutstandingExpectation() }) -/*eslint-enable*/ + diff --git a/package.json b/package.json index ce12383..a17cff2 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,8 @@ ] }, "scripts": { - "lint": "standard src/*.js *.js", - "bundle": "rollup src/index.js -c -o dist/angular-cache.js -m dist/angular-cache.js.map -f umd && node scripts/postbuild", + "lint": "standard build_examples/*.js src/*.js test/**/*.js *.js", + "bundle": "rollup src/index.js -c -o dist/angular-cache.js -m dist/angular-cache.js.map -f umd", "min": "uglifyjs dist/angular-cache.js -o dist/angular-cache.min.js --source-map dist/angular-cache.min.map --source-map-url angular-cache.min.map -v -m -c", "build": "npm run lint && npm run bundle && npm run min", "karma": "karma start", @@ -43,30 +43,32 @@ "ci": "npm test && cat ./coverage/PhantomJS*/lcov.info | codecov" }, "devDependencies": { - "angular": "1.5.8", - "angular-mocks": "1.5.8", - "angular-resource": "1.5.8", - "babel-core": "6.14.0", - "babel-eslint": "6.1.2", - "babel-preset-es2015": "6.14.0", - "babel-preset-es2015-rollup": "1.2.0", - "cachefactory": "1.5.1", + "angular": "~1.5.11", + "angular-mocks": "~1.5.11", + "angular-resource": "~1.5.11", + "babel-core": "~6.23.1", + "babel-eslint": "~7.1.1", + "babel-preset-es2015": "~6.22.0", + "babel-preset-es2015-rollup": "~3.0.0", + "cachefactory": "~3.0.0", "chai": "3.5.0", "codecov": "1.0.1", - "es6-promise": "3.2.1", - "karma": "1.2.0", - "karma-chai": "0.1.0", - "karma-coverage": "1.1.1", - "karma-mocha": "1.1.1", - "karma-phantomjs-launcher": "1.0.1", + "es6-promise": "~4.0.5", + "karma": "~1.5.0", + "karma-chai": "~0.1.0", + "karma-coverage": "~1.1.1", + "karma-mocha": "~1.3.0", + "karma-phantomjs-launcher": "~1.0.2", "karma-sinon": "1.0.5", - "mocha": "3.0.2", - "phantomjs-prebuilt": "2.1.12", - "rollup": "0.34.10", - "rollup-plugin-babel": "2.6.1", - "sinon": "1.17.5", - "standard": "8.0.0", - "uglify-js": "2.7.3" + "karma-spec-reporter": "0.0.30", + "mocha": "~3.2.0", + "phantomjs-prebuilt": "~2.1.14", + "rollup": "~0.41.4", + "rollup-plugin-babel": "~2.7.1", + "rollup-plugin-node-resolve": "~2.0.0", + "sinon": "~2.0.0-pre.6", + "standard": "~8.6.0", + "uglify-js": "~2.7.5" }, "peerDependencies": { "angular": ">=1.x <2" diff --git a/rollup.config.js b/rollup.config.js index 21abf98..4e9158e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,3 +1,4 @@ +var nodeResolve = require('rollup-plugin-node-resolve') var babel = require('rollup-plugin-babel') var pkg = require('./package.json') @@ -5,18 +6,21 @@ module.exports = { moduleName: 'angularCacheModuleName', moduleId: 'angular-cache', banner: '/**\n' + - ' * angular-cache\n' + - ' * @version ' + pkg.version + ' - Homepage \n' + - ' * @copyright (c) 2013-2016 angular-cache project authors\n' + - ' * @license MIT \n' + - ' * @overview angular-cache is a very useful replacement for Angular\'s $cacheFactory.\n' + - ' */', + ' * angular-cache\n' + + ' * @version ' + + pkg.version + + ' - Homepage \n' + + ' * @copyright (c) 2013-2016 angular-cache project authors\n' + + ' * @license MIT \n' + + ' * @overview angular-cache is a very useful replacement for Angular\'s $cacheFactory.\n' + + ' */', + globals: { + angular: 'angular' + }, + external: [ + 'angular' + ], plugins: [ - babel({ - babelrc: false, - presets: [ - 'es2015-rollup' - ] - }) + nodeResolve({ jsnext: true }), babel({ babelrc: false, presets: ['es2015-rollup'] }) ] } diff --git a/scripts/postbuild.js b/scripts/postbuild.js deleted file mode 100644 index 20c3d9a..0000000 --- a/scripts/postbuild.js +++ /dev/null @@ -1,21 +0,0 @@ -var fs = require('fs') -var path = __dirname + '/../dist/angular-cache.js' -var file = fs.readFileSync(path, { encoding: 'utf8' }) -file = file.replace( - 'module.exports = factory(require(\'angular\'))', - 'module.exports = factory(typeof angular === \'undefined\' ? require(\'angular\') : angular)' -) -var index = file.indexOf('babelHelpers;') -var str = 'var babelHelpers = {};\n' + -' babelHelpers.typeof = typeof Symbol === "function" && babelHelpers.typeof(Symbol.iterator) === "symbol" ? function (obj) {\n' + -' return typeof obj === "undefined" ? "undefined" : babelHelpers.typeof(obj);\n' + -' } : function (obj) {\n' + -' return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj === "undefined" ? "undefined" : babelHelpers.typeof(obj);\n' + -' };' - -var index2 = file.indexOf(str) - -var file2 = file.substring(index2 + str.length) -file = file.substring(0, index) + file2 - -fs.writeFileSync(path, file) diff --git a/src/index.js b/src/index.js index f2948cc..a64e64e 100644 --- a/src/index.js +++ b/src/index.js @@ -1,26 +1,28 @@ import angular from 'angular' -import CacheFactory from '../node_modules/cachefactory/dist/cachefactory.es2015' +import { BinaryHeap, CacheFactory, defaults, utils } from 'cachefactory' -CacheFactory.utils.equals = angular.equals -CacheFactory.utils.isObject = angular.isObject -CacheFactory.utils.fromJson = angular.fromJson +utils.equals = angular.equals +utils.isObject = angular.isObject +utils.fromJson = angular.fromJson function BinaryHeapProvider () { - this.$get = function () { return CacheFactory.BinaryHeap } + this.$get = function () { return BinaryHeap } } function CacheFactoryProvider () { - this.defaults = CacheFactory.defaults + this.defaults = defaults this.defaults.storagePrefix = 'angular-cache.caches.' - this.$get = ['$q', function ($q) { - CacheFactory.utils.Promise = $q - return CacheFactory - }] + this.$get = [ + '$q', function ($q) { + utils.Promise = $q + return new CacheFactory() + } + ] } angular.module('angular-cache', []) - .provider('BinaryHeap', BinaryHeapProvider) - .provider('CacheFactory', CacheFactoryProvider) + .provider('BinaryHeap', BinaryHeapProvider) + .provider('CacheFactory', CacheFactoryProvider) export default 'angular-cache' diff --git a/test/unit/Cache/index.destroy.test.js b/test/unit/Cache/index.destroy.test.js index 57e5bfb..02cd98a 100644 --- a/test/unit/Cache/index.destroy.test.js +++ b/test/unit/Cache/index.destroy.test.js @@ -1,39 +1,41 @@ +/* global fail, TestCacheFactory */ describe('Cache#destroy()', function () { it('should destroy the cache and remove all traces of its existence.', function () { - var cache = TestCacheFactory('cache'); - cache.destroy(); + var cache = TestCacheFactory.createCache('cache') + cache.destroy() try { - assert.equal(cache.info(), { size: 0 }); - fail('should not be able to use a cache after destroying it'); - } catch (err) { - - } - assert.isUndefined(TestCacheFactory.get('cache')); - }); + assert.equal(cache.info(), { size: 0 }) + fail('should not be able to use a cache after destroying it') + } catch (err) { } + assert.throws(function () { TestCacheFactory.get('cache') }) + }) it('should remove items from localStorage when storageMode is used.', function () { - var localStorageCache = TestCacheFactory('localStorageCache', { storageMode: 'localStorage', storagePrefix: 'acc.' }); - var sessionStorageCache = TestCacheFactory('sessionStorageCache', { storageMode: 'sessionStorage' }); + var localStorageCache = TestCacheFactory.createCache('localStorageCache', { + storageMode: 'localStorage', + storagePrefix: 'acc.' + }) + var sessionStorageCache = TestCacheFactory.createCache('sessionStorageCache', { storageMode: 'sessionStorage' }) - localStorageCache.put('item1', 'value1'); - sessionStorageCache.put('item1', 'value1'); - localStorageCache.put('item2', 'value2'); - sessionStorageCache.put('item2', 'value2'); + localStorageCache.put('item1', 'value1') + sessionStorageCache.put('item1', 'value1') + localStorageCache.put('item2', 'value2') + sessionStorageCache.put('item2', 'value2') - assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1')).value, 'value1'); - assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item2')).value, 'value2'); - assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys'), '["item1","item2"]'); - assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1')).value, 'value1'); - assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item2')).value, 'value2'); - assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys'), '["item1","item2"]'); + assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1')).value, 'value1') + assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item2')).value, 'value2') + assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys'), '["item1","item2"]') + assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1')).value, 'value1') + assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item2')).value, 'value2') + assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys'), '["item1","item2"]') - localStorageCache.destroy(); - sessionStorageCache.destroy(); + localStorageCache.destroy() + sessionStorageCache.destroy() - assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1'))); - assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item2'))); - assert.isNull(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys')); - assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1'))); - assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item2'))); - assert.isNull(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys')); - }); -}); + assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1'))) + assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item2'))) + assert.isNull(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys')) + assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1'))) + assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item2'))) + assert.isNull(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys')) + }) +}) diff --git a/test/unit/Cache/index.get.test.js b/test/unit/Cache/index.get.test.js index 30d0b53..bac3cfa 100644 --- a/test/unit/Cache/index.get.test.js +++ b/test/unit/Cache/index.get.test.js @@ -1,104 +1,105 @@ +/* global fail, sinon, TestCacheFactory, TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER, TYPES_EXCEPT_OBJECT, TYPES_EXCEPT_FUNCTION */ describe('Cache#get(key[, options])', function () { it('should do nothing if the cache is disabled.', function () { - var cache = TestCacheFactory.createCache('cache'); + var cache = TestCacheFactory.createCache('cache') - assert.equal(cache.info().size, 0); - cache.put('1', 'item'); - assert.equal(cache.get('1'), 'item'); - assert.equal(cache.info().size, 1); - cache.setOptions({ disabled: true }); - assert.equal(cache.info().size, 1); - assert.isUndefined(cache.get('1')); - }); + assert.equal(cache.info().size, 0) + cache.put('1', 'item') + assert.equal(cache.get('1'), 'item') + assert.equal(cache.info().size, 1) + cache.setOptions({ enabled: false }) + assert.equal(cache.info().size, 1) + assert.isUndefined(cache.get('1')) + }) it('should throw an error if "key" is not a string or array.', function () { - var cache = TestCacheFactory.createCache('cache'); + var cache = TestCacheFactory.createCache('cache') for (var i = 0; i < TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER.length; i++) { try { - cache.get(TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER[i]); - fail(TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER[i]); + cache.get(TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER[i]) + fail(TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER[i]) } catch (err) { - assert.equal(err.message, 'key must be a string!'); - continue; + assert.equal(err.message, '"key" must be a string!') + continue } - fail(TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER[i]); + fail(TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER[i]) } - }); + }) it('should throw an error if "options" is not an object.', function () { - var cache = TestCacheFactory.createCache('cache'); + var cache = TestCacheFactory.createCache('cache') for (var i = 0; i < TYPES_EXCEPT_OBJECT.length; i++) { try { - cache.get('item', TYPES_EXCEPT_OBJECT[i]); + cache.get('item', TYPES_EXCEPT_OBJECT[i]) if (TYPES_EXCEPT_OBJECT[i] !== null && TYPES_EXCEPT_OBJECT[i] !== undefined && TYPES_EXCEPT_OBJECT[i] !== false) { - fail(TYPES_EXCEPT_OBJECT[i]); + fail(TYPES_EXCEPT_OBJECT[i]) } } catch (err) { - assert.equal(err.message, 'options must be an object!'); - continue; + assert.equal(err.message, '"options" must be an object!') + continue } if (TYPES_EXCEPT_OBJECT[i] !== null && TYPES_EXCEPT_OBJECT[i] !== undefined && TYPES_EXCEPT_OBJECT[i] !== false) { - fail(TYPES_EXCEPT_OBJECT[i]); + fail(TYPES_EXCEPT_OBJECT[i]) } } - }); + }) it('should throw an error if "onExpire" is not a function.', function () { - var cache = TestCacheFactory.createCache('cache'); + var cache = TestCacheFactory.createCache('cache') for (var i = 0; i < TYPES_EXCEPT_FUNCTION.length; i++) { try { if (!TYPES_EXCEPT_FUNCTION[i]) { - continue; + continue } - cache.get('item', { onExpire: TYPES_EXCEPT_FUNCTION[i] }); + cache.get('item', { onExpire: TYPES_EXCEPT_FUNCTION[i] }) if (TYPES_EXCEPT_FUNCTION[i] !== null && TYPES_EXCEPT_FUNCTION[i] !== undefined && TYPES_EXCEPT_FUNCTION[i] !== false) { - fail(TYPES_EXCEPT_FUNCTION[i]); + fail(TYPES_EXCEPT_FUNCTION[i]) } } catch (err) { - assert.equal(err.message, 'options.onExpire must be a function!'); - continue; + assert.equal(err.message, '"options.onExpire" must be a function!') + continue } if (TYPES_EXCEPT_FUNCTION[i] !== null && TYPES_EXCEPT_FUNCTION[i] !== undefined && TYPES_EXCEPT_FUNCTION[i] !== false) { - fail(TYPES_EXCEPT_FUNCTION[i]); + fail(TYPES_EXCEPT_FUNCTION[i]) } } - }); + }) it('should return the correct value for the specified key.', function () { - var cache = TestCacheFactory.createCache('cache'); - var value1 = 'value1', - value2 = 2, - value3 = { - value3: 'stuff' - }; - cache.put('item1', value1); - cache.put('item2', value2); - cache.put('item3', value3); - assert.equal(cache.get('item1'), value1); - assert.equal(cache.get('item2'), value2); - assert.equal(cache.get('item3'), value3); - }); + var cache = TestCacheFactory.createCache('cache') + var value1 = 'value1' + var value2 = 2 + var value3 = { + value3: 'stuff' + } + cache.put('item1', value1) + cache.put('item2', value2) + cache.put('item3', value3) + assert.equal(cache.get('item1'), value1) + assert.equal(cache.get('item2'), value2) + assert.equal(cache.get('item3'), value3) + }) it('should return undefined if the key isn\'t in the cache.', function () { - var cache = TestCacheFactory.createCache('cache'); - assert.isUndefined(cache.get('item')); - }); + var cache = TestCacheFactory.createCache('cache') + assert.isUndefined(cache.get('item')) + }) it('should execute globally configured "onExpire" callback if the item is expired in passive mode and global "onExpire" callback is configured.', function (done) { var cache = TestCacheFactory.createCache('cache', { maxAge: 10, recycleFreq: 20, deleteOnExpire: 'passive', onExpire: function (key, value, done2) { - done2(key, value, 'executed global callback'); + done2(key, value, 'executed global callback') } - }); - cache.put('item', 'value'); + }) + cache.put('item', 'value') setTimeout(function () { cache.get('item', { onExpire: function (key, value, test) { - assert.equal(key, 'item'); - assert.equal(value, 'value'); - assert.equal(test, 'executed global callback'); + assert.equal(key, 'item') + assert.equal(value, 'value') + assert.equal(test, 'executed global callback') } - }); - done(); - }, 100); - }); + }) + done() + }, 100) + }) it('should execute globally configured "onExpire" callback when an item is aggressively deleted and global "onExpire" callback is configured.', function (done) { var options = { maxAge: 10, @@ -106,51 +107,51 @@ describe('Cache#get(key[, options])', function () { deleteOnExpire: 'aggressive', onExpire: function (key, value) { } - }; - sinon.spy(options, 'onExpire'); - var cache = TestCacheFactory.createCache('cache', options); - cache.put('item', 'value'); + } + sinon.spy(options, 'onExpire') + var cache = TestCacheFactory.createCache('cache', options) + cache.put('item', 'value') setTimeout(function () { - assert.isTrue(options.onExpire.called); - assert.isTrue(options.onExpire.calledWith('item', 'value')); - done(); - }, 100); - }); + assert.isTrue(options.onExpire.called) + assert.isTrue(options.onExpire.calledWith('item', 'value')) + done() + }, 100) + }) it('should execute local "onExpire" callback if the item is expired in passive mode and global "onExpire" callback is NOT configured.', function (done) { var cache = TestCacheFactory.createCache('cache', { maxAge: 10, deleteOnExpire: 'passive', recycleFreq: 20 - }); - cache.put('item', 'value'); + }) + cache.put('item', 'value') setTimeout(function () { cache.get('item', { onExpire: function (key, value) { - assert.equal(key, 'item'); - assert.equal(value, 'value'); + assert.equal(key, 'item') + assert.equal(value, 'value') } - }); - done(); - }, 100); - }); + }) + done() + }, 100) + }) it('should return the correct values for multiple keys.', function () { - var cache = TestCacheFactory.createCache('cache'); - var value1 = 'value1', - value2 = 2, - value3 = { - value3: 'stuff' - }; - cache.put('item1', value1); - cache.put('item2', value2); - cache.put('item3', value3); - assert.deepEqual(cache.get(['item1', 'item2', 'item3']), [value1, value2, value3]); - }); + var cache = TestCacheFactory.createCache('cache') + var value1 = 'value1' + var value2 = 2 + var value3 = { + value3: 'stuff' + } + cache.put('item1', value1) + cache.put('item2', value2) + cache.put('item3', value3) + assert.deepEqual(cache.get(['item1', 'item2', 'item3']), [value1, value2, value3]) + }) it('should not return undefined values for multiple keys.', function () { - var cache = TestCacheFactory.createCache('cache'); - var value1 = 'value1', - value2 = 2; - cache.put('item1', value1); - cache.put('item2', value2); - assert.deepEqual(cache.get(['item1', 'item2', 'item3']), [value1, value2]); - }); -}); + var cache = TestCacheFactory.createCache('cache') + var value1 = 'value1' + var value2 = 2 + cache.put('item1', value1) + cache.put('item2', value2) + assert.deepEqual(cache.get(['item1', 'item2', 'item3']), [value1, value2]) + }) +}) diff --git a/test/unit/Cache/index.info.test.js b/test/unit/Cache/index.info.test.js index fe1adaa..7418855 100644 --- a/test/unit/Cache/index.info.test.js +++ b/test/unit/Cache/index.info.test.js @@ -1,76 +1,80 @@ +/* global TestCacheFactory */ describe('Cache#info()', function () { it('should return the correct values.', function () { var onExpire = function () { - }; - var cache = TestCacheFactory('cache'), - cache2 = TestCacheFactory('cache2', { maxAge: 1000 }), - cache3 = TestCacheFactory('cache3', { cacheFlushInterval: 1000 }), - cache4 = TestCacheFactory('cache4', { capacity: 1000 }), - cache5 = TestCacheFactory('cache5', { storageMode: 'localStorage' }), - cache6 = TestCacheFactory('cache6', { storageMode: 'sessionStorage' }), - cache7 = TestCacheFactory('cache7', { maxAge: 100, onExpire: onExpire }); - var cacheInfo = cache.info(); - assert.equal(cacheInfo.id, 'cache'); - assert.equal(cacheInfo.capacity, Number.MAX_VALUE); - assert.equal(cacheInfo.size, 0); - assert.equal(cacheInfo.recycleFreq, 1000); - assert.equal(cacheInfo.maxAge, Number.MAX_VALUE); - assert.equal(cacheInfo.cacheFlushInterval, null); - assert.equal(cacheInfo.deleteOnExpire, 'none'); - assert.equal(cacheInfo.storageMode, 'memory'); - assert.equal(cacheInfo.onExpire, null); - cache.put('item', 'value'); - cache.put('item2', 'value2'); + } + var cache = TestCacheFactory.createCache('cache') + var cache2 = TestCacheFactory.createCache('cache2', { maxAge: 1000 }) + var cache3 = TestCacheFactory.createCache('cache3', { cacheFlushInterval: 1000 }) + var cache4 = TestCacheFactory.createCache('cache4', { capacity: 1000 }) + var cache5 = TestCacheFactory.createCache('cache5', { storageMode: 'localStorage' }) + var cache6 = TestCacheFactory.createCache('cache6', { storageMode: 'sessionStorage' }) + var cache7 = TestCacheFactory.createCache('cache7', { + maxAge: 100, + onExpire: onExpire + }) + var cacheInfo = cache.info() + assert.equal(cacheInfo.id, 'cache') + assert.equal(cacheInfo.capacity, Number.MAX_VALUE) + assert.equal(cacheInfo.size, 0) + assert.equal(cacheInfo.recycleFreq, 1000) + assert.equal(cacheInfo.maxAge, Number.MAX_VALUE) + assert.equal(cacheInfo.cacheFlushInterval, null) + assert.equal(cacheInfo.deleteOnExpire, 'none') + assert.equal(cacheInfo.storageMode, 'memory') + assert.equal(cacheInfo.onExpire, null) + cache.put('item', 'value') + cache.put('item2', 'value2') // DSCache#info(key) - assert.isUndefined(cache.info('non-existent item')); - assert.isNumber(cache.info('item').created); - assert.isNumber(cache.info('item').expires); - assert.isFalse(cache.info('item').isExpired); - assert.isNumber(cache.info('item').accessed); - assert.isNumber(cache.info('item2').created); - assert.isNumber(cache.info('item2').expires); - assert.isFalse(cache.info('item2').isExpired); - assert.isNumber(cache.info('item2').accessed); + assert.isUndefined(cache.info('non-existent item')) + assert.isNumber(cache.info('item').created) + assert.isNumber(cache.info('item').expires) + assert.isFalse(cache.info('item').isExpired) + assert.isNumber(cache.info('item').accessed) + assert.isNumber(cache.info('item2').created) + assert.isNumber(cache.info('item2').expires) + assert.isFalse(cache.info('item2').isExpired) + assert.isNumber(cache.info('item2').accessed) - assert.equal(cache.info().size, 2); + assert.equal(cache.info().size, 2) - var cacheInfo2 = cache2.info(); - assert.equal(cacheInfo2.id, 'cache2'); - assert.equal(cacheInfo2.capacity, Number.MAX_VALUE); - assert.equal(cacheInfo2.size, 0); - assert.equal(cacheInfo2.recycleFreq, 1000); - assert.equal(cacheInfo2.maxAge, 1000); - assert.equal(cacheInfo2.cacheFlushInterval, null); - assert.equal(cacheInfo2.deleteOnExpire, 'none'); - assert.equal(cacheInfo2.storageMode, 'memory'); - assert.equal(cacheInfo2.onExpire, null); + var cacheInfo2 = cache2.info() + assert.equal(cacheInfo2.id, 'cache2') + assert.equal(cacheInfo2.capacity, Number.MAX_VALUE) + assert.equal(cacheInfo2.size, 0) + assert.equal(cacheInfo2.recycleFreq, 1000) + assert.equal(cacheInfo2.maxAge, 1000) + assert.equal(cacheInfo2.cacheFlushInterval, null) + assert.equal(cacheInfo2.deleteOnExpire, 'none') + assert.equal(cacheInfo2.storageMode, 'memory') + assert.equal(cacheInfo2.onExpire, null) - assert.equal(cache3.info().id, 'cache3'); - assert.equal(cache3.info().capacity, Number.MAX_VALUE); - assert.equal(cache3.info().cacheFlushInterval, 1000); - assert.equal(cache3.info().size, 0); + assert.equal(cache3.info().id, 'cache3') + assert.equal(cache3.info().capacity, Number.MAX_VALUE) + assert.equal(cache3.info().cacheFlushInterval, 1000) + assert.equal(cache3.info().size, 0) - var cacheInfo4 = cache4.info(); - assert.equal(cacheInfo4.id, 'cache4'); - assert.equal(cacheInfo4.capacity, 1000); - assert.equal(cacheInfo4.size, 0); - assert.equal(cacheInfo4.recycleFreq, 1000); - assert.equal(cacheInfo4.maxAge, Number.MAX_VALUE); - assert.equal(cacheInfo4.cacheFlushInterval, null); - assert.equal(cacheInfo4.deleteOnExpire, 'none'); - assert.equal(cacheInfo4.storageMode, 'memory'); - assert.equal(cacheInfo4.onExpire, null); + var cacheInfo4 = cache4.info() + assert.equal(cacheInfo4.id, 'cache4') + assert.equal(cacheInfo4.capacity, 1000) + assert.equal(cacheInfo4.size, 0) + assert.equal(cacheInfo4.recycleFreq, 1000) + assert.equal(cacheInfo4.maxAge, Number.MAX_VALUE) + assert.equal(cacheInfo4.cacheFlushInterval, null) + assert.equal(cacheInfo4.deleteOnExpire, 'none') + assert.equal(cacheInfo4.storageMode, 'memory') + assert.equal(cacheInfo4.onExpire, null) if (localStorage) { - assert.equal(cache5.info().storageMode, 'localStorage', 'cache5 storageMode should be "memory"'); + assert.equal(cache5.info().storageMode, 'localStorage', 'cache5 storageMode should be "memory"') } else { - assert.equal(cache5.info().storageMode, null); + assert.equal(cache5.info().storageMode, null) } if (sessionStorage) { - assert.equal(cache6.info().storageMode, 'sessionStorage'); + assert.equal(cache6.info().storageMode, 'sessionStorage') } else { - assert.equal(cache6.info().storageMode, null); + assert.equal(cache6.info().storageMode, null) } - assert.equal(cache7.info().onExpire, onExpire); - }); -}); + assert.equal(cache7.info().onExpire, onExpire) + }) +}) diff --git a/test/unit/Cache/index.keySet.test.js b/test/unit/Cache/index.keySet.test.js index be227cc..f846e85 100644 --- a/test/unit/Cache/index.keySet.test.js +++ b/test/unit/Cache/index.keySet.test.js @@ -1,31 +1,32 @@ +/* global TestCacheFactory */ describe('Cache#keySet()', function () { it('should return the set of keys of all items in the cache.', function () { - var itemKeys = ['item1', 'item2', 'item3']; + var itemKeys = ['item1', 'item2', 'item3'] - var cache = TestCacheFactory('DSCache.keySet.cache'); + var cache = TestCacheFactory.createCache('DSCache.keySet.cache') - cache.put(itemKeys[0], itemKeys[0]); - cache.put(itemKeys[1], itemKeys[1]); - cache.put(itemKeys[2], itemKeys[2]); + cache.put(itemKeys[0], itemKeys[0]) + cache.put(itemKeys[1], itemKeys[1]) + cache.put(itemKeys[2], itemKeys[2]) - var keySet = cache.keySet(); + var keySet = cache.keySet() - assert.equal(keySet.hasOwnProperty(itemKeys[0]), true); - assert.equal(keySet.hasOwnProperty(itemKeys[1]), true); - assert.equal(keySet.hasOwnProperty(itemKeys[2]), true); + assert.equal(keySet.hasOwnProperty(itemKeys[0]), true) + assert.equal(keySet.hasOwnProperty(itemKeys[1]), true) + assert.equal(keySet.hasOwnProperty(itemKeys[2]), true) - assert.equal(keySet[itemKeys[0]], itemKeys[0]); - assert.equal(keySet[itemKeys[1]], itemKeys[1]); - assert.equal(keySet[itemKeys[2]], itemKeys[2]); + assert.equal(keySet[itemKeys[0]], itemKeys[0]) + assert.equal(keySet[itemKeys[1]], itemKeys[1]) + assert.equal(keySet[itemKeys[2]], itemKeys[2]) - cache.remove(itemKeys[0]); - cache.remove(itemKeys[1]); - cache.remove(itemKeys[2]); + cache.remove(itemKeys[0]) + cache.remove(itemKeys[1]) + cache.remove(itemKeys[2]) - keySet = cache.keySet(); + keySet = cache.keySet() - assert.equal(keySet.hasOwnProperty(itemKeys[0]), false); - assert.equal(keySet.hasOwnProperty(itemKeys[1]), false); - assert.equal(keySet.hasOwnProperty(itemKeys[2]), false); - }); -}); + assert.equal(keySet.hasOwnProperty(itemKeys[0]), false) + assert.equal(keySet.hasOwnProperty(itemKeys[1]), false) + assert.equal(keySet.hasOwnProperty(itemKeys[2]), false) + }) +}) diff --git a/test/unit/Cache/index.keys.test.js b/test/unit/Cache/index.keys.test.js index 13dbf1c..8f224b7 100644 --- a/test/unit/Cache/index.keys.test.js +++ b/test/unit/Cache/index.keys.test.js @@ -1,70 +1,71 @@ +/* global TestCacheFactory */ describe('Cache#keys()', function () { it('should return the array of keys of all items in the cache.', function () { - var itemKeys = ['item1', 'item2', 'item3']; + var itemKeys = ['item1', 'item2', 'item3'] - var cache = TestCacheFactory('DSCache.keys.cache'); + var cache = TestCacheFactory.createCache('DSCache.keys.cache') - cache.put(itemKeys[0], itemKeys[0]); - assert.deepEqual(cache.keys(), [itemKeys[0]]); + cache.put(itemKeys[0], itemKeys[0]) + assert.deepEqual(cache.keys(), [itemKeys[0]]) - cache.put(itemKeys[0], itemKeys[2]); - assert.deepEqual(cache.keys(), [itemKeys[0]]); - assert.deepEqual(cache.get(itemKeys[0]), itemKeys[2]); + cache.put(itemKeys[0], itemKeys[2]) + assert.deepEqual(cache.keys(), [itemKeys[0]]) + assert.deepEqual(cache.get(itemKeys[0]), itemKeys[2]) - cache.put(itemKeys[1], itemKeys[1]); - assert.deepEqual(cache.keys(), [itemKeys[0], itemKeys[1]]); + cache.put(itemKeys[1], itemKeys[1]) + assert.deepEqual(cache.keys(), [itemKeys[0], itemKeys[1]]) - cache.put(itemKeys[2], itemKeys[2]); - assert.deepEqual(cache.keys(), [itemKeys[0], itemKeys[1], itemKeys[2]]); + cache.put(itemKeys[2], itemKeys[2]) + assert.deepEqual(cache.keys(), [itemKeys[0], itemKeys[1], itemKeys[2]]) - var keys = cache.keys(); + var keys = cache.keys() - assert.equal(keys[0], itemKeys[0]); - assert.equal(keys[1], itemKeys[1]); - assert.equal(keys[2], itemKeys[2]); + assert.equal(keys[0], itemKeys[0]) + assert.equal(keys[1], itemKeys[1]) + assert.equal(keys[2], itemKeys[2]) - cache.remove(itemKeys[0]); - cache.remove(itemKeys[1]); - cache.remove(itemKeys[2]); + cache.remove(itemKeys[0]) + cache.remove(itemKeys[1]) + cache.remove(itemKeys[2]) - keys = cache.keys(); + keys = cache.keys() - assert.equal(keys.length, 0); - assert.deepEqual(keys, []); - }); + assert.equal(keys.length, 0) + assert.deepEqual(keys, []) + }) it('should return the array of keys of all items in the cache when using localStorage.', function () { - var itemKeys = ['item1', 'item2', 'item3']; + var itemKeys = ['item1', 'item2', 'item3'] - var cache = TestCacheFactory('DSCache.keys.cache', { + var cache = TestCacheFactory.createCache('DSCache.keys.cache', { storageMode: 'localStorage' - }); + }) - cache.put(itemKeys[0], itemKeys[0]); - assert.deepEqual(cache.keys(), [itemKeys[0]]); + cache.put(itemKeys[0], itemKeys[0]) + assert.deepEqual(cache.keys(), [itemKeys[0]]) - cache.put(itemKeys[0], itemKeys[2]); - assert.deepEqual(cache.keys(), [itemKeys[0]]); - assert.deepEqual(cache.get(itemKeys[0]), itemKeys[2]); + cache.put(itemKeys[0], itemKeys[2]) + assert.deepEqual(cache.keys(), [itemKeys[0]]) + assert.deepEqual(cache.get(itemKeys[0]), itemKeys[2]) - cache.put(itemKeys[1], itemKeys[1]); - assert.deepEqual(cache.keys(), [itemKeys[0], itemKeys[1]]); + cache.put(itemKeys[1], itemKeys[1]) + assert.deepEqual(cache.keys(), [itemKeys[0], itemKeys[1]]) - cache.put(itemKeys[2], itemKeys[2]); - assert.deepEqual(cache.keys(), [itemKeys[0], itemKeys[1], itemKeys[2]]); + cache.put(itemKeys[2], itemKeys[2]) + assert.deepEqual(cache.keys(), [itemKeys[0], itemKeys[1], itemKeys[2]]) - var keys = cache.keys(); + var keys = cache.keys() - assert.equal(keys[0], itemKeys[0]); - assert.equal(keys[1], itemKeys[1]); - assert.equal(keys[2], itemKeys[2]); + assert.equal(keys[0], itemKeys[0]) + assert.equal(keys[1], itemKeys[1]) + assert.equal(keys[2], itemKeys[2]) - cache.remove(itemKeys[0]); - cache.remove(itemKeys[1]); - cache.remove(itemKeys[2]); + cache.remove(itemKeys[0]) + cache.remove(itemKeys[1]) + cache.remove(itemKeys[2]) - keys = cache.keys(); + keys = cache.keys() - assert.equal(keys.length, 0); - assert.deepEqual(keys, []); - }); -}); + assert.equal(keys.length, 0) + assert.deepEqual(keys, []) + }) +}) diff --git a/test/unit/Cache/index.put.test.js b/test/unit/Cache/index.put.test.js index e8df2a7..2f82282 100644 --- a/test/unit/Cache/index.put.test.js +++ b/test/unit/Cache/index.put.test.js @@ -1,388 +1,398 @@ +/* global fail, TestCacheFactory, $http, $httpBackend, $rootScope, $q, TYPES_EXCEPT_STRING_OR_NUMBER */ describe('Cache#put(key, value[, options])', function () { it('should do nothing if the cache is disabled.', function () { - var cache = TestCacheFactory('DSCache.put.cache', { disabled: true }); + var cache = TestCacheFactory.createCache('DSCache.put.cache', { enabled: false }) - assert.equal(cache.info().size, 0); - assert.isUndefined(cache.put('1', 'item')); - assert.equal(cache.info().size, 0); - }); + assert.equal(cache.info().size, 0) + assert.isUndefined(cache.put('1', 'item')) + assert.equal(cache.info().size, 0) + }) it('should throw an error if "key" is not a string.', function () { - var cache = TestCacheFactory('DSCache.put.cache'); + var cache = TestCacheFactory.createCache('DSCache.put.cache') for (var i = 0; i < TYPES_EXCEPT_STRING_OR_NUMBER.length; i++) { try { - cache.put(TYPES_EXCEPT_STRING_OR_NUMBER[i], 'value'); - fail(TYPES_EXCEPT_STRING_OR_NUMBER[i]); + cache.put(TYPES_EXCEPT_STRING_OR_NUMBER[i], 'value') + fail(TYPES_EXCEPT_STRING_OR_NUMBER[i]) } catch (err) { - assert.equal(err.message, 'key must be a string!'); - continue; + assert.equal(err.message, '"key" must be a string!') + continue } - fail(TYPES_EXCEPT_STRING_OR_NUMBER[i]); + fail(TYPES_EXCEPT_STRING_OR_NUMBER[i]) } - }); + }) it('should not add values that are not defined.', function () { - var cache = TestCacheFactory('cache'); - cache.put('item', null); - assert.equal(cache.get('item'), undefined); - cache.put('item', undefined); - assert.equal(cache.get('item'), undefined); - }); + var cache = TestCacheFactory.createCache('cache') + cache.put('item', null) + assert.equal(cache.get('item'), undefined) + cache.put('item', undefined) + assert.equal(cache.get('item'), undefined) + }) it('should increase the size of the cache by one.', function () { - var cache = TestCacheFactory('cache'); - assert.equal(cache.info().size, 0); - cache.put('item', 'value1'); - assert.equal(cache.info().size, 1); - cache.put('item2', 'value2'); - assert.equal(cache.info().size, 2); - }); + var cache = TestCacheFactory.createCache('cache') + assert.equal(cache.info().size, 0) + cache.put('item', 'value1') + assert.equal(cache.info().size, 1) + cache.put('item2', 'value2') + assert.equal(cache.info().size, 2) + }) it('should overwrite an item if it is re-added to the cache.', function () { - var cache = TestCacheFactory('cache'); - assert.equal(cache.info().size, 0); - cache.put('item', 'value1'); - assert.equal(cache.info().size, 1); - cache.put('item', 'value2'); - assert.equal(cache.info().size, 1); - assert.equal(cache.get('item'), 'value2'); - }); + var cache = TestCacheFactory.createCache('cache') + assert.equal(cache.info().size, 0) + cache.put('item', 'value1') + assert.equal(cache.info().size, 1) + cache.put('item', 'value2') + assert.equal(cache.info().size, 1) + assert.equal(cache.get('item'), 'value2') + }) it('should remove the least recently used item if the capacity has been reached.', function () { - var cache = TestCacheFactory('cache', { capacity: 2 }); - assert.equal(cache.info().size, 0); - cache.put('item1', 'value1'); - assert.equal(cache.info().size, 1); - cache.put('item2', 'value2'); - assert.equal(cache.info().size, 2); - cache.put('item3', 'value3'); - assert.equal(cache.info().size, 2); - assert.equal(cache.get('item1'), undefined); - assert.equal(cache.get('item2'), 'value2'); - assert.equal(cache.get('item3'), 'value3'); - cache.get('item2'); - cache.put('item1', 'value1'); - assert.equal(cache.get('item3'), undefined); - assert.equal(cache.get('item1'), 'value1'); - assert.equal(cache.get('item2'), 'value2'); - }); + var cache = TestCacheFactory.createCache('cache', { capacity: 2 }) + assert.equal(cache.info().size, 0) + cache.put('item1', 'value1') + assert.equal(cache.info().size, 1) + cache.put('item2', 'value2') + assert.equal(cache.info().size, 2) + cache.put('item3', 'value3') + assert.equal(cache.info().size, 2) + assert.equal(cache.get('item1'), undefined) + assert.equal(cache.get('item2'), 'value2') + assert.equal(cache.get('item3'), 'value3') + cache.get('item2') + cache.put('item1', 'value1') + assert.equal(cache.get('item3'), undefined) + assert.equal(cache.get('item1'), 'value1') + assert.equal(cache.get('item2'), 'value2') + }) it('should not delete items if maxAge is specified and deleteOnExpire is set to "none".', function (done) { - var cache = TestCacheFactory('cache', { maxAge: 10, deleteOnExpire: 'none', recycleFreq: 20 }); - cache.put('item1', 'value1'); - assert.equal(cache.get('item1'), 'value1'); + var cache = TestCacheFactory.createCache('cache', { + maxAge: 10, + deleteOnExpire: 'none', + recycleFreq: 20 + }) + cache.put('item1', 'value1') + assert.equal(cache.get('item1'), 'value1') setTimeout(function () { - assert.equal(cache.get('item1'), 'value1'); - assert.equal(cache.info('item1').isExpired, true); - done(); - }, 100); - }); + assert.equal(cache.get('item1'), 'value1') + assert.equal(cache.info('item1').isExpired, true) + done() + }, 100) + }) it('should remove items if maxAge is specified and deleteOnExpire is set to "aggressive".', function (done) { - var cache = TestCacheFactory('cache', { maxAge: 10, deleteOnExpire: 'aggressive', recycleFreq: 20 }); - cache.put('item1', 'value1'); - assert.equal(cache.get('item1'), 'value1'); + var cache = TestCacheFactory.createCache('cache', { + maxAge: 10, + deleteOnExpire: 'aggressive', + recycleFreq: 20 + }) + cache.put('item1', 'value1') + assert.equal(cache.get('item1'), 'value1') setTimeout(function () { - assert.isUndefined(cache.info('item1')); - assert.isUndefined(cache.get('item1')); + assert.isUndefined(cache.info('item1')) + assert.isUndefined(cache.get('item1')) - done(); - }, 100); - }); + done() + }, 100) + }) it('should should lazy delete an item when maxAge is specified and deleteOnExpire is set to "passive".', function (done) { - var cache = TestCacheFactory('cache', { maxAge: 10, deleteOnExpire: 'passive' }); - cache.put('item1', 'value1'); - assert.equal(cache.get('item1'), 'value1'); + var cache = TestCacheFactory.createCache('cache', { + maxAge: 10, + deleteOnExpire: 'passive' + }) + cache.put('item1', 'value1') + assert.equal(cache.get('item1'), 'value1') setTimeout(function () { - assert.isTrue(cache.info('item1').isExpired); - assert.isUndefined(cache.get('item1')); + assert.isTrue(cache.info('item1').isExpired) + assert.isUndefined(cache.get('item1')) - done(); - }, 100); - }); + done() + }, 100) + }) it('should touch an item.', function (done) { - var cache = TestCacheFactory('cache', { maxAge: 10, deleteOnExpire: 'passive' }); - cache.put('item1', 'value1'); - assert.equal(cache.get('item1'), 'value1'); + var cache = TestCacheFactory.createCache('cache', { + maxAge: 10, + deleteOnExpire: 'passive' + }) + cache.put('item1', 'value1') + assert.equal(cache.get('item1'), 'value1') setTimeout(function () { - assert.isTrue(cache.info('item1').isExpired); - cache.touch('item1'); - assert.equal(cache.get('item1'), 'value1'); + assert.isTrue(cache.info('item1').isExpired) + cache.touch('item1') + assert.equal(cache.get('item1'), 'value1') - done(); - }, 100); - }); + done() + }, 100) + }) it('should handle normal promises.', function (done) { - var cache = TestCacheFactory('cache', { + var cache = TestCacheFactory.createCache('cache', { maxAge: 10, deleteOnExpire: 'passive', recycleFreq: 20, storeOnResolve: true, storeOnReject: true - }); - var deferred = $q.defer(); - var item = cache.put('item1', deferred.promise); - assert.equal(typeof item.then, 'function'); - assert.equal(typeof cache.get('item1').then, 'function'); + }) + var deferred = $q.defer() + var item = cache.put('item1', deferred.promise) + assert.equal(typeof item.then, 'function') + assert.equal(typeof cache.get('item1').then, 'function') setTimeout(function () { try { $rootScope.$apply(function () { - deferred.resolve('value1'); - }); - assert.equal(cache.get('item1'), 'value1'); + deferred.resolve('value1') + }) + assert.equal(cache.get('item1'), 'value1') setTimeout(function () { - assert.isUndefined(cache.get('item1')); - done(); - }, 100); + assert.isUndefined(cache.get('item1')) + done() + }, 100) } catch (err) { - done(err); + done(err) } - }, 100); - }); + }, 100) + }) it('should handle normal promises using localStorage.', function (done) { - var cache = TestCacheFactory('cache', { + var cache = TestCacheFactory.createCache('cache', { maxAge: 10, deleteOnExpire: 'passive', recycleFreq: 20, storageMode: 'localStorage', storeOnResolve: true, storeOnReject: true - }); - var deferred = $q.defer(); - var item = cache.put('item1', deferred.promise); - assert.equal(typeof item.then, 'function'); - assert.equal(typeof cache.get('item1').then, 'function'); + }) + var deferred = $q.defer() + var item = cache.put('item1', deferred.promise) + assert.equal(typeof item.then, 'function') + assert.equal(typeof cache.get('item1').then, 'function') setTimeout(function () { try { $rootScope.$apply(function () { - deferred.resolve('value1'); - }); - assert.equal(cache.get('item1'), 'value1'); + deferred.resolve('value1') + }) + assert.equal(cache.get('item1'), 'value1') setTimeout(function () { - assert.isUndefined(cache.get('item1')); - done(); - }, 100); + assert.isUndefined(cache.get('item1')) + done() + }, 100) } catch (err) { - done(err); + done(err) } - }, 100); - }); + }, 100) + }) it('should work with $http promises.', function (done) { - $httpBackend.expectGET('test.com').respond({ name: 'John' }); - var cache = TestCacheFactory('cache', { + $httpBackend.expectGET('test.com').respond({ name: 'John' }) + var cache = TestCacheFactory.createCache('cache', { storeOnResolve: true, storeOnReject: true - }); + }) $http.get('test.com', { cache: cache - }).success(function (data) { - assert.deepEqual(data, { name: 'John' }); + }).then(function (data) { + assert.deepEqual(data.data, { name: 'John' }) $http.get('test.com', { cache: cache - }).success(function (data) { - assert.deepEqual(data, { name: 'John' }); - }); - $rootScope.$safeApply(); - assert.equal(cache.get('test.com')[0], 200); - assert.deepEqual(cache.get('test.com')[1], { name: 'John' }); - done(); - }); - $httpBackend.flush(); - }); + }).then(function (data) { + assert.deepEqual(data.data, { name: 'John' }) + }) + $rootScope.$safeApply() + assert.equal(cache.get('test.com')[0], 200) + assert.deepEqual(cache.get('test.com')[1], { name: 'John' }) + done() + }) + $httpBackend.flush() + }) it('should work with $http promises when storeOnResolve is false.', function () { - $httpBackend.expectGET('test.com').respond({ name: 'John' }); - var cache = TestCacheFactory('cache', { storeOnReject: true }); + $httpBackend.expectGET('test.com').respond({ name: 'John' }) + var cache = TestCacheFactory.createCache('cache', { storeOnReject: true }) $http.get('test.com', { cache: cache - }).success(function (data) { - assert.deepEqual(data, { name: 'John' }); - $rootScope.$safeApply(); - assert.equal(cache.get('test.com')[0], 200); - assert.deepEqual(cache.get('test.com')[1], { name: 'John' }); - }); - $httpBackend.flush(); - }); + }).then(function (data) { + assert.deepEqual(data.data, { name: 'John' }) + $rootScope.$safeApply() + assert.equal(cache.get('test.com')[0], 200) + assert.deepEqual(cache.get('test.com')[1], { name: 'John' }) + }) + $httpBackend.flush() + }) it('should work with promises when storeOnResolve is true.', function (done) { - var deferred = $q.defer(); - var cache = TestCacheFactory('cache', { + var deferred = $q.defer() + var cache = TestCacheFactory.createCache('cache', { storeOnResolve: true - }); - cache.put('test', deferred.promise); - deferred.resolve('value'); - $rootScope.$safeApply(); + }) + cache.put('test', deferred.promise) + deferred.resolve('value') + $rootScope.$safeApply() setTimeout(function () { - assert.equal(cache.get('test'), 'value'); - done(); - }, 30); - }); + assert.equal(cache.get('test'), 'value') + done() + }, 30) + }) it('should work with rejected $http promises when storeOnReject and storeOnResolve are false.', function (done) { - $httpBackend.expectGET('test.com').respond(404, 'Not Found'); - var cache = TestCacheFactory('cache', {}); + $httpBackend.expectGET('test.com').respond(404, 'Not Found') + var cache = TestCacheFactory.createCache('cache', {}) $http.get('test.com', { cache: cache - }).success(function () { - done('Should not have succeeded'); - }).error(function (data) { - assert.deepEqual(data, 'Not Found'); + }).then(function () { + done('Should not have succeeded') + }, function (data) { + assert.deepEqual(data.data, 'Not Found') // should not have cached the 404 - $httpBackend.expectGET('test.com').respond(200, { test: 'data' }); + $httpBackend.expectGET('test.com').respond(200, { test: 'data' }) $http.get('test.com', { cache: cache - }).success(function (data) { - assert.deepEqual(data, { test: 'data' }); - done(); - }).error(function (data) { - console.log(data); - done('Should not have failed'); - }); - //$httpBackend.flush(); - }); - $httpBackend.flush(); - }); + }).then(function (data) { + assert.deepEqual(data.data, { test: 'data' }) + done() + }, function (data) { + done('Should not have failed') + }) + // $httpBackend.flush(); + }) + $httpBackend.flush() + }) it('should work with rejected $http promises when storeOnReject and storeOnResolve are false and using localStorage.', function (done) { - $httpBackend.expectGET('test.com').respond(404, 'Not Found'); - var cache = TestCacheFactory('cache', { + $httpBackend.expectGET('test.com').respond(404, 'Not Found') + var cache = TestCacheFactory.createCache('cacheLocalStorage', { storageMode: 'localStorage' - }); + }) $http.get('test.com', { cache: cache - }).success(function () { - done('Should not have succeeded'); - }).error(function (data) { - assert.deepEqual(data, 'Not Found'); + }).then(function (data) { + console.log(data) + done('Should not have succeeded') + }, function (data) { + assert.deepEqual(data.data, 'Not Found') // should not have cached the 404 - $httpBackend.expectGET('test.com').respond(200, { test: 'data' }); + $httpBackend.expectGET('test.com').respond(200, { test: 'data' }) $http.get('test.com', { cache: cache - }).success(function (data) { - assert.deepEqual(data, { test: 'data' }); - done(); - }).error(function (data) { - console.log(data); - done('Should not have failed'); - }); - //$httpBackend.flush(); - }); - $httpBackend.flush(); - }); + }).then(function (data) { + assert.deepEqual(data.data, { test: 'data' }) + done() + }, function (data) { + done('Should not have failed') + }) + // $httpBackend.flush(); + }) + $httpBackend.flush() + }) it('should work with rejected promises when storeOnReject is false.', function (done) { - var deferred = $q.defer(); - var cache = TestCacheFactory('cache', { storeOnResolve: true }); - cache.put('test', deferred.promise); - deferred.reject('error'); - $rootScope.$safeApply(); - setTimeout(function () { - assert.equal(typeof cache.get('test').then, 'function'); - done(); - }, 30); - }); + var deferred = $q.defer() + var cache = TestCacheFactory.createCache('cache', { storeOnResolve: true }) + cache.put('test', deferred.promise) + deferred.reject('error') + $rootScope.$safeApply() + assert.equal(typeof cache.get('test').then, 'function') + done() + }) it('should work with rejected promises.', function (done) { - var deferred = $q.defer(); - var cache = TestCacheFactory('cache', { + var deferred = $q.defer() + var cache = TestCacheFactory.createCache('cache', { storeOnResolve: true, storeOnReject: true - }); - cache.put('test', deferred.promise); - deferred.reject('error'); - $rootScope.$safeApply(); - setTimeout(function () { - assert.equal(cache.get('test'), 'error'); - done(); - }, 30); - }); + }) + cache.put('test', deferred.promise) + deferred.reject('error') + $rootScope.$safeApply() + assert.equal(cache.get('test'), 'error') + done() + }) it('should work with $http promises using localStorage.', function (done) { - $httpBackend.expectGET('test.com').respond({ name: 'John' }); - var cache = TestCacheFactory('cache', { + $httpBackend.expectGET('test.com').respond({ name: 'John' }) + var cache = TestCacheFactory.createCache('cache', { storeOnResolve: true, storeOnReject: true, storageMode: 'localStorage' - }); + }) $http.get('test.com', { cache: cache - }).success(function (data) { - assert.deepEqual(data, { name: 'John' }); + }).then(function (data) { + assert.deepEqual(data.data, { name: 'John' }) $http.get('test.com', { cache: cache - }).success(function (data) { - assert.deepEqual(data, { name: 'John' }); - done(); - }).error(done); - $rootScope.$safeApply(); - }).error(done); - $httpBackend.flush(); - }); + }).then(function (data) { + assert.deepEqual(data.data, { name: 'John' }) + done() + }, done) + $rootScope.$safeApply() + }, done) + $httpBackend.flush() + }) it('should work with $http promises with multiple requests.', function (done) { - $httpBackend.expectGET('test.com').respond({ name: 'John' }); - var cache = TestCacheFactory('cache', { + $httpBackend.expectGET('test.com').respond({ name: 'John' }) + var cache = TestCacheFactory.createCache('cacheMultiple', { storeOnResolve: true, storeOnReject: true - }); + }) $http.get('test.com', { cache: cache - }); - $rootScope.$safeApply(); - assert.deepEqual(cache.keys(), ['test.com']); + }) + $rootScope.$safeApply() + assert.deepEqual(cache.keys(), ['test.com']) setTimeout(function () { try { - $rootScope.$safeApply(); - var promise = cache.get('test.com'); - assert.equal(typeof promise.then, 'function'); + $rootScope.$safeApply() + var promise = cache.get('test.com') + assert.equal(typeof promise.then, 'function') $http.get('test.com', { cache: cache - }); - $rootScope.$safeApply(); - assert.deepEqual(cache.keys(), ['test.com']); - assert.isTrue(promise === cache.get('test.com')); + }) + $rootScope.$safeApply() + assert.deepEqual(cache.keys(), ['test.com']) + assert.isTrue(promise === cache.get('test.com')) setTimeout(function () { try { $http.get('test.com', { cache: cache - }); - $rootScope.$safeApply(); - assert.deepEqual(cache.keys(), ['test.com']); - assert.isTrue(promise === cache.get('test.com')); - $httpBackend.flush(); - assert.deepEqual(cache.keys(), ['test.com']); - done(); + }) + $rootScope.$safeApply() + assert.deepEqual(cache.keys(), ['test.com']) + assert.isTrue(promise === cache.get('test.com')) + $httpBackend.flush() + assert.deepEqual(cache.keys(), ['test.com']) + done() } catch (err) { - done(err); + done(err) } - }, 20); + }, 20) } catch (err) { - done(err); + done(err) } - }, 20); - }); + }, 20) + }) it('should work with $http promises with multiple requests using localStorage.', function (done) { - $httpBackend.expectGET('test.com').respond({ name: 'John' }); - var cache = TestCacheFactory('cache', { + $httpBackend.expectGET('test.com').respond({ name: 'John' }) + var cache = TestCacheFactory.createCache('cacheMultiple', { storageMode: 'localStorage', storeOnResolve: true, storeOnReject: true - }); + }) $http.get('test.com', { cache: cache - }); - assert.deepEqual(cache.keys(), []); + }) + assert.deepEqual(cache.keys(), []) setTimeout(function () { $http.get('test.com', { cache: cache - }); - assert.deepEqual(cache.keys(), []); + }) + assert.deepEqual(cache.keys(), []) setTimeout(function () { $http.get('test.com', { cache: cache - }); - assert.deepEqual(cache.keys(), []); - $httpBackend.flush(); - assert.deepEqual(cache.keys(), ['test.com']); - done(); - }, 20); - }, 20); - }); + }) + assert.deepEqual(cache.keys(), []) + $httpBackend.flush() + assert.deepEqual(cache.keys(), ['test.com']) + done() + }, 20) + }, 20) + }) it('should save data to localStorage when storageMode is used.', function () { - var localStorageCache = TestCacheFactory('localStorageCache', { storageMode: 'localStorage' }); - var sessionStorageCache = TestCacheFactory('sessionStorageCache', { storageMode: 'sessionStorage' }); + var localStorageCache = TestCacheFactory.createCache('localStorageCache', { storageMode: 'localStorage' }) + var sessionStorageCache = TestCacheFactory.createCache('sessionStorageCache', { storageMode: 'sessionStorage' }) - localStorageCache.put('item1', 'value1'); - sessionStorageCache.put('item1', 'value1'); + localStorageCache.put('item1', 'value1') + sessionStorageCache.put('item1', 'value1') - assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1')).value, 'value1'); - assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys'), '["item1"]'); - assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1')).value, 'value1'); - assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys'), '["item1"]'); - }); -}); + assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1')).value, 'value1') + assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys'), '["item1"]') + assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1')).value, 'value1') + assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys'), '["item1"]') + }) +}) diff --git a/test/unit/Cache/index.remove.test.js b/test/unit/Cache/index.remove.test.js index 945a120..8c3acbc 100644 --- a/test/unit/Cache/index.remove.test.js +++ b/test/unit/Cache/index.remove.test.js @@ -1,60 +1,61 @@ +/* global TestCacheFactory */ describe('Cache#remove(key)', function () { it('should remove the item with the specified key.', function () { - var cache = TestCacheFactory('cache'); - var value1 = 'value1', - value2 = 2, - value3 = { - value3: 'stuff' - }; - cache.put('item1', value1); - cache.put('item2', value2); - cache.put('item3', value3); - cache.remove('item1'); - assert.isUndefined(cache.get('item1')); - cache.remove('item2'); - assert.isUndefined(cache.get('item2')); - cache.remove('item3'); - assert.isUndefined(cache.get('item3')); - }); + var cache = TestCacheFactory.createCache('cache') + var value1 = 'value1' + var value2 = 2 + var value3 = { + value3: 'stuff' + } + cache.put('item1', value1) + cache.put('item2', value2) + cache.put('item3', value3) + cache.remove('item1') + assert.isUndefined(cache.get('item1')) + cache.remove('item2') + assert.isUndefined(cache.get('item2')) + cache.remove('item3') + assert.isUndefined(cache.get('item3')) + }) it('should reduce the size of the cache by one if the size is greater than zero.', function () { - var cache = TestCacheFactory('cache'); - cache.put('item1', 'value1'); - assert.equal(cache.info().size, 1); - cache.put('item2', 'value2'); - assert.equal(cache.info().size, 2); - cache.remove('item1'); - assert.equal(cache.info().size, 1); - cache.remove('item2'); - assert.equal(cache.info().size, 0); - cache.remove('item1'); - assert.equal(cache.info().size, 0); - cache.remove('item2'); - assert.equal(cache.info().size, 0); - }); + var cache = TestCacheFactory.createCache('cache') + cache.put('item1', 'value1') + assert.equal(cache.info().size, 1) + cache.put('item2', 'value2') + assert.equal(cache.info().size, 2) + cache.remove('item1') + assert.equal(cache.info().size, 1) + cache.remove('item2') + assert.equal(cache.info().size, 0) + cache.remove('item1') + assert.equal(cache.info().size, 0) + cache.remove('item2') + assert.equal(cache.info().size, 0) + }) it('should remove items from localStorage when storageMode is used.', function () { - var localStorageCache = TestCacheFactory('localStorageCache', { storageMode: 'localStorage' }), - sessionStorageCache = TestCacheFactory('sessionStorageCache', { storageMode: 'sessionStorage' }); + var localStorageCache = TestCacheFactory.createCache('localStorageCache', { storageMode: 'localStorage' }) + var sessionStorageCache = TestCacheFactory.createCache('sessionStorageCache', { storageMode: 'sessionStorage' }) - localStorageCache.put('item1', 'value1'); + localStorageCache.put('item1', 'value1') - localStorageCache.put('2', "value2"); - assert.equal(localStorageCache.keys().length, 2); - localStorageCache.remove(2); - assert.equal(localStorageCache.keys().length, 1); + localStorageCache.put('2', 'value2') + assert.equal(localStorageCache.keys().length, 2) + localStorageCache.remove(2) + assert.equal(localStorageCache.keys().length, 1) - sessionStorageCache.put('item1', 'value1'); + sessionStorageCache.put('item1', 'value1') - assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1')).value, 'value1'); - assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys'), '["item1"]'); - assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1')).value, 'value1'); - assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys'), '["item1"]'); + assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1')).value, 'value1') + assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys'), '["item1"]') + assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1')).value, 'value1') + assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys'), '["item1"]') - localStorageCache.remove('item1'); - sessionStorageCache.remove('item1'); + localStorageCache.remove('item1') + sessionStorageCache.remove('item1') - assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1'))); - assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys'), '[]'); - assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1'))); - assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys'), '[]'); - }); -}); + assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.data.item1'))) + assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'localStorageCache.keys'), '[]') + assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.data.item1'))) + assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'sessionStorageCache.keys'), '[]') + }) +}) diff --git a/test/unit/Cache/index.removeAll.test.js b/test/unit/Cache/index.removeAll.test.js index b3aad37..c2004eb 100644 --- a/test/unit/Cache/index.removeAll.test.js +++ b/test/unit/Cache/index.removeAll.test.js @@ -1,43 +1,51 @@ +/* global TestCacheFactory */ describe('Cache#removeAll()', function () { it('should remove all items in the cache.', function () { - var cache = TestCacheFactory('DSCache.removeAll.cache'); - var value1 = 'value1', - value2 = 2, - value3 = { - value3: 'stuff' - }; - cache.put('item1', value1); - cache.put('item2', value2); - cache.put('item3', value3); - cache.removeAll(); - assert.isUndefined(cache.get('item1')); - assert.isUndefined(cache.get('item2')); - assert.isUndefined(cache.get('item3')); - }); + var cache = TestCacheFactory.createCache('DSCache.removeAll.cache') + var value1 = 'value1' + var value2 = 2 + var value3 = { + value3: 'stuff' + } + cache.put('item1', value1) + cache.put('item2', value2) + cache.put('item3', value3) + cache.removeAll() + assert.isUndefined(cache.get('item1')) + assert.isUndefined(cache.get('item2')) + assert.isUndefined(cache.get('item3')) + }) it('should remove items from localStorage when storageMode is used.', function () { - var localStorageCache = TestCacheFactory('DSCache.removeAll.localStorageCache', { storageMode: 'localStorage', storageImpl: localStorage }), - sessionStorageCache = TestCacheFactory('DSCache.removeAll.sessionStorageCache', { storageMode: 'sessionStorage', storageImpl: sessionStorage, storagePrefix: 'affas' }); + var localStorageCache = TestCacheFactory.createCache('DSCache.removeAll.localStorageCache', { + storageMode: 'localStorage', + storageImpl: localStorage + }) + var sessionStorageCache = TestCacheFactory.createCache('DSCache.removeAll.sessionStorageCache', { + storageMode: 'sessionStorage', + storageImpl: sessionStorage, + storagePrefix: 'affas' + }) - localStorageCache.put('item1', 'value1'); - sessionStorageCache.put('item1', 'value1'); - localStorageCache.put('item2', 'value2'); - sessionStorageCache.put('item2', 'value2'); + localStorageCache.put('item1', 'value1') + sessionStorageCache.put('item1', 'value1') + localStorageCache.put('item2', 'value2') + sessionStorageCache.put('item2', 'value2') - assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.data.item1')).value, 'value1'); - assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.data.item2')).value, 'value2'); - assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.keys'), '["item1","item2"]'); - assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.data.item1')).value, 'value1'); - assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.data.item2')).value, 'value2'); - assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.keys'), '["item1","item2"]'); + assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.data.item1')).value, 'value1') + assert.equal(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.data.item2')).value, 'value2') + assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.keys'), '["item1","item2"]') + assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.data.item1')).value, 'value1') + assert.equal(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.data.item2')).value, 'value2') + assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.keys'), '["item1","item2"]') - localStorageCache.removeAll(); - sessionStorageCache.removeAll(); + localStorageCache.removeAll() + sessionStorageCache.removeAll() - assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.data.item1'))); - assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.data.item2'))); - assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.keys'), '[]'); - assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.data.item1'))); - assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.data.item2'))); - assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.keys'), '[]'); - }); -}); + assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.data.item1'))) + assert.isNull(angular.fromJson(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.data.item2'))) + assert.equal(localStorage.getItem(localStorageCache.$$storagePrefix + 'DSCache.removeAll.localStorageCache.keys'), '[]') + assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.data.item1'))) + assert.isNull(angular.fromJson(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.data.item2'))) + assert.equal(sessionStorage.getItem(sessionStorageCache.$$storagePrefix + 'DSCache.removeAll.sessionStorageCache.keys'), '[]') + }) +}) diff --git a/test/unit/Cache/index.removeExpired.test.js b/test/unit/Cache/index.removeExpired.test.js index cfb6d49..8698f18 100644 --- a/test/unit/Cache/index.removeExpired.test.js +++ b/test/unit/Cache/index.removeExpired.test.js @@ -1,79 +1,76 @@ +/* global TestCacheFactory */ describe('Cache#removeExpired()', function () { it('should remove all expired items when deleteOnExpire is "none".', function (done) { - var cache = TestCacheFactory('cache', { + var cache = TestCacheFactory.createCache('cache', { deleteOnExpire: 'none', maxAge: 10, recycleFreq: 20 - }); - var value1 = 'value1', - value2 = 2, - value3 = { - value3: 'stuff' - }; - cache.put('item1', value1); - cache.put('item2', value2); - cache.put('item3', value3); + }) + var value1 = 'value1' + var value2 = 2 + var value3 = { + value3: 'stuff' + } + cache.put('item1', value1) + cache.put('item2', value2) + cache.put('item3', value3) setTimeout(function () { - var expired = cache.removeExpired(); + var expired = cache.removeExpired() assert.deepEqual(expired, { item1: value1, item2: value2, item3: value3 - }); - assert.equal(cache.info().size, 0); - cache.put('item3', value3); - assert.equal(cache.info().size, 1); - done(); - }, 100); - }); -// it('should remove all expired items when deleteOnExpire is "passive".', function (done) { -// var cache = TestCacheFactory('cache', { -// deleteOnExpire: 'passive', -// maxAge: 10, -// recycleFreq: 20 -// }); -// var value1 = 'value1', -// value2 = 2, -// value3 = { -// value3: 'stuff' -// }; -// cache.put('item1', value1); -// cache.put('item2', value2); -// cache.put('item3', value3); -// setTimeout(function () { -// var expired = cache.removeExpired(); -// assert.deepEqual(expired, { -// item1: value1, -// item2: value2, -// item3: value3 -// }); -// assert.equal(cache.info().size, 0); -// cache.put('item3', value3); -// assert.equal(cache.info().size, 1); -// done(); -// }, 100); -// }); -// it('should remove all expired items when deleteOnExpire is "aggressive".', function (done) { -// var cache = TestCacheFactory('cache', { -// deleteOnExpire: 'aggressive', -// maxAge: 10, -// recycleFreq: 20 -// }); -// var value1 = 'value1', -// value2 = 2, -// value3 = { -// value3: 'stuff' -// }; -// cache.put('item1', value1); -// cache.put('item2', value2); -// cache.put('item3', value3); -// setTimeout(function () { -// var expired = cache.removeExpired(); -// assert.deepEqual(expired, {}); -// assert.equal(cache.info().size, 0); -// cache.put('item3', value3); -// assert.equal(cache.info().size, 1); -// done(); -// }, 100); -// }); -}); + }) + assert.equal(cache.info().size, 0) + cache.put('item3', value3) + assert.equal(cache.info().size, 1) + done() + }, 100) + }) + // it('should remove all expired items when deleteOnExpire is "passive".', function (done) { + // var cache = TestCacheFactory.createCache('cache', { + // deleteOnExpire: 'passive', + // maxAge: 10, + // recycleFreq: 20 + // }) + // var value1 = 'value1', value2 = 2, value3 = { + // value3: 'stuff' + // } + // cache.put('item1', value1) + // cache.put('item2', value2) + // cache.put('item3', value3) + // setTimeout(function () { + // var expired = cache.removeExpired() + // assert.deepEqual(expired, { + // item1: value1, + // item2: value2, + // item3: value3 + // }) + // assert.equal(cache.info().size, 0) + // cache.put('item3', value3) + // assert.equal(cache.info().size, 1) + // done() + // }, 100) + // }) + // it('should remove all expired items when deleteOnExpire is "aggressive".', function (done) { + // var cache = TestCacheFactory.createCache('cache', { + // deleteOnExpire: 'aggressive', + // maxAge: 10, + // recycleFreq: 20 + // }) + // var value1 = 'value1', value2 = 2, value3 = { + // value3: 'stuff' + // } + // cache.put('item1', value1) + // cache.put('item2', value2) + // cache.put('item3', value3) + // setTimeout(function () { + // var expired = cache.removeExpired() + // assert.deepEqual(expired, {}) + // assert.equal(cache.info().size, 0) + // cache.put('item3', value3) + // assert.equal(cache.info().size, 1) + // done() + // }, 100) + // }) +}) diff --git a/test/unit/Cache/index.setOptions.test.js b/test/unit/Cache/index.setOptions.test.js index b483b9a..6c86b05 100644 --- a/test/unit/Cache/index.setOptions.test.js +++ b/test/unit/Cache/index.setOptions.test.js @@ -1,188 +1,212 @@ +/* global fail, TestCacheFactory, TYPES_EXCEPT_OBJECT */ describe('Cache#setOptions([options][, strict])', function () { it('should throw an error if "options" is not an object.', function () { - var cache = TestCacheFactory('cache'); + var cache = TestCacheFactory.createCache('cache') for (var i = 0; i < TYPES_EXCEPT_OBJECT.length; i++) { try { - cache.setOptions(TYPES_EXCEPT_OBJECT[i]); + cache.setOptions(TYPES_EXCEPT_OBJECT[i]) if (TYPES_EXCEPT_OBJECT[i] !== null && TYPES_EXCEPT_OBJECT[i] !== undefined && TYPES_EXCEPT_OBJECT[i] !== false) { - fail(TYPES_EXCEPT_OBJECT[i]); + fail(TYPES_EXCEPT_OBJECT[i]) } } catch (err) { - assert.equal(err.message, 'cacheOptions must be an object!'); - continue; + assert.equal(err.message, '"options" must be an object!') + continue } if (TYPES_EXCEPT_OBJECT[i] !== null && TYPES_EXCEPT_OBJECT[i] !== undefined && TYPES_EXCEPT_OBJECT[i] !== false) { - fail(TYPES_EXCEPT_OBJECT[i]); + fail(TYPES_EXCEPT_OBJECT[i]) } } - }); + }) it('should correctly reset to defaults if strict mode is true', function () { var onExpire = function () { - }; - var cache = TestCacheFactory('cache', { + } + var cache = TestCacheFactory.createCache('cache', { maxAge: 100, cacheFlushInterval: 200, onExpire: onExpire, storageMode: 'localStorage', - disabled: true - }); - assert.equal(cache.info().maxAge, 100); - assert.equal(cache.info().cacheFlushInterval, 200); - assert.equal(cache.info().onExpire, onExpire); - assert.equal(cache.info().storageMode, 'localStorage'); - assert.isTrue(cache.info().disabled); - cache.setOptions({ }, true); - assert.equal(cache.info().maxAge, Number.MAX_VALUE); - assert.isUndefined(cache.info().cacheFlushInterval); - assert.isUndefined(cache.info().onExpire); - assert.equal(cache.info().storageMode, 'memory'); - assert.isFalse(cache.info().disabled); - }); + enabled: false + }) + assert.equal(cache.info().maxAge, 100) + assert.equal(cache.info().cacheFlushInterval, 200) + assert.equal(cache.info().onExpire, onExpire) + assert.equal(cache.info().storageMode, 'localStorage') + assert.isFalse(cache.info().enabled) + cache.setOptions({}, true) + assert.equal(cache.info().maxAge, Number.MAX_VALUE) + assert.isNull(cache.info().cacheFlushInterval) + assert.isNull(cache.info().onExpire) + assert.equal(cache.info().storageMode, 'memory') + assert.isTrue(cache.info().enabled) + }) it('should correctly modify the capacity of a cache', function (done) { - var cache = TestCacheFactory('cache'); - assert.equal(cache.info().capacity, Number.MAX_VALUE); - cache.setOptions({ capacity: 5 }, false); - assert.equal(cache.info().capacity, 5); - cache.put('item1', 1); - cache.put('item2', 2); - cache.put('item3', 3); - cache.put('item4', 4); - cache.put('item5', 5); - cache.put('item6', 6); - assert.isUndefined(cache.get('item1')); + var cache = TestCacheFactory.createCache('cache') + assert.equal(cache.info().capacity, Number.MAX_VALUE) + cache.setOptions({ capacity: 5 }, false) + assert.equal(cache.info().capacity, 5) + cache.put('item1', 1) + cache.put('item2', 2) + cache.put('item3', 3) + cache.put('item4', 4) + cache.put('item5', 5) + cache.put('item6', 6) + assert.isUndefined(cache.get('item1')) setTimeout(function () { - cache.get('item2'); - cache.get('item3'); - cache.get('item6'); - cache.setOptions({ capacity: 3 }, false); + cache.get('item2') + cache.get('item3') + cache.get('item6') + cache.setOptions({ capacity: 3 }, false) // Least-recently used items over the new capacity should have been removed. - assert.isUndefined(cache.get('item4')); - assert.isUndefined(cache.get('item5')); - assert.equal(cache.info().size, 3); + assert.isUndefined(cache.get('item4')) + assert.isUndefined(cache.get('item5')) + assert.equal(cache.info().size, 3) - done(); - }, 50); - }); + done() + }, 50) + }) it('should correctly modify the maxAge of a cache', function (done) { - var cache = TestCacheFactory('cache'); - assert.equal(cache.info().maxAge, Number.MAX_VALUE); - cache.setOptions({ maxAge: 1000, deleteOnExpire: 'aggressive', recycleFreq: 20 }, false); - assert.equal(cache.info().maxAge, 1000); - cache.put('item1', 1); - cache.put('item2', 2); + var cache = TestCacheFactory.createCache('cache') + assert.equal(cache.info().maxAge, Number.MAX_VALUE) + cache.setOptions({ + maxAge: 1000, + deleteOnExpire: 'aggressive', + recycleFreq: 20 + }, false) + assert.equal(cache.info().maxAge, 1000) + cache.put('item1', 1) + cache.put('item2', 2) setTimeout(function () { - assert.isDefined(cache.get('item1')); - assert.isDefined(cache.get('item2')); - cache.setOptions({ maxAge: 10, deleteOnExpire: 'aggressive', recycleFreq: 20 }, false); - assert.equal(cache.info().maxAge, 10); - cache.put('item1', 1); - cache.put('item2', 2); + assert.isDefined(cache.get('item1')) + assert.isDefined(cache.get('item2')) + cache.setOptions({ + maxAge: 10, + deleteOnExpire: 'aggressive', + recycleFreq: 20 + }, false) + assert.equal(cache.info().maxAge, 10) + cache.put('item1', 1) + cache.put('item2', 2) // The new items should be removed after 500 ms (the new maxAge) setTimeout(function () { - assert.isUndefined(cache.get('item1')); - assert.isUndefined(cache.get('item2')); - cache.put('item1', 1); - cache.put('item2', 2); - cache.setOptions({ maxAge: null, deleteOnExpire: 'none', recycleFreq: 20 }, false); - assert.equal(cache.info().maxAge, Number.MAX_VALUE); + assert.isUndefined(cache.get('item1')) + assert.isUndefined(cache.get('item2')) + cache.put('item1', 1) + cache.put('item2', 2) + cache.setOptions({ + maxAge: null, + deleteOnExpire: 'none', + recycleFreq: 20 + }, false) + assert.equal(cache.info().maxAge, Number.MAX_VALUE) // The new items should be removed after 500 ms (the new maxAge) setTimeout(function () { - assert.equal(cache.get('item1'), 1); - assert.isNumber(cache.info('item1').expires); - assert.equal(cache.get('item2'), 2); - assert.isNumber(cache.info('item2').expires); + assert.equal(cache.get('item1'), 1) + assert.isNumber(cache.info('item1').expires) + assert.equal(cache.get('item2'), 2) + assert.isNumber(cache.info('item2').expires) - cache.setOptions({ maxAge: 1000, deleteOnExpire: 'aggressive', recycleFreq: 20 }, false); - cache.put('item1', 1); - cache.put('item2', 2); + cache.setOptions({ + maxAge: 1000, + deleteOnExpire: 'aggressive', + recycleFreq: 20 + }, false) + cache.put('item1', 1) + cache.put('item2', 2) // The new items should be removed after 500 ms (the new maxAge) setTimeout(function () { - cache.setOptions({ maxAge: 10, deleteOnExpire: 'aggressive' }, false); - assert.isUndefined(cache.get('item1')); - assert.isUndefined(cache.get('item2')); + cache.setOptions({ + maxAge: 10, + deleteOnExpire: 'aggressive' + }, false) + assert.isUndefined(cache.get('item1')) + assert.isUndefined(cache.get('item2')) - done(); - }, 100); - }, 100); - }, 100); - }, 100); - }); + done() + }, 100) + }, 100) + }, 100) + }, 100) + }) it('should correctly modify the cacheFlushInterval of a cache', function (done) { - var cache = TestCacheFactory('cache'); - assert.isUndefined(cache.info().cacheFlushInterval); - cache.setOptions({ cacheFlushInterval: 10 }, false); - assert.equal(cache.info().cacheFlushInterval, 10); - cache.put('item1', 1); - cache.put('item2', 2); + var cache = TestCacheFactory.createCache('cache') + assert.isNull(cache.info().cacheFlushInterval) + cache.setOptions({ cacheFlushInterval: 10 }, false) + assert.equal(cache.info().cacheFlushInterval, 10) + cache.put('item1', 1) + cache.put('item2', 2) // The first items should be removed after 2000 ms setTimeout(function () { - assert.isUndefined(cache.get('item1')); - assert.isUndefined(cache.get('item2')); - cache.setOptions({ cacheFlushInterval: 20 }, false); - assert.equal(cache.info().cacheFlushInterval, 20); - cache.put('item1', 1); - cache.put('item2', 2); + assert.isUndefined(cache.get('item1')) + assert.isUndefined(cache.get('item2')) + cache.setOptions({ cacheFlushInterval: 20 }, false) + assert.equal(cache.info().cacheFlushInterval, 20) + cache.put('item1', 1) + cache.put('item2', 2) // The new items should be removed after 500 ms (the new maxAge) setTimeout(function () { - assert.isUndefined(cache.get('item1')); - assert.isUndefined(cache.get('item2')); - cache.setOptions({ cacheFlushInterval: 20 }); - assert.equal(cache.info().cacheFlushInterval, 20); - cache.put('item1', 1); - cache.put('item2', 2); + assert.isUndefined(cache.get('item1')) + assert.isUndefined(cache.get('item2')) + cache.setOptions({ cacheFlushInterval: 20 }) + assert.equal(cache.info().cacheFlushInterval, 20) + cache.put('item1', 1) + cache.put('item2', 2) // The new items should be removed after 500 ms (the new maxAge) setTimeout(function () { - assert.isUndefined(cache.get('item1')); - assert.isUndefined(cache.get('item2')); + assert.isUndefined(cache.get('item1')) + assert.isUndefined(cache.get('item2')) - done(); - }, 100); - }, 100); - }, 100); - }); + done() + }, 100) + }, 100) + }, 100) + }) it('should correctly modify the deleteOnExpire of a cache', function (done) { - var cache = TestCacheFactory('cache', { maxAge: 10 }); - assert.equal(cache.info().deleteOnExpire, 'none'); - cache.setOptions({ deleteOnExpire: 'passive' }); - assert.equal(cache.info().deleteOnExpire, 'passive'); - cache.put('item1', 1); - cache.put('item2', 2); + var cache = TestCacheFactory.createCache('cache', { maxAge: 10 }) + assert.equal(cache.info().deleteOnExpire, 'none') + cache.setOptions({ deleteOnExpire: 'passive' }) + assert.equal(cache.info().deleteOnExpire, 'passive') + cache.put('item1', 1) + cache.put('item2', 2) // The first items should be removed after 2000 ms setTimeout(function () { - assert.isUndefined(cache.get('item1')); - assert.isUndefined(cache.get('item2')); - cache.setOptions({ maxAge: 10, deleteOnExpire: 'aggressive', recycleFreq: 20 }, false); - assert.equal(cache.info().deleteOnExpire, 'aggressive'); - cache.put('item1', 1); - cache.put('item2', 2); + assert.isUndefined(cache.get('item1')) + assert.isUndefined(cache.get('item2')) + cache.setOptions({ + maxAge: 10, + deleteOnExpire: 'aggressive', + recycleFreq: 20 + }, false) + assert.equal(cache.info().deleteOnExpire, 'aggressive') + cache.put('item1', 1) + cache.put('item2', 2) // The new items should be removed after 500 ms (the new maxAge) setTimeout(function () { - assert.isUndefined(cache.get('item1')); - assert.isUndefined(cache.get('item2')); + assert.isUndefined(cache.get('item1')) + assert.isUndefined(cache.get('item2')) - done(); - }, 100); - }, 100); - }); + done() + }, 100) + }, 100) + }) it('should correctly set configuration to default when "strict" is true', function () { - var cache = TestCacheFactory('cache', { + var cache = TestCacheFactory.createCache('cache', { capacity: 10, maxAge: 1000, cacheFlushInterval: 1000, deleteOnExpire: 'aggressive', recycleFreq: 20000, storageMode: 'localStorage' - }); - cache.setOptions({}, true); - var cacheInfo = cache.info(); - assert.equal(cacheInfo.id, 'cache'); - assert.equal(cacheInfo.capacity, Number.MAX_VALUE); - assert.equal(cacheInfo.size, 0); - assert.equal(cacheInfo.recycleFreq, 1000); - assert.equal(cacheInfo.maxAge, Number.MAX_VALUE); - assert.equal(cacheInfo.cacheFlushInterval, null); - assert.equal(cacheInfo.deleteOnExpire, 'none'); - assert.equal(cacheInfo.storageMode, 'memory'); - assert.equal(cacheInfo.onExpire, null); - }); -}); + }) + cache.setOptions({}, true) + var cacheInfo = cache.info() + assert.equal(cacheInfo.id, 'cache') + assert.equal(cacheInfo.capacity, Number.MAX_VALUE) + assert.equal(cacheInfo.size, 0) + assert.equal(cacheInfo.recycleFreq, 1000) + assert.equal(cacheInfo.maxAge, Number.MAX_VALUE) + assert.equal(cacheInfo.cacheFlushInterval, null) + assert.equal(cacheInfo.deleteOnExpire, 'none') + assert.equal(cacheInfo.storageMode, 'memory') + assert.equal(cacheInfo.onExpire, null) + }) +}) diff --git a/test/unit/DSCacheFactory/DSCacheFactoryProvider.setCacheDefaults.test.js b/test/unit/DSCacheFactory/CacheFactoryProvider.setCacheDefaults.test.js similarity index 57% rename from test/unit/DSCacheFactory/DSCacheFactoryProvider.setCacheDefaults.test.js rename to test/unit/DSCacheFactory/CacheFactoryProvider.setCacheDefaults.test.js index 3080cf2..68c25e7 100644 --- a/test/unit/DSCacheFactory/DSCacheFactoryProvider.setCacheDefaults.test.js +++ b/test/unit/DSCacheFactory/CacheFactoryProvider.setCacheDefaults.test.js @@ -1,18 +1,19 @@ +/* global TestCacheFactory, TestCacheFactoryProvider, CACHE_DEFAULTS */ describe('CacheFactoryProvider.setCacheDefaults(options)', function () { it('should have the correct defaults.', function () { - var cache = TestCacheFactory('CacheFactoryProvider.setCacheDefaults.cache'); - assert.isDefined(cache); - assert.equal(cache.info().id, 'CacheFactoryProvider.setCacheDefaults.cache'); - assert.equal(cache.info().capacity, CACHE_DEFAULTS.capacity); - assert.equal(cache.info().maxAge, CACHE_DEFAULTS.maxAge); - assert.equal(cache.info().cacheFlushInterval, CACHE_DEFAULTS.cacheFlushInterval); - assert.equal(cache.info().deleteOnExpire, CACHE_DEFAULTS.deleteOnExpire); - assert.equal(cache.info().onExpire, CACHE_DEFAULTS.onExpire); - assert.equal(cache.info().recycleFreq, CACHE_DEFAULTS.recycleFreq); - assert.equal(cache.info().storageMode, CACHE_DEFAULTS.storageMode); - assert.equal(cache.info().storageImpl, CACHE_DEFAULTS.storageImpl); - assert.equal(cache.info().disabled, CACHE_DEFAULTS.disabled); - }); + var cache = TestCacheFactory.createCache('CacheFactoryProvider.setCacheDefaults.cache') + assert.isDefined(cache) + assert.equal(cache.info().id, 'CacheFactoryProvider.setCacheDefaults.cache') + assert.equal(cache.info().capacity, CACHE_DEFAULTS.capacity) + assert.equal(cache.info().maxAge, CACHE_DEFAULTS.maxAge) + assert.equal(cache.info().cacheFlushInterval, CACHE_DEFAULTS.cacheFlushInterval) + assert.equal(cache.info().deleteOnExpire, CACHE_DEFAULTS.deleteOnExpire) + assert.equal(cache.info().onExpire, CACHE_DEFAULTS.onExpire) + assert.equal(cache.info().recycleFreq, CACHE_DEFAULTS.recycleFreq) + assert.equal(cache.info().storageMode, CACHE_DEFAULTS.storageMode) + assert.equal(cache.info().storageImpl, CACHE_DEFAULTS.storageImpl) + assert.equal(cache.info().enabled, CACHE_DEFAULTS.enabled) + }) it('should set the default options.', function () { var options = { capacity: Math.floor((Math.random() * 100000) + 1), @@ -30,21 +31,21 @@ describe('CacheFactoryProvider.setCacheDefaults(options)', function () { }, verifyIntegrity: false, recycleFreq: 2000, - disabled: true, + enabled: false, onExpire: function () { } - }; - angular.extend(TestCacheFactoryProvider.defaults, options); - var cache = TestCacheFactory('cache'); - assert.isDefined(cache); - assert.equal(cache.info().id, 'cache'); - assert.equal(cache.info().capacity, options.capacity); - assert.equal(cache.info().maxAge, options.maxAge); - assert.equal(cache.info().cacheFlushInterval, options.cacheFlushInterval); - assert.equal(cache.info().deleteOnExpire, options.deleteOnExpire); - assert.equal(cache.info().storageMode, options.storageMode); - assert.equal(cache.info().storageImpl, options.storageImpl); - assert.equal(cache.info().onExpire, options.onExpire); - assert.equal(cache.info().disabled, options.disabled); - }); -}); + } + angular.extend(TestCacheFactoryProvider.defaults, options) + var cache = TestCacheFactory.createCache('cache') + assert.isDefined(cache) + assert.equal(cache.info().id, 'cache') + assert.equal(cache.info().capacity, options.capacity) + assert.equal(cache.info().maxAge, options.maxAge) + assert.equal(cache.info().cacheFlushInterval, options.cacheFlushInterval) + assert.equal(cache.info().deleteOnExpire, options.deleteOnExpire) + assert.equal(cache.info().storageMode, options.storageMode) + assert.equal(cache.info().storageImpl, options.storageImpl) + assert.equal(cache.info().onExpire, options.onExpire) + assert.equal(cache.info().enabled, options.enabled) + }) +}) diff --git a/test/unit/DSCacheFactory/index.clearAll.test.js b/test/unit/DSCacheFactory/index.clearAll.test.js index 0ecf2ab..cd36f7e 100644 --- a/test/unit/DSCacheFactory/index.clearAll.test.js +++ b/test/unit/DSCacheFactory/index.clearAll.test.js @@ -1,59 +1,60 @@ +/* global sinon, TestCacheFactory */ describe('CacheFactory.clearAll()', function () { it('should call "removeAll()" on all caches.', function () { - var cacheKeys = ['CacheFactory.clearAll.cache', 'CacheFactory.clearAll.cache1', 'CacheFactory.clearAll.cache2'], - caches = []; - - caches.push(TestCacheFactory(cacheKeys[0])); - caches[0].put('item', 'value'); - caches[0].put('item2', 'value2'); - caches.push(TestCacheFactory(cacheKeys[1])); - caches[1].put('item', 'value'); - caches[1].put('item2', 'value2'); - caches.push(TestCacheFactory(cacheKeys[2])); - caches[2].put('item', 'value'); - caches[2].put('item2', 'value2'); - - sinon.spy(caches[0], 'removeAll'); - sinon.spy(caches[1], 'removeAll'); - sinon.spy(caches[2], 'removeAll'); - - TestCacheFactory.clearAll(); - - assert.equal(caches[0].removeAll.callCount, 1); - assert.equal(caches[1].removeAll.callCount, 1); - assert.equal(caches[2].removeAll.callCount, 1); - }); + var cacheKeys = ['CacheFactory.clearAll.cache', 'CacheFactory.clearAll.cache1', 'CacheFactory.clearAll.cache2'] + var caches = [] + + caches.push(TestCacheFactory.createCache(cacheKeys[0])) + caches[0].put('item', 'value') + caches[0].put('item2', 'value2') + caches.push(TestCacheFactory.createCache(cacheKeys[1])) + caches[1].put('item', 'value') + caches[1].put('item2', 'value2') + caches.push(TestCacheFactory.createCache(cacheKeys[2])) + caches[2].put('item', 'value') + caches[2].put('item2', 'value2') + + sinon.spy(caches[0], 'removeAll') + sinon.spy(caches[1], 'removeAll') + sinon.spy(caches[2], 'removeAll') + + TestCacheFactory.clearAll() + + assert.equal(caches[0].removeAll.callCount, 1) + assert.equal(caches[1].removeAll.callCount, 1) + assert.equal(caches[2].removeAll.callCount, 1) + }) it('should result in each cache being cleared.', function () { - var cacheKeys = ['CacheFactory.clearAll.cache', 'CacheFactory.clearAll.cache1', 'CacheFactory.clearAll.cache2'], - caches = []; - - caches.push(TestCacheFactory(cacheKeys[0])); - caches[0].put('item', 'value'); - caches[0].put('item2', 'value2'); - caches.push(TestCacheFactory(cacheKeys[1])); - caches[1].put('item', 'value'); - caches[1].put('item2', 'value2'); - caches.push(TestCacheFactory(cacheKeys[2])); - caches[2].put('item', 'value'); - caches[2].put('item2', 'value2'); - - assert.isDefined(caches[0].get('item')); - assert.isDefined(caches[1].get('item')); - assert.isDefined(caches[2].get('item')); - assert.isDefined(caches[0].get('item2')); - assert.isDefined(caches[1].get('item2')); - assert.isDefined(caches[2].get('item2')); - - TestCacheFactory.clearAll(); - - assert.isUndefined(caches[0].get('item')); - assert.isUndefined(caches[1].get('item')); - assert.isUndefined(caches[2].get('item')); - assert.isUndefined(caches[0].get('item2')); - assert.isUndefined(caches[1].get('item2')); - assert.isUndefined(caches[2].get('item2')); - assert.equal(caches[0].info().size, 0); - assert.equal(caches[1].info().size, 0); - assert.equal(caches[2].info().size, 0); - }); -}); + var cacheKeys = ['CacheFactory.clearAll.cache', 'CacheFactory.clearAll.cache1', 'CacheFactory.clearAll.cache2'] + var caches = [] + + caches.push(TestCacheFactory.createCache(cacheKeys[0])) + caches[0].put('item', 'value') + caches[0].put('item2', 'value2') + caches.push(TestCacheFactory.createCache(cacheKeys[1])) + caches[1].put('item', 'value') + caches[1].put('item2', 'value2') + caches.push(TestCacheFactory.createCache(cacheKeys[2])) + caches[2].put('item', 'value') + caches[2].put('item2', 'value2') + + assert.isDefined(caches[0].get('item')) + assert.isDefined(caches[1].get('item')) + assert.isDefined(caches[2].get('item')) + assert.isDefined(caches[0].get('item2')) + assert.isDefined(caches[1].get('item2')) + assert.isDefined(caches[2].get('item2')) + + TestCacheFactory.clearAll() + + assert.isUndefined(caches[0].get('item')) + assert.isUndefined(caches[1].get('item')) + assert.isUndefined(caches[2].get('item')) + assert.isUndefined(caches[0].get('item2')) + assert.isUndefined(caches[1].get('item2')) + assert.isUndefined(caches[2].get('item2')) + assert.equal(caches[0].info().size, 0) + assert.equal(caches[1].info().size, 0) + assert.equal(caches[2].info().size, 0) + }) +}) diff --git a/test/unit/DSCacheFactory/index.destroyAll.test.js b/test/unit/DSCacheFactory/index.destroyAll.test.js index a5529c0..9cf1a5c 100644 --- a/test/unit/DSCacheFactory/index.destroyAll.test.js +++ b/test/unit/DSCacheFactory/index.destroyAll.test.js @@ -1,37 +1,43 @@ +/* global fail, sinon, TestCacheFactory */ describe('CacheFactory.destroyAll()', function () { it('should call "destroy()" on all caches currently owned by the factory.', function (done) { - var cacheKeys = ['CacheFactory.destroyAll.cache', 'CacheFactory.destroyAll.cache1', 'CacheFactory.destroyAll.cache2'], - caches = []; + var cacheKeys = ['CacheFactory.destroyAll.cache', 'CacheFactory.destroyAll.cache1', 'CacheFactory.destroyAll.cache2'] + var caches = [] - caches.push(TestCacheFactory(cacheKeys[0])); - caches.push(TestCacheFactory(cacheKeys[1])); - caches.push(TestCacheFactory(cacheKeys[2])); + caches.push(TestCacheFactory.createCache(cacheKeys[0])) + caches.push(TestCacheFactory.createCache(cacheKeys[1])) + caches.push(TestCacheFactory.createCache(cacheKeys[2])) - sinon.spy(caches[0], 'destroy'); - sinon.spy(caches[1], 'destroy'); - sinon.spy(caches[2], 'destroy'); - TestCacheFactory.destroyAll(); + sinon.spy(caches[0], 'destroy') + sinon.spy(caches[1], 'destroy') + sinon.spy(caches[2], 'destroy') + TestCacheFactory.destroyAll() - assert.equal(caches[0].destroy.callCount, 1); - assert.equal(caches[1].destroy.callCount, 1); - assert.equal(caches[2].destroy.callCount, 1); + assert.equal(caches[0].destroy.callCount, 1) + assert.equal(caches[1].destroy.callCount, 1) + assert.equal(caches[2].destroy.callCount, 1) - done(); - }); + done() + }) it('should result in all caches being removed from CacheFactory.', function (done) { - var cacheKeys = ['CacheFactory.destroyAll.cache', 'CacheFactory.destroyAll.cache1', 'CacheFactory.destroyAll.cache2'], - caches = []; - - caches.push(TestCacheFactory(cacheKeys[0])); - caches.push(TestCacheFactory(cacheKeys[1])); - caches.push(TestCacheFactory(cacheKeys[2])); - - TestCacheFactory.destroyAll(); - - assert.isUndefined(TestCacheFactory.get(cacheKeys[0])); - assert.isUndefined(TestCacheFactory.get(cacheKeys[1])); - assert.isUndefined(TestCacheFactory.get(cacheKeys[2])); - - done(); - }); -}); + var cacheKeys = ['CacheFactory.destroyAll.cache', 'CacheFactory.destroyAll.cache1', 'CacheFactory.destroyAll.cache2'] + var caches = [] + var i + for (i = 0; i < cacheKeys.length; i++) { + caches.push(TestCacheFactory.createCache(cacheKeys[i])) + } + + TestCacheFactory.destroyAll() + for (i = 0; i < cacheKeys.length; i++) { + try { + TestCacheFactory.get(cacheKeys[i]) + fail('should not reach this!') + } catch (err) { + assert.equal(err.message, 'Cache "' + cacheKeys[i] + '" does not exist!') + continue + } + fail('should not reach this!') + } + done() + }) +}) diff --git a/test/unit/DSCacheFactory/index.disableAll.test.js b/test/unit/DSCacheFactory/index.disableAll.test.js index 9cd1876..6a1ea74 100644 --- a/test/unit/DSCacheFactory/index.disableAll.test.js +++ b/test/unit/DSCacheFactory/index.disableAll.test.js @@ -1,21 +1,22 @@ +/* global TestCacheFactory */ describe('CacheFactory.disableAll()', function () { it('should disable all caches in CacheFactory.', function (done) { - var cacheKeys = ['CacheFactory.disableAll.cache', 'CacheFactory.disableAll.cache1', 'CacheFactory.disableAll.cache2']; + var cacheKeys = ['CacheFactory.disableAll.cache', 'CacheFactory.disableAll.cache1', 'CacheFactory.disableAll.cache2'] - TestCacheFactory(cacheKeys[0]); - TestCacheFactory(cacheKeys[1], { disabled: true }); - TestCacheFactory(cacheKeys[2]); + TestCacheFactory.createCache(cacheKeys[0]) + TestCacheFactory.createCache(cacheKeys[1], { enabled: false }) + TestCacheFactory.createCache(cacheKeys[2]) - assert.equal(TestCacheFactory.get(cacheKeys[0]).info().disabled, false); - assert.equal(TestCacheFactory.get(cacheKeys[1]).info().disabled, true); - assert.equal(TestCacheFactory.get(cacheKeys[2]).info().disabled, false); + assert.equal(TestCacheFactory.get(cacheKeys[0]).info().enabled, true) + assert.equal(TestCacheFactory.get(cacheKeys[1]).info().enabled, false) + assert.equal(TestCacheFactory.get(cacheKeys[2]).info().enabled, true) - TestCacheFactory.disableAll(); + TestCacheFactory.disableAll() - assert.equal(TestCacheFactory.get(cacheKeys[0]).info().disabled, true); - assert.equal(TestCacheFactory.get(cacheKeys[1]).info().disabled, true); - assert.equal(TestCacheFactory.get(cacheKeys[2]).info().disabled, true); + assert.equal(TestCacheFactory.get(cacheKeys[0]).info().enabled, false) + assert.equal(TestCacheFactory.get(cacheKeys[1]).info().enabled, false) + assert.equal(TestCacheFactory.get(cacheKeys[2]).info().enabled, false) - done(); - }); -}); + done() + }) +}) diff --git a/test/unit/DSCacheFactory/index.enableAll.test.js b/test/unit/DSCacheFactory/index.enableAll.test.js index 9f5baa2..fc4387a 100644 --- a/test/unit/DSCacheFactory/index.enableAll.test.js +++ b/test/unit/DSCacheFactory/index.enableAll.test.js @@ -1,21 +1,22 @@ +/* global TestCacheFactory */ describe('CacheFactory.enableAll()', function () { it('should enable all caches in CacheFactory.', function (done) { - var cacheKeys = ['CacheFactory.enableAll.cache', 'CacheFactory.enableAll.cache1', 'CacheFactory.enableAll.cache2']; + var cacheKeys = ['CacheFactory.enableAll.cache', 'CacheFactory.enableAll.cache1', 'CacheFactory.enableAll.cache2'] - TestCacheFactory(cacheKeys[0], { disabled: true }); - TestCacheFactory(cacheKeys[1]); - TestCacheFactory(cacheKeys[2], { disabled: true }); + TestCacheFactory.createCache(cacheKeys[0], { enabled: false }) + TestCacheFactory.createCache(cacheKeys[1]) + TestCacheFactory.createCache(cacheKeys[2], { enabled: false }) - assert.equal(TestCacheFactory.get(cacheKeys[0]).info().disabled, true); - assert.equal(TestCacheFactory.get(cacheKeys[1]).info().disabled, false); - assert.equal(TestCacheFactory.get(cacheKeys[2]).info().disabled, true); + assert.equal(TestCacheFactory.get(cacheKeys[0]).info().enabled, false) + assert.equal(TestCacheFactory.get(cacheKeys[1]).info().enabled, true) + assert.equal(TestCacheFactory.get(cacheKeys[2]).info().enabled, false) - TestCacheFactory.enableAll(); + TestCacheFactory.enableAll() - assert.equal(TestCacheFactory.get(cacheKeys[0]).info().disabled, false); - assert.equal(TestCacheFactory.get(cacheKeys[1]).info().disabled, false); - assert.equal(TestCacheFactory.get(cacheKeys[2]).info().disabled, false); + assert.equal(TestCacheFactory.get(cacheKeys[0]).info().enabled, true) + assert.equal(TestCacheFactory.get(cacheKeys[1]).info().enabled, true) + assert.equal(TestCacheFactory.get(cacheKeys[2]).info().enabled, true) - done(); - }); -}); + done() + }) +}) diff --git a/test/unit/DSCacheFactory/index.get.test.js b/test/unit/DSCacheFactory/index.get.test.js index b0239d8..bcb35b7 100644 --- a/test/unit/DSCacheFactory/index.get.test.js +++ b/test/unit/DSCacheFactory/index.get.test.js @@ -1,15 +1,21 @@ +/* global fail, TestCacheFactory */ describe('CacheFactory.get(cacheId)', function () { - it('should return "undefined" if the cache does not exist.', function (done) { - assert.isUndefined(TestCacheFactory.get('someNonExistentCache')); - done(); - }); + it('should throw if the cache does not exist.', function () { + try { + TestCacheFactory.get('someNonExistentCache') + fail('should not reach this!') + } catch (err) { + var msg = err.message + } + assert.equal(msg, 'Cache "someNonExistentCache" does not exist!') + }) it('should return the correct cache with the specified cacheId.', function (done) { - var cache = TestCacheFactory('CacheFactory.get.cache'), - cache2 = TestCacheFactory('CacheFactory.get.cache2'); - assert.equal(TestCacheFactory.get('CacheFactory.get.cache'), cache); - assert.equal(TestCacheFactory.get('CacheFactory.get.cache2'), cache2); - assert.notEqual(cache, cache2); + var cache = TestCacheFactory.createCache('CacheFactory.get.cache') + var cache2 = TestCacheFactory.createCache('CacheFactory.get.cache2') + assert.equal(TestCacheFactory.get('CacheFactory.get.cache'), cache) + assert.equal(TestCacheFactory.get('CacheFactory.get.cache2'), cache2) + assert.notEqual(cache, cache2) - done(); - }); -}); + done() + }) +}) diff --git a/test/unit/DSCacheFactory/index.info.test.js b/test/unit/DSCacheFactory/index.info.test.js index 6ac2772..9c0a2db 100644 --- a/test/unit/DSCacheFactory/index.info.test.js +++ b/test/unit/DSCacheFactory/index.info.test.js @@ -1,46 +1,47 @@ +/* global TestCacheFactory, CACHE_DEFAULTS */ describe('CacheFactory.info()', function () { it('should return the correct info for CacheFactory.', function (done) { var options = { - capacity: Math.floor((Math.random() * 100000) + 1), - maxAge: Math.floor((Math.random() * 100000) + 1), - cacheFlushInterval: Math.floor((Math.random() * 100000) + 1) - }, - caches = []; + capacity: Math.floor((Math.random() * 100000) + 1), + maxAge: Math.floor((Math.random() * 100000) + 1), + cacheFlushInterval: Math.floor((Math.random() * 100000) + 1) + } + var caches = [] - caches.push(TestCacheFactory('cache')); - caches.push(TestCacheFactory('cache2', { + caches.push(TestCacheFactory.createCache('cache')) + caches.push(TestCacheFactory.createCache('cache2', { maxAge: options.maxAge - })); - caches.push(TestCacheFactory('cache3', { + })) + caches.push(TestCacheFactory.createCache('cache3', { capacity: options.capacity, cacheFlushInterval: options.cacheFlushInterval - })); - var info = TestCacheFactory.info(); - assert.equal(info.size, 3); + })) + var info = TestCacheFactory.info() + assert.equal(info.size, 3) - assert.equal(info.capacity, CACHE_DEFAULTS.capacity); - assert.equal(info.maxAge, CACHE_DEFAULTS.maxAge); - assert.equal(info.cacheFlushInterval, CACHE_DEFAULTS.cacheFlushInterval); - assert.equal(info.deleteOnExpire, CACHE_DEFAULTS.deleteOnExpire); - assert.equal(info.onExpire, CACHE_DEFAULTS.onExpire); - assert.equal(info.recycleFreq, CACHE_DEFAULTS.recycleFreq); - assert.equal(info.storageMode, CACHE_DEFAULTS.storageMode); - assert.equal(info.storageImpl, CACHE_DEFAULTS.storageImpl); + assert.equal(info.capacity, CACHE_DEFAULTS.capacity) + assert.equal(info.maxAge, CACHE_DEFAULTS.maxAge) + assert.equal(info.cacheFlushInterval, CACHE_DEFAULTS.cacheFlushInterval) + assert.equal(info.deleteOnExpire, CACHE_DEFAULTS.deleteOnExpire) + assert.equal(info.onExpire, CACHE_DEFAULTS.onExpire) + assert.equal(info.recycleFreq, CACHE_DEFAULTS.recycleFreq) + assert.equal(info.storageMode, CACHE_DEFAULTS.storageMode) + assert.equal(info.storageImpl, CACHE_DEFAULTS.storageImpl) - assert.equal(info.caches.cache.id, caches[0].info().id); - assert.equal(info.caches.cache.capacity, caches[0].info().capacity); - assert.equal(info.caches.cache.size, caches[0].info().size); + assert.equal(info.caches.cache.id, caches[0].info().id) + assert.equal(info.caches.cache.capacity, caches[0].info().capacity) + assert.equal(info.caches.cache.size, caches[0].info().size) - assert.equal(info.caches.cache2.id, caches[1].info().id); - assert.equal(info.caches.cache2.capacity, caches[1].info().capacity); - assert.equal(info.caches.cache2.size, caches[1].info().size); - assert.equal(info.caches.cache2.maxAge, caches[1].info().maxAge); + assert.equal(info.caches.cache2.id, caches[1].info().id) + assert.equal(info.caches.cache2.capacity, caches[1].info().capacity) + assert.equal(info.caches.cache2.size, caches[1].info().size) + assert.equal(info.caches.cache2.maxAge, caches[1].info().maxAge) - assert.equal(info.caches.cache3.id, caches[2].info().id); - assert.equal(info.caches.cache3.capacity, caches[2].info().capacity); - assert.equal(info.caches.cache3.size, caches[2].info().size); - assert.equal(info.caches.cache3.cacheFlushInterval, caches[2].info().cacheFlushInterval); + assert.equal(info.caches.cache3.id, caches[2].info().id) + assert.equal(info.caches.cache3.capacity, caches[2].info().capacity) + assert.equal(info.caches.cache3.size, caches[2].info().size) + assert.equal(info.caches.cache3.cacheFlushInterval, caches[2].info().cacheFlushInterval) - done(); - }); -}); + done() + }) +}) diff --git a/test/unit/DSCacheFactory/index.keySet.test.js b/test/unit/DSCacheFactory/index.keySet.test.js index f5b7715..bc5bd68 100644 --- a/test/unit/DSCacheFactory/index.keySet.test.js +++ b/test/unit/DSCacheFactory/index.keySet.test.js @@ -1,50 +1,51 @@ +/* global TestCacheFactory */ describe('CacheFactory.keySet()', function () { it('should return the set of keys of all caches in CacheFactory.', function (done) { - var cacheKeys = ['CacheFactory.keySet.cache', 'CacheFactory.keySet.cache1', 'CacheFactory.keySet.cache2']; - - TestCacheFactory(cacheKeys[0]); - TestCacheFactory(cacheKeys[1]); - TestCacheFactory(cacheKeys[2]); - - var keySet = TestCacheFactory.keySet(); - - assert.equal(keySet.hasOwnProperty(cacheKeys[0]), true); - assert.equal(keySet.hasOwnProperty(cacheKeys[1]), true); - assert.equal(keySet.hasOwnProperty(cacheKeys[2]), true); - - assert.equal(keySet[cacheKeys[0]], cacheKeys[0]); - assert.equal(keySet[cacheKeys[1]], cacheKeys[1]); - assert.equal(keySet[cacheKeys[2]], cacheKeys[2]); - - TestCacheFactory.get(cacheKeys[0]).destroy(); - keySet = TestCacheFactory.keySet(); - assert.equal(keySet.hasOwnProperty(cacheKeys[0]), false); - assert.equal(keySet.hasOwnProperty(cacheKeys[1]), true); - assert.equal(keySet.hasOwnProperty(cacheKeys[2]), true); - assert.isUndefined(keySet[cacheKeys[0]]); - assert.equal(keySet[cacheKeys[1]], cacheKeys[1]); - assert.equal(keySet[cacheKeys[2]], cacheKeys[2]); - - TestCacheFactory.get(cacheKeys[1]).destroy(); - keySet = TestCacheFactory.keySet(); - assert.equal(keySet.hasOwnProperty(cacheKeys[0]), false); - assert.equal(keySet.hasOwnProperty(cacheKeys[1]), false); - assert.equal(keySet.hasOwnProperty(cacheKeys[2]), true); - assert.isUndefined(keySet[cacheKeys[0]]); - assert.isUndefined(keySet[cacheKeys[1]]); - assert.equal(keySet[cacheKeys[2]], cacheKeys[2]); - - TestCacheFactory.get(cacheKeys[2]).destroy(); - - keySet = TestCacheFactory.keySet(); - - assert.equal(keySet.hasOwnProperty(cacheKeys[0]), false); - assert.equal(keySet.hasOwnProperty(cacheKeys[1]), false); - assert.equal(keySet.hasOwnProperty(cacheKeys[2]), false); - assert.isUndefined(keySet[cacheKeys[0]]); - assert.isUndefined(keySet[cacheKeys[1]]); - assert.isUndefined(keySet[cacheKeys[2]]); - - done(); - }); -}); + var cacheKeys = ['CacheFactory.keySet.cache', 'CacheFactory.keySet.cache1', 'CacheFactory.keySet.cache2'] + + TestCacheFactory.createCache(cacheKeys[0]) + TestCacheFactory.createCache(cacheKeys[1]) + TestCacheFactory.createCache(cacheKeys[2]) + + var keySet = TestCacheFactory.keySet() + + assert.equal(keySet.hasOwnProperty(cacheKeys[0]), true) + assert.equal(keySet.hasOwnProperty(cacheKeys[1]), true) + assert.equal(keySet.hasOwnProperty(cacheKeys[2]), true) + + assert.equal(keySet[cacheKeys[0]], cacheKeys[0]) + assert.equal(keySet[cacheKeys[1]], cacheKeys[1]) + assert.equal(keySet[cacheKeys[2]], cacheKeys[2]) + + TestCacheFactory.get(cacheKeys[0]).destroy() + keySet = TestCacheFactory.keySet() + assert.equal(keySet.hasOwnProperty(cacheKeys[0]), false) + assert.equal(keySet.hasOwnProperty(cacheKeys[1]), true) + assert.equal(keySet.hasOwnProperty(cacheKeys[2]), true) + assert.isUndefined(keySet[cacheKeys[0]]) + assert.equal(keySet[cacheKeys[1]], cacheKeys[1]) + assert.equal(keySet[cacheKeys[2]], cacheKeys[2]) + + TestCacheFactory.get(cacheKeys[1]).destroy() + keySet = TestCacheFactory.keySet() + assert.equal(keySet.hasOwnProperty(cacheKeys[0]), false) + assert.equal(keySet.hasOwnProperty(cacheKeys[1]), false) + assert.equal(keySet.hasOwnProperty(cacheKeys[2]), true) + assert.isUndefined(keySet[cacheKeys[0]]) + assert.isUndefined(keySet[cacheKeys[1]]) + assert.equal(keySet[cacheKeys[2]], cacheKeys[2]) + + TestCacheFactory.get(cacheKeys[2]).destroy() + + keySet = TestCacheFactory.keySet() + + assert.equal(keySet.hasOwnProperty(cacheKeys[0]), false) + assert.equal(keySet.hasOwnProperty(cacheKeys[1]), false) + assert.equal(keySet.hasOwnProperty(cacheKeys[2]), false) + assert.isUndefined(keySet[cacheKeys[0]]) + assert.isUndefined(keySet[cacheKeys[1]]) + assert.isUndefined(keySet[cacheKeys[2]]) + + done() + }) +}) diff --git a/test/unit/DSCacheFactory/index.keys.test.js b/test/unit/DSCacheFactory/index.keys.test.js index 18974f4..ea2e02d 100644 --- a/test/unit/DSCacheFactory/index.keys.test.js +++ b/test/unit/DSCacheFactory/index.keys.test.js @@ -1,34 +1,35 @@ +/* global TestCacheFactory */ describe('CacheFactory.keys()', function () { it('should return the array of keys of all caches in CacheFactory.', function (done) { - var cacheKeys = ['cache', 'cache1', 'cache2']; + var cacheKeys = ['cache', 'cache1', 'cache2'] - TestCacheFactory(cacheKeys[0]); - TestCacheFactory(cacheKeys[1]); - TestCacheFactory(cacheKeys[2]); + TestCacheFactory.createCache(cacheKeys[0]) + TestCacheFactory.createCache(cacheKeys[1]) + TestCacheFactory.createCache(cacheKeys[2]) - var keys = TestCacheFactory.keys(); - assert.equal(keys.length, 3); - assert.equal(keys[0], cacheKeys[0]); - assert.equal(keys[1], cacheKeys[1]); - assert.equal(keys[2], cacheKeys[2]); + var keys = TestCacheFactory.keys() + assert.equal(keys.length, 3) + assert.equal(keys[0], cacheKeys[0]) + assert.equal(keys[1], cacheKeys[1]) + assert.equal(keys[2], cacheKeys[2]) - TestCacheFactory.get(cacheKeys[0]).destroy(); - keys = TestCacheFactory.keys(); - assert.equal(keys.length, 2); - assert.notEqual(keys.indexOf(cacheKeys[1]), -1); - assert.notEqual(keys.indexOf(cacheKeys[2]), -1); + TestCacheFactory.get(cacheKeys[0]).destroy() + keys = TestCacheFactory.keys() + assert.equal(keys.length, 2) + assert.notEqual(keys.indexOf(cacheKeys[1]), -1) + assert.notEqual(keys.indexOf(cacheKeys[2]), -1) - TestCacheFactory.get(cacheKeys[1]).destroy(); - keys = TestCacheFactory.keys(); - assert.equal(keys.length, 1); - assert.notEqual(keys.indexOf(cacheKeys[2]), -1); + TestCacheFactory.get(cacheKeys[1]).destroy() + keys = TestCacheFactory.keys() + assert.equal(keys.length, 1) + assert.notEqual(keys.indexOf(cacheKeys[2]), -1) - TestCacheFactory.get(cacheKeys[2]).destroy(); + TestCacheFactory.get(cacheKeys[2]).destroy() - keys = TestCacheFactory.keys(); + keys = TestCacheFactory.keys() - assert.equal(keys.length, 0); + assert.equal(keys.length, 0) - done(); - }); -}); + done() + }) +}) diff --git a/test/unit/DSCacheFactory/index.test.js b/test/unit/DSCacheFactory/index.test.js index 2eabe26..e80f81a 100644 --- a/test/unit/DSCacheFactory/index.test.js +++ b/test/unit/DSCacheFactory/index.test.js @@ -1,36 +1,37 @@ +/* global fail, $httpBackend, $resource, TestCacheFactory, CACHE_DEFAULTS, TYPES_EXCEPT_STRING, TYPES_EXCEPT_OBJECT, TYPES_EXCEPT_NUMBER, TYPES_EXCEPT_FUNCTION */ + describe('CacheFactory(cacheId, options)', function () { it('should be able to create a default cache.', function () { - var cache = TestCacheFactory('CacheFactory.cache'); - assert.isDefined(cache); - assert.equal(cache.info().id, 'CacheFactory.cache'); - assert.equal(cache.info().capacity, CACHE_DEFAULTS.capacity); - assert.equal(cache.info().maxAge, CACHE_DEFAULTS.maxAge); - assert.equal(cache.info().cacheFlushInterval, CACHE_DEFAULTS.cacheFlushInterval); - assert.equal(cache.info().deleteOnExpire, CACHE_DEFAULTS.deleteOnExpire); - assert.equal(cache.info().onExpire, CACHE_DEFAULTS.onExpire); - assert.equal(cache.info().recycleFreq, CACHE_DEFAULTS.recycleFreq); - assert.equal(cache.info().storageMode, CACHE_DEFAULTS.storageMode); - assert.equal(cache.info().storageImpl, CACHE_DEFAULTS.storageImpl); - }); + var cache = TestCacheFactory.createCache('CacheFactory.cache') + assert.isDefined(cache) + assert.equal(cache.info().id, 'CacheFactory.cache') + assert.equal(cache.info().capacity, CACHE_DEFAULTS.capacity) + assert.equal(cache.info().maxAge, CACHE_DEFAULTS.maxAge) + assert.equal(cache.info().cacheFlushInterval, CACHE_DEFAULTS.cacheFlushInterval) + assert.equal(cache.info().deleteOnExpire, CACHE_DEFAULTS.deleteOnExpire) + assert.equal(cache.info().onExpire, CACHE_DEFAULTS.onExpire) + assert.equal(cache.info().recycleFreq, CACHE_DEFAULTS.recycleFreq) + assert.equal(cache.info().storageMode, CACHE_DEFAULTS.storageMode) + assert.equal(cache.info().storageImpl, CACHE_DEFAULTS.storageImpl) + }) it('should work with ngResource.', function () { - var cache = TestCacheFactory('CacheFactory.cache'); - cache.put('test', 'value'); - assert.equal(cache.get('test'), 'value'); - var copyCache = angular.copy(cache); - assert.equal(copyCache.get('test'), 'value'); + var cache = TestCacheFactory.createCache('CacheFactory.cache') + cache.put('test', 'value') + assert.equal(cache.get('test'), 'value') $httpBackend.expectGET('/api/card').respond(200, { username: 'test' - }); - var CreditCard = $resource( - '/api/card', - null, - { charge: { method: 'GET', cache: cache } } - ); - var card = new CreditCard(); - card.$charge(); - $httpBackend.flush(); - card.$charge().then(); - }); + }) + var CreditCard = $resource('/api/card', null, { + charge: { + method: 'GET', + cache: cache + } + }) + var card = new CreditCard() + card.$charge() + $httpBackend.flush() + card.$charge().then() + }) it('should be able to create a cache with options.', function () { var options = { capacity: Math.floor((Math.random() * 100000) + 1), @@ -49,251 +50,257 @@ describe('CacheFactory(cacheId, options)', function () { recycleFreq: 2000, onExpire: function () { } - }; - var cache = TestCacheFactory('CacheFactory.cache', options); - assert.isDefined(cache); - assert.equal(cache.info().id, 'CacheFactory.cache'); - assert.equal(cache.info().capacity, options.capacity); - assert.equal(cache.info().maxAge, options.maxAge); - assert.equal(cache.info().cacheFlushInterval, options.cacheFlushInterval); - assert.equal(cache.info().deleteOnExpire, options.deleteOnExpire); - assert.equal(cache.info().storageMode, options.storageMode); - assert.equal(cache.info().storageImpl, options.storageImpl); - assert.equal(cache.info().onExpire, options.onExpire); - }); + } + var cache = TestCacheFactory.createCache('CacheFactory.cache', options) + assert.isDefined(cache) + assert.equal(cache.info().id, 'CacheFactory.cache') + assert.equal(cache.info().capacity, options.capacity) + assert.equal(cache.info().maxAge, options.maxAge) + assert.equal(cache.info().cacheFlushInterval, options.cacheFlushInterval) + assert.equal(cache.info().deleteOnExpire, options.deleteOnExpire) + assert.equal(cache.info().storageMode, options.storageMode) + assert.equal(cache.info().storageImpl, options.storageImpl) + assert.equal(cache.info().onExpire, options.onExpire) + }) it('should not use localStorage if it is not available.', function () { - function setItem() { - throw new Error(); + function setItem () { + throw new Error() } var options = { deleteOnExpire: 'aggressive', storageMode: 'localStorage' - }; - var orig = localStorage.setItem; - localStorage.setItem = setItem; + } + var orig = localStorage.setItem + localStorage.setItem = setItem if (localStorage.setItem === setItem) { - var cache = TestCacheFactory('CacheFactory.cache', options); - assert.isDefined(cache); - assert.equal(cache.info().id, 'CacheFactory.cache'); - assert.equal(cache.info().deleteOnExpire, options.deleteOnExpire); - assert.equal(cache.info().storageMode, 'memory'); - assert.isUndefined(cache.info().storageImpl); - localStorage.setItem = orig; + var cache = TestCacheFactory.createCache('CacheFactory.cache', options) + assert.isDefined(cache) + assert.equal(cache.info().id, 'CacheFactory.cache') + assert.equal(cache.info().deleteOnExpire, options.deleteOnExpire) + assert.equal(cache.info().storageMode, 'memory') + assert.isUndefined(cache.info().storageImpl) + localStorage.setItem = orig } else { - console.log('skipping because Firefox!'); + console.log('skipping because Firefox!') } - }); + }) it('should not use sessionStorage if it is not available.', function () { - function setItem() { - throw new Error(); + function setItem () { + throw new Error() } var options = { deleteOnExpire: 'aggressive', storageMode: 'sessionStorage' - }; - var orig = sessionStorage.setItem; - sessionStorage.setItem = setItem; + } + var orig = sessionStorage.setItem + sessionStorage.setItem = setItem if (sessionStorage.setItem === setItem) { - var cache = TestCacheFactory('CacheFactory.cache', options); - assert.isDefined(cache); - assert.equal(cache.info().id, 'CacheFactory.cache'); - assert.equal(cache.info().deleteOnExpire, options.deleteOnExpire); - assert.equal(cache.info().storageMode, 'memory'); - assert.isUndefined(cache.info().storageImpl); - sessionStorage.setItem = orig; + var cache = TestCacheFactory.createCache('CacheFactory.cache', options) + assert.isDefined(cache) + assert.equal(cache.info().id, 'CacheFactory.cache') + assert.equal(cache.info().deleteOnExpire, options.deleteOnExpire) + assert.equal(cache.info().storageMode, 'memory') + assert.isUndefined(cache.info().storageImpl) + sessionStorage.setItem = orig } else { - console.log('skipping because Firefox!'); + console.log('skipping because Firefox!') } - }); + }) it('should throw an exception if "capacity" is not a number or is less than zero.', function () { - var capacity = Math.floor((Math.random() * 100000) + 1) * -1; + var capacity = Math.floor((Math.random() * 100000) + 1) * -1 try { - TestCacheFactory('capacityCache99', { capacity: capacity }); - fail(); + TestCacheFactory.createCache('capacityCache99', { capacity: capacity }) + fail() } catch (err) { - var msg = err.message; + var msg = err.message } - assert.equal(msg, 'capacity must be greater than zero!'); + assert.equal(msg, '"capacity" must be greater than zero!') for (var i = 0; i < TYPES_EXCEPT_NUMBER.length; i++) { if (TYPES_EXCEPT_NUMBER[i] === null) { - continue; + continue } try { - TestCacheFactory('capacityCache' + i, { capacity: TYPES_EXCEPT_NUMBER[i] }); - fail(); + TestCacheFactory.createCache('capacityCache' + i, { capacity: TYPES_EXCEPT_NUMBER[i] }) + fail() } catch (err) { - assert.equal(err.message, 'capacity must be a number!'); - continue; + assert.equal(err.message, '"capacity" must be a number!') + continue } - fail(); + fail() } - }); + }) it('should validate maxAge.', function () { - var maxAge = Math.floor((Math.random() * 100000) + 1) * -1; + var maxAge = Math.floor((Math.random() * 100000) + 1) * -1 try { - TestCacheFactory('maxAgeCache99', { maxAge: maxAge }); - fail(); + TestCacheFactory.createCache('maxAgeCache99', { maxAge: maxAge }) + fail() } catch (err) { - var msg = err.message; + var msg = err.message } - assert.equal(msg, 'maxAge must be greater than zero!'); + assert.equal(msg, '"maxAge" must be greater than zero!') for (var i = 0; i < TYPES_EXCEPT_NUMBER.length; i++) { try { - TestCacheFactory('maxAgeCache' + i, { maxAge: TYPES_EXCEPT_NUMBER[i] }); + TestCacheFactory.createCache('maxAgeCache' + i, { maxAge: TYPES_EXCEPT_NUMBER[i] }) if (TYPES_EXCEPT_NUMBER[i] !== null) { - fail(TYPES_EXCEPT_NUMBER[i]); + fail(TYPES_EXCEPT_NUMBER[i]) } } catch (err) { - assert.equal(err.message, 'maxAge must be a number!'); - continue; + assert.equal(err.message, '"maxAge" must be a number!') + continue } if (TYPES_EXCEPT_NUMBER[i] !== null) { - fail(TYPES_EXCEPT_NUMBER[i]); + fail(TYPES_EXCEPT_NUMBER[i]) } } - }); + }) it('should validate cacheFlushInterval.', function () { - var cacheFlushInterval = Math.floor((Math.random() * 100000) + 1) * -1; + var cacheFlushInterval = Math.floor((Math.random() * 100000) + 1) * -1 try { - TestCacheFactory('cacheFlushIntervalCache99', { cacheFlushInterval: cacheFlushInterval }); - fail(); + TestCacheFactory.createCache('cacheFlushIntervalCache99', { cacheFlushInterval: cacheFlushInterval }) + fail() } catch (err) { - var msg = err.message; + var msg = err.message } - assert.equal(msg, 'cacheFlushInterval must be greater than zero!'); + assert.equal(msg, '"cacheFlushInterval" must be greater than zero!') for (var i = 0; i < TYPES_EXCEPT_NUMBER.length; i++) { try { - TestCacheFactory('cacheFlushIntervalCache' + i, { cacheFlushInterval: TYPES_EXCEPT_NUMBER[i] }); + TestCacheFactory.createCache('cacheFlushIntervalCache' + i, { cacheFlushInterval: TYPES_EXCEPT_NUMBER[i] }) if (TYPES_EXCEPT_NUMBER[i] !== null) { - fail(); + fail() } } catch (err) { - assert.equal(err.message, 'cacheFlushInterval must be a number!'); - continue; + assert.equal(err.message, '"cacheFlushInterval" must be a number!') + continue } if (TYPES_EXCEPT_NUMBER[i] !== null) { - fail(); + fail() } } - }); + }) it('should validate recycleFreq.', function () { - var recycleFreq = Math.floor((Math.random() * 100000) + 1) * -1; + var recycleFreq = Math.floor((Math.random() * 100000) + 1) * -1 try { - TestCacheFactory('recycleFreqCache99', { recycleFreq: recycleFreq }); - fail(); + TestCacheFactory.createCache('recycleFreqCache99', { recycleFreq: recycleFreq }) + fail() } catch (err) { - var msg = err.message; + var msg = err.message } - assert.equal(msg, 'recycleFreq must be greater than zero!'); + assert.equal(msg, '"recycleFreq" must be greater than zero!') for (var i = 0; i < TYPES_EXCEPT_NUMBER.length; i++) { try { - TestCacheFactory('recycleFreqCache' + i, { recycleFreq: TYPES_EXCEPT_NUMBER[i] }); + TestCacheFactory.createCache('recycleFreqCache' + i, { recycleFreq: TYPES_EXCEPT_NUMBER[i] }) if (TYPES_EXCEPT_NUMBER[i] !== null) { - fail(); + fail() } } catch (err) { - assert.equal(err.message, 'recycleFreq must be a number!'); - continue; + assert.equal(err.message, '"recycleFreq" must be a number!') + continue } if (TYPES_EXCEPT_NUMBER[i] !== null) { - fail(); + fail() } } - }); + }) it('should validate onExpire.', function () { - var onExpire = 234; + var onExpire = 234 try { - TestCacheFactory('onExpireCache99', { onExpire: onExpire }); - assert.equal('should not reach this!', false); + TestCacheFactory.createCache('onExpireCache99', { onExpire: onExpire }) + assert.equal('should not reach this!', false) } catch (err) { - var msg = err.message; + var msg = err.message } - assert.equal(msg, 'onExpire must be a function!'); + assert.equal(msg, '"onExpire" must be a function!') for (var i = 0; i < TYPES_EXCEPT_FUNCTION.length; i++) { try { if (TYPES_EXCEPT_FUNCTION[i]) { - TestCacheFactory('onExpireCache' + i, { onExpire: TYPES_EXCEPT_FUNCTION[i] }); + TestCacheFactory.createCache('onExpireCache' + i, { onExpire: TYPES_EXCEPT_FUNCTION[i] }) } else { - continue; + continue } } catch (err) { - assert.equal(err.message, 'onExpire must be a function!'); - continue; + assert.equal(err.message, '"onExpire" must be a function!') + continue } if (TYPES_EXCEPT_FUNCTION[i] !== null) { - fail(); + fail() } } - }); + }) it('should validate deleteOnExpire.', function () { - var deleteOnExpire = 'fail'; + var deleteOnExpire = 'fail' try { - TestCacheFactory('cache', { deleteOnExpire: deleteOnExpire }); - fail('should not reach this!'); + TestCacheFactory.createCache('cache', { deleteOnExpire: deleteOnExpire }) + fail('should not reach this!') } catch (err) { - var msg = err.message; + var msg = err.message } - assert.equal(msg, 'deleteOnExpire must be "none", "passive" or "aggressive"!'); + assert.equal(msg, '"deleteOnExpire" must be "none", "passive" or "aggressive"!') for (var i = 0; i < TYPES_EXCEPT_STRING.length; i++) { if (TYPES_EXCEPT_STRING[i] === null) { - continue; + continue } try { - TestCacheFactory('deleteOnExpireCache' + i, { deleteOnExpire: TYPES_EXCEPT_STRING[i] }); - fail(TYPES_EXCEPT_STRING[i]); + TestCacheFactory.createCache('deleteOnExpireCache' + i, { deleteOnExpire: TYPES_EXCEPT_STRING[i] }) + fail(TYPES_EXCEPT_STRING[i]) } catch (err) { - assert.equal(err.message, 'deleteOnExpire must be a string!'); - continue; + assert.equal(err.message, '"deleteOnExpire" must be a string!') + continue } - fail(TYPES_EXCEPT_STRING[i]); + fail(TYPES_EXCEPT_STRING[i]) } - }); + }) it('should validate storageMode.', function () { - var storageMode = 'fail'; + var storageMode = 'fail' try { - TestCacheFactory('cache', { storageMode: storageMode }); - assert.equal('should not reach this!', false); + TestCacheFactory.createCache('cache', { storageMode: storageMode }) + assert.equal('should not reach this!', false) } catch (err) { - var msg = err.message; + var msg = err.message } - assert.equal(msg, 'storageMode must be "memory", "localStorage" or "sessionStorage"!'); + assert.equal(msg, '"storageMode" must be "memory", "localStorage", or "sessionStorage"!') for (var i = 0; i < TYPES_EXCEPT_STRING.length; i++) { if (!TYPES_EXCEPT_STRING[i]) { - continue; + continue } try { - TestCacheFactory('storageModeCache' + i, { storageMode: TYPES_EXCEPT_STRING[i] }); - fail(TYPES_EXCEPT_STRING[i]); + TestCacheFactory.createCache('storageModeCache' + i, { storageMode: TYPES_EXCEPT_STRING[i] }) + fail(TYPES_EXCEPT_STRING[i]) } catch (err) { - assert.equal(err.message, 'storageMode must be a string!'); - continue; + assert.equal(err.message, '"storageMode" must be a string!') + continue } - fail(TYPES_EXCEPT_STRING[i]); + fail(TYPES_EXCEPT_STRING[i]) } - }); + }) it('should validate storageImpl.', function () { - var storageImpl = 'fail'; + var storageImpl = 'fail' try { - TestCacheFactory('cache', { storageMode: 'localStorage', storageImpl: storageImpl }); - assert.equal('should not reach this!', false); + TestCacheFactory.createCache('cache', { + storageMode: 'localStorage', + storageImpl: storageImpl + }) + assert.equal('should not reach this!', false) } catch (err) { - var msg = err.message; + var msg = err.message } - assert.equal(msg, 'storageImpl must be an object!'); + assert.equal(msg, '"storageImpl" must be an object!') for (var i = 0; i < TYPES_EXCEPT_OBJECT.length; i++) { try { - TestCacheFactory('storageImplCache' + i, { storageMode: 'localStorage', storageImpl: TYPES_EXCEPT_OBJECT[i] }); + TestCacheFactory.createCache('storageImplCache' + i, { + storageMode: 'localStorage', + storageImpl: TYPES_EXCEPT_OBJECT[i] + }) if (TYPES_EXCEPT_OBJECT[i] !== null && TYPES_EXCEPT_OBJECT[i] !== undefined && TYPES_EXCEPT_OBJECT[i] !== false) { - fail(TYPES_EXCEPT_OBJECT[i]); + fail(TYPES_EXCEPT_OBJECT[i]) } } catch (err) { - assert.equal(err.message, 'storageImpl must be an object!'); - continue; + assert.equal(err.message, '"storageImpl" must be an object!') + continue } if (TYPES_EXCEPT_OBJECT[i] !== null && TYPES_EXCEPT_OBJECT[i] !== undefined && TYPES_EXCEPT_OBJECT[i] !== false) { - fail(TYPES_EXCEPT_OBJECT[i]); + fail(TYPES_EXCEPT_OBJECT[i]) } } try { @@ -302,14 +309,14 @@ describe('CacheFactory(cacheId, options)', function () { }, removeItem: function () { } - }; - TestCacheFactory('storageImplCache-noSetItem', { + } + TestCacheFactory.createCache('storageImplCache-noSetItem', { storageMode: 'localStorage', storageImpl: storageImpl - }); - fail(); + }) + fail() } catch (err) { - assert.equal(err.message, 'storageImpl must implement "setItem(key, value)"!'); + assert.equal(err.message, '"storageImpl" must implement "setItem(key, value)"!') } try { storageImpl = { @@ -317,14 +324,14 @@ describe('CacheFactory(cacheId, options)', function () { }, removeItem: function () { } - }; - TestCacheFactory('storageImplCache-noGetItem', { + } + TestCacheFactory.createCache('storageImplCache-noGetItem', { storageMode: 'localStorage', storageImpl: storageImpl - }); - fail(); + }) + fail() } catch (err) { - assert.equal(err.message, 'storageImpl must implement "getItem(key)"!'); + assert.equal(err.message, '"storageImpl" must implement "getItem(key)"!') } try { storageImpl = { @@ -332,35 +339,35 @@ describe('CacheFactory(cacheId, options)', function () { }, setItem: function () { } - }; - TestCacheFactory('storageImplCache-noRemoveItem', { + } + TestCacheFactory.createCache('storageImplCache-noRemoveItem', { storageMode: 'localStorage', storageImpl: storageImpl - }); - fail(); + }) + fail() } catch (err) { - assert.equal(err.message, 'storageImpl must implement "removeItem(key)"!'); + assert.equal(err.message, '"storageImpl" must implement "removeItem(key)"!') } - }); + }) it('should prevent a cache from being duplicated.', function () { try { - TestCacheFactory('cache'); - TestCacheFactory('cache'); + TestCacheFactory.createCache('cache') + TestCacheFactory.createCache('cache') } catch (err) { - var msg = err.message; + var msg = err.message } - assert.equal(msg, 'cache already exists!'); - }); + assert.equal(msg, 'cache "cache" already exists!') + }) it('should require cacheId to be a string.', function () { for (var i = 0; i < TYPES_EXCEPT_STRING.length; i++) { try { - TestCacheFactory(TYPES_EXCEPT_STRING[i]); - fail(TYPES_EXCEPT_STRING[i]); + TestCacheFactory.createCache(TYPES_EXCEPT_STRING[i]) + fail(TYPES_EXCEPT_STRING[i]) } catch (err) { - assert.equal(err.message, 'cacheId must be a string!'); - continue; + assert.equal(err.message, '"id" must be a string!') + continue } - fail(TYPES_EXCEPT_STRING[i]); + fail(TYPES_EXCEPT_STRING[i]) } - }); -}); + }) +})