bitsnote-assets 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4893785c198c2cbdde746cfef05b08a379e0c381
4
- data.tar.gz: 494caf8418cd9f22a3c7aa0d53e14840b4c4a1b7
3
+ metadata.gz: b9ef4aa3d6eab63f6856156a8d696f38e9da8116
4
+ data.tar.gz: 394474812bce2227f5b6ad3389f8a4a64ee95a32
5
5
  SHA512:
6
- metadata.gz: 200d734fb8e71b688e7bc4dc0f118ca5b3046730f626f05ed1abb59f6683c06c3d1c13197e4d076424eda0e5086e94f97c761f002b2ecba04a8f77cdf2264e8c
7
- data.tar.gz: 4d97419f7881629afe547230f181ab232cb5b4a9fe6bbe64f47696ad6f16e7fc4c26425d8a0e1e213b4b0de93335b86ad78660f0e79c9d8100df044c5eb00128
6
+ metadata.gz: 1ae9453a983c4a42f3dd082846b3759acdf4651d22402c8e019b630e5bd1044cfdc9ae30089d2b7602d607d7c22dac78ceca00927695f1e6c829813a2a39455b
7
+ data.tar.gz: f9f967d5c74e771f8d4723b88c932fdc1cc9054773f3da16529df02358f4ad4fdaeeff81f36d8c9b57b596bf9ec530ff6657b0b70a661bd62d21a91757b7ecd1
@@ -0,0 +1,2466 @@
1
+ /**
2
+ * @author Jason Dobry <jason.dobry@gmail.com>
3
+ * @file angular-cache.js
4
+ * @version 3.1.1 - Homepage <https://github.com/jmdobry/angular-cache>
5
+ * @copyright (c) 2013-2014 Jason Dobry <http://www.pseudobry.com>
6
+ * @license MIT <https://github.com/jmdobry/angular-cache/blob/master/LICENSE>
7
+ *
8
+ * @overview angular-cache is a very useful replacement for Angular's $cacheFactory.
9
+ */
10
+ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
11
+ /**
12
+ * @method bubbleUp
13
+ * @param {array} heap The heap.
14
+ * @param {function} weightFunc The weight function.
15
+ * @param {number} n The index of the element to bubble up.
16
+ */
17
+ function bubbleUp(heap, weightFunc, n) {
18
+ var element = heap[n],
19
+ weight = weightFunc(element);
20
+ // When at 0, an element can not go up any further.
21
+ while (n > 0) {
22
+ // Compute the parent element's index, and fetch it.
23
+ var parentN = Math.floor((n + 1) / 2) - 1,
24
+ parent = heap[parentN];
25
+ // If the parent has a lesser weight, things are in order and we
26
+ // are done.
27
+ if (weight >= weightFunc(parent)) {
28
+ break;
29
+ } else {
30
+ heap[parentN] = element;
31
+ heap[n] = parent;
32
+ n = parentN;
33
+ }
34
+ }
35
+ }
36
+
37
+ /**
38
+ * @method bubbleDown
39
+ * @param {array} heap The heap.
40
+ * @param {function} weightFunc The weight function.
41
+ * @param {number} n The index of the element to sink down.
42
+ */
43
+ function bubbleDown(heap, weightFunc, n) {
44
+ var length = heap.length,
45
+ node = heap[n],
46
+ nodeWeight = weightFunc(node);
47
+
48
+ while (true) {
49
+ var child2N = (n + 1) * 2,
50
+ child1N = child2N - 1;
51
+ var swap = null;
52
+ if (child1N < length) {
53
+ var child1 = heap[child1N],
54
+ child1Weight = weightFunc(child1);
55
+ // If the score is less than our node's, we need to swap.
56
+ if (child1Weight < nodeWeight) {
57
+ swap = child1N;
58
+ }
59
+ }
60
+ // Do the same checks for the other child.
61
+ if (child2N < length) {
62
+ var child2 = heap[child2N],
63
+ child2Weight = weightFunc(child2);
64
+ if (child2Weight < (swap === null ? nodeWeight : weightFunc(heap[child1N]))) {
65
+ swap = child2N;
66
+ }
67
+ }
68
+
69
+ if (swap === null) {
70
+ break;
71
+ } else {
72
+ heap[n] = heap[swap];
73
+ heap[swap] = node;
74
+ n = swap;
75
+ }
76
+ }
77
+ }
78
+
79
+ /**
80
+ * @class DSBinaryHeap
81
+ * @desc DSBinaryHeap implementation of a priority queue.
82
+ * @param {function} weightFunc Function that returns the value that should be used for node value comparison.
83
+ * @example
84
+ * angular.module('app').controller(function (DSBinaryHeap) {
85
+ * var bHeap = new DSBinaryHeap(function (x) {
86
+ * return x.value;
87
+ * });
88
+ * );
89
+ */
90
+ function DSBinaryHeap(weightFunc) {
91
+ if (weightFunc && !angular.isFunction(weightFunc)) {
92
+ throw new Error('DSBinaryHeap(weightFunc): weightFunc: must be a function!');
93
+ }
94
+ weightFunc = weightFunc || function (x) {
95
+ return x;
96
+ };
97
+ this.weightFunc = weightFunc;
98
+ this.heap = [];
99
+ }
100
+
101
+ /**
102
+ * @method DSBinaryHeap.push
103
+ * @desc Push an element into the binary heap.
104
+ * @param {*} node The element to push into the binary heap.
105
+ */
106
+ DSBinaryHeap.prototype.push = function (node) {
107
+ this.heap.push(node);
108
+ bubbleUp(this.heap, this.weightFunc, this.heap.length - 1);
109
+ };
110
+
111
+ /**
112
+ * @method DSBinaryHeap.peek
113
+ * @desc Return, but do not remove, the minimum element in the binary heap.
114
+ * @returns {*}
115
+ */
116
+ DSBinaryHeap.prototype.peek = function () {
117
+ return this.heap[0];
118
+ };
119
+
120
+ /**
121
+ * @method DSBinaryHeap.pop
122
+ * @desc Remove and return the minimum element in the binary heap.
123
+ * @returns {*}
124
+ */
125
+ DSBinaryHeap.prototype.pop = function () {
126
+ var front = this.heap[0],
127
+ end = this.heap.pop();
128
+ if (this.heap.length > 0) {
129
+ this.heap[0] = end;
130
+ bubbleDown(this.heap, this.weightFunc, 0);
131
+ }
132
+ return front;
133
+ };
134
+
135
+ /**
136
+ * @method DSBinaryHeap.remove
137
+ * @desc Remove the first node in the priority queue that satisfies angular.equals comparison with
138
+ * the given node.
139
+ * @param {*} node The node to remove.
140
+ * @returns {*} The removed node.
141
+ */
142
+ DSBinaryHeap.prototype.remove = function (node) {
143
+ var length = this.heap.length;
144
+ for (var i = 0; i < length; i++) {
145
+ if (angular.equals(this.heap[i], node)) {
146
+ var removed = this.heap[i],
147
+ end = this.heap.pop();
148
+ if (i !== length - 1) {
149
+ this.heap[i] = end;
150
+ bubbleUp(this.heap, this.weightFunc, i);
151
+ bubbleDown(this.heap, this.weightFunc, i);
152
+ }
153
+ return removed;
154
+ }
155
+ }
156
+ return null;
157
+ };
158
+
159
+ /**
160
+ * @method DSBinaryHeap.removeAll
161
+ * @desc Remove all nodes from this DSBinaryHeap.
162
+ */
163
+ DSBinaryHeap.prototype.removeAll = function () {
164
+ this.heap = [];
165
+ };
166
+
167
+ /**
168
+ * @method DSBinaryHeap.size
169
+ * @desc Return the size of the priority queue.
170
+ * @returns {number} The size of the priority queue.
171
+ */
172
+ DSBinaryHeap.prototype.size = function () {
173
+ return this.heap.length;
174
+ };
175
+
176
+ /**
177
+ * @desc Provider for the DSBinaryHeap.
178
+ */
179
+ function DSBinaryHeapProvider() {
180
+ this.$get = function () {
181
+ return DSBinaryHeap;
182
+ };
183
+ }
184
+
185
+ module.exports = {
186
+ DSBinaryHeapProvider: DSBinaryHeapProvider,
187
+ DSBinaryHeap: DSBinaryHeap
188
+ };
189
+
190
+ },{}],2:[function(require,module,exports){
191
+ /**
192
+ * @doc method
193
+ * @id DSCache.methods:destroy
194
+ * @name destroy
195
+ * @description
196
+ * Destroy this cache and all of its data.
197
+ *
198
+ * ## Signature:
199
+ * ```js
200
+ * DSCache#destroy()
201
+ * ```
202
+ *
203
+ * ## Example:
204
+ * ```js
205
+ * var someCache = DSCacheFactory.get('someCache');
206
+ *
207
+ * someCache.destroy();
208
+ *
209
+ * DSCacheFactory.get('someCache'); // undefined
210
+ * someCache.put('1', 'apple'); // Error
211
+ * ```
212
+ */
213
+ module.exports = function destroy() {
214
+ clearInterval(this.$$cacheFlushIntervalId);
215
+ clearInterval(this.$$recycleFreqId);
216
+ this.removeAll();
217
+ if (this.$$storage) {
218
+ this.$$storage.removeItem(this.$$prefix + '.keys');
219
+ this.$$storage.removeItem(this.$$prefix);
220
+ }
221
+ this.$$storage = null;
222
+ this.$$data = null;
223
+ this.$$lruHeap = null;
224
+ this.$$expiresHeap = null;
225
+ this.$$prefix = null;
226
+ };
227
+
228
+ },{}],3:[function(require,module,exports){
229
+ var utils = require('../utils');
230
+
231
+ /**
232
+ * @doc method
233
+ * @id DSCache.methods:get
234
+ * @name get
235
+ * @description
236
+ * Retrieve the item with the given key.
237
+ *
238
+ * ## Signature:
239
+ * ```js
240
+ * DSCache#get(key)
241
+ * ```
242
+ *
243
+ * ## Examples:
244
+ * ```js
245
+ * var cache = DSCacheFactory('cache');
246
+ *
247
+ * cache.put('1', 'apple');
248
+ *
249
+ * cache.get('1'); // "apple"
250
+ * cache.get('2'); // undefined
251
+ * ```
252
+ *
253
+ * ```js
254
+ * var options = {
255
+ * deleteOnExpire: 'passive',
256
+ * maxAge: 1000
257
+ * },
258
+ * cache = DSCacheFactory('cache', options);
259
+ *
260
+ * cache.put('1', 'apple');
261
+ *
262
+ * cache.get('1'); // "apple"
263
+ *
264
+ * setTimeout(function () {
265
+ * cache.get('1'); // undefined
266
+ * }, 1500);
267
+ * ```
268
+ *
269
+ * ```js
270
+ * var options = {
271
+ * deleteOnExpire: 'passive',
272
+ * maxAge: 1000
273
+ * },
274
+ * cache = DSCacheFactory('cache', options);
275
+ *
276
+ * cache.put('1', 'apple');
277
+ *
278
+ * cache.get('1', {
279
+ * onExpire: function (key, value) {
280
+ * console.log(key, value);
281
+ * }
282
+ * }); // "apple"
283
+ *
284
+ * setTimeout(function () {
285
+ * cache.get('1'); // undefined
286
+ * // "1" "apple" (printed to console)
287
+ * }, 1500);
288
+ * ```
289
+ *
290
+ * ```js
291
+ * var options = {
292
+ * deleteOnExpire: 'passive',
293
+ * maxAge: 1000,
294
+ * onExpire: function (key, value, done) {
295
+ * console.log('global hit');
296
+ * if (done) {
297
+ * done(key, value);
298
+ * }
299
+ * }
300
+ * },
301
+ * cache = DSCacheFactory('cache', options);
302
+ *
303
+ * cache.put('1', 'apple');
304
+ *
305
+ * cache.get('1', {
306
+ * onExpire: function (key, value) {
307
+ * console.log(key, value);
308
+ * }
309
+ * }); // "apple"
310
+ *
311
+ * setTimeout(function () {
312
+ * cache.get('1'); // undefined
313
+ * // "global hit" (printed to console)
314
+ * // "1" "apple" (printed to console)
315
+ * }, 1500);
316
+ * ```
317
+ *
318
+ * @param {string} key The key of the item to retrieve.
319
+ * @param {object=} options Optional configuration. Properties:
320
+ *
321
+ * - `{function=}` - `onExpire` - Callback to be used if in passive `deleteOnExpire` mode and the requested item has
322
+ * expired. If a global `onExpire` callback exists for this cache, then it will be called with three arguments: `key`,
323
+ * `value`, and `done`, where `done` is the `onExpire` callback passed into the call to `DSCache#get(key[, options])`.
324
+ * (See the last example above.)
325
+ *
326
+ * @returns {*} The item with the given key.
327
+ */
328
+ module.exports = function get(key, options) {
329
+ var _this = this;
330
+
331
+ if (angular.isArray(key)) {
332
+ var keys = key,
333
+ values = [];
334
+
335
+ angular.forEach(keys, function (key) {
336
+ var value = _this.get(key, options);
337
+ if (value !== null && value !== undefined) {
338
+ values.push(value);
339
+ }
340
+ });
341
+
342
+ return values;
343
+ } else {
344
+ key = utils.stringifyNumber(key);
345
+
346
+ if (this.$$disabled) {
347
+ return;
348
+ }
349
+ }
350
+
351
+ options = options || {};
352
+ if (!angular.isString(key)) {
353
+ throw angular.$$minErr('ng')('areq', 'Expected key to be a string! Found: {0}.', typeof key);
354
+ } else if (options && !angular.isObject(options)) {
355
+ throw angular.$$minErr('ng')('areq', 'Expected options to be an object! Found: {0}.', typeof options);
356
+ } else if (options.onExpire && !angular.isFunction(options.onExpire)) {
357
+ throw angular.$$minErr('ng')('areq', 'Expected options.onExpire to be a function! Found: {0}.', typeof options.onExpire);
358
+ }
359
+
360
+ var item;
361
+
362
+ if (this.$$storage) {
363
+ var itemJson = this.$$storage.getItem(this.$$prefix + '.data.' + key);
364
+
365
+ if (itemJson) {
366
+ item = angular.fromJson(itemJson);
367
+ } else {
368
+ return;
369
+ }
370
+ } else {
371
+ if (!(key in this.$$data)) {
372
+ return;
373
+ }
374
+
375
+ item = this.$$data[key];
376
+ }
377
+
378
+ var value = item.value,
379
+ now = new Date().getTime();
380
+
381
+ if (this.$$storage) {
382
+ this.$$lruHeap.remove({
383
+ key: key,
384
+ accessed: item.accessed
385
+ });
386
+ item.accessed = now;
387
+ this.$$lruHeap.push({
388
+ key: key,
389
+ accessed: now
390
+ });
391
+ } else {
392
+ this.$$lruHeap.remove(item);
393
+ item.accessed = now;
394
+ this.$$lruHeap.push(item);
395
+ }
396
+
397
+ if (this.$$deleteOnExpire === 'passive' && 'expires' in item && item.expires < now) {
398
+ this.remove(key);
399
+
400
+ if (this.$$onExpire) {
401
+ this.$$onExpire(key, item.value, options.onExpire);
402
+ } else if (options.onExpire) {
403
+ options.onExpire(key, item.value);
404
+ }
405
+ value = undefined;
406
+ } else if (this.$$storage) {
407
+ this.$$storage.setItem(this.$$prefix + '.data.' + key, angular.toJson(item));
408
+ }
409
+
410
+ return value;
411
+ };
412
+
413
+ },{"../utils":21}],4:[function(require,module,exports){
414
+ var defaults = require('../defaults'),
415
+ DSBinaryHeap = require('../DSBinaryHeap').DSBinaryHeap;
416
+
417
+ /*!
418
+ * Configure the cache to use webStorage.
419
+ */
420
+ function _setStorageMode(storageMode, storageImpl) {
421
+ if (!angular.isString(storageMode)) {
422
+ throw angular.$$minErr('ng')('areq', 'Expected storageMode to be a string! Found: {0}.', typeof storageMode);
423
+ } else if (storageMode !== 'memory' && storageMode !== 'localStorage' && storageMode !== 'sessionStorage') {
424
+ throw angular.$$minErr('ng')('areq', 'Expected storageMode to be "memory", "localStorage" or "sessionStorage"! Found: {0}.', storageMode);
425
+ }
426
+
427
+ this.$$storageMode = storageMode;
428
+
429
+ if (storageImpl) {
430
+ if (!angular.isObject(storageImpl)) {
431
+ throw angular.$$minErr('ng')('areq', 'Expected storageImpl to be an object! Found: {0}.', typeof storageImpl);
432
+ } else if (!('setItem' in storageImpl) || typeof storageImpl.setItem !== 'function') {
433
+ throw angular.$$minErr('ng')('areq', 'Expected storageImpl to implement "setItem(key, value)"! Found: {0}.', typeof storageImpl.setItem);
434
+ } else if (!('getItem' in storageImpl) || typeof storageImpl.getItem !== 'function') {
435
+ throw angular.$$minErr('ng')('areq', 'Expected storageImpl to implement "getItem(key)"! Found: {0}.', typeof storageImpl.getItem);
436
+ } else if (!('removeItem' in storageImpl) || typeof storageImpl.removeItem !== 'function') {
437
+ throw angular.$$minErr('ng')('areq', 'Expected storageImpl to implement "removeItem(key)"! Found: {0}.', typeof storageImpl.removeItem);
438
+ }
439
+ this.$$storage = storageImpl;
440
+ } else if (this.$$storageMode === 'localStorage') {
441
+ try {
442
+ localStorage.setItem('angular-cache', 'angular-cache');
443
+ localStorage.removeItem('angular-cache');
444
+ this.$$storage = localStorage;
445
+ } catch (e) {
446
+ delete this.$$storage;
447
+ this.$$storageMode = 'memory';
448
+ }
449
+ } else if (this.$$storageMode === 'sessionStorage') {
450
+ try {
451
+ sessionStorage.setItem('angular-cache', 'angular-cache');
452
+ sessionStorage.removeItem('angular-cache');
453
+ this.$$storage = sessionStorage;
454
+ } catch (e) {
455
+ delete this.$$storage;
456
+ this.$$storageMode = 'memory';
457
+ }
458
+ }
459
+ }
460
+
461
+ /**
462
+ * @doc method
463
+ * @id DSCache.methods:setOptions
464
+ * @name setOptions
465
+ * @description
466
+ * Configure this cache with the given options. With this method you can configure all of this cache's settings at once.
467
+ *
468
+ * ## Signature:
469
+ * ```js
470
+ * DSCache#setOptions(cacheOptions[, strict])
471
+ * ```
472
+ *
473
+ * ## Example:
474
+ * ```js
475
+ * cache.setOptions({
476
+ * maxAge: 60000,
477
+ * deleteOnExpire: 'aggressive',
478
+ * disabled: false
479
+ * });
480
+ * ```
481
+ *
482
+ * @param {object} cacheOptions New configuration options for the cache. Properties:
483
+ *
484
+ * - `{number=}` - `capacity` - Default: `Number.MAX_VALUE`
485
+ * - `{number=}` - `maxAge` - Default: `null`
486
+ * - `{number=}` - `deleteOnExpire` - Default: `none`
487
+ * - `{function=}` - `onExpire` - Default: `null`
488
+ * - `{number=}` - `cacheFlushInterval` - Default: `null`
489
+ * - `{number=}` - `recycleFreq` - Default: `1000`
490
+ * - `{boolean=}` - `disabled` - Default: `false`
491
+ *
492
+ * @param {boolean=} strict If true then any existing configuration will be reset to the defaults before
493
+ * applying the new options, otherwise only the options specified in the options hash will be altered.
494
+ */
495
+ function _setOptions(cacheOptions, strict) {
496
+ cacheOptions = cacheOptions || {};
497
+ strict = !!strict;
498
+ if (!angular.isObject(cacheOptions)) {
499
+ throw angular.$$minErr('ng')('areq', 'Expected cacheOptions to be an object! Found: {0}.', typeof cacheOptions);
500
+ }
501
+
502
+ if ('disabled' in cacheOptions) {
503
+ this.$$disabled = !!cacheOptions.disabled;
504
+ } else if (strict) {
505
+ delete this.$$disabled;
506
+ }
507
+
508
+ if ('capacity' in cacheOptions) {
509
+ this.setCapacity(cacheOptions.capacity);
510
+ } else if (strict) {
511
+ this.setCapacity(null);
512
+ }
513
+
514
+ if ('deleteOnExpire' in cacheOptions) {
515
+ this.setDeleteOnExpire(cacheOptions.deleteOnExpire);
516
+ } else if (strict) {
517
+ this.setDeleteOnExpire(null);
518
+ }
519
+
520
+ if ('maxAge' in cacheOptions) {
521
+ this.setMaxAge(cacheOptions.maxAge);
522
+ } else if (strict) {
523
+ this.setMaxAge(null);
524
+ }
525
+
526
+ if ('recycleFreq' in cacheOptions) {
527
+ this.setRecycleFreq(cacheOptions.recycleFreq);
528
+ } else if (strict) {
529
+ this.setRecycleFreq(null);
530
+ }
531
+
532
+ if ('cacheFlushInterval' in cacheOptions) {
533
+ this.setCacheFlushInterval(cacheOptions.cacheFlushInterval);
534
+ } else if (strict) {
535
+ this.setCacheFlushInterval(null);
536
+ }
537
+
538
+ if ('onExpire' in cacheOptions) {
539
+ this.setOnExpire(cacheOptions.onExpire);
540
+ } else if (strict) {
541
+ this.setOnExpire(null);
542
+ }
543
+ }
544
+
545
+ /**
546
+ * @doc function
547
+ * @id DSCache
548
+ * @name DSCache
549
+ * @description
550
+ * Instantiated via `DSCacheFactory(cacheId[, options])`.
551
+ *
552
+ * @param {string} cacheId The id of the new cache.
553
+ * @param {object=} options Configuration options.
554
+ */
555
+ function DSCache(cacheId, options) {
556
+
557
+ this.$$data = {};
558
+ this.$$id = cacheId;
559
+ this.$$storage = null;
560
+
561
+ this.$$expiresHeap = new DSBinaryHeap(function (x) {
562
+ return x.expires;
563
+ });
564
+
565
+ this.$$lruHeap = new DSBinaryHeap(function (x) {
566
+ return x.accessed;
567
+ });
568
+
569
+ options = options || {};
570
+
571
+ if ('storageMode' in options) {
572
+ _setStorageMode.apply(this, [options.storageMode, options.storageImpl]);
573
+ }
574
+ if ('storagePrefix' in options) {
575
+ this.$$storagePrefix = options.storagePrefix;
576
+ }
577
+
578
+ this.$$prefix = this.$$storagePrefix + cacheId;
579
+
580
+ // Initialize this cache with the default and given options
581
+ _setOptions.apply(this, [options, true]);
582
+ }
583
+
584
+ for (var key in defaults.defaults) {
585
+ DSCache.prototype['$$' + key] = defaults.defaults[key];
586
+ }
587
+
588
+ /**
589
+ * @doc method
590
+ * @id DSCache.methods:setOptions
591
+ * @name setOptions
592
+ * @methodOf DSCache
593
+ * @description
594
+ * See [DSCache.setOptions](/documentation/api/angular-cache/DSCache.methods:create).
595
+ */
596
+ DSCache.prototype.setOptions = _setOptions;
597
+
598
+ /**
599
+ * @doc method
600
+ * @id DSCache.methods:setCapacity
601
+ * @name setCapacity
602
+ * @methodOf DSCache
603
+ * @description
604
+ * See [DSCache.setCapacity](/documentation/api/angular-cache/DSCache.methods:create).
605
+ */
606
+ DSCache.prototype.setCapacity = require('./setCapacity');
607
+
608
+ /**
609
+ * @doc method
610
+ * @id DSCache.methods:setDeleteOnExpire
611
+ * @name setDeleteOnExpire
612
+ * @methodOf DSCache
613
+ * @description
614
+ * See [DSCache.setDeleteOnExpire](/documentation/api/angular-cache/DSCache.methods:create).
615
+ */
616
+ DSCache.prototype.setDeleteOnExpire = require('./setDeleteOnExpire');
617
+
618
+ /**
619
+ * @doc method
620
+ * @id DSCache.methods:setMaxAge
621
+ * @name setMaxAge
622
+ * @methodOf DSCache
623
+ * @description
624
+ * See [DSCache.setMaxAge](/documentation/api/angular-cache/DSCache.methods:create).
625
+ */
626
+ DSCache.prototype.setMaxAge = require('./setMaxAge');
627
+
628
+ /**
629
+ * @doc method
630
+ * @id DSCache.methods:setRecycleFreq
631
+ * @name setRecycleFreq
632
+ * @methodOf DSCache
633
+ * @description
634
+ * See [DSCache.setRecycleFreq](/documentation/api/angular-cache/DSCache.methods:create).
635
+ */
636
+ DSCache.prototype.setRecycleFreq = require('./setRecycleFreq');
637
+
638
+ /**
639
+ * @doc method
640
+ * @id DSCache.methods:setCacheFlushInterval
641
+ * @name setCacheFlushInterval
642
+ * @methodOf DSCache
643
+ * @description
644
+ * See [DSCache.setCacheFlushInterval](/documentation/api/angular-cache/DSCache.methods:create).
645
+ */
646
+ DSCache.prototype.setCacheFlushInterval = require('./setCacheFlushInterval');
647
+
648
+ /**
649
+ * @doc method
650
+ * @id DSCache.methods:setOnExpire
651
+ * @name setOnExpire
652
+ * @methodOf DSCache
653
+ * @description
654
+ * See [DSCache.setOnExpire](/documentation/api/angular-cache/DSCache.methods:create).
655
+ */
656
+ DSCache.prototype.setOnExpire = require('./setOnExpire');
657
+
658
+ /**
659
+ * @doc method
660
+ * @id DSCache.methods:put
661
+ * @name put
662
+ * @methodOf DSCache
663
+ * @description
664
+ * See [DSCache.put](/documentation/api/angular-cache/DSCache.methods:create).
665
+ */
666
+ DSCache.prototype.put = require('./put');
667
+
668
+ /**
669
+ * @doc method
670
+ * @id DSCache.methods:get
671
+ * @name get
672
+ * @methodOf DSCache
673
+ * @description
674
+ * See [DSCache.get](/documentation/api/angular-cache/DSCache.methods:create).
675
+ */
676
+ DSCache.prototype.get = require('./get');
677
+
678
+ /**
679
+ * @doc method
680
+ * @id DSCache.methods:remove
681
+ * @name remove
682
+ * @methodOf DSCache
683
+ * @description
684
+ * See [DSCache.remove](/documentation/api/angular-cache/DSCache.methods:create).
685
+ */
686
+ DSCache.prototype.remove = require('./remove');
687
+
688
+ /**
689
+ * @doc method
690
+ * @id DSCache.methods:removeAll
691
+ * @name removeAll
692
+ * @methodOf DSCache
693
+ * @description
694
+ * See [DSCache.removeAll](/documentation/api/angular-cache/DSCache.methods:create).
695
+ */
696
+ DSCache.prototype.removeAll = require('./removeAll');
697
+
698
+ /**
699
+ * @doc method
700
+ * @id DSCache.methods:removeExpired
701
+ * @name removeExpired
702
+ * @methodOf DSCache
703
+ * @description
704
+ * See [DSCache.removeExpired](/documentation/api/angular-cache/DSCache.methods:create).
705
+ */
706
+ DSCache.prototype.removeExpired = require('./removeExpired');
707
+
708
+ /**
709
+ * @doc method
710
+ * @id DSCache.methods:destroy
711
+ * @name destroy
712
+ * @methodOf DSCache
713
+ * @description
714
+ * See [DSCache.destroy](/documentation/api/angular-cache/DSCache.methods:create).
715
+ */
716
+ DSCache.prototype.destroy = require('./destroy');
717
+
718
+ /**
719
+ * @doc method
720
+ * @id DSCache.methods:info
721
+ * @name info
722
+ * @methodOf DSCache
723
+ * @description
724
+ * See [DSCache.info](/documentation/api/angular-cache/DSCache.methods:create).
725
+ */
726
+ DSCache.prototype.info = require('./info');
727
+
728
+ /**
729
+ * @doc method
730
+ * @id DSCache.methods:keySet
731
+ * @name keySet
732
+ * @methodOf DSCache
733
+ * @description
734
+ * See [DSCache.keySet](/documentation/api/angular-cache/DSCache.methods:create).
735
+ */
736
+ DSCache.prototype.keySet = require('./keySet');
737
+
738
+ /**
739
+ * @doc method
740
+ * @id DSCache.methods:keys
741
+ * @name keys
742
+ * @methodOf DSCache
743
+ * @description
744
+ * See [DSCache.keys](/documentation/api/angular-cache/DSCache.methods:create).
745
+ */
746
+ DSCache.prototype.keys = require('./keys');
747
+
748
+ /**
749
+ * @doc method
750
+ * @id DSCache.methods:disable
751
+ * @name disable
752
+ * @description
753
+ * Disable this cache. Disabling a cache does not remove any data, it just turns DSCache#get and DSCache#put into noops.
754
+ *
755
+ * ## Signature:
756
+ * ```js
757
+ * DSCache#disable()
758
+ * ```
759
+ *
760
+ * ## Example:
761
+ * ```js
762
+ * var cache = DSCacheFactory.get('cache');
763
+ *
764
+ * cache.put('1', 'apple');
765
+ * cache.get('1'); // "apple"
766
+ * cache.info().size; // 1
767
+ *
768
+ * cache.disable();
769
+ * cache.info().size; // 1
770
+ *
771
+ * cache.get('1'); // undefined
772
+ * cache.put('2', 'banana'); // undefined
773
+ * cache.get('2'); // undefined
774
+ * cache.info().size; // 1
775
+ * ```
776
+ */
777
+ DSCache.prototype.disable = function () {
778
+ this.$$disabled = true;
779
+ };
780
+
781
+ /**
782
+ * @doc method
783
+ * @id DSCache.methods:enable
784
+ * @name enable
785
+ * @description
786
+ * Enable this cache.
787
+ *
788
+ * ## Signature:
789
+ * ```js
790
+ * DSCache#enable()
791
+ * ```
792
+ *
793
+ * ## Example:
794
+ * ```js
795
+ * var options = {
796
+ * disabled: true
797
+ * };
798
+ * var cache = DSCacheFactory.get('cache', options);
799
+ *
800
+ * cache.put('1', 'apple');
801
+ * cache.get('1'); // undefined
802
+ *
803
+ * cache.enable();
804
+ *
805
+ * cache.put('1', 'apple');
806
+ * cache.get('1'); // "apple"
807
+ * ```
808
+ */
809
+ DSCache.prototype.enable = function () {
810
+ delete this.$$disabled;
811
+ };
812
+
813
+ /**
814
+ * @doc method
815
+ * @id DSCache.methods:touch
816
+ * @name touch
817
+ * @description
818
+ * Reset the expiry of a single item or all items in the cache.
819
+ *
820
+ * ## Signature:
821
+ * ```js
822
+ * DSCache#touch(key)
823
+ * ```
824
+ *
825
+ * ## Example:
826
+ * ```js
827
+ * cache.touch('1'); // touch one item
828
+ *
829
+ * cache.touch(); // touch all items
830
+ * ```
831
+ *
832
+ * @param {string=} key The key of the item to touch.
833
+ */
834
+ DSCache.prototype.touch = function (key) {
835
+ if (key) {
836
+ var _this = this;
837
+ var val = this.get(key, {
838
+ onExpire: function (k, v) {
839
+ _this.put(k, v);
840
+ }
841
+ });
842
+ if (val) {
843
+ this.put(key, val);
844
+ }
845
+ } else {
846
+ var keys = this.keys();
847
+ for (var i = 0; i < keys.length; i++) {
848
+ this.touch(keys[i]);
849
+ }
850
+ }
851
+ };
852
+
853
+ module.exports = DSCache;
854
+
855
+ },{"../DSBinaryHeap":1,"../defaults":19,"./destroy":2,"./get":3,"./info":5,"./keySet":6,"./keys":7,"./put":8,"./remove":9,"./removeAll":10,"./removeExpired":11,"./setCacheFlushInterval":12,"./setCapacity":13,"./setDeleteOnExpire":14,"./setMaxAge":15,"./setOnExpire":16,"./setRecycleFreq":17}],5:[function(require,module,exports){
856
+ /**
857
+ * @doc method
858
+ * @id DSCache.methods:info
859
+ * @name info
860
+ * @description
861
+ * Return the status of this cache, or if `key` is provided return the status of the item with that key.
862
+ *
863
+ * ## Signature:
864
+ * ```js
865
+ * DSCache#info([key])
866
+ * ```
867
+ *
868
+ * ## Example:
869
+ * ```js
870
+ * var cache = DSCacheFactory('cache');
871
+ *
872
+ * cache.put('1', 'apple');
873
+ * cache.put('2', 'banana');
874
+ *
875
+ * cache.info(); // {
876
+ * // id: 'cache',
877
+ * // capacity: Number.MAX_VALUE,
878
+ * // maxAge: Number.MAX_VALUE,
879
+ * // deleteOnExpire: 'none',
880
+ * // onExpire: null,
881
+ * // cacheFlushInterval: null,
882
+ * // recycleFreq: 1000,
883
+ * // storageMode: 'memory',
884
+ * // storageImpl: null,
885
+ * // disabled: false,
886
+ * // size: 2
887
+ * // }
888
+ *
889
+ * cache.info('1'); // {
890
+ * // created: 1234567890,
891
+ * // accessed: 1234567890,
892
+ * // expires: Number.MAX_VALUE,
893
+ * // isExpired: false
894
+ * // }
895
+ *
896
+ * cache.info('3'); // undefined
897
+ * ```
898
+ *
899
+ * @param {string=} key The key of the item whose status is to be retrieved.
900
+ * @returns {object} The status of this cache or of the item with the given key.
901
+ */
902
+ module.exports = function info(key) {
903
+ if (key) {
904
+ var item;
905
+ if (this.$$storage) {
906
+ var itemJson = this.$$storage.getItem(this.$$prefix + '.data.' + key);
907
+
908
+ if (itemJson) {
909
+ item = angular.fromJson(itemJson);
910
+ return {
911
+ created: item.created,
912
+ accessed: item.accessed,
913
+ expires: item.expires,
914
+ isExpired: (new Date().getTime() - item.created) > this.$$maxAge
915
+ };
916
+ } else {
917
+ return undefined;
918
+ }
919
+ } else {
920
+ if (key in this.$$data) {
921
+ item = this.$$data[key];
922
+
923
+ return {
924
+ created: item.created,
925
+ accessed: item.accessed,
926
+ expires: item.expires,
927
+ isExpired: (new Date().getTime() - item.created) > this.$$maxAge
928
+ };
929
+ } else {
930
+ return undefined;
931
+ }
932
+ }
933
+ } else {
934
+ return {
935
+ id: this.$$id,
936
+ capacity: this.$$capacity,
937
+ maxAge: this.$$maxAge,
938
+ deleteOnExpire: this.$$deleteOnExpire,
939
+ onExpire: this.$$onExpire,
940
+ cacheFlushInterval: this.$$cacheFlushInterval,
941
+ recycleFreq: this.$$recycleFreq,
942
+ storageMode: this.$$storageMode,
943
+ storageImpl: this.$$storage,
944
+ disabled: this.$$disabled,
945
+ size: this.$$lruHeap && this.$$lruHeap.size() || 0
946
+ };
947
+ }
948
+ };
949
+
950
+ },{}],6:[function(require,module,exports){
951
+ var utils = require('../utils');
952
+
953
+ /**
954
+ * @doc method
955
+ * @id DSCache.methods:keySet
956
+ * @name keySet
957
+ * @description
958
+ * Return an object of the keys in this cache.
959
+ *
960
+ * ## Signature:
961
+ * ```js
962
+ * DSCache#keySet()
963
+ * ```
964
+ *
965
+ * ## Example:
966
+ * ```js
967
+ * var cache = DSCacheFactory('cache');
968
+ *
969
+ * cache.put('1', 'apple');
970
+ * cache.put('2', 'banana');
971
+ *
972
+ * cache.keys(); // { "1": "1", "2": "2" }
973
+ * ```
974
+ *
975
+ * @returns {object} An object of the keys in this cache.
976
+ */
977
+ module.exports = function keySet() {
978
+ if (this.$$storage) {
979
+ var keysJson = this.$$storage.getItem(this.$$prefix + '.keys'),
980
+ kSet = {};
981
+
982
+ if (keysJson) {
983
+ var keys = angular.fromJson(keysJson);
984
+
985
+ for (var i = 0; i < keys.length; i++) {
986
+ kSet[keys[i]] = keys[i];
987
+ }
988
+ }
989
+ return kSet;
990
+ } else {
991
+ return utils.keySet(this.$$data);
992
+ }
993
+ };
994
+
995
+ },{"../utils":21}],7:[function(require,module,exports){
996
+ var utils = require('../utils');
997
+
998
+ /**
999
+ * @doc method
1000
+ * @id DSCache.methods:keys
1001
+ * @name keys
1002
+ * @description
1003
+ * Return an array of the keys in this cache.
1004
+ *
1005
+ * ## Signature:
1006
+ * ```js
1007
+ * DSCache#keys()
1008
+ * ```
1009
+ *
1010
+ * ## Example:
1011
+ * ```js
1012
+ * var cache = DSCacheFactory('cache');
1013
+ *
1014
+ * cache.put('1', 'apple');
1015
+ * cache.put('2', 'banana');
1016
+ *
1017
+ * cache.keys(); // [ "1", "2" ]
1018
+ * ```
1019
+ *
1020
+ * @returns {Array} An array of the keys in this cache.
1021
+ */
1022
+ module.exports = function keys() {
1023
+ if (this.$$storage) {
1024
+ var keysJson = this.$$storage.getItem(this.$$prefix + '.keys');
1025
+
1026
+ if (keysJson) {
1027
+ return angular.fromJson(keysJson);
1028
+ } else {
1029
+ return [];
1030
+ }
1031
+ } else {
1032
+ return utils.keys(this.$$data);
1033
+ }
1034
+ };
1035
+
1036
+ },{"../utils":21}],8:[function(require,module,exports){
1037
+ var utils = require('../utils');
1038
+
1039
+ /**
1040
+ * @doc method
1041
+ * @id DSCache.methods:put
1042
+ * @name put
1043
+ * @description
1044
+ * Insert a value into the cache under the given key.
1045
+ *
1046
+ * ## Signature:
1047
+ * ```js
1048
+ * DSCache#put(key, value)
1049
+ * ```
1050
+ *
1051
+ * ## Example:
1052
+ * ```js
1053
+ * var cache = DSCacheFactory('cache');
1054
+ *
1055
+ * cache.put('1', 'apple');
1056
+ * cache.put('2', 3);
1057
+ * cache.put('3', { stuff: 'more stuff' });
1058
+ *
1059
+ * cache.get('1'); // "apple"
1060
+ * cache.get('2'); // 3
1061
+ * cache.get('3'); // { stuff: 'more stuff' }
1062
+ * cache.get('4'); // undefined
1063
+ * ```
1064
+ *
1065
+ * ## Throws:
1066
+ * - `Error` - `key` must be a string.
1067
+ *
1068
+ * @param {string} key The key under which to store the given value.
1069
+ * @param {*} value The value to store.
1070
+ * @returns {*} The newly stored item.
1071
+ */
1072
+ module.exports = function put(key, value) {
1073
+ var _this = this;
1074
+ if (this.$$disabled || value === null || value === undefined) {
1075
+ return;
1076
+ }
1077
+ if (value && value.then) {
1078
+ value.then(function (v) {
1079
+ if (angular.isObject(v) && 'status' in v && 'data' in v) {
1080
+ _this.put(key, [v.status, v.data, v.headers(), v.statusText]);
1081
+ } else {
1082
+ _this.put(key, v);
1083
+ }
1084
+ });
1085
+ return;
1086
+ }
1087
+ key = utils.stringifyNumber(key);
1088
+
1089
+ if (!angular.isString(key)) {
1090
+ throw angular.$$minErr('ng')('areq', 'Expected key to be a string! Found: {0}.', typeof key);
1091
+ }
1092
+
1093
+ var now = new Date().getTime(),
1094
+ item = {
1095
+ key: key,
1096
+ value: value,
1097
+ created: now,
1098
+ accessed: now
1099
+ };
1100
+
1101
+ item.expires = item.created + this.$$maxAge;
1102
+
1103
+ if (this.$$storage) {
1104
+ var keysJson = this.$$storage.getItem(this.$$prefix + '.keys'),
1105
+ keys = keysJson ? angular.fromJson(keysJson) : [],
1106
+ itemJson = this.$$storage.getItem(this.$$prefix + '.data.' + key);
1107
+
1108
+ // Remove existing
1109
+ if (itemJson) {
1110
+ this.remove(key);
1111
+ }
1112
+ // Add to expires heap
1113
+ this.$$expiresHeap.push({
1114
+ key: key,
1115
+ expires: item.expires
1116
+ });
1117
+ // Add to lru heap
1118
+ this.$$lruHeap.push({
1119
+ key: key,
1120
+ accessed: item.accessed
1121
+ });
1122
+ // Set item
1123
+ this.$$storage.setItem(this.$$prefix + '.data.' + key, angular.toJson(item));
1124
+ var exists = false;
1125
+ for (var i = 0; i < keys.length; i++) {
1126
+ if (keys[i] === key) {
1127
+ exists = true;
1128
+ break;
1129
+ }
1130
+ }
1131
+ if (!exists) {
1132
+ keys.push(key);
1133
+ }
1134
+ this.$$storage.setItem(this.$$prefix + '.keys', angular.toJson(keys));
1135
+ } else {
1136
+ // Remove existing
1137
+ if (this.$$data[key]) {
1138
+ this.remove(key);
1139
+ }
1140
+ // Add to expires heap
1141
+ this.$$expiresHeap.push(item);
1142
+ // Add to lru heap
1143
+ this.$$lruHeap.push(item);
1144
+ // Set item
1145
+ this.$$data[key] = item;
1146
+ }
1147
+
1148
+ // Handle exceeded capacity
1149
+ if (this.$$lruHeap.size() > this.$$capacity) {
1150
+ this.remove(this.$$lruHeap.peek().key);
1151
+ }
1152
+
1153
+ return value;
1154
+ };
1155
+
1156
+ },{"../utils":21}],9:[function(require,module,exports){
1157
+ /**
1158
+ * @doc method
1159
+ * @id DSCache.methods:remove
1160
+ * @name remove
1161
+ * @description
1162
+ * Remove the item with the given key.
1163
+ *
1164
+ * ## Signature:
1165
+ * ```js
1166
+ * DSCache#remove(key)
1167
+ * ```
1168
+ *
1169
+ * ## Example:
1170
+ * ```js
1171
+ * var cache = DSCacheFactory('cache');
1172
+ *
1173
+ * cache.put('1', 'apple');
1174
+ *
1175
+ * cache.get('1'); // "apple"
1176
+ *
1177
+ * cache.remove('1'); // "apple"
1178
+ *
1179
+ * cache.get('1'); // undefined
1180
+ * ```
1181
+ *
1182
+ * @param {string} key The key of the item to remove.
1183
+ * @returns {*} The removed item if an item was removed.
1184
+ */
1185
+ module.exports = function remove(key) {
1186
+ if (this.$$storage) {
1187
+ var itemJson = this.$$storage.getItem(this.$$prefix + '.data.' + key);
1188
+
1189
+ if (itemJson) {
1190
+ var item = angular.fromJson(itemJson);
1191
+ this.$$lruHeap.remove({
1192
+ key: key,
1193
+ accessed: item.accessed
1194
+ });
1195
+ this.$$expiresHeap.remove({
1196
+ key: key,
1197
+ expires: item.expires
1198
+ });
1199
+ this.$$storage.removeItem(this.$$prefix + '.data.' + key);
1200
+ var keysJson = this.$$storage.getItem(this.$$prefix + '.keys'),
1201
+ keys = keysJson ? angular.fromJson(keysJson) : [],
1202
+ index = keys.indexOf(key);
1203
+
1204
+ if (index >= 0) {
1205
+ keys.splice(index, 1);
1206
+ }
1207
+ this.$$storage.setItem(this.$$prefix + '.keys', angular.toJson(keys));
1208
+ return item.value;
1209
+ }
1210
+ } else {
1211
+ var value = this.$$data[key] ? this.$$data[key].value : undefined;
1212
+ this.$$lruHeap.remove(this.$$data[key]);
1213
+ this.$$expiresHeap.remove(this.$$data[key]);
1214
+ this.$$data[key] = null;
1215
+ delete this.$$data[key];
1216
+ return value;
1217
+ }
1218
+ };
1219
+
1220
+ },{}],10:[function(require,module,exports){
1221
+ /**
1222
+ * @doc method
1223
+ * @id DSCache.methods:removeAll
1224
+ * @name removeAll
1225
+ * @description
1226
+ * Remove all items from this cache.
1227
+ *
1228
+ * ## Signature:
1229
+ * ```js
1230
+ * DSCache#removeAll()
1231
+ * ```
1232
+ *
1233
+ * ## Example:
1234
+ * ```js
1235
+ * var cache = DSCacheFactory('cache');
1236
+ *
1237
+ * cache.put('1', 'apple');
1238
+ * cache.put('2', 'banana');
1239
+ * cache.info().size; // 2
1240
+ *
1241
+ * cache.get('1'); // "apple"
1242
+ * cache.get('2'); // "banana"
1243
+ *
1244
+ * cache.removeAll();
1245
+ * cache.info().size; // 0
1246
+ *
1247
+ * cache.get('1'); // undefined
1248
+ * cache.get('2'); // undefined
1249
+ * ```
1250
+ */
1251
+ module.exports = function removeAll() {
1252
+ if (this.$$storage) {
1253
+ this.$$lruHeap.removeAll();
1254
+ this.$$expiresHeap.removeAll();
1255
+ var keysJson = this.$$storage.getItem(this.$$prefix + '.keys');
1256
+
1257
+ if (keysJson) {
1258
+ var keys = angular.fromJson(keysJson);
1259
+
1260
+ for (var i = 0; i < keys.length; i++) {
1261
+ this.remove(keys[i]);
1262
+ }
1263
+ }
1264
+ this.$$storage.setItem(this.$$prefix + '.keys', angular.toJson([]));
1265
+ } else {
1266
+ this.$$lruHeap.removeAll();
1267
+ this.$$expiresHeap.removeAll();
1268
+ for (var key in this.$$data) {
1269
+ this.$$data[key] = null;
1270
+ }
1271
+ this.$$data = {};
1272
+ }
1273
+ };
1274
+
1275
+ },{}],11:[function(require,module,exports){
1276
+ /**
1277
+ * @doc method
1278
+ * @id DSCache.methods:removeExpired
1279
+ * @name removeExpired
1280
+ * @description
1281
+ * Remove and return all expired items from the cache.
1282
+ *
1283
+ * ## Signature:
1284
+ * ```js
1285
+ * DSCache#removeExpired()
1286
+ * ```
1287
+ *
1288
+ * ## Example:
1289
+ * ```js
1290
+ * var options = {
1291
+ * maxAge: 1000
1292
+ * },
1293
+ * // deleteOnExpire defaults to "none"
1294
+ * cache = DSCacheFactory('cache', options);
1295
+ *
1296
+ * cache.put('1', 'apple');
1297
+ * cache.put('2', 'banana');
1298
+ *
1299
+ * setTimeout(function () {
1300
+ * cache.put('3', 'orange');
1301
+ *
1302
+ * cache.info().size; // 3
1303
+ * cache.info('1').isExpired; // true
1304
+ * cache.info('2').isExpired; // true
1305
+ * cache.info('3').isExpired; // false
1306
+ *
1307
+ * cache.removeExpired(); // { "1": "apple", "2": "banana" }
1308
+ *
1309
+ * cache.info().size; // 1
1310
+ * cache.get('1'); // undefined
1311
+ * cache.get('2'); // undefined
1312
+ * cache.info('3').isExpired; // false
1313
+ * }, 1500);
1314
+ * ```
1315
+ *
1316
+ * @returns {object} The removed items, if any.
1317
+ */
1318
+ module.exports = function removeExpired() {
1319
+ var now = new Date().getTime(),
1320
+ expired = {},
1321
+ key,
1322
+ expiredItem;
1323
+
1324
+ while ((expiredItem = this.$$expiresHeap.peek()) && expiredItem.expires < now) {
1325
+ expired[expiredItem.key] = expiredItem.value ? expiredItem.value : null;
1326
+ this.$$expiresHeap.pop();
1327
+ }
1328
+
1329
+ if (this.$$storage) {
1330
+ for (key in expired) {
1331
+ var itemJson = this.$$storage.getItem(this.$$prefix + '.data.' + key);
1332
+ if (itemJson) {
1333
+ expired[key] = angular.fromJson(itemJson).value;
1334
+ this.remove(key);
1335
+ }
1336
+ }
1337
+ } else {
1338
+ for (key in expired) {
1339
+ this.remove(key);
1340
+ }
1341
+ }
1342
+
1343
+ if (this.$$onExpire) {
1344
+ for (key in expired) {
1345
+ this.$$onExpire(key, expired[key]);
1346
+ }
1347
+ }
1348
+
1349
+ return expired;
1350
+ };
1351
+
1352
+ },{}],12:[function(require,module,exports){
1353
+ /**
1354
+ * @doc method
1355
+ * @id DSCache.methods:setCacheFlushInterval
1356
+ * @name setCacheFlushInterval
1357
+ * @description
1358
+ * Set the `cacheFlushInterval` setting for this cache. If set, this setting will cause this cache to periodically
1359
+ * clear itself.
1360
+ *
1361
+ * ## Signature:
1362
+ * ```js
1363
+ * DSCache#setCacheFlushInterval(cacheFlushInterval)
1364
+ * ```
1365
+ *
1366
+ * ## Example:
1367
+ * ```js
1368
+ * var cache = DSCacheFactory('cache');
1369
+ *
1370
+ * cache.put('1', 'apple');
1371
+ * cache.put('2', 'banana');
1372
+ *
1373
+ * cache.info().size; // 2
1374
+ * cache.setCacheFlushInterval(60000);
1375
+ *
1376
+ * setTimeout(function () {
1377
+ * cache.info().size; // 0
1378
+ * }, 90000);
1379
+ * ```
1380
+ *
1381
+ * ## Throws:
1382
+ * - `Error` - `cacheFlushInterval` must be `null` or a number greater than zero.
1383
+ *
1384
+ * @param {number|null} cacheFlushInterval The new cacheFlushInterval for this cache in milliseconds. If
1385
+ * `cacheFlushInterval` is `null` then `cacheFlushInterval` for this cache will be reset to the default (`null`).
1386
+ */
1387
+ module.exports = function setCacheFlushInterval(cacheFlushInterval) {
1388
+ if (cacheFlushInterval === null) {
1389
+ delete this.$$cacheFlushInterval;
1390
+ } else if (!angular.isNumber(cacheFlushInterval)) {
1391
+ throw angular.$$minErr('ng')('areq', 'Expected cacheFlushInterval to be a number! Found: {0}.', typeof cacheFlushInterval);
1392
+ } else if (cacheFlushInterval < 0) {
1393
+ throw angular.$$minErr('ng')('areq', 'Expected cacheFlushInterval to be greater than zero! Found: {0}.', cacheFlushInterval);
1394
+ } else if (cacheFlushInterval !== this.$$cacheFlushInterval) {
1395
+ this.$$cacheFlushInterval = cacheFlushInterval;
1396
+ clearInterval(this.$$cacheFlushIntervalId);
1397
+ (function (_this) {
1398
+ _this.$$cacheFlushIntervalId = setInterval(function () {
1399
+ _this.removeAll();
1400
+ }, _this.$$cacheFlushInterval);
1401
+ })(this);
1402
+ }
1403
+ };
1404
+
1405
+ },{}],13:[function(require,module,exports){
1406
+ /**
1407
+ * @doc method
1408
+ * @id DSCache.methods:setCapacity
1409
+ * @name setCapacity
1410
+ * @description
1411
+ * Set the capacity for this cache.
1412
+ *
1413
+ * ## Signature:
1414
+ * ```js
1415
+ * DSCache#setCapacity(capacity)
1416
+ * ```
1417
+ *
1418
+ * ## Example:
1419
+ * ```js
1420
+ * var smallCache = DSCacheFactory('smallCache', { capacity: 2 });
1421
+ *
1422
+ * smallCache.info().size; // 0
1423
+ *
1424
+ * smallCache.put('1', 'apple');
1425
+ * smallCache.put('2', 'banana');
1426
+ *
1427
+ * smallCache.info().size; // 2
1428
+ *
1429
+ * // Least-recently used items are removed
1430
+ * // when the cache's new capacity exceeds
1431
+ * // its size
1432
+ * smallCache.setCapacity(1);
1433
+ *
1434
+ * smallCache.get('1'); // undefined
1435
+ * smallCache.info().size; // 1
1436
+ * ```
1437
+ *
1438
+ * ## Throws:
1439
+ * - `Error` - `capacity` must be `null` or a number greater than zero.
1440
+ *
1441
+ * @param {number|null} capacity The new capacity for this cache. If `capacity` is `null` then the capacity for this cache
1442
+ * will be reset to the default (`Number.MAX_VALUE`).
1443
+ * @returns {object} Key-value pairs of any items removed because this cache's size exceeds the new capacity.
1444
+ */
1445
+ module.exports = function setCapacity(capacity) {
1446
+ if (capacity === null) {
1447
+ delete this.$$capacity;
1448
+ } else if (!angular.isNumber(capacity)) {
1449
+ throw angular.$$minErr('ng')('areq', 'Expected capacity to be a number! Found: {0}.', typeof capacity);
1450
+ } else if (capacity < 0) {
1451
+ throw angular.$$minErr('ng')('areq', 'Expected capacity to be greater than zero! Found: {0}.', capacity);
1452
+ } else {
1453
+ this.$$capacity = capacity;
1454
+ }
1455
+ var removed = {};
1456
+ while (this.$$lruHeap.size() > this.$$capacity) {
1457
+ removed[this.$$lruHeap.peek().key] = this.remove(this.$$lruHeap.peek().key);
1458
+ }
1459
+ return removed;
1460
+ };
1461
+
1462
+ },{}],14:[function(require,module,exports){
1463
+ /**
1464
+ * @doc method
1465
+ * @id DSCache.methods:setDeleteOnExpire
1466
+ * @name setDeleteOnExpire
1467
+ * @description
1468
+ * Set the behavior for this cache for when items expire. This setting determines what this cache will do when one of
1469
+ * its items expires.
1470
+ *
1471
+ * ## Possible Values:
1472
+ * - `"none"` - Do nothing when items expire.
1473
+ * - `"passive"` - Do nothing when items expire, but if an expired item is requested, remove it from the cache and return `undefined`.
1474
+ * - `"aggressive"` - Scan for expired items on the interval specified by the `recycleFreq` setting for this cache (defaults
1475
+ * to `1000ms`) and actively remove any expired items.
1476
+ *
1477
+ * ## Signature:
1478
+ * ```js
1479
+ * DSCache#setDeleteOnExpire(deleteOnExpire)
1480
+ * ```
1481
+ *
1482
+ * ## Example:
1483
+ * ```js
1484
+ * var cache = DSCacheFactory('cache');
1485
+ *
1486
+ * cache.put('1', 'apple');
1487
+ *
1488
+ * // Wait a few seconds
1489
+ *
1490
+ * cache.get('1'); // "apple"
1491
+ *
1492
+ * cache.setDeleteOnExpire('aggressive');
1493
+ *
1494
+ * // Wait a few seconds
1495
+ *
1496
+ * cache.get('1'); // undefined
1497
+ * ```
1498
+ *
1499
+ * ## Throws:
1500
+ * - `Error` - `deleteOnExpire` must be `null`, `"none"`, `"passive"` or `"aggressive"`.
1501
+ *
1502
+ * @param {string|null} deleteOnExpire The new deleteOnExpire for this cache. If `deleteOnExpire` is `null` then
1503
+ * `deleteOnExpire` for this cache will be reset to the default (`"none"`).
1504
+ */
1505
+ module.exports = function setDeleteOnExpire(deleteOnExpire) {
1506
+ if (deleteOnExpire === null) {
1507
+ delete this.$$deleteOnExpire;
1508
+ } else if (!angular.isString(deleteOnExpire)) {
1509
+ throw angular.$$minErr('ng')('areq', 'Expected deleteOnExpire to be a string! Found: {0}.', typeof deleteOnExpire);
1510
+ } else if (deleteOnExpire !== 'none' && deleteOnExpire !== 'passive' && deleteOnExpire !== 'aggressive') {
1511
+ throw angular.$$minErr('ng')('areq', 'Expected deleteOnExpire to be "none", "passive" or "aggressive"! Found: {0}.', deleteOnExpire);
1512
+ } else {
1513
+ this.$$deleteOnExpire = deleteOnExpire;
1514
+ }
1515
+ this.setRecycleFreq(this.$$recycleFreq);
1516
+ };
1517
+
1518
+ },{}],15:[function(require,module,exports){
1519
+ var utils = require('../utils');
1520
+
1521
+ /**
1522
+ * @doc method
1523
+ * @id DSCache.methods:setMaxAge
1524
+ * @name setMaxAge
1525
+ * @description
1526
+ * Set the `maxAge` setting for this cache. This setting specifies how long items can be in the cache before they expire.
1527
+ *
1528
+ * ## Signature:
1529
+ * ```js
1530
+ * DSCache#setMaxAge(maxAge)
1531
+ * ```
1532
+ *
1533
+ * ## Example:
1534
+ * ```js
1535
+ * var cache = DSCacheFactory('cache', { deleteOnExpire: 'aggressive' });
1536
+ *
1537
+ * // This won't expire for a long time
1538
+ * cache.put('1', 'apple');
1539
+ *
1540
+ * setTimeout(function () {
1541
+ * // 'apple' will be removed because it
1542
+ * // has already been in the cache longer
1543
+ * // than the new maxAge
1544
+ * var removed = cache.setMaxAge(1000);
1545
+ *
1546
+ * removed; // {
1547
+ * // '1': 'apple'
1548
+ * // }
1549
+ * }, 1500);
1550
+ * ```
1551
+ *
1552
+ * ## Throws:
1553
+ * - `Error` - `maxAge must be `null` or a number greater than zero.
1554
+ *
1555
+ * @param {number} maxAge The new maxAge for this cache in milliseconds. If `maxAge` is `null` then `maxAge` for this
1556
+ * cache will be reset to the default (`Number.MAX_VALUE`);
1557
+ * @returns {object} Key-value pairs of any items aggressively removed because they are expired according to the new
1558
+ * `maxAge`. Items are only removed if the `deleteOnExpire` setting for this cache is set to `"aggressive"`.
1559
+ */
1560
+ module.exports = function setMaxAge(maxAge) {
1561
+ if (maxAge === null) {
1562
+ delete this.$$maxAge;
1563
+ } else if (!angular.isNumber(maxAge)) {
1564
+ throw angular.$$minErr('ng')('areq', 'Expected maxAge to be a number! Found: {0}.', typeof maxAge);
1565
+ } else if (maxAge < 0) {
1566
+ throw angular.$$minErr('ng')('areq', 'Expected maxAge to be greater than zero! Found: {0}.', maxAge);
1567
+ } else {
1568
+ this.$$maxAge = maxAge;
1569
+ }
1570
+ var i, keys, key;
1571
+
1572
+ this.$$expiresHeap.removeAll();
1573
+
1574
+ if (this.$$storage) {
1575
+ var keysJson = this.$$storage.getItem(this.$$prefix + '.keys');
1576
+
1577
+ keys = keysJson ? angular.fromJson(keysJson) : [];
1578
+
1579
+ for (i = 0; i < keys.length; i++) {
1580
+ key = keys[i];
1581
+ var itemJson = this.$$storage.getItem(this.$$prefix + '.data.' + key);
1582
+
1583
+ if (itemJson) {
1584
+ var item = angular.fromJson(itemJson);
1585
+ if (this.$$maxAge === Number.MAX_VALUE) {
1586
+ item.expires = Number.MAX_VALUE;
1587
+ } else {
1588
+ item.expires = item.created + this.$$maxAge;
1589
+ }
1590
+ this.$$expiresHeap.push({
1591
+ key: key,
1592
+ expires: item.expires
1593
+ });
1594
+ }
1595
+ }
1596
+ } else {
1597
+ keys = utils.keys(this.$$data);
1598
+
1599
+ for (i = 0; i < keys.length; i++) {
1600
+ key = keys[i];
1601
+ if (this.$$maxAge === Number.MAX_VALUE) {
1602
+ this.$$data[key].expires = Number.MAX_VALUE;
1603
+ } else {
1604
+ this.$$data[key].expires = this.$$data[key].created + this.$$maxAge;
1605
+ }
1606
+ this.$$expiresHeap.push(this.$$data[key]);
1607
+ }
1608
+ }
1609
+ if (this.$$deleteOnExpire === 'aggressive') {
1610
+ return this.removeExpired();
1611
+ } else {
1612
+ return {};
1613
+ }
1614
+ };
1615
+
1616
+ },{"../utils":21}],16:[function(require,module,exports){
1617
+ /**
1618
+ * @doc method
1619
+ * @id DSCache.methods:setOnExpire
1620
+ * @name setOnExpire
1621
+ * @description
1622
+ * Set the global `onExpire` callback for this cache.
1623
+ *
1624
+ * ## Signature:
1625
+ * ```js
1626
+ * DSCache#setOnExpire(onExpire)
1627
+ * ```
1628
+ *
1629
+ * ## Examples:
1630
+ * ```js
1631
+ * var options = {
1632
+ * onExpire: function (key, value) {
1633
+ * window.lastExpiredItem = key;
1634
+ * },
1635
+ * maxAge: 1000,
1636
+ * deleteOnExpire: 'aggressive'
1637
+ * };
1638
+ * var cache = DSCacheFactory('cache', options);
1639
+ *
1640
+ * cache.put('1', 'apple');
1641
+ *
1642
+ * setTimeout(function () {
1643
+ * window.lastExpiredItem; // '1'
1644
+ * }, 1500);
1645
+ * ```
1646
+ *
1647
+ * ## Throws:
1648
+ * - `Error` - `cacheFlushInterval` must be `null` or a number greater than zero.
1649
+ *
1650
+ * @param {function|null} onExpire The new onExpire callback for this cache. If `onExpire` is `null` then the onExpire
1651
+ * callback for this cache will be removed.
1652
+ */
1653
+ module.exports = function setOnExpire(onExpire) {
1654
+ if (onExpire === null) {
1655
+ delete this.$$onExpire;
1656
+ } else if (!angular.isFunction(onExpire)) {
1657
+ throw angular.$$minErr('ng')('areq', 'Expected onExpire to be a function! Found: {0}.', typeof onExpire);
1658
+ } else {
1659
+ this.$$onExpire = onExpire;
1660
+ }
1661
+ };
1662
+
1663
+ },{}],17:[function(require,module,exports){
1664
+ /**
1665
+ * @doc method
1666
+ * @id DSCache.methods:setRecycleFreq
1667
+ * @name setRecycleFreq
1668
+ * @description
1669
+ * Set the `recycleFreq` setting for this cache. This setting determines how often this cache will scan for expired
1670
+ * items. The cache will only scan for expired items if the `deleteOnExpire` setting for this cache is set to
1671
+ * `"aggressive"`.
1672
+ *
1673
+ * ## Signature:
1674
+ * ```js
1675
+ * DSCache#setRecycleFreq(recycleFreq)
1676
+ * ```
1677
+ *
1678
+ * ## Example:
1679
+ * ```js
1680
+ * var options = {
1681
+ * deleteOnExpire: 'aggressive',
1682
+ * maxAge: 1000
1683
+ * };
1684
+ * var cache = DSCacheFactory('cache', options);
1685
+ *
1686
+ * cache.put('1', 'apple');
1687
+ *
1688
+ * setTimeout(function () {
1689
+ *
1690
+ * cache.get('1'); // undefined
1691
+ * cache.setRecycleFreq(60000);
1692
+ *
1693
+ * // This expires after 1 second, but the cache
1694
+ * // only checks every 60 seconds now
1695
+ * cache.put('1', 'apple');
1696
+ *
1697
+ * setTimeout(function () {
1698
+ * // expired, but won't be removed
1699
+ * // until the next check
1700
+ * cache.get('1'); // "apple"
1701
+ * cache.info('1').isExpired; // true
1702
+ * }, 1500);
1703
+ * }, 1500);
1704
+ * ```
1705
+ *
1706
+ * ## Throws:
1707
+ * - `Error` - `recycleFreq` must be `null` or a number greater than zero.
1708
+ *
1709
+ * @param {number} recycleFreq The new recycleFreq for this cache in milliseconds. If `recycleFreq` is `null` then
1710
+ * `recycleFreq` for this cache will be reset to the default (`1000` milliseconds).
1711
+ */
1712
+ module.exports = function setRecycleFreq(recycleFreq) {
1713
+ if (recycleFreq === null) {
1714
+ delete this.$$recycleFreq;
1715
+ } else if (!angular.isNumber(recycleFreq)) {
1716
+ throw angular.$$minErr('ng')('areq', 'Expected recycleFreq to be a number! Found: {0}.', typeof recycleFreq);
1717
+ } else if (recycleFreq < 0) {
1718
+ throw angular.$$minErr('ng')('areq', 'Expected recycleFreq to be greater than zero! Found: {0}.', recycleFreq);
1719
+ } else {
1720
+ this.$$recycleFreq = recycleFreq;
1721
+ }
1722
+ clearInterval(this.$$recycleFreqId);
1723
+ if (this.$$deleteOnExpire === 'aggressive') {
1724
+ (function (_this) {
1725
+ _this.$$recycleFreqId = setInterval(function () {
1726
+ _this.removeExpired();
1727
+ }, _this.$$recycleFreq);
1728
+ })(this);
1729
+ } else {
1730
+ delete this.$$recycleFreqId;
1731
+ }
1732
+ };
1733
+
1734
+ },{}],18:[function(require,module,exports){
1735
+ var defaults = require('../defaults'),
1736
+ DSCache = require('../DSCache'),
1737
+ version = '3.1.1';
1738
+
1739
+ /**
1740
+ * @doc function
1741
+ * @id DSCacheFactoryProvider
1742
+ * @name DSCacheFactoryProvider
1743
+ */
1744
+ function DSCacheFactoryProvider() {
1745
+
1746
+ var config = new defaults.Config();
1747
+
1748
+ this.version = version;
1749
+
1750
+ /**
1751
+ * @doc method
1752
+ * @id DSCacheFactoryProvider.methods:setCacheDefaults
1753
+ * @name setCacheDefaults
1754
+ * @desc Set the default configuration for all caches created by $angularCacheFactory.
1755
+ * @param {object} options Default configuration options for each new cache.
1756
+ */
1757
+ this.setCacheDefaults = function (options) {
1758
+ options = options || {};
1759
+
1760
+ if (!angular.isObject(options)) {
1761
+ throw angular.$$minErr('ng')('areq', 'Expected options to be an object! Found: {0}.', typeof options);
1762
+ }
1763
+
1764
+ for (var key in defaults.defaults) {
1765
+ if (key in options) {
1766
+ config[key] = options[key];
1767
+ }
1768
+ }
1769
+ if ('disabled' in options) {
1770
+ config.$$disabled = !!options.disabled;
1771
+ }
1772
+ };
1773
+
1774
+ this.$get = function () {
1775
+ var caches = {};
1776
+
1777
+ /*!
1778
+ * @method _keys
1779
+ * @desc Returns an array of the keys of the given collection.
1780
+ * @param {object} collection The collection from which to get the keys.
1781
+ * @returns {array} An array of the keys of the given collection.
1782
+ */
1783
+ function _keys(collection) {
1784
+ var keys = [], key;
1785
+ for (key in collection) {
1786
+ if (collection.hasOwnProperty(key)) {
1787
+ keys.push(key);
1788
+ }
1789
+ }
1790
+ return keys;
1791
+ }
1792
+
1793
+ function createCache(cacheId, options) {
1794
+ if (cacheId in caches) {
1795
+ throw angular.$$minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId);
1796
+ } else if (!angular.isString(cacheId)) {
1797
+ throw angular.$$minErr('ng')('areq', 'Expected cacheId to be a string! Found: {0}.', typeof cacheId);
1798
+ }
1799
+
1800
+ caches[cacheId] = new DSCache(cacheId, angular.extend({}, config, options));
1801
+ caches[cacheId].destroy = function () {
1802
+ this.constructor.prototype.destroy.call(this);
1803
+ delete caches[this.$$id];
1804
+ };
1805
+ return caches[cacheId];
1806
+ }
1807
+
1808
+ /**
1809
+ * @doc function
1810
+ * @id DSCacheFactory
1811
+ * @name DSCacheFactory
1812
+ * @description
1813
+ * Factory function that produces instances of `DSCache`.
1814
+ *
1815
+ * @param {string} cacheId The id of the new cache.
1816
+ * @param {object} options Configuration options. Properties:
1817
+ *
1818
+ * - `{number=}` - `capacity` - Default: `Number.MAX_VALUE`
1819
+ * - `{number=}` - `maxAge` - Default: `null`
1820
+ * - `{number=}` - `deleteOnExpire` - Default: `none`
1821
+ * - `{function=}` - `onExpire` - Default: `null`
1822
+ * - `{number=}` - `cacheFlushInterval` - Default: `null`
1823
+ * - `{number=}` - `recycleFreq` - Default: `1000`
1824
+ * - `{number=}` - `deleteOnExpire` - Default: `null`
1825
+ * - `{string=}` - `storageMode` - Default: `'none`
1826
+ * - `{object=}` - `storageImpl` - Default: `null`
1827
+ * - `{boolean=}` - `disabled` - Default: `false`
1828
+ * - `{string=}` - `storagePrefix` - Default: `"angular-cache.caches."`
1829
+ *
1830
+ * @returns {DSCache} New instance of DSCache.
1831
+ */
1832
+ function DSCacheFactory(cacheId, options) {
1833
+ return createCache(cacheId, options);
1834
+ }
1835
+
1836
+ /**
1837
+ * @doc method
1838
+ * @id DSCacheFactory.methods:createCache
1839
+ * @name createCache
1840
+ * @description
1841
+ * Factory function that produces instances of `DSCache`.
1842
+ *
1843
+ * @param {string} cacheId The id of the new cache.
1844
+ * @param {object} options Configuration options. Properties:
1845
+ *
1846
+ * - `{number=}` - `capacity` - Default: `Number.MAX_VALUE`
1847
+ * - `{number=}` - `maxAge` - Default: `null`
1848
+ * - `{number=}` - `deleteOnExpire` - Default: `none`
1849
+ * - `{function=}` - `onExpire` - Default: `null`
1850
+ * - `{number=}` - `cacheFlushInterval` - Default: `null`
1851
+ * - `{number=}` - `recycleFreq` - Default: `1000`
1852
+ * - `{number=}` - `deleteOnExpire` - Default: `null`
1853
+ * - `{string=}` - `storageMode` - Default: `'none`
1854
+ * - `{object=}` - `storageImpl` - Default: `null`
1855
+ * - `{boolean=}` - `disabled` - Default: `false`
1856
+ * - `{string=}` - `storagePrefix` - Default: `"angular-cache.caches."`
1857
+ *
1858
+ * @returns {DSCache} New instance of DSCache.
1859
+ */
1860
+ DSCacheFactory.createCache = createCache;
1861
+
1862
+ DSCacheFactory.version = version;
1863
+
1864
+ /**
1865
+ * @doc method
1866
+ * @id DSCacheFactory.methods:info
1867
+ * @name info
1868
+ * @description
1869
+ * Return the status of `DSCacheFactory`.
1870
+ * @returns {object} The status of `DSCacheFactory`.
1871
+ */
1872
+ DSCacheFactory.info = function () {
1873
+ var keys = _keys(caches);
1874
+ var info = {
1875
+ size: keys.length,
1876
+ caches: {}
1877
+ };
1878
+ for (var i = 0; i < keys.length; i++) {
1879
+ var key = keys[i];
1880
+ info.caches[key] = caches[key].info();
1881
+ }
1882
+ var c = info.cacheDefaults = angular.extend({}, config);
1883
+ for (var option in defaults.defaults) {
1884
+ if (!(option in c)) {
1885
+ c[option] = config['$$' + option];
1886
+ }
1887
+ }
1888
+ return info;
1889
+ };
1890
+
1891
+ /**
1892
+ * @doc method
1893
+ * @id DSCacheFactory.methods:get
1894
+ * @name get
1895
+ * @description
1896
+ * Return the cache with the given `cacheId`.
1897
+ * @param {string} cacheId The id of the desired cache.
1898
+ * @returns {DSCache} The cache with the specified `cacheId`.
1899
+ */
1900
+ DSCacheFactory.get = function (cacheId) {
1901
+ if (!angular.isString(cacheId)) {
1902
+ throw angular.$$minErr('ng')('areq', 'Expected cacheId to be a string! Found: {0}.', typeof cacheId);
1903
+ }
1904
+ return caches[cacheId];
1905
+ };
1906
+
1907
+ /**
1908
+ * @doc method
1909
+ * @id DSCacheFactory.methods:keySet
1910
+ * @name keySet
1911
+ * @description
1912
+ * Return an object containing the `cacheId` of each cache.
1913
+ * @returns {object} An object containing the `cacheId` of each cache.
1914
+ */
1915
+ DSCacheFactory.keySet = function () {
1916
+ var cacheIds = {}, cacheId;
1917
+ for (cacheId in caches) {
1918
+ if (caches.hasOwnProperty(cacheId)) {
1919
+ cacheIds[cacheId] = cacheId;
1920
+ }
1921
+ }
1922
+ return cacheIds;
1923
+ };
1924
+
1925
+ /**
1926
+ * @doc method
1927
+ * @id DSCacheFactory.methods:keys
1928
+ * @name keys
1929
+ * @description
1930
+ * Return an array containing the `cacheId` of each cache.
1931
+ * @returns {array} An array containing the `cacheId` of each cache.
1932
+ */
1933
+ DSCacheFactory.keys = function () {
1934
+ return _keys(caches);
1935
+ };
1936
+
1937
+ /**
1938
+ * @doc method
1939
+ * @id DSCacheFactory.methods:destroyAll
1940
+ * @name destroyAll
1941
+ * @description
1942
+ * Destroy all caches.
1943
+ *
1944
+ * ## Signature:
1945
+ * ```js
1946
+ * DSCacheFactory.destroyAll()
1947
+ * ```
1948
+ *
1949
+ * ## Example:
1950
+ * ```js
1951
+ * var newCache = DSCacheFactory('newCache');
1952
+ * var otherCache = DSCacheFactory('otherCache');
1953
+ *
1954
+ * newCache.info().size; // 0
1955
+ * otherCache.info().size; // 0
1956
+ *
1957
+ * newCache.put('1', 'apple');
1958
+ * newCache.put('2', 'banana');
1959
+ * otherCache.put('abcd', 'horse');
1960
+ *
1961
+ * newCache.info().size; // 2
1962
+ * otherCache.info().size; // 1
1963
+ *
1964
+ * DSCacheFactory.destroyAll();
1965
+ *
1966
+ * newCache.info().size; // Error thrown
1967
+ * otherCache.info().size; // Error thrown
1968
+ *
1969
+ * DSCacheFactory.get('newCache'); // undefined
1970
+ * DSCacheFactory.get('otherCache'); // undefined
1971
+ * ```
1972
+ */
1973
+ DSCacheFactory.destroyAll = function () {
1974
+ for (var cacheId in caches) {
1975
+ caches[cacheId].destroy();
1976
+ }
1977
+ caches = {};
1978
+ };
1979
+
1980
+ /**
1981
+ * @doc method
1982
+ * @id DSCacheFactory.methods:clearAll
1983
+ * @name clearAll
1984
+ * @description
1985
+ * Clear the contents of all caches.
1986
+ *
1987
+ * ## Signature:
1988
+ * ```js
1989
+ * DSCacheFactory.clearAll()
1990
+ * ```
1991
+ *
1992
+ * ## Example:
1993
+ * ```js
1994
+ * var newCache = DSCacheFactory('newCache');
1995
+ * var otherCache = DSCacheFactory('otherCache');
1996
+ *
1997
+ * newCache.info().size; // 0
1998
+ * otherCache.info().size; // 0
1999
+ *
2000
+ * newCache.put('1', 'apple');
2001
+ * newCache.put('2', 'banana');
2002
+ * otherCache.put('abcd', 'horse');
2003
+ *
2004
+ * newCache.info().size; // 2
2005
+ * otherCache.info().size; // 1
2006
+ *
2007
+ * DSCacheFactory.clearAll();
2008
+ *
2009
+ * newCache.info().size; // 0
2010
+ * otherCache.info().size; // 0
2011
+ * ```
2012
+ */
2013
+ DSCacheFactory.clearAll = function () {
2014
+ for (var cacheId in caches) {
2015
+ caches[cacheId].removeAll();
2016
+ }
2017
+ };
2018
+
2019
+ /**
2020
+ * @doc method
2021
+ * @id DSCacheFactory.methods:enableAll
2022
+ * @name enableAll
2023
+ * @description
2024
+ * Enable any disabled caches.
2025
+ *
2026
+ * ## Signature:
2027
+ * ```js
2028
+ * DSCacheFactory.enableAll()
2029
+ * ```
2030
+ *
2031
+ * ## Example:
2032
+ * ```js
2033
+ * var newCache = DSCacheFactory('newCache', { disabled: true });
2034
+ * var otherCache = DSCacheFactory('otherCache', { disabled: true });
2035
+ *
2036
+ * newCache.info().disabled; // true
2037
+ * otherCache.info().disabled; // true
2038
+ *
2039
+ * DSCacheFactory.enableAll();
2040
+ *
2041
+ * newCache.info().disabled; // false
2042
+ * otherCache.info().disabled; // false
2043
+ * ```
2044
+ */
2045
+ DSCacheFactory.enableAll = function () {
2046
+ for (var cacheId in caches) {
2047
+ caches[cacheId].$$disabled = false;
2048
+ }
2049
+ };
2050
+
2051
+ /**
2052
+ * @doc method
2053
+ * @id DSCacheFactory.methods:disableAll
2054
+ * @name disableAll
2055
+ * @description
2056
+ * Disable all caches.
2057
+ *
2058
+ * ## Signature:
2059
+ * ```js
2060
+ * DSCacheFactory.disableAll()
2061
+ * ```
2062
+ *
2063
+ * ## Example:
2064
+ * ```js
2065
+ * var newCache = DSCacheFactory('newCache');
2066
+ * var otherCache = DSCacheFactory('otherCache');
2067
+ *
2068
+ * newCache.info().disabled; // false
2069
+ * otherCache.info().disabled; // false
2070
+ *
2071
+ * DSCacheFactory.disableAll();
2072
+ *
2073
+ * newCache.info().disabled; // true
2074
+ * otherCache.info().disabled; // true
2075
+ * ```
2076
+ */
2077
+ DSCacheFactory.disableAll = function () {
2078
+ for (var cacheId in caches) {
2079
+ caches[cacheId].$$disabled = true;
2080
+ }
2081
+ };
2082
+
2083
+ return DSCacheFactory;
2084
+ };
2085
+ }
2086
+
2087
+ module.exports = DSCacheFactoryProvider;
2088
+
2089
+ },{"../DSCache":4,"../defaults":19}],19:[function(require,module,exports){
2090
+ var defaults = {
2091
+ /**
2092
+ * @doc overview
2093
+ * @id capacity
2094
+ * @name capacity
2095
+ * @description
2096
+ * __Default:__ `Number.MAX_VALUE`
2097
+ *
2098
+ * This option limits the capacity of a cache. With a maximum capacity set, a cache operates as an LRU cache,
2099
+ * deleting the least-recently-used item when the cache exceeds capacity.
2100
+ *
2101
+ * This option is dynamically configurable. Must be a number (milliseconds) greater than zero.
2102
+ *
2103
+ * ### Where can it be used?
2104
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2105
+ * - `DSCacheFactory(cacheId[, options])`
2106
+ * - `DSCache.setCapacity(capacity)`
2107
+ * - `DSCache.setOptions(options[, strict])`
2108
+ */
2109
+ capacity: Number.MAX_VALUE,
2110
+
2111
+ /**
2112
+ * @doc overview
2113
+ * @id maxAge
2114
+ * @name maxAge
2115
+ * @description
2116
+ * __Default:__ `Number.MAX_VALUE`
2117
+ *
2118
+ * This option determines how long an item is in a cache before the item expires.. With `maxAge` set, items are
2119
+ * marked as expired when their time in a cache exceeds `maxAge`. A cache's behavior when an item expires is
2120
+ * determined by the [deleteOnExpire](/documentation/api/angular-cache/deleteOnExpire) option.
2121
+ *
2122
+ * This option is dynamically configurable. Must be a number (milliseconds) greater than zero.
2123
+ *
2124
+ * ### Where can it be used?
2125
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2126
+ * - `DSCacheFactory(cacheId[, options])`
2127
+ * - `DSCache.setMaxAge(maxAge)`
2128
+ * - `DSCache.setOptions(options[, strict])`
2129
+ */
2130
+ maxAge: Number.MAX_VALUE,
2131
+
2132
+ /**
2133
+ * @doc overview
2134
+ * @id deleteOnExpire
2135
+ * @name deleteOnExpire
2136
+ * @description
2137
+ * __Default:__ `"none"`
2138
+ *
2139
+ * This option determines how long an item is in a cache before the item expires.. With `maxAge` set, items are
2140
+ * marked as expired when their time in a cache exceeds `maxAge`. A cache's behavior when an item expires is
2141
+ * determined by the [deleteOnExpire](/documentation/api/angular-cache/deleteOnExpire) option.
2142
+ *
2143
+ * This option is dynamically configurable. Must be `"none"`, `"passive"` or `"aggressive"`.
2144
+ *
2145
+ * #### "none"
2146
+ * A cache will do nothing when its items expire.
2147
+ *
2148
+ * #### "passive"
2149
+ * A cache will do nothing when its items expire. If an expired item is request it is removed from the cache and
2150
+ * `undefined` is returned.
2151
+ *
2152
+ * #### "aggressive"
2153
+ * A cache will periodically scan for expired items and actively remove them from the cache if any are found. The
2154
+ * frequency of the scan is determined by the [recycleFreq](/documentation/api/angular-cache/recycleFreq) option.
2155
+ *
2156
+ * ### Where can it be used?
2157
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2158
+ * - `DSCacheFactory(cacheId[, options])`
2159
+ * - `DSCache.setRecycleFreq(recycleFreq)`
2160
+ * - `DSCache.setOptions(options[, strict])`
2161
+ */
2162
+ deleteOnExpire: 'none',
2163
+
2164
+ /**
2165
+ * @doc overview
2166
+ * @id onExpire
2167
+ * @name onExpire
2168
+ * @description
2169
+ * __Default:__ `"none"`
2170
+ *
2171
+ * This option is a callback function which will be executed whenever an expired item is removed from a cache by
2172
+ * either requesting an expired item while the cache is in `"passive"` `deleteOnExpire` mode, or when an expired
2173
+ * item is actively removed when the cache is in `"aggressive"` `deleteOnExpire` mode.
2174
+ *
2175
+ * This option is dynamically configurable. Must be a function. Will be passed the `key` and `value` of the expired
2176
+ * item. Will be passed a third `done` argument (if in `"passive"` `deleteOnExpire` mode) which is the `onExpire`
2177
+ * argument passed to [DSCache#get(key[, options])](/documentation/api/angular-cache/DSCache.methods:get).
2178
+ *
2179
+ * ### Where can it be used?
2180
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2181
+ * - `DSCacheFactory(cacheId[, options])`
2182
+ * - `DSCache.setOnExpire(onExpire)`
2183
+ * - `DSCache.setOptions(options[, strict])`
2184
+ */
2185
+ onExpire: null,
2186
+
2187
+ /**
2188
+ * @doc overview
2189
+ * @id cacheFlushInterval
2190
+ * @name cacheFlushInterval
2191
+ * @description
2192
+ * __Default:__ `null`
2193
+ *
2194
+ * This option, if set, will cause a cache to periodically clear itself of all data.
2195
+ *
2196
+ * This option is dynamically configurable. Must be a number (milliseconds) greater than zero.
2197
+ *
2198
+ * ### Where can it be used?
2199
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2200
+ * - `DSCacheFactory(cacheId[, options])`
2201
+ * - `DSCache.setCacheFlushInterval(cacheFlushInterval)`
2202
+ * - `DSCache.setOptions(options[, strict])`
2203
+ */
2204
+ cacheFlushInterval: null,
2205
+
2206
+ /**
2207
+ * @doc overview
2208
+ * @id recycleFreq
2209
+ * @name recycleFreq
2210
+ * @description
2211
+ * __Default:__ `1000`
2212
+ *
2213
+ * This option determines how often a cache will scan for expired items when in `"aggressive"` `deleteOnExpire`
2214
+ * mode.
2215
+ *
2216
+ * This option is dynamically configurable. Must be a number (milliseconds) greater than zero.
2217
+ *
2218
+ * ### Where can it be used?
2219
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2220
+ * - `DSCacheFactory(cacheId[, options])`
2221
+ * - `DSCache.setRecycleFreq(recycleFreq)`
2222
+ * - `DSCache.setOptions(options[, strict])`
2223
+ */
2224
+ recycleFreq: 1000,
2225
+
2226
+ /**
2227
+ * @doc overview
2228
+ * @id storageMode
2229
+ * @name storageMode
2230
+ * @description
2231
+ * __Default:__ `"memory"`
2232
+ *
2233
+ * This option determines the storage mode for a cache.
2234
+ *
2235
+ * #### "memory"
2236
+ * All data will be held in memory.
2237
+ *
2238
+ * #### "localStorage"
2239
+ * Data will be held in `localStorage`, if available (or
2240
+ * [storageImpl](/documentation/api/angular-cache/storageImpl) is provided).
2241
+ *
2242
+ * #### "sessionStorage"
2243
+ * Data will be held in `sessionStorage`, if available (or
2244
+ * [storageImpl](/documentation/api/angular-cache/storageImpl) is provided).
2245
+ *
2246
+ * This option is NOT dynamically configurable. Must be `"memory"`, `"localStorage"` or `"sessionStorage"`.
2247
+ *
2248
+ * ### Where can it be used?
2249
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2250
+ * - `DSCacheFactory(cacheId[, options])`
2251
+ */
2252
+ storageMode: 'memory',
2253
+
2254
+ /**
2255
+ * @doc overview
2256
+ * @id storageImpl
2257
+ * @name storageImpl
2258
+ * @description
2259
+ * __Default:__ `null`
2260
+ *
2261
+ * This option is available if you want to provide a custom `localStorage` or `sessionStorage` implementation.
2262
+ *
2263
+ * This option is NOT dynamically configurable. Must be an object that implements `setItem(key, value)`,
2264
+ * `getItem(key)` and `removeItem(key)`.
2265
+ *
2266
+ * ### Where can it be used?
2267
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2268
+ * - `DSCacheFactory(cacheId[, options])`
2269
+ */
2270
+ storageImpl: null,
2271
+
2272
+ /**
2273
+ * @doc overview
2274
+ * @id disabled
2275
+ * @name disabled
2276
+ * @description
2277
+ * __Default:__ `false`
2278
+ *
2279
+ * This option disables or enables cache.
2280
+ *
2281
+ * This option is dynamically configurable. Must be `true` or `false`.
2282
+ *
2283
+ * ### Where can it be used?
2284
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2285
+ * - `DSCacheFactory(cacheId[, options])`
2286
+ * - `DSCache.setOptions(options[, strict])`
2287
+ *
2288
+ * or just use [DSCache#disable()](/documentation/api/angular-cache/DSCache.methods:disable) or
2289
+ * [DSCache#enable()](/documentation/api/angular-cache/DSCache.methods:enable).
2290
+ */
2291
+ disabled: false,
2292
+
2293
+ /**
2294
+ * @doc overview
2295
+ * @id storagePrefix
2296
+ * @name storagePrefix
2297
+ * @description
2298
+ * __Default:__ `"angular-cache.caches."`
2299
+ *
2300
+ * This option determines the namespace for a cache when `storageMode` is `"localStorage"` or `"sessionStorage"`.
2301
+ * Setting this value to something like `"ac."` will save space when using WebStorage.
2302
+ *
2303
+ * This option is NOT dynamically configurable. Must be a string.
2304
+ *
2305
+ * ### Where can it be used?
2306
+ * - `DSCacheFactoryProvider.setCacheDefaults(options)`
2307
+ * - `DSCacheFactory(cacheId[, options])`
2308
+ */
2309
+ storagePrefix: 'angular-cache.caches.'
2310
+ };
2311
+
2312
+ function Config() {
2313
+ }
2314
+
2315
+ for (var option in defaults) {
2316
+ Config.prototype['$$' + option] = defaults[option];
2317
+ }
2318
+
2319
+ module.exports = {
2320
+ Config: Config,
2321
+ defaults: defaults
2322
+ };
2323
+
2324
+ },{}],20:[function(require,module,exports){
2325
+ (function (window, angular, undefined) {
2326
+ 'use strict';
2327
+
2328
+ angular.$$minErr = angular.$$minErr || function minErr(module) {
2329
+ return function () {
2330
+ var code = arguments[0],
2331
+ prefix = '[' + (module ? module + ':' : '') + code + '] ',
2332
+ template = arguments[1],
2333
+ templateArgs = arguments,
2334
+ stringify = function (obj) {
2335
+ if (typeof obj === 'function') {
2336
+ return obj.toString().replace(/ \{[\s\S]*$/, '');
2337
+ } else if (typeof obj === 'undefined') {
2338
+ return 'undefined';
2339
+ } else if (typeof obj !== 'string') {
2340
+ return JSON.stringify(obj);
2341
+ }
2342
+ return obj;
2343
+ },
2344
+ message, i;
2345
+
2346
+ message = prefix + template.replace(/\{\d+\}/g, function (match) {
2347
+ var index = +match.slice(1, -1), arg;
2348
+
2349
+ if (index + 2 < templateArgs.length) {
2350
+ arg = templateArgs[index + 2];
2351
+ if (typeof arg === 'function') {
2352
+ return arg.toString().replace(/ ?\{[\s\S]*$/, '');
2353
+ } else if (typeof arg === 'undefined') {
2354
+ return 'undefined';
2355
+ } else if (typeof arg !== 'string') {
2356
+ return angular.toJson(arg);
2357
+ }
2358
+ return arg;
2359
+ }
2360
+ return match;
2361
+ });
2362
+
2363
+ message = message + '\nhttp://errors.angularjs.org/' + angular.version.full + '/' +
2364
+ (module ? module + '/' : '') + code;
2365
+ for (i = 2; i < arguments.length; i++) {
2366
+ message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
2367
+ encodeURIComponent(stringify(arguments[i]));
2368
+ }
2369
+
2370
+ return new Error(message);
2371
+ };
2372
+ };
2373
+
2374
+
2375
+ angular.module('angular-data.DSBinaryHeap', [])
2376
+ .provider('DSBinaryHeap', require('./DSBinaryHeap').DSBinaryHeapProvider);
2377
+
2378
+ /**
2379
+ * @doc overview
2380
+ * @id angular-cache
2381
+ * @name Overview
2382
+ * @description
2383
+ * __Version:__ 3.1.1
2384
+ *
2385
+ * ## Install
2386
+ *
2387
+ * #### Bower
2388
+ * ```text
2389
+ * bower install angular-cache
2390
+ * ```
2391
+ *
2392
+ * Load `dist/angular-cache.js` or `dist/angular-cache.min.js` onto your web page after Angular.js.
2393
+ *
2394
+ * #### Npm
2395
+ * ```text
2396
+ * npm install angular-cache
2397
+ * ```
2398
+ *
2399
+ * Load `dist/angular-cache.js` or `dist/angular-cache.min.js` onto your web page after Angular.js. Angular-cache is
2400
+ * also consumable by Browserify and you should be able to `require('angular-cache')`. The `main` file is `src/index.js`.
2401
+ *
2402
+ * #### Manual download
2403
+ * Download angular-cache.3.1.1.js from the [Releases](https://github.com/jmdobry/angular-cache/releases)
2404
+ * section of the angular-cache GitHub project.
2405
+ *
2406
+ * ## Load into Angular
2407
+ * Your Angular app must depend on the module `"angular-data.DSCacheFactory"` in order to use angular-cache. Loading
2408
+ * angular-cache into your app allows you to inject the following:
2409
+ *
2410
+ * - `DSCacheFactory`
2411
+ * - `DSBinaryHeap`
2412
+ *
2413
+ * [DSCacheFactory](/documentation/api/api/DSCacheFactory) is a factory function that produces instances of
2414
+ * [DSCache](/documentation/api/api/DSCache), which is API compatible with caches produced by Angular's
2415
+ * [$cacheFactory](http://docs.angularjs.org/api/ng/service/$cacheFactory).
2416
+ *
2417
+ * [DSBinaryHeap](/documentation/api/api/DSBinaryHeap) is a priority queue implemented as a Binary Heap.
2418
+ *
2419
+ * Angular-cache is a dependency of [angular-data](/documentation/api/api/angular-data) and must be loaded before
2420
+ * angular-data if you are using angular-data.
2421
+ */
2422
+ angular.module('angular-data.DSCacheFactory', ['ng', 'angular-data.DSBinaryHeap'])
2423
+ .provider('DSCacheFactory', require('./DSCacheFactory'));
2424
+
2425
+ })(window, window.angular);
2426
+
2427
+ },{"./DSBinaryHeap":1,"./DSCacheFactory":18}],21:[function(require,module,exports){
2428
+ module.exports = {
2429
+ /*!
2430
+ * Stringify a number.
2431
+ */
2432
+ stringifyNumber: function (number) {
2433
+ if (number && angular.isNumber(number)) {
2434
+ return number.toString();
2435
+ }
2436
+ return number;
2437
+ },
2438
+
2439
+ /*!
2440
+ * Return a hash of the keys in the given collection.
2441
+ */
2442
+ keySet: function (collection) {
2443
+ var keySet = {}, key;
2444
+ for (key in collection) {
2445
+ if (collection.hasOwnProperty(key)) {
2446
+ keySet[key] = key;
2447
+ }
2448
+ }
2449
+ return keySet;
2450
+ },
2451
+
2452
+ /*!
2453
+ * Return an array of the keys in the given collection
2454
+ */
2455
+ keys: function (collection) {
2456
+ var keys = [], key;
2457
+ for (key in collection) {
2458
+ if (collection.hasOwnProperty(key)) {
2459
+ keys.push(key);
2460
+ }
2461
+ }
2462
+ return keys;
2463
+ }
2464
+ };
2465
+
2466
+ },{}]},{},[20]);