iconify-browser-cache
Version:
```html <script src="https://cdn.jsdelivr.net/npm/iconify-browser-cache@0.4.0/dist/iconify-browser-cache.umd.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/iconify-icon@3.0.0/dist/iconify-icon.min.js"></script> ```
2 lines (1 loc) • 1.98 kB
JavaScript
!function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";const e=(e,t)=>{const o=JSON.stringify(e);return new Response(o,t)},t={getItem:async e=>{const t=window.localStorage.getItem(e);return t?JSON.parse(t):null},setItemRaw:async(e,t)=>{window.localStorage.setItem(e,JSON.stringify(t))},remove:async e=>{window.localStorage.removeItem(e)},removeExpired:async e=>{const t=Date.now(),o=Object.keys(window.localStorage);let n=[];o.filter(t=>t.startsWith(e)&&t.endsWith(".metadata")).map(e=>{const o=window.localStorage.getItem(e);if(o){const i=JSON.parse(o);if(t>=i.expires){window.localStorage.removeItem(e);const t=e.replace(/\.metadata$/,"");n.push(t)}}});o.filter(e=>n.some(t=>e.startsWith(t))).map(e=>window.localStorage.removeItem(e))}};var o;o={ttl:15552e6,prefix:"iconify-browser-cache",storage:"localStorage"},"undefined"!=typeof window&&(window.IconifyBrowserCache={fetch:window.fetch.bind(window),config:{ttl:o.ttl,prefix:o.prefix,storage:o.storage}},window.fetch=async(o,n)=>{const i=window.IconifyBrowserCache.fetch.bind(window.IconifyBrowserCache);if(!(o=o instanceof URL?o.toString():o instanceof Request?o.url:String(o)).includes("https://api.iconify.design/"))return i(o,n);const a=Date.now(),r=window.IconifyBrowserCache.config.prefix,s=window.IconifyBrowserCache.config.ttl,c=t,w=o.match(/\/([^\/?]+)\.json/)?.[1],f=new URL(o).searchParams?.get("icons")?.split(","),d={},l=`${r}:${w}`;if(!w||!f?.length)return i(o,n);await c.removeExpired(r);for(const e of f){const t=`${l}:${e}`,o=await c.getItem(t);o&&(d[e]={body:o})}const g=await c.getItem(`${l}.metadata`),{width:h,height:m,expires:p}=g||{};if(Object.keys(d).length===f.length&&p&&a<(p||0))return e({icons:d,prefix:w,width:h,height:m});const y=await i(o,n),I=await y.json();for(const[e,{body:t}]of Object.entries(I.icons))await Promise.all([c.setItemRaw(`${l}:${e}`,t),c.setItemRaw(`${l}.metadata`,{collection:w,width:I.width,height:I.height,expires:a+s})]);return e(I)})});