From 6a284e6b4b321306ea418d4fc4c4f6efccc203d5 Mon Sep 17 00:00:00 2001 From: Jason Mulligan Date: Fri, 7 Apr 2023 10:31:42 -0400 Subject: [PATCH 1/2] Updating rollup config such that ecma module is '.js' and UMD is 'umd.js', replacing private `#has()` with equal `has()`, updating test such that it imports by name, updating package.json such that `exports` key is present for esm and cjs usage --- dist/tiny-lru.cjs | 18 +++++++++--------- dist/tiny-lru.esm.min.js | 5 ----- dist/tiny-lru.esm.min.js.map | 1 - dist/tiny-lru.js | 20 +++++++++----------- dist/tiny-lru.min.js | 4 ++-- dist/tiny-lru.min.js.map | 2 +- dist/{tiny-lru.esm.js => tiny-lru.umd.js} | 20 +++++++++----------- dist/tiny-lru.umd.min.js | 5 +++++ dist/tiny-lru.umd.min.js.map | 1 + package-lock.json | 4 ++-- package.json | 14 ++++++++------ rollup.config.js | 8 ++++---- src/has.js | 3 +++ src/lru.js | 14 ++++++-------- test/lru.js | 2 +- 15 files changed, 60 insertions(+), 61 deletions(-) delete mode 100644 dist/tiny-lru.esm.min.js delete mode 100644 dist/tiny-lru.esm.min.js.map rename dist/{tiny-lru.esm.js => tiny-lru.umd.js} (85%) create mode 100644 dist/tiny-lru.umd.min.js create mode 100644 dist/tiny-lru.umd.min.js.map create mode 100644 src/has.js diff --git a/dist/tiny-lru.cjs b/dist/tiny-lru.cjs index 7fdb4a6..8ef1114 100644 --- a/dist/tiny-lru.cjs +++ b/dist/tiny-lru.cjs @@ -3,10 +3,14 @@ * * @copyright 2023 Jason Mulligan * @license BSD-3-Clause - * @version 10.4.1 + * @version 11.0.0 */ 'use strict'; +function has (items, key) { + return key in items; +} + class LRU { constructor (max = 0, ttl = 0, resetTtl = false) { this.first = null; @@ -28,7 +32,7 @@ class LRU { } delete (key) { - if (this.#has(key)) { + if (has(this.items, key)) { const item = this.items[key]; delete this.items[key]; @@ -75,7 +79,7 @@ class LRU { expiresAt (key) { let result; - if (this.#has(key)) { + if (has(this.items, key)) { result = this.items[key].expiry; } @@ -85,7 +89,7 @@ class LRU { get (key) { let result; - if (this.#has(key)) { + if (has(this.items, key)) { const item = this.items[key]; if (this.ttl > 0 && item.expiry <= Date.now()) { @@ -99,10 +103,6 @@ class LRU { return result; } - #has (key) { - return key in this.items; - } - keys () { return Object.keys(this.items); } @@ -110,7 +110,7 @@ class LRU { set (key, value, bypass = false, resetTtl = this.resetTtl) { let item; - if (bypass || this.#has(key)) { + if (bypass || has(this.items, key)) { item = this.items[key]; item.value = value; diff --git a/dist/tiny-lru.esm.min.js b/dist/tiny-lru.esm.min.js deleted file mode 100644 index b6cdf7c..0000000 --- a/dist/tiny-lru.esm.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! - 2023 Jason Mulligan - @version 10.4.1 -*/ -class t{constructor(t=0,s=0,e=!1){this.first=null,this.items=Object.create(null),this.last=null,this.max=t,this.resetTtl=e,this.size=0,this.ttl=s}clear(){return this.first=null,this.items=Object.create(null),this.last=null,this.size=0,this}delete(t){if(this.#t(t)){const s=this.items[t];delete this.items[t],this.size--,null!==s.prev&&(s.prev.next=s.next),null!==s.next&&(s.next.prev=s.prev),this.first===s&&(this.first=s.next),this.last===s&&(this.last=s.prev)}return this}evict(t=!1){if(t||this.size>0){const t=this.first;delete this.items[t.key],0==--this.size?(this.first=null,this.last=null):(this.first=t.next,this.first.prev=null)}return this}expiresAt(t){let s;return this.#t(t)&&(s=this.items[t].expiry),s}get(t){let s;if(this.#t(t)){const e=this.items[t];this.ttl>0&&e.expiry<=Date.now()?this.delete(t):(s=e.value,this.set(t,s,!0))}return s}#t(t){return t in this.items}keys(){return Object.keys(this.items)}set(t,s,e=!1,i=this.resetTtl){let l;if(e||this.#t(t)){if(l=this.items[t],l.value=s,i&&(l.expiry=this.ttl>0?Date.now()+this.ttl:this.ttl),this.last!==l){const t=this.last,s=l.next,e=l.prev;this.first===l&&(this.first=l.next),l.next=null,l.prev=this.last,t.next=l,null!==e&&(e.next=s),null!==s&&(s.prev=e)}}else this.max>0&&this.size===this.max&&this.evict(!0),l=this.items[t]={expiry:this.ttl>0?Date.now()+this.ttl:this.ttl,key:t,prev:this.last,next:null,value:s},1==++this.size?this.first=l:this.last.next=l;return this.last=l,this}}function s(s=1e3,e=0,i=!1){if(isNaN(s)||s<0)throw new TypeError("Invalid max value");if(isNaN(e)||e<0)throw new TypeError("Invalid ttl value");if("boolean"!=typeof i)throw new TypeError("Invalid resetTtl value");return new t(s,e,i)}export{s as lru};//# sourceMappingURL=tiny-lru.esm.min.js.map diff --git a/dist/tiny-lru.esm.min.js.map b/dist/tiny-lru.esm.min.js.map deleted file mode 100644 index 0b280a7..0000000 --- a/dist/tiny-lru.esm.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"tiny-lru.esm.min.js","sources":["../src/lru.js"],"sourcesContent":["class LRU {\r\n\tconstructor (max = 0, ttl = 0, resetTtl = false) {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.max = max;\r\n\t\tthis.resetTtl = resetTtl;\r\n\t\tthis.size = 0;\r\n\t\tthis.ttl = ttl;\r\n\t}\r\n\r\n\tclear () {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.size = 0;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tdelete (key) {\r\n\t\tif (this.#has(key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tdelete this.items[key];\r\n\t\t\tthis.size--;\r\n\r\n\t\t\tif (item.prev !== null) {\r\n\t\t\t\titem.prev.next = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (item.next !== null) {\r\n\t\t\t\titem.next.prev = item.prev;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.first === item) {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last === item) {\r\n\t\t\t\tthis.last = item.prev;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tevict (bypass = false) {\r\n\t\tif (bypass || this.size > 0) {\r\n\t\t\tconst item = this.first;\r\n\r\n\t\t\tdelete this.items[item.key];\r\n\r\n\t\t\tif (--this.size === 0) {\r\n\t\t\t\tthis.first = null;\r\n\t\t\t\tthis.last = null;\r\n\t\t\t} else {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t\tthis.first.prev = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\texpiresAt (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (this.#has(key)) {\r\n\t\t\tresult = this.items[key].expiry;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tget (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (this.#has(key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tif (this.ttl > 0 && item.expiry <= Date.now()) {\r\n\t\t\t\tthis.delete(key);\r\n\t\t\t} else {\r\n\t\t\t\tresult = item.value;\r\n\t\t\t\tthis.set(key, result, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t#has (key) {\r\n\t\treturn key in this.items;\r\n\t}\r\n\r\n\tkeys () {\r\n\t\treturn Object.keys(this.items);\r\n\t}\r\n\r\n\tset (key, value, bypass = false, resetTtl = this.resetTtl) {\r\n\t\tlet item;\r\n\r\n\t\tif (bypass || this.#has(key)) {\r\n\t\t\titem = this.items[key];\r\n\t\t\titem.value = value;\r\n\r\n\t\t\tif (resetTtl) {\r\n\t\t\t\titem.expiry = this.ttl > 0 ? Date.now() + this.ttl : this.ttl;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last !== item) {\r\n\t\t\t\tconst last = this.last,\r\n\t\t\t\t\tnext = item.next,\r\n\t\t\t\t\tprev = item.prev;\r\n\r\n\t\t\t\tif (this.first === item) {\r\n\t\t\t\t\tthis.first = item.next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\titem.next = null;\r\n\t\t\t\titem.prev = this.last;\r\n\t\t\t\tlast.next = item;\r\n\r\n\t\t\t\tif (prev !== null) {\r\n\t\t\t\t\tprev.next = next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (next !== null) {\r\n\t\t\t\t\tnext.prev = prev;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (this.max > 0 && this.size === this.max) {\r\n\t\t\t\tthis.evict(true);\r\n\t\t\t}\r\n\r\n\t\t\titem = this.items[key] = {\r\n\t\t\t\texpiry: this.ttl > 0 ? Date.now() + this.ttl : this.ttl,\r\n\t\t\t\tkey: key,\r\n\t\t\t\tprev: this.last,\r\n\t\t\t\tnext: null,\r\n\t\t\t\tvalue\r\n\t\t\t};\r\n\r\n\t\t\tif (++this.size === 1) {\r\n\t\t\t\tthis.first = item;\r\n\t\t\t} else {\r\n\t\t\t\tthis.last.next = item;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.last = item;\r\n\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nexport function lru (max = 1000, ttl = 0, resetTtl = false) {\r\n\tif (isNaN(max) || max < 0) {\r\n\t\tthrow new TypeError(\"Invalid max value\");\r\n\t}\r\n\r\n\tif (isNaN(ttl) || ttl < 0) {\r\n\t\tthrow new TypeError(\"Invalid ttl value\");\r\n\t}\r\n\r\n\tif (typeof resetTtl !== \"boolean\") {\r\n\t\tthrow new TypeError(\"Invalid resetTtl value\");\r\n\t}\r\n\r\n\treturn new LRU(max, ttl, resetTtl);\r\n}\r\n"],"names":["LRU","constructor","max","ttl","resetTtl","this","first","items","Object","create","last","size","clear","delete","key","has","item","prev","next","evict","bypass","expiresAt","result","expiry","get","Date","now","value","set","keys","lru","isNaN","TypeError"],"mappings":";;;;AAAA,MAAMA,EACLC,YAAaC,EAAM,EAAGC,EAAM,EAAGC,GAAW,GACzCC,KAAKC,MAAQ,KACbD,KAAKE,MAAQC,OAAOC,OAAO,MAC3BJ,KAAKK,KAAO,KACZL,KAAKH,IAAMA,EACXG,KAAKD,SAAWA,EAChBC,KAAKM,KAAO,EACZN,KAAKF,IAAMA,CACX,CAEDS,QAMC,OALAP,KAAKC,MAAQ,KACbD,KAAKE,MAAQC,OAAOC,OAAO,MAC3BJ,KAAKK,KAAO,KACZL,KAAKM,KAAO,EAELN,IACP,CAEDQ,OAAQC,GACP,GAAIT,MAAKU,EAAKD,GAAM,CACnB,MAAME,EAAOX,KAAKE,MAAMO,UAEjBT,KAAKE,MAAMO,GAClBT,KAAKM,OAEa,OAAdK,EAAKC,OACRD,EAAKC,KAAKC,KAAOF,EAAKE,MAGL,OAAdF,EAAKE,OACRF,EAAKE,KAAKD,KAAOD,EAAKC,MAGnBZ,KAAKC,QAAUU,IAClBX,KAAKC,MAAQU,EAAKE,MAGfb,KAAKK,OAASM,IACjBX,KAAKK,KAAOM,EAAKC,KAElB,CAED,OAAOZ,IACP,CAEDc,MAAOC,GAAS,GACf,GAAIA,GAAUf,KAAKM,KAAO,EAAG,CAC5B,MAAMK,EAAOX,KAAKC,aAEXD,KAAKE,MAAMS,EAAKF,KAEH,KAAdT,KAAKM,MACVN,KAAKC,MAAQ,KACbD,KAAKK,KAAO,OAEZL,KAAKC,MAAQU,EAAKE,KAClBb,KAAKC,MAAMW,KAAO,KAEnB,CAED,OAAOZ,IACP,CAEDgB,UAAWP,GACV,IAAIQ,EAMJ,OAJIjB,MAAKU,EAAKD,KACbQ,EAASjB,KAAKE,MAAMO,GAAKS,QAGnBD,CACP,CAEDE,IAAKV,GACJ,IAAIQ,EAEJ,GAAIjB,MAAKU,EAAKD,GAAM,CACnB,MAAME,EAAOX,KAAKE,MAAMO,GAEpBT,KAAKF,IAAM,GAAKa,EAAKO,QAAUE,KAAKC,MACvCrB,KAAKQ,OAAOC,IAEZQ,EAASN,EAAKW,MACdtB,KAAKuB,IAAId,EAAKQ,GAAQ,GAEvB,CAED,OAAOA,CACP,CAEDP,GAAMD,GACL,OAAOA,KAAOT,KAAKE,KACnB,CAEDsB,OACC,OAAOrB,OAAOqB,KAAKxB,KAAKE,MACxB,CAEDqB,IAAKd,EAAKa,EAAOP,GAAS,EAAOhB,EAAWC,KAAKD,UAChD,IAAIY,EAEJ,GAAII,GAAUf,MAAKU,EAAKD,IAQvB,GAPAE,EAAOX,KAAKE,MAAMO,GAClBE,EAAKW,MAAQA,EAETvB,IACHY,EAAKO,OAASlB,KAAKF,IAAM,EAAIsB,KAAKC,MAAQrB,KAAKF,IAAME,KAAKF,KAGvDE,KAAKK,OAASM,EAAM,CACvB,MAAMN,EAAOL,KAAKK,KACjBQ,EAAOF,EAAKE,KACZD,EAAOD,EAAKC,KAETZ,KAAKC,QAAUU,IAClBX,KAAKC,MAAQU,EAAKE,MAGnBF,EAAKE,KAAO,KACZF,EAAKC,KAAOZ,KAAKK,KACjBA,EAAKQ,KAAOF,EAEC,OAATC,IACHA,EAAKC,KAAOA,GAGA,OAATA,IACHA,EAAKD,KAAOA,EAEb,OAEGZ,KAAKH,IAAM,GAAKG,KAAKM,OAASN,KAAKH,KACtCG,KAAKc,OAAM,GAGZH,EAAOX,KAAKE,MAAMO,GAAO,CACxBS,OAAQlB,KAAKF,IAAM,EAAIsB,KAAKC,MAAQrB,KAAKF,IAAME,KAAKF,IACpDW,IAAKA,EACLG,KAAMZ,KAAKK,KACXQ,KAAM,KACNS,SAGmB,KAAdtB,KAAKM,KACVN,KAAKC,MAAQU,EAEbX,KAAKK,KAAKQ,KAAOF,EAMnB,OAFAX,KAAKK,KAAOM,EAELX,IACP,EAGK,SAASyB,EAAK5B,EAAM,IAAMC,EAAM,EAAGC,GAAW,GACpD,GAAI2B,MAAM7B,IAAQA,EAAM,EACvB,MAAM,IAAI8B,UAAU,qBAGrB,GAAID,MAAM5B,IAAQA,EAAM,EACvB,MAAM,IAAI6B,UAAU,qBAGrB,GAAwB,kBAAb5B,EACV,MAAM,IAAI4B,UAAU,0BAGrB,OAAO,IAAIhC,EAAIE,EAAKC,EAAKC,EAC1B,QAAA0B"} \ No newline at end of file diff --git a/dist/tiny-lru.js b/dist/tiny-lru.js index 48671d8..fde01dc 100644 --- a/dist/tiny-lru.js +++ b/dist/tiny-lru.js @@ -3,9 +3,11 @@ * * @copyright 2023 Jason Mulligan * @license BSD-3-Clause - * @version 10.4.1 + * @version 11.0.0 */ -(function(g,f){typeof exports==='object'&&typeof module!=='undefined'?f(exports):typeof define==='function'&&define.amd?define(['exports'],f):(g=typeof globalThis!=='undefined'?globalThis:g||self,f(g.lru={}));})(this,(function(exports){'use strict';class LRU { +function has (items, key) { + return key in items; +}class LRU { constructor (max = 0, ttl = 0, resetTtl = false) { this.first = null; this.items = Object.create(null); @@ -26,7 +28,7 @@ } delete (key) { - if (this.#has(key)) { + if (has(this.items, key)) { const item = this.items[key]; delete this.items[key]; @@ -73,7 +75,7 @@ expiresAt (key) { let result; - if (this.#has(key)) { + if (has(this.items, key)) { result = this.items[key].expiry; } @@ -83,7 +85,7 @@ get (key) { let result; - if (this.#has(key)) { + if (has(this.items, key)) { const item = this.items[key]; if (this.ttl > 0 && item.expiry <= Date.now()) { @@ -97,10 +99,6 @@ return result; } - #has (key) { - return key in this.items; - } - keys () { return Object.keys(this.items); } @@ -108,7 +106,7 @@ set (key, value, bypass = false, resetTtl = this.resetTtl) { let item; - if (bypass || this.#has(key)) { + if (bypass || has(this.items, key)) { item = this.items[key]; item.value = value; @@ -177,4 +175,4 @@ function lru (max = 1000, ttl = 0, resetTtl = false) { } return new LRU(max, ttl, resetTtl); -}exports.lru=lru;})); \ No newline at end of file +}export{lru}; \ No newline at end of file diff --git a/dist/tiny-lru.min.js b/dist/tiny-lru.min.js index 58f10e4..2fbdae0 100644 --- a/dist/tiny-lru.min.js +++ b/dist/tiny-lru.min.js @@ -1,5 +1,5 @@ /*! 2023 Jason Mulligan - @version 10.4.1 + @version 11.0.0 */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).lru={})}(this,(function(t){"use strict";class e{constructor(t=0,e=0,s=!1){this.first=null,this.items=Object.create(null),this.last=null,this.max=t,this.resetTtl=s,this.size=0,this.ttl=e}clear(){return this.first=null,this.items=Object.create(null),this.last=null,this.size=0,this}delete(t){if(this.#t(t)){const e=this.items[t];delete this.items[t],this.size--,null!==e.prev&&(e.prev.next=e.next),null!==e.next&&(e.next.prev=e.prev),this.first===e&&(this.first=e.next),this.last===e&&(this.last=e.prev)}return this}evict(t=!1){if(t||this.size>0){const t=this.first;delete this.items[t.key],0==--this.size?(this.first=null,this.last=null):(this.first=t.next,this.first.prev=null)}return this}expiresAt(t){let e;return this.#t(t)&&(e=this.items[t].expiry),e}get(t){let e;if(this.#t(t)){const s=this.items[t];this.ttl>0&&s.expiry<=Date.now()?this.delete(t):(e=s.value,this.set(t,e,!0))}return e}#t(t){return t in this.items}keys(){return Object.keys(this.items)}set(t,e,s=!1,i=this.resetTtl){let l;if(s||this.#t(t)){if(l=this.items[t],l.value=e,i&&(l.expiry=this.ttl>0?Date.now()+this.ttl:this.ttl),this.last!==l){const t=this.last,e=l.next,s=l.prev;this.first===l&&(this.first=l.next),l.next=null,l.prev=this.last,t.next=l,null!==s&&(s.next=e),null!==e&&(e.prev=s)}}else this.max>0&&this.size===this.max&&this.evict(!0),l=this.items[t]={expiry:this.ttl>0?Date.now()+this.ttl:this.ttl,key:t,prev:this.last,next:null,value:e},1==++this.size?this.first=l:this.last.next=l;return this.last=l,this}}t.lru=function(t=1e3,s=0,i=!1){if(isNaN(t)||t<0)throw new TypeError("Invalid max value");if(isNaN(s)||s<0)throw new TypeError("Invalid ttl value");if("boolean"!=typeof i)throw new TypeError("Invalid resetTtl value");return new e(t,s,i)}}));//# sourceMappingURL=tiny-lru.min.js.map +function t(t,s){return s in t}class s{constructor(t=0,s=0,e=!1){this.first=null,this.items=Object.create(null),this.last=null,this.max=t,this.resetTtl=e,this.size=0,this.ttl=s}clear(){return this.first=null,this.items=Object.create(null),this.last=null,this.size=0,this}delete(s){if(t(this.items,s)){const t=this.items[s];delete this.items[s],this.size--,null!==t.prev&&(t.prev.next=t.next),null!==t.next&&(t.next.prev=t.prev),this.first===t&&(this.first=t.next),this.last===t&&(this.last=t.prev)}return this}evict(t=!1){if(t||this.size>0){const t=this.first;delete this.items[t.key],0==--this.size?(this.first=null,this.last=null):(this.first=t.next,this.first.prev=null)}return this}expiresAt(s){let e;return t(this.items,s)&&(e=this.items[s].expiry),e}get(s){let e;if(t(this.items,s)){const t=this.items[s];this.ttl>0&&t.expiry<=Date.now()?this.delete(s):(e=t.value,this.set(s,e,!0))}return e}keys(){return Object.keys(this.items)}set(s,e,i=!1,l=this.resetTtl){let h;if(i||t(this.items,s)){if(h=this.items[s],h.value=e,l&&(h.expiry=this.ttl>0?Date.now()+this.ttl:this.ttl),this.last!==h){const t=this.last,s=h.next,e=h.prev;this.first===h&&(this.first=h.next),h.next=null,h.prev=this.last,t.next=h,null!==e&&(e.next=s),null!==s&&(s.prev=e)}}else this.max>0&&this.size===this.max&&this.evict(!0),h=this.items[s]={expiry:this.ttl>0?Date.now()+this.ttl:this.ttl,key:s,prev:this.last,next:null,value:e},1==++this.size?this.first=h:this.last.next=h;return this.last=h,this}}function e(t=1e3,e=0,i=!1){if(isNaN(t)||t<0)throw new TypeError("Invalid max value");if(isNaN(e)||e<0)throw new TypeError("Invalid ttl value");if("boolean"!=typeof i)throw new TypeError("Invalid resetTtl value");return new s(t,e,i)}export{e as lru};//# sourceMappingURL=tiny-lru.min.js.map diff --git a/dist/tiny-lru.min.js.map b/dist/tiny-lru.min.js.map index 6e9f499..eaae53c 100644 --- a/dist/tiny-lru.min.js.map +++ b/dist/tiny-lru.min.js.map @@ -1 +1 @@ -{"version":3,"file":"tiny-lru.min.js","sources":["../src/lru.js"],"sourcesContent":["class LRU {\r\n\tconstructor (max = 0, ttl = 0, resetTtl = false) {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.max = max;\r\n\t\tthis.resetTtl = resetTtl;\r\n\t\tthis.size = 0;\r\n\t\tthis.ttl = ttl;\r\n\t}\r\n\r\n\tclear () {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.size = 0;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tdelete (key) {\r\n\t\tif (this.#has(key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tdelete this.items[key];\r\n\t\t\tthis.size--;\r\n\r\n\t\t\tif (item.prev !== null) {\r\n\t\t\t\titem.prev.next = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (item.next !== null) {\r\n\t\t\t\titem.next.prev = item.prev;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.first === item) {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last === item) {\r\n\t\t\t\tthis.last = item.prev;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tevict (bypass = false) {\r\n\t\tif (bypass || this.size > 0) {\r\n\t\t\tconst item = this.first;\r\n\r\n\t\t\tdelete this.items[item.key];\r\n\r\n\t\t\tif (--this.size === 0) {\r\n\t\t\t\tthis.first = null;\r\n\t\t\t\tthis.last = null;\r\n\t\t\t} else {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t\tthis.first.prev = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\texpiresAt (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (this.#has(key)) {\r\n\t\t\tresult = this.items[key].expiry;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tget (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (this.#has(key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tif (this.ttl > 0 && item.expiry <= Date.now()) {\r\n\t\t\t\tthis.delete(key);\r\n\t\t\t} else {\r\n\t\t\t\tresult = item.value;\r\n\t\t\t\tthis.set(key, result, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t#has (key) {\r\n\t\treturn key in this.items;\r\n\t}\r\n\r\n\tkeys () {\r\n\t\treturn Object.keys(this.items);\r\n\t}\r\n\r\n\tset (key, value, bypass = false, resetTtl = this.resetTtl) {\r\n\t\tlet item;\r\n\r\n\t\tif (bypass || this.#has(key)) {\r\n\t\t\titem = this.items[key];\r\n\t\t\titem.value = value;\r\n\r\n\t\t\tif (resetTtl) {\r\n\t\t\t\titem.expiry = this.ttl > 0 ? Date.now() + this.ttl : this.ttl;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last !== item) {\r\n\t\t\t\tconst last = this.last,\r\n\t\t\t\t\tnext = item.next,\r\n\t\t\t\t\tprev = item.prev;\r\n\r\n\t\t\t\tif (this.first === item) {\r\n\t\t\t\t\tthis.first = item.next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\titem.next = null;\r\n\t\t\t\titem.prev = this.last;\r\n\t\t\t\tlast.next = item;\r\n\r\n\t\t\t\tif (prev !== null) {\r\n\t\t\t\t\tprev.next = next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (next !== null) {\r\n\t\t\t\t\tnext.prev = prev;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (this.max > 0 && this.size === this.max) {\r\n\t\t\t\tthis.evict(true);\r\n\t\t\t}\r\n\r\n\t\t\titem = this.items[key] = {\r\n\t\t\t\texpiry: this.ttl > 0 ? Date.now() + this.ttl : this.ttl,\r\n\t\t\t\tkey: key,\r\n\t\t\t\tprev: this.last,\r\n\t\t\t\tnext: null,\r\n\t\t\t\tvalue\r\n\t\t\t};\r\n\r\n\t\t\tif (++this.size === 1) {\r\n\t\t\t\tthis.first = item;\r\n\t\t\t} else {\r\n\t\t\t\tthis.last.next = item;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.last = item;\r\n\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nexport function lru (max = 1000, ttl = 0, resetTtl = false) {\r\n\tif (isNaN(max) || max < 0) {\r\n\t\tthrow new TypeError(\"Invalid max value\");\r\n\t}\r\n\r\n\tif (isNaN(ttl) || ttl < 0) {\r\n\t\tthrow new TypeError(\"Invalid ttl value\");\r\n\t}\r\n\r\n\tif (typeof resetTtl !== \"boolean\") {\r\n\t\tthrow new TypeError(\"Invalid resetTtl value\");\r\n\t}\r\n\r\n\treturn new LRU(max, ttl, resetTtl);\r\n}\r\n"],"names":["g","f","exports","module","define","amd","globalThis","self","lru","this","LRU","constructor","max","ttl","resetTtl","first","items","Object","create","last","size","clear","delete","key","has","item","prev","next","evict","bypass","expiresAt","result","expiry","get","Date","now","value","set","keys","isNaN","TypeError"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tiny-lru.min.js","sources":["../src/has.js","../src/lru.js"],"sourcesContent":["export function has (items, key) {\r\n\treturn key in items;\r\n}\n","import {has} from \"./has.js\";\r\n\r\nclass LRU {\r\n\tconstructor (max = 0, ttl = 0, resetTtl = false) {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.max = max;\r\n\t\tthis.resetTtl = resetTtl;\r\n\t\tthis.size = 0;\r\n\t\tthis.ttl = ttl;\r\n\t}\r\n\r\n\tclear () {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.size = 0;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tdelete (key) {\r\n\t\tif (has(this.items, key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tdelete this.items[key];\r\n\t\t\tthis.size--;\r\n\r\n\t\t\tif (item.prev !== null) {\r\n\t\t\t\titem.prev.next = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (item.next !== null) {\r\n\t\t\t\titem.next.prev = item.prev;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.first === item) {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last === item) {\r\n\t\t\t\tthis.last = item.prev;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tevict (bypass = false) {\r\n\t\tif (bypass || this.size > 0) {\r\n\t\t\tconst item = this.first;\r\n\r\n\t\t\tdelete this.items[item.key];\r\n\r\n\t\t\tif (--this.size === 0) {\r\n\t\t\t\tthis.first = null;\r\n\t\t\t\tthis.last = null;\r\n\t\t\t} else {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t\tthis.first.prev = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\texpiresAt (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (has(this.items, key)) {\r\n\t\t\tresult = this.items[key].expiry;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tget (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (has(this.items, key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tif (this.ttl > 0 && item.expiry <= Date.now()) {\r\n\t\t\t\tthis.delete(key);\r\n\t\t\t} else {\r\n\t\t\t\tresult = item.value;\r\n\t\t\t\tthis.set(key, result, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tkeys () {\r\n\t\treturn Object.keys(this.items);\r\n\t}\r\n\r\n\tset (key, value, bypass = false, resetTtl = this.resetTtl) {\r\n\t\tlet item;\r\n\r\n\t\tif (bypass || has(this.items, key)) {\r\n\t\t\titem = this.items[key];\r\n\t\t\titem.value = value;\r\n\r\n\t\t\tif (resetTtl) {\r\n\t\t\t\titem.expiry = this.ttl > 0 ? Date.now() + this.ttl : this.ttl;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last !== item) {\r\n\t\t\t\tconst last = this.last,\r\n\t\t\t\t\tnext = item.next,\r\n\t\t\t\t\tprev = item.prev;\r\n\r\n\t\t\t\tif (this.first === item) {\r\n\t\t\t\t\tthis.first = item.next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\titem.next = null;\r\n\t\t\t\titem.prev = this.last;\r\n\t\t\t\tlast.next = item;\r\n\r\n\t\t\t\tif (prev !== null) {\r\n\t\t\t\t\tprev.next = next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (next !== null) {\r\n\t\t\t\t\tnext.prev = prev;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (this.max > 0 && this.size === this.max) {\r\n\t\t\t\tthis.evict(true);\r\n\t\t\t}\r\n\r\n\t\t\titem = this.items[key] = {\r\n\t\t\t\texpiry: this.ttl > 0 ? Date.now() + this.ttl : this.ttl,\r\n\t\t\t\tkey: key,\r\n\t\t\t\tprev: this.last,\r\n\t\t\t\tnext: null,\r\n\t\t\t\tvalue\r\n\t\t\t};\r\n\r\n\t\t\tif (++this.size === 1) {\r\n\t\t\t\tthis.first = item;\r\n\t\t\t} else {\r\n\t\t\t\tthis.last.next = item;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.last = item;\r\n\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nexport function lru (max = 1000, ttl = 0, resetTtl = false) {\r\n\tif (isNaN(max) || max < 0) {\r\n\t\tthrow new TypeError(\"Invalid max value\");\r\n\t}\r\n\r\n\tif (isNaN(ttl) || ttl < 0) {\r\n\t\tthrow new TypeError(\"Invalid ttl value\");\r\n\t}\r\n\r\n\tif (typeof resetTtl !== \"boolean\") {\r\n\t\tthrow new TypeError(\"Invalid resetTtl value\");\r\n\t}\r\n\r\n\treturn new LRU(max, ttl, resetTtl);\r\n}\r\n"],"names":["has","items","key","LRU","constructor","max","ttl","resetTtl","this","first","Object","create","last","size","clear","delete","item","prev","next","evict","bypass","expiresAt","result","expiry","get","Date","now","value","set","keys","lru","isNaN","TypeError"],"mappings":"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"} \ No newline at end of file diff --git a/dist/tiny-lru.esm.js b/dist/tiny-lru.umd.js similarity index 85% rename from dist/tiny-lru.esm.js rename to dist/tiny-lru.umd.js index 8592c16..eb4667a 100644 --- a/dist/tiny-lru.esm.js +++ b/dist/tiny-lru.umd.js @@ -3,9 +3,11 @@ * * @copyright 2023 Jason Mulligan * @license BSD-3-Clause - * @version 10.4.1 + * @version 11.0.0 */ -class LRU { +(function(g,f){typeof exports==='object'&&typeof module!=='undefined'?f(exports):typeof define==='function'&&define.amd?define(['exports'],f):(g=typeof globalThis!=='undefined'?globalThis:g||self,f(g.lru={}));})(this,(function(exports){'use strict';function has (items, key) { + return key in items; +}class LRU { constructor (max = 0, ttl = 0, resetTtl = false) { this.first = null; this.items = Object.create(null); @@ -26,7 +28,7 @@ class LRU { } delete (key) { - if (this.#has(key)) { + if (has(this.items, key)) { const item = this.items[key]; delete this.items[key]; @@ -73,7 +75,7 @@ class LRU { expiresAt (key) { let result; - if (this.#has(key)) { + if (has(this.items, key)) { result = this.items[key].expiry; } @@ -83,7 +85,7 @@ class LRU { get (key) { let result; - if (this.#has(key)) { + if (has(this.items, key)) { const item = this.items[key]; if (this.ttl > 0 && item.expiry <= Date.now()) { @@ -97,10 +99,6 @@ class LRU { return result; } - #has (key) { - return key in this.items; - } - keys () { return Object.keys(this.items); } @@ -108,7 +106,7 @@ class LRU { set (key, value, bypass = false, resetTtl = this.resetTtl) { let item; - if (bypass || this.#has(key)) { + if (bypass || has(this.items, key)) { item = this.items[key]; item.value = value; @@ -177,4 +175,4 @@ function lru (max = 1000, ttl = 0, resetTtl = false) { } return new LRU(max, ttl, resetTtl); -}export{lru}; \ No newline at end of file +}exports.lru=lru;})); \ No newline at end of file diff --git a/dist/tiny-lru.umd.min.js b/dist/tiny-lru.umd.min.js new file mode 100644 index 0000000..17bbe89 --- /dev/null +++ b/dist/tiny-lru.umd.min.js @@ -0,0 +1,5 @@ +/*! + 2023 Jason Mulligan + @version 11.0.0 +*/ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).lru={})}(this,(function(t){"use strict";function e(t,e){return e in t}class s{constructor(t=0,e=0,s=!1){this.first=null,this.items=Object.create(null),this.last=null,this.max=t,this.resetTtl=s,this.size=0,this.ttl=e}clear(){return this.first=null,this.items=Object.create(null),this.last=null,this.size=0,this}delete(t){if(e(this.items,t)){const e=this.items[t];delete this.items[t],this.size--,null!==e.prev&&(e.prev.next=e.next),null!==e.next&&(e.next.prev=e.prev),this.first===e&&(this.first=e.next),this.last===e&&(this.last=e.prev)}return this}evict(t=!1){if(t||this.size>0){const t=this.first;delete this.items[t.key],0==--this.size?(this.first=null,this.last=null):(this.first=t.next,this.first.prev=null)}return this}expiresAt(t){let s;return e(this.items,t)&&(s=this.items[t].expiry),s}get(t){let s;if(e(this.items,t)){const e=this.items[t];this.ttl>0&&e.expiry<=Date.now()?this.delete(t):(s=e.value,this.set(t,s,!0))}return s}keys(){return Object.keys(this.items)}set(t,s,i=!1,l=this.resetTtl){let n;if(i||e(this.items,t)){if(n=this.items[t],n.value=s,l&&(n.expiry=this.ttl>0?Date.now()+this.ttl:this.ttl),this.last!==n){const t=this.last,e=n.next,s=n.prev;this.first===n&&(this.first=n.next),n.next=null,n.prev=this.last,t.next=n,null!==s&&(s.next=e),null!==e&&(e.prev=s)}}else this.max>0&&this.size===this.max&&this.evict(!0),n=this.items[t]={expiry:this.ttl>0?Date.now()+this.ttl:this.ttl,key:t,prev:this.last,next:null,value:s},1==++this.size?this.first=n:this.last.next=n;return this.last=n,this}}t.lru=function(t=1e3,e=0,i=!1){if(isNaN(t)||t<0)throw new TypeError("Invalid max value");if(isNaN(e)||e<0)throw new TypeError("Invalid ttl value");if("boolean"!=typeof i)throw new TypeError("Invalid resetTtl value");return new s(t,e,i)}}));//# sourceMappingURL=tiny-lru.umd.min.js.map diff --git a/dist/tiny-lru.umd.min.js.map b/dist/tiny-lru.umd.min.js.map new file mode 100644 index 0000000..eee142f --- /dev/null +++ b/dist/tiny-lru.umd.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tiny-lru.umd.min.js","sources":["../src/has.js","../src/lru.js"],"sourcesContent":["export function has (items, key) {\r\n\treturn key in items;\r\n}\n","import {has} from \"./has.js\";\r\n\r\nclass LRU {\r\n\tconstructor (max = 0, ttl = 0, resetTtl = false) {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.max = max;\r\n\t\tthis.resetTtl = resetTtl;\r\n\t\tthis.size = 0;\r\n\t\tthis.ttl = ttl;\r\n\t}\r\n\r\n\tclear () {\r\n\t\tthis.first = null;\r\n\t\tthis.items = Object.create(null);\r\n\t\tthis.last = null;\r\n\t\tthis.size = 0;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tdelete (key) {\r\n\t\tif (has(this.items, key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tdelete this.items[key];\r\n\t\t\tthis.size--;\r\n\r\n\t\t\tif (item.prev !== null) {\r\n\t\t\t\titem.prev.next = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (item.next !== null) {\r\n\t\t\t\titem.next.prev = item.prev;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.first === item) {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last === item) {\r\n\t\t\t\tthis.last = item.prev;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tevict (bypass = false) {\r\n\t\tif (bypass || this.size > 0) {\r\n\t\t\tconst item = this.first;\r\n\r\n\t\t\tdelete this.items[item.key];\r\n\r\n\t\t\tif (--this.size === 0) {\r\n\t\t\t\tthis.first = null;\r\n\t\t\t\tthis.last = null;\r\n\t\t\t} else {\r\n\t\t\t\tthis.first = item.next;\r\n\t\t\t\tthis.first.prev = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\texpiresAt (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (has(this.items, key)) {\r\n\t\t\tresult = this.items[key].expiry;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tget (key) {\r\n\t\tlet result;\r\n\r\n\t\tif (has(this.items, key)) {\r\n\t\t\tconst item = this.items[key];\r\n\r\n\t\t\tif (this.ttl > 0 && item.expiry <= Date.now()) {\r\n\t\t\t\tthis.delete(key);\r\n\t\t\t} else {\r\n\t\t\t\tresult = item.value;\r\n\t\t\t\tthis.set(key, result, true);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tkeys () {\r\n\t\treturn Object.keys(this.items);\r\n\t}\r\n\r\n\tset (key, value, bypass = false, resetTtl = this.resetTtl) {\r\n\t\tlet item;\r\n\r\n\t\tif (bypass || has(this.items, key)) {\r\n\t\t\titem = this.items[key];\r\n\t\t\titem.value = value;\r\n\r\n\t\t\tif (resetTtl) {\r\n\t\t\t\titem.expiry = this.ttl > 0 ? Date.now() + this.ttl : this.ttl;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.last !== item) {\r\n\t\t\t\tconst last = this.last,\r\n\t\t\t\t\tnext = item.next,\r\n\t\t\t\t\tprev = item.prev;\r\n\r\n\t\t\t\tif (this.first === item) {\r\n\t\t\t\t\tthis.first = item.next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\titem.next = null;\r\n\t\t\t\titem.prev = this.last;\r\n\t\t\t\tlast.next = item;\r\n\r\n\t\t\t\tif (prev !== null) {\r\n\t\t\t\t\tprev.next = next;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (next !== null) {\r\n\t\t\t\t\tnext.prev = prev;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (this.max > 0 && this.size === this.max) {\r\n\t\t\t\tthis.evict(true);\r\n\t\t\t}\r\n\r\n\t\t\titem = this.items[key] = {\r\n\t\t\t\texpiry: this.ttl > 0 ? Date.now() + this.ttl : this.ttl,\r\n\t\t\t\tkey: key,\r\n\t\t\t\tprev: this.last,\r\n\t\t\t\tnext: null,\r\n\t\t\t\tvalue\r\n\t\t\t};\r\n\r\n\t\t\tif (++this.size === 1) {\r\n\t\t\t\tthis.first = item;\r\n\t\t\t} else {\r\n\t\t\t\tthis.last.next = item;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.last = item;\r\n\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\nexport function lru (max = 1000, ttl = 0, resetTtl = false) {\r\n\tif (isNaN(max) || max < 0) {\r\n\t\tthrow new TypeError(\"Invalid max value\");\r\n\t}\r\n\r\n\tif (isNaN(ttl) || ttl < 0) {\r\n\t\tthrow new TypeError(\"Invalid ttl value\");\r\n\t}\r\n\r\n\tif (typeof resetTtl !== \"boolean\") {\r\n\t\tthrow new TypeError(\"Invalid resetTtl value\");\r\n\t}\r\n\r\n\treturn new LRU(max, ttl, resetTtl);\r\n}\r\n"],"names":["g","f","exports","module","define","amd","globalThis","self","lru","this","has","items","key","LRU","constructor","max","ttl","resetTtl","first","Object","create","last","size","clear","delete","item","prev","next","evict","bypass","expiresAt","result","expiry","get","Date","now","value","set","keys","isNaN","TypeError"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8681585..9f7a881 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tiny-lru", - "version": "10.4.1", + "version": "11.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "tiny-lru", - "version": "10.4.1", + "version": "11.0.0", "license": "BSD-3-Clause", "devDependencies": { "@rollup/plugin-terser": "^0.4.0", diff --git a/package.json b/package.json index bc26213..aaa6c83 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiny-lru", "description": "Tiny LRU cache for Client or Server", - "version": "10.4.1", + "version": "11.0.0", "homepage": "https://github.com/avoidwork/tiny-lru", "author": "Jason Mulligan ", "repository": { @@ -17,20 +17,22 @@ ], "license": "BSD-3-Clause", "source": "src/lru.js", - "main": "dist/tiny-lru.cjs", - "module": "dist/tiny-lru.esm.js", + "main": "dist/tiny-lru", + "exports": { + "import": "./dist/tiny-lru.js", + "require": "./dist/tiny-lru.cjs" + }, "type": "module", - "sourceType": "module", "types": "lru.d.ts", "engines": { "node": ">=12" }, "engineStrict": true, "scripts": { - "build": "npm run lint && rm -rf dist/* && npm run rollup && npm run mocha", + "build": "npm run lint && npm run rollup && npm run mocha", "benchmark": "node benchmark.js", "changelog": "auto-changelog -p", - "lint": "eslint *.js src/*.js test/*.js", + "lint": "eslint --fix *.js src/*.js test/*.js", "mocha": "mocha test/*.js", "rollup": "rollup --config", "test": "npm run lint && npm run mocha", diff --git a/rollup.config.js b/rollup.config.js index e315c04..31caa38 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -31,22 +31,22 @@ export default [ }, { ...esmOutBase, - file: `dist/${pkg.name}.esm.js` + file: `dist/${pkg.name}.js` }, { ...esmOutBase, ...minOutBase, - file: `dist/${pkg.name}.esm.min.js` + file: `dist/${pkg.name}.min.js` }, { ...umdOutBase, - file: `dist/${pkg.name}.js`, + file: `dist/${pkg.name}.umd.js`, name: "lru" }, { ...umdOutBase, ...minOutBase, - file: `dist/${pkg.name}.min.js`, + file: `dist/${pkg.name}.umd.min.js`, name: "lru" } ] diff --git a/src/has.js b/src/has.js new file mode 100644 index 0000000..ca47e0c --- /dev/null +++ b/src/has.js @@ -0,0 +1,3 @@ +export function has (items, key) { + return key in items; +} diff --git a/src/lru.js b/src/lru.js index 8ecf6a8..b48dc2c 100644 --- a/src/lru.js +++ b/src/lru.js @@ -1,3 +1,5 @@ +import {has} from "./has.js"; + class LRU { constructor (max = 0, ttl = 0, resetTtl = false) { this.first = null; @@ -19,7 +21,7 @@ class LRU { } delete (key) { - if (this.#has(key)) { + if (has(this.items, key)) { const item = this.items[key]; delete this.items[key]; @@ -66,7 +68,7 @@ class LRU { expiresAt (key) { let result; - if (this.#has(key)) { + if (has(this.items, key)) { result = this.items[key].expiry; } @@ -76,7 +78,7 @@ class LRU { get (key) { let result; - if (this.#has(key)) { + if (has(this.items, key)) { const item = this.items[key]; if (this.ttl > 0 && item.expiry <= Date.now()) { @@ -90,10 +92,6 @@ class LRU { return result; } - #has (key) { - return key in this.items; - } - keys () { return Object.keys(this.items); } @@ -101,7 +99,7 @@ class LRU { set (key, value, bypass = false, resetTtl = this.resetTtl) { let item; - if (bypass || this.#has(key)) { + if (bypass || has(this.items, key)) { item = this.items[key]; item.value = value; diff --git a/test/lru.js b/test/lru.js index 0345471..20b8a98 100644 --- a/test/lru.js +++ b/test/lru.js @@ -1,5 +1,5 @@ import assert from "node:assert"; -import {lru} from "../dist/tiny-lru.esm.js"; +import {lru} from "tiny-lru"; describe("Testing functionality", function () { beforeEach(function () { From 6e8b7a761017647d289c3ee119fd76f0294b2e8d Mon Sep 17 00:00:00 2001 From: Jason Mulligan Date: Fri, 7 Apr 2023 10:32:50 -0400 Subject: [PATCH 2/2] Generating CHANGELOG.md --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d3a13f..1779a83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,18 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [11.0.0](https://github.com/avoidwork/tiny-lru/compare/10.4.1...11.0.0) + +- Updating rollup config such that ecma module is '.js' and UMD is 'umd.js', replacing private `#has()` with equal `has()`, updating test such that it imports by name, updating package.json such that `exports` key is present for esm and cjs usage [`6a284e6`](https://github.com/avoidwork/tiny-lru/commit/6a284e6b4b321306ea418d4fc4c4f6efccc203d5) + #### [10.4.1](https://github.com/avoidwork/tiny-lru/compare/10.4.0...10.4.1) +> 2 April 2023 + - Tune evict [`#77`](https://github.com/avoidwork/tiny-lru/pull/77) - Minor optimization to `evict()` [`1f99a00`](https://github.com/avoidwork/tiny-lru/commit/1f99a00cf875e8730d30b4b5552b30c07c22901e) - Version bump to release [`2249899`](https://github.com/avoidwork/tiny-lru/commit/2249899dc1b1a92e5794af223f99f72b85e8fc1e) -- Moving `#has` to alphabetical position [`63e5c1c`](https://github.com/avoidwork/tiny-lru/commit/63e5c1c1e1e1def268bac30c0476e6d07d870a0b) +- Generating CHANGELOG.md [`eddeef3`](https://github.com/avoidwork/tiny-lru/commit/eddeef349b9841523810366b9082b0b9776c08d3) #### [10.4.0](https://github.com/avoidwork/tiny-lru/compare/10.3.0...10.4.0)