UNPKG

@codefast/image-loader

Version:

Simple, functional image loader for Next.js supporting multiple CDN providers

1 lines 3.34 kB
"use strict";const __rslib_import_meta_url__="undefined"==typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,r)=>{for(var t in r)__webpack_require__.o(r,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},__webpack_require__.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{ImageLoader:()=>ImageLoader,createImageLoader:()=>createImageLoader});class ImageLoader{domainRegistry=new Map;fallbackLoaders=[];fallbackLoader;urlCache=new Map;resultCache=new Map;maxCacheSize;constructor(e=[],r,t=1e3){this.fallbackLoader=r,this.maxCacheSize=t,this.initializeRegistry(e)}registerLoader(e,r,t){let a={loader:t,matcher:r,name:e},i=this.extractDomainFromMatcher(a);i?this.domainRegistry.set(i,t):this.fallbackLoaders.push(a)}transform(e){let{quality:r,src:t,width:a}=e,i=`${t}:${a}:${r??"undefined"}`;return this.getCachedResult(i,()=>{try{let r=this.extractDomainFromUrl(t);if(r){let t=this.domainRegistry.get(r);if(!t){for(let[e,a]of this.domainRegistry)if(r.endsWith(`.${e}`)||r===e){t=a;break}}if(t)return t(e)}for(let{loader:r,matcher:a}of this.fallbackLoaders)if(a(t))return r(e);if(this.fallbackLoader)return this.fallbackLoader(e);return t}catch{return t}})}getRegisteredLoaders(){return[...this.domainRegistry.keys(),...this.fallbackLoaders.map(({name:e})=>e)]}hasLoader(e){return!!this.domainRegistry.has(e)||this.fallbackLoaders.some(({name:r})=>r===e)}getCacheStats(){return{resultCacheSize:this.resultCache.size,urlCacheSize:this.urlCache.size}}clearCaches(){this.urlCache.clear(),this.resultCache.clear()}initializeRegistry(e){for(let r of e){let e=this.extractDomainFromMatcher(r);e&&!this.domainRegistry.has(e)?this.domainRegistry.set(e,r.loader):this.fallbackLoaders.push(r)}}extractDomainFromMatcher(e){if(e.domain)return e.domain;let r=e.matcher.toString(),t=/\.includes\("([^"]+)"\)/.exec(r);if(t)return t[1];let a=/\.startsWith\("https?:\/\/([^"]+)"\)/.exec(r);return a?a[1]:null}extractDomainFromUrl(e){try{return this.parseURL(e).hostname||null}catch{return null}}parseURL(e){let r=this.urlCache.get(e);if(r)return r;let t=new URL(e);if(this.urlCache.size>=this.maxCacheSize){let e=this.urlCache.keys().next().value;e&&this.urlCache.delete(e)}return this.urlCache.set(e,t),t}getCachedResult(e,r){let t=this.resultCache.get(e);if(t)return t;let a=r();if(this.resultCache.size>=this.maxCacheSize){let e=this.resultCache.keys().next().value;e&&this.resultCache.delete(e)}return this.resultCache.set(e,a),a}}function createImageLoader(e=[],r,t=1e3){return new ImageLoader(e,r,t)}for(var __webpack_i__ in exports.ImageLoader=__webpack_exports__.ImageLoader,exports.createImageLoader=__webpack_exports__.createImageLoader,__webpack_exports__)-1===["ImageLoader","createImageLoader"].indexOf(__webpack_i__)&&(exports[__webpack_i__]=__webpack_exports__[__webpack_i__]);Object.defineProperty(exports,"__esModule",{value:!0});