mirror of
				https://github.com/1disk/edp445.git
				synced 2024-08-14 22:47:02 +00:00 
			
		
		
		
	Changed alot of things.
This commit is contained in:
		
							parent
							
								
									a5a0523e5a
								
							
						
					
					
						commit
						3513d5390c
					
				
					 2016 changed files with 336930 additions and 9 deletions
				
			
		
							
								
								
									
										15
									
								
								node_modules/lru-cache/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								node_modules/lru-cache/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| The ISC License | ||||
| 
 | ||||
| Copyright (c) Isaac Z. Schlueter and Contributors | ||||
| 
 | ||||
| Permission to use, copy, modify, and/or distribute this software for any | ||||
| purpose with or without fee is hereby granted, provided that the above | ||||
| copyright notice and this permission notice appear in all copies. | ||||
| 
 | ||||
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||||
| WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
| MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||||
| ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
| ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR | ||||
| IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
							
								
								
									
										166
									
								
								node_modules/lru-cache/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								node_modules/lru-cache/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,166 @@ | |||
| # lru cache | ||||
| 
 | ||||
| A cache object that deletes the least-recently-used items. | ||||
| 
 | ||||
| [](https://travis-ci.org/isaacs/node-lru-cache) [](https://coveralls.io/github/isaacs/node-lru-cache) | ||||
| 
 | ||||
| ## Installation: | ||||
| 
 | ||||
| ```javascript | ||||
| npm install lru-cache --save | ||||
| ``` | ||||
| 
 | ||||
| ## Usage: | ||||
| 
 | ||||
| ```javascript | ||||
| var LRU = require("lru-cache") | ||||
|   , options = { max: 500 | ||||
|               , length: function (n, key) { return n * 2 + key.length } | ||||
|               , dispose: function (key, n) { n.close() } | ||||
|               , maxAge: 1000 * 60 * 60 } | ||||
|   , cache = new LRU(options) | ||||
|   , otherCache = new LRU(50) // sets just the max size | ||||
| 
 | ||||
| cache.set("key", "value") | ||||
| cache.get("key") // "value" | ||||
| 
 | ||||
| // non-string keys ARE fully supported | ||||
| // but note that it must be THE SAME object, not | ||||
| // just a JSON-equivalent object. | ||||
| var someObject = { a: 1 } | ||||
| cache.set(someObject, 'a value') | ||||
| // Object keys are not toString()-ed | ||||
| cache.set('[object Object]', 'a different value') | ||||
| assert.equal(cache.get(someObject), 'a value') | ||||
| // A similar object with same keys/values won't work, | ||||
| // because it's a different object identity | ||||
| assert.equal(cache.get({ a: 1 }), undefined) | ||||
| 
 | ||||
| cache.reset()    // empty the cache | ||||
| ``` | ||||
| 
 | ||||
| If you put more stuff in it, then items will fall out. | ||||
| 
 | ||||
| If you try to put an oversized thing in it, then it'll fall out right | ||||
| away. | ||||
| 
 | ||||
| ## Options | ||||
| 
 | ||||
| * `max` The maximum size of the cache, checked by applying the length | ||||
|   function to all values in the cache.  Not setting this is kind of | ||||
|   silly, since that's the whole purpose of this lib, but it defaults | ||||
|   to `Infinity`.  Setting it to a non-number or negative number will | ||||
|   throw a `TypeError`.  Setting it to 0 makes it be `Infinity`. | ||||
| * `maxAge` Maximum age in ms.  Items are not pro-actively pruned out | ||||
|   as they age, but if you try to get an item that is too old, it'll | ||||
|   drop it and return undefined instead of giving it to you. | ||||
|   Setting this to a negative value will make everything seem old! | ||||
|   Setting it to a non-number will throw a `TypeError`. | ||||
| * `length` Function that is used to calculate the length of stored | ||||
|   items.  If you're storing strings or buffers, then you probably want | ||||
|   to do something like `function(n, key){return n.length}`.  The default is | ||||
|   `function(){return 1}`, which is fine if you want to store `max` | ||||
|   like-sized things.  The item is passed as the first argument, and | ||||
|   the key is passed as the second argumnet. | ||||
| * `dispose` Function that is called on items when they are dropped | ||||
|   from the cache.  This can be handy if you want to close file | ||||
|   descriptors or do other cleanup tasks when items are no longer | ||||
|   accessible.  Called with `key, value`.  It's called *before* | ||||
|   actually removing the item from the internal cache, so if you want | ||||
|   to immediately put it back in, you'll have to do that in a | ||||
|   `nextTick` or `setTimeout` callback or it won't do anything. | ||||
| * `stale` By default, if you set a `maxAge`, it'll only actually pull | ||||
|   stale items out of the cache when you `get(key)`.  (That is, it's | ||||
|   not pre-emptively doing a `setTimeout` or anything.)  If you set | ||||
|   `stale:true`, it'll return the stale value before deleting it.  If | ||||
|   you don't set this, then it'll return `undefined` when you try to | ||||
|   get a stale entry, as if it had already been deleted. | ||||
| * `noDisposeOnSet` By default, if you set a `dispose()` method, then | ||||
|   it'll be called whenever a `set()` operation overwrites an existing | ||||
|   key.  If you set this option, `dispose()` will only be called when a | ||||
|   key falls out of the cache, not when it is overwritten. | ||||
| * `updateAgeOnGet` When using time-expiring entries with `maxAge`, | ||||
|   setting this to `true` will make each item's effective time update | ||||
|   to the current time whenever it is retrieved from cache, causing it | ||||
|   to not expire.  (It can still fall out of cache based on recency of | ||||
|   use, of course.) | ||||
| 
 | ||||
| ## API | ||||
| 
 | ||||
| * `set(key, value, maxAge)` | ||||
| * `get(key) => value` | ||||
| 
 | ||||
|     Both of these will update the "recently used"-ness of the key. | ||||
|     They do what you think. `maxAge` is optional and overrides the | ||||
|     cache `maxAge` option if provided. | ||||
| 
 | ||||
|     If the key is not found, `get()` will return `undefined`. | ||||
| 
 | ||||
|     The key and val can be any value. | ||||
| 
 | ||||
| * `peek(key)` | ||||
| 
 | ||||
|     Returns the key value (or `undefined` if not found) without | ||||
|     updating the "recently used"-ness of the key. | ||||
| 
 | ||||
|     (If you find yourself using this a lot, you *might* be using the | ||||
|     wrong sort of data structure, but there are some use cases where | ||||
|     it's handy.) | ||||
| 
 | ||||
| * `del(key)` | ||||
| 
 | ||||
|     Deletes a key out of the cache. | ||||
| 
 | ||||
| * `reset()` | ||||
| 
 | ||||
|     Clear the cache entirely, throwing away all values. | ||||
| 
 | ||||
| * `has(key)` | ||||
| 
 | ||||
|     Check if a key is in the cache, without updating the recent-ness | ||||
|     or deleting it for being stale. | ||||
| 
 | ||||
| * `forEach(function(value,key,cache), [thisp])` | ||||
| 
 | ||||
|     Just like `Array.prototype.forEach`.  Iterates over all the keys | ||||
|     in the cache, in order of recent-ness.  (Ie, more recently used | ||||
|     items are iterated over first.) | ||||
| 
 | ||||
| * `rforEach(function(value,key,cache), [thisp])` | ||||
| 
 | ||||
|     The same as `cache.forEach(...)` but items are iterated over in | ||||
|     reverse order.  (ie, less recently used items are iterated over | ||||
|     first.) | ||||
| 
 | ||||
| * `keys()` | ||||
| 
 | ||||
|     Return an array of the keys in the cache. | ||||
| 
 | ||||
| * `values()` | ||||
| 
 | ||||
|     Return an array of the values in the cache. | ||||
| 
 | ||||
| * `length` | ||||
| 
 | ||||
|     Return total length of objects in cache taking into account | ||||
|     `length` options function. | ||||
| 
 | ||||
| * `itemCount` | ||||
| 
 | ||||
|     Return total quantity of objects currently in cache. Note, that | ||||
|     `stale` (see options) items are returned as part of this item | ||||
|     count. | ||||
| 
 | ||||
| * `dump()` | ||||
| 
 | ||||
|     Return an array of the cache entries ready for serialization and usage | ||||
|     with 'destinationCache.load(arr)`. | ||||
| 
 | ||||
| * `load(cacheEntriesArray)` | ||||
| 
 | ||||
|     Loads another cache entries array, obtained with `sourceCache.dump()`, | ||||
|     into the cache. The destination cache is reset before loading new entries | ||||
| 
 | ||||
| * `prune()` | ||||
| 
 | ||||
|     Manually iterates over the entire cache proactively pruning old entries | ||||
							
								
								
									
										334
									
								
								node_modules/lru-cache/index.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										334
									
								
								node_modules/lru-cache/index.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,334 @@ | |||
| 'use strict' | ||||
| 
 | ||||
| // A linked list to keep track of recently-used-ness
 | ||||
| const Yallist = require('yallist') | ||||
| 
 | ||||
| const MAX = Symbol('max') | ||||
| const LENGTH = Symbol('length') | ||||
| const LENGTH_CALCULATOR = Symbol('lengthCalculator') | ||||
| const ALLOW_STALE = Symbol('allowStale') | ||||
| const MAX_AGE = Symbol('maxAge') | ||||
| const DISPOSE = Symbol('dispose') | ||||
| const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet') | ||||
| const LRU_LIST = Symbol('lruList') | ||||
| const CACHE = Symbol('cache') | ||||
| const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet') | ||||
| 
 | ||||
| const naiveLength = () => 1 | ||||
| 
 | ||||
| // lruList is a yallist where the head is the youngest
 | ||||
| // item, and the tail is the oldest.  the list contains the Hit
 | ||||
| // objects as the entries.
 | ||||
| // Each Hit object has a reference to its Yallist.Node.  This
 | ||||
| // never changes.
 | ||||
| //
 | ||||
| // cache is a Map (or PseudoMap) that matches the keys to
 | ||||
| // the Yallist.Node object.
 | ||||
| class LRUCache { | ||||
|   constructor (options) { | ||||
|     if (typeof options === 'number') | ||||
|       options = { max: options } | ||||
| 
 | ||||
|     if (!options) | ||||
|       options = {} | ||||
| 
 | ||||
|     if (options.max && (typeof options.max !== 'number' || options.max < 0)) | ||||
|       throw new TypeError('max must be a non-negative number') | ||||
|     // Kind of weird to have a default max of Infinity, but oh well.
 | ||||
|     const max = this[MAX] = options.max || Infinity | ||||
| 
 | ||||
|     const lc = options.length || naiveLength | ||||
|     this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc | ||||
|     this[ALLOW_STALE] = options.stale || false | ||||
|     if (options.maxAge && typeof options.maxAge !== 'number') | ||||
|       throw new TypeError('maxAge must be a number') | ||||
|     this[MAX_AGE] = options.maxAge || 0 | ||||
|     this[DISPOSE] = options.dispose | ||||
|     this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false | ||||
|     this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false | ||||
|     this.reset() | ||||
|   } | ||||
| 
 | ||||
|   // resize the cache when the max changes.
 | ||||
|   set max (mL) { | ||||
|     if (typeof mL !== 'number' || mL < 0) | ||||
|       throw new TypeError('max must be a non-negative number') | ||||
| 
 | ||||
|     this[MAX] = mL || Infinity | ||||
|     trim(this) | ||||
|   } | ||||
|   get max () { | ||||
|     return this[MAX] | ||||
|   } | ||||
| 
 | ||||
|   set allowStale (allowStale) { | ||||
|     this[ALLOW_STALE] = !!allowStale | ||||
|   } | ||||
|   get allowStale () { | ||||
|     return this[ALLOW_STALE] | ||||
|   } | ||||
| 
 | ||||
|   set maxAge (mA) { | ||||
|     if (typeof mA !== 'number') | ||||
|       throw new TypeError('maxAge must be a non-negative number') | ||||
| 
 | ||||
|     this[MAX_AGE] = mA | ||||
|     trim(this) | ||||
|   } | ||||
|   get maxAge () { | ||||
|     return this[MAX_AGE] | ||||
|   } | ||||
| 
 | ||||
|   // resize the cache when the lengthCalculator changes.
 | ||||
|   set lengthCalculator (lC) { | ||||
|     if (typeof lC !== 'function') | ||||
|       lC = naiveLength | ||||
| 
 | ||||
|     if (lC !== this[LENGTH_CALCULATOR]) { | ||||
|       this[LENGTH_CALCULATOR] = lC | ||||
|       this[LENGTH] = 0 | ||||
|       this[LRU_LIST].forEach(hit => { | ||||
|         hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) | ||||
|         this[LENGTH] += hit.length | ||||
|       }) | ||||
|     } | ||||
|     trim(this) | ||||
|   } | ||||
|   get lengthCalculator () { return this[LENGTH_CALCULATOR] } | ||||
| 
 | ||||
|   get length () { return this[LENGTH] } | ||||
|   get itemCount () { return this[LRU_LIST].length } | ||||
| 
 | ||||
|   rforEach (fn, thisp) { | ||||
|     thisp = thisp || this | ||||
|     for (let walker = this[LRU_LIST].tail; walker !== null;) { | ||||
|       const prev = walker.prev | ||||
|       forEachStep(this, fn, walker, thisp) | ||||
|       walker = prev | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   forEach (fn, thisp) { | ||||
|     thisp = thisp || this | ||||
|     for (let walker = this[LRU_LIST].head; walker !== null;) { | ||||
|       const next = walker.next | ||||
|       forEachStep(this, fn, walker, thisp) | ||||
|       walker = next | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   keys () { | ||||
|     return this[LRU_LIST].toArray().map(k => k.key) | ||||
|   } | ||||
| 
 | ||||
|   values () { | ||||
|     return this[LRU_LIST].toArray().map(k => k.value) | ||||
|   } | ||||
| 
 | ||||
|   reset () { | ||||
|     if (this[DISPOSE] && | ||||
|         this[LRU_LIST] && | ||||
|         this[LRU_LIST].length) { | ||||
|       this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value)) | ||||
|     } | ||||
| 
 | ||||
|     this[CACHE] = new Map() // hash of items by key
 | ||||
|     this[LRU_LIST] = new Yallist() // list of items in order of use recency
 | ||||
|     this[LENGTH] = 0 // length of items in the list
 | ||||
|   } | ||||
| 
 | ||||
|   dump () { | ||||
|     return this[LRU_LIST].map(hit => | ||||
|       isStale(this, hit) ? false : { | ||||
|         k: hit.key, | ||||
|         v: hit.value, | ||||
|         e: hit.now + (hit.maxAge || 0) | ||||
|       }).toArray().filter(h => h) | ||||
|   } | ||||
| 
 | ||||
|   dumpLru () { | ||||
|     return this[LRU_LIST] | ||||
|   } | ||||
| 
 | ||||
|   set (key, value, maxAge) { | ||||
|     maxAge = maxAge || this[MAX_AGE] | ||||
| 
 | ||||
|     if (maxAge && typeof maxAge !== 'number') | ||||
|       throw new TypeError('maxAge must be a number') | ||||
| 
 | ||||
|     const now = maxAge ? Date.now() : 0 | ||||
|     const len = this[LENGTH_CALCULATOR](value, key) | ||||
| 
 | ||||
|     if (this[CACHE].has(key)) { | ||||
|       if (len > this[MAX]) { | ||||
|         del(this, this[CACHE].get(key)) | ||||
|         return false | ||||
|       } | ||||
| 
 | ||||
|       const node = this[CACHE].get(key) | ||||
|       const item = node.value | ||||
| 
 | ||||
|       // dispose of the old one before overwriting
 | ||||
|       // split out into 2 ifs for better coverage tracking
 | ||||
|       if (this[DISPOSE]) { | ||||
|         if (!this[NO_DISPOSE_ON_SET]) | ||||
|           this[DISPOSE](key, item.value) | ||||
|       } | ||||
| 
 | ||||
|       item.now = now | ||||
|       item.maxAge = maxAge | ||||
|       item.value = value | ||||
|       this[LENGTH] += len - item.length | ||||
|       item.length = len | ||||
|       this.get(key) | ||||
|       trim(this) | ||||
|       return true | ||||
|     } | ||||
| 
 | ||||
|     const hit = new Entry(key, value, len, now, maxAge) | ||||
| 
 | ||||
|     // oversized objects fall out of cache automatically.
 | ||||
|     if (hit.length > this[MAX]) { | ||||
|       if (this[DISPOSE]) | ||||
|         this[DISPOSE](key, value) | ||||
| 
 | ||||
|       return false | ||||
|     } | ||||
| 
 | ||||
|     this[LENGTH] += hit.length | ||||
|     this[LRU_LIST].unshift(hit) | ||||
|     this[CACHE].set(key, this[LRU_LIST].head) | ||||
|     trim(this) | ||||
|     return true | ||||
|   } | ||||
| 
 | ||||
|   has (key) { | ||||
|     if (!this[CACHE].has(key)) return false | ||||
|     const hit = this[CACHE].get(key).value | ||||
|     return !isStale(this, hit) | ||||
|   } | ||||
| 
 | ||||
|   get (key) { | ||||
|     return get(this, key, true) | ||||
|   } | ||||
| 
 | ||||
|   peek (key) { | ||||
|     return get(this, key, false) | ||||
|   } | ||||
| 
 | ||||
|   pop () { | ||||
|     const node = this[LRU_LIST].tail | ||||
|     if (!node) | ||||
|       return null | ||||
| 
 | ||||
|     del(this, node) | ||||
|     return node.value | ||||
|   } | ||||
| 
 | ||||
|   del (key) { | ||||
|     del(this, this[CACHE].get(key)) | ||||
|   } | ||||
| 
 | ||||
|   load (arr) { | ||||
|     // reset the cache
 | ||||
|     this.reset() | ||||
| 
 | ||||
|     const now = Date.now() | ||||
|     // A previous serialized cache has the most recent items first
 | ||||
|     for (let l = arr.length - 1; l >= 0; l--) { | ||||
|       const hit = arr[l] | ||||
|       const expiresAt = hit.e || 0 | ||||
|       if (expiresAt === 0) | ||||
|         // the item was created without expiration in a non aged cache
 | ||||
|         this.set(hit.k, hit.v) | ||||
|       else { | ||||
|         const maxAge = expiresAt - now | ||||
|         // dont add already expired items
 | ||||
|         if (maxAge > 0) { | ||||
|           this.set(hit.k, hit.v, maxAge) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   prune () { | ||||
|     this[CACHE].forEach((value, key) => get(this, key, false)) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const get = (self, key, doUse) => { | ||||
|   const node = self[CACHE].get(key) | ||||
|   if (node) { | ||||
|     const hit = node.value | ||||
|     if (isStale(self, hit)) { | ||||
|       del(self, node) | ||||
|       if (!self[ALLOW_STALE]) | ||||
|         return undefined | ||||
|     } else { | ||||
|       if (doUse) { | ||||
|         if (self[UPDATE_AGE_ON_GET]) | ||||
|           node.value.now = Date.now() | ||||
|         self[LRU_LIST].unshiftNode(node) | ||||
|       } | ||||
|     } | ||||
|     return hit.value | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const isStale = (self, hit) => { | ||||
|   if (!hit || (!hit.maxAge && !self[MAX_AGE])) | ||||
|     return false | ||||
| 
 | ||||
|   const diff = Date.now() - hit.now | ||||
|   return hit.maxAge ? diff > hit.maxAge | ||||
|     : self[MAX_AGE] && (diff > self[MAX_AGE]) | ||||
| } | ||||
| 
 | ||||
| const trim = self => { | ||||
|   if (self[LENGTH] > self[MAX]) { | ||||
|     for (let walker = self[LRU_LIST].tail; | ||||
|       self[LENGTH] > self[MAX] && walker !== null;) { | ||||
|       // We know that we're about to delete this one, and also
 | ||||
|       // what the next least recently used key will be, so just
 | ||||
|       // go ahead and set it now.
 | ||||
|       const prev = walker.prev | ||||
|       del(self, walker) | ||||
|       walker = prev | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const del = (self, node) => { | ||||
|   if (node) { | ||||
|     const hit = node.value | ||||
|     if (self[DISPOSE]) | ||||
|       self[DISPOSE](hit.key, hit.value) | ||||
| 
 | ||||
|     self[LENGTH] -= hit.length | ||||
|     self[CACHE].delete(hit.key) | ||||
|     self[LRU_LIST].removeNode(node) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class Entry { | ||||
|   constructor (key, value, length, now, maxAge) { | ||||
|     this.key = key | ||||
|     this.value = value | ||||
|     this.length = length | ||||
|     this.now = now | ||||
|     this.maxAge = maxAge || 0 | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const forEachStep = (self, fn, node, thisp) => { | ||||
|   let hit = node.value | ||||
|   if (isStale(self, hit)) { | ||||
|     del(self, node) | ||||
|     if (!self[ALLOW_STALE]) | ||||
|       hit = undefined | ||||
|   } | ||||
|   if (hit) | ||||
|     fn.call(thisp, hit.value, hit.key, self) | ||||
| } | ||||
| 
 | ||||
| module.exports = LRUCache | ||||
							
								
								
									
										34
									
								
								node_modules/lru-cache/package.json
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								node_modules/lru-cache/package.json
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | |||
| { | ||||
|   "name": "lru-cache", | ||||
|   "description": "A cache object that deletes the least-recently-used items.", | ||||
|   "version": "6.0.0", | ||||
|   "author": "Isaac Z. Schlueter <i@izs.me>", | ||||
|   "keywords": [ | ||||
|     "mru", | ||||
|     "lru", | ||||
|     "cache" | ||||
|   ], | ||||
|   "scripts": { | ||||
|     "test": "tap", | ||||
|     "snap": "tap", | ||||
|     "preversion": "npm test", | ||||
|     "postversion": "npm publish", | ||||
|     "prepublishOnly": "git push origin --follow-tags" | ||||
|   }, | ||||
|   "main": "index.js", | ||||
|   "repository": "git://github.com/isaacs/node-lru-cache.git", | ||||
|   "devDependencies": { | ||||
|     "benchmark": "^2.1.4", | ||||
|     "tap": "^14.10.7" | ||||
|   }, | ||||
|   "license": "ISC", | ||||
|   "dependencies": { | ||||
|     "yallist": "^4.0.0" | ||||
|   }, | ||||
|   "files": [ | ||||
|     "index.js" | ||||
|   ], | ||||
|   "engines": { | ||||
|     "node": ">=10" | ||||
|   } | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue