@kluntje/services
Advanced tools
+11
-0
@@ -6,2 +6,13 @@ # Change Log | ||
| ## [0.10.2](https://github.com/kluntje/kluntje/tree/develop/packages/services/compare/@kluntje/services@0.10.1...@kluntje/services@0.10.2) (2025-04-11) | ||
| ### Bug Fixes | ||
| * **services:** fixed APIService fetchRespone issue ([5c5771c](https://github.com/kluntje/kluntje/tree/develop/packages/services/commit/5c5771ce502ce9a08fd2d5064ffc792ae93a3a5e)) | ||
| ## [0.10.1](https://github.com/kluntje/kluntje/tree/develop/packages/services/compare/@kluntje/services@0.10.0...@kluntje/services@0.10.1) (2025-04-04) | ||
@@ -8,0 +19,0 @@ |
+1
-1
@@ -15,3 +15,3 @@ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@kluntje/js-utils/lib/function-helpers/decorators"),t=require("@kluntje/js-utils/lib/dom-helpers"),r=require("@kluntje/js-utils/lib/api-helpers"),s=require("@kluntje/js-utils/lib/object-helpers"),i=require("@kluntje/js-utils/lib/url-helpers");class n{constructor(){}static getInstance(){return void 0===n.instance&&(n.instance=new IntersectionObserver(n.handleIntersectionChange)),n.instance}static handleIntersectionChange(e){Object.keys(e).forEach((t=>{const r=e[t],s=r.target;r.isIntersecting?s.dispatchEvent(new CustomEvent("kl-in-vp",{bubbles:!1})):s.dispatchEvent(new CustomEvent("kl-out-vp",{bubbles:!1}))}))}} | ||
| PERFORMANCE OF THIS SOFTWARE. | ||
| ***************************************************************************** */function o(e,t,r,s){return new(r||(r=Promise))((function(i,n){function o(e){try{c(s.next(e))}catch(e){n(e)}}function a(e){try{c(s.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,a)}c((s=s.apply(e,t||[])).next())}))}class a{constructor(){this.eventIdMap=new WeakMap,this.eventBindingMap={},this.lastMQ=t.getCurrentMQ(a.mediaQuerys),t.onEvent(window,"resize",this.handleMQChange,this)}static getInstance(e){return void 0===a.instance&&(a.mediaQuerys=e,a.instance=new a),a.instance}handleMQChange(){const e=t.getCurrentMQ(a.mediaQuerys);e!==this.lastMQ&&(window.dispatchEvent(new CustomEvent("kl-mq-change",{detail:{newMQ:e,oldMQ:this.lastMQ}})),this.lastMQ=e)}}!function(e,t,r,s){var i,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(n<3?i(o):n>3?i(t,r,o):i(t,r))||o);n>3&&o&&Object.defineProperty(t,r,o)}([e.throttle(100)],a.prototype,"handleMQChange",null);const c=Symbol("resolve"),l=Symbol("reject"),h=Symbol("pending");class u{static get PLACEHOLDER_SELECTOR(){return"kl-i18n-placeholder"}static getInstance(){return void 0===u._instance&&(u._instance=new u),u._instance}get isSetUp(){return Boolean(this._url||s.isFilledObject(this._dictionary))}get loaded(){return this._loaded}get ready(){return this._ready[h]||this.fetchI18nDictionary(),this._ready}setUp({url:e,dictionary:t}={}){if(this.isSetUp)console.warn("@kluntje I18nService: service has already been set up. You can't set it up twice!");else if(e)this._url=e;else{if(!t)throw new Error('@kluntje I18nService: a "url" or "dictionary" should have been passed to the setUp function.');this._dictionary=t,this._loaded=!0,this._ready[c](),this._ready[h]=!0}}get(e,{fallback:t,interpolations:r}={}){if(this.loaded){if(this._dictionary.hasOwnProperty(e)){let t=this._dictionary[e];return r&&Object.entries(r).forEach((([e,r])=>{t=t.split(`{${e}}`).join(String(r))})),t}return console.warn(`@kluntje I18nService: i18n for key '${e}' is missing in dictionary!`),void 0!==t?t:this.getHumanReadableName(e)}return this._ready[h]||(this.addStyling(),this.fetchI18nDictionary()),this.getPlaceholder(e,{fallback:t,interpolations:r})}constructor(){this._loaded=!1,this._dictionary={},this._ready=this.getReadyPromise()}getReadyPromise(){let e,t;const r=new Promise(((r,s)=>{e=r,t=s}));return r[c]=e,r[l]=t,r[h]=!1,r}ensureSetup(){if(!this.isSetUp)throw new Error("@kluntje I18nService: should be set up before calling other APIs")}addStyling(){const e=document.head,t=document.createElement("style");t.type="text/css",t.appendChild(document.createTextNode(`\n .${u.PLACEHOLDER_SELECTOR} {\n display: contents;\n }\n `)),e.appendChild(t)}fetchI18nDictionary(){this.ensureSetup(),this._ready[h]=!0,r.fetchJSON(this._url).then((e=>{this._dictionary=e,this._loaded=!0,this._ready[c](),this.fillInPlaceholders()})).catch((e=>{console.error("@kluntje I18nService: unable to fetch keys from server!",e),this._loaded=!0,this._ready[c]()}))}fillInPlaceholders(){Array.from(document.getElementsByClassName(u.PLACEHOLDER_SELECTOR)).forEach((e=>{const{key:t,fallback:r,interpolations:s}=e.dataset;e.replaceWith(this.get(t,{fallback:r,interpolations:s?JSON.parse(s):void 0}))}))}getHumanReadableName(e){return e.split(".").reverse()[0].replace(/[A-Z]/g,(e=>` ${e.toLowerCase()}`))}getPlaceholder(e,{fallback:t,interpolations:r}={}){const s=document.createElement("span");return s.innerText=void 0!==t?t:this.getHumanReadableName(e),s.classList.add(u.PLACEHOLDER_SELECTOR),s.setAttribute("data-key",e),t&&s.setAttribute("data-fallback",t),r&&s.setAttribute("data-interpolations",JSON.stringify(r)),s.outerHTML}}var d=new class{constructor(){this.urlSearchParams=new URLSearchParams(window.location.search)}get(e){return this.urlSearchParams.get(e)}getAll(e){return this.urlSearchParams.getAll(e)}getAllKeys(){return Array.from(this.urlSearchParams.keys())}set(e,t){this.urlSearchParams.set(e,t),this.updateUrl()}delete(e){this.urlSearchParams.delete(e),this.updateUrl()}getString(){return this.urlSearchParams.toString()}get curUrl(){return`${window.location.protocol}//${window.location.host}${window.location.pathname}`}updateUrl(){const e=this.getString(),t=this.curUrl,r=window.location.hash,s=""!==e?`${t}?${e}`:t;window.history.replaceState({path:s},"",s),""!==r&&(window.location.hash=r)}};var g=new Proxy(console,{get:(e,t)=>null!==d.get("js-debug")?e[t]:()=>{}});var v=new class{constructor(){this.componentMap=new WeakMap,this.intersectionObserver=new IntersectionObserver((e=>this.handleIntersectionChange(e)),{rootMargin:"500px 0px"})}subscribe(e,t){this.componentMap.set(e,t),this.intersectionObserver.observe(e)}unsubscribe(e){this.intersectionObserver.unobserve(e),this.componentMap.delete(e)}handleIntersectionChange(e){e.forEach((e=>{const t=e.target;if(!e.isIntersecting||!this.componentMap.has(t))return;const r=this.componentMap.get(t);this.unsubscribe(t),r()}))}};class p{constructor(){this.observedItemsMap=new Map,window.addEventListener("storage",(e=>this.handleStorageChange(e)))}addItem(e,t,r={}){this.getStorage(r).setItem(e,t),this.fireCallbacks(e)}getItem(e,t={}){return this.getStorage(t).getItem(e)}removeItem(e,t={}){this.getStorage(t).removeItem(e)}observeItem(e,t){const r=this.getKeyCallbacks(e);r.add(t),this.observedItemsMap.set(e,r)}unobserveItem(e,t){const r=this.getKeyCallbacks(e);r.delete(t),this.observedItemsMap.set(e,r)}clearStorage(e){this.getStorage({storageType:e}).clear()}handleStorageChange(e){const t=e.key,r=e.oldValue,s=e.newValue;null!==t&&r!==s&&this.observedItemsMap.has(t)&&this.fireCallbacks(t)}getKeyCallbacks(e){return this.observedItemsMap.get(e)||new Set}fireCallbacks(e){this.getKeyCallbacks(e).forEach((e=>e()))}getStorage(e){const{storageType:t="local"}=e;return"local"===t?localStorage:sessionStorage}}const S=new p;class y{constructor(e){this.runtimeCache=new Map,this.storageService=S,this.storageKeyPrefix="kl-caching-service";const{storageService:t,storageKeyPrefix:r}=null!=e?e:{};void 0!==t&&(this.storageService=t),void 0!==r&&(this.storageKeyPrefix=r)}get shouldCache(){return!0}cacheValue(e,t,r){if(!1===this.shouldCache)return;if(0===r.validFor)return void this.runtimeCache.set(this.getStorageKey(e),t);const s={value:t,validUntil:Date.now()+r.validFor};this.storageService.addItem(this.getStorageKey(e),JSON.stringify(s),this.getStorageServiceOptions(r))}getCachedValue(e,t){if(!1===this.shouldCache)return null;const r=this.getStorageKey(e),s=this.runtimeCache.get(r);if(void 0!==s)return s;const i=this.storageService.getItem(r,this.getStorageServiceOptions(t));if(null===i)return null;try{const e=JSON.parse(i);return e.validUntil<Date.now()?(this.storageService.removeItem(r,this.getStorageServiceOptions(t)),null):e.value}catch(e){return g.warn("CachingService: ",e),this.storageService.removeItem(r,this.getStorageServiceOptions(t)),null}}getCachedJSON(e,t){const r=this.getCachedValue(e,t);if(null===r)return null;try{return JSON.parse(r)}catch(e){return g.error("CachingService: ",e),null}}clearCachedValue(e,t){const r=this.getStorageKey(e);0!==(null==t?void 0:t.validFor)?this.storageService.removeItem(r,this.getStorageServiceOptions(t)):this.runtimeCache.delete(r)}getStorageServiceOptions(e){return{storageType:null==e?void 0:e.storageType}}getStorageKey(e){return`${this.storageKeyPrefix}_${e}`}}const f=new y;class b{constructor(e){this.storageService=S,this.requestCacheName="kl-request-cache",this.storageKeyPrefix="kl-request-caching-service";const{storageService:t,requestCacheName:r,storageKeyPrefix:s}=null!=e?e:{};void 0!==t&&(this.storageService=t),void 0!==r&&(this.requestCacheName=r),void 0!==s&&(this.storageKeyPrefix=s)}getCache(){return o(this,void 0,void 0,(function*(){try{return void 0===this._cache&&(this._cache=caches.open(this.requestCacheName)),yield this._cache}catch(e){return g.error("RequestCachingService: ",e),null}}))}getCachedResponse(e,t){return o(this,void 0,void 0,(function*(){const r=yield this.getCache();if(null===r)return null;const s=yield r.match(e);if(void 0===s)return null;const i=this.storageService.getItem(this.getStorageKey(e.url),{storageType:t});if(null===i)return yield r.delete(e),null;return Date.now()>parseInt(i,10)?(yield r.delete(e),null):s}))}getCachedJSON(e,t){return o(this,void 0,void 0,(function*(){const r=yield this.getCachedResponse(e,t);if(null===r)return null;try{return yield r.json()}catch(e){return g.error("RequestCachingService: ",e),null}}))}cacheRequest(e){return o(this,void 0,void 0,(function*(){const{request:t,response:r}=e,s=yield this.getCache();null!==s&&(this.storeExpirationTime(e),yield s.put(t,r))}))}clearCachedRequest(e,t){return o(this,void 0,void 0,(function*(){const r=yield this.getCache();null!==r&&(yield r.delete(e),this.storageService.removeItem(this.getStorageKey(e.url),{storageType:t}))}))}storeExpirationTime(e){const{request:t,maxAge:r}=e,s=Date.now()+r;this.storageService.addItem(this.getStorageKey(t.url),s.toString(),{storageType:e.storage})}getStorageKey(e){return`${this.storageKeyPrefix}_${e}`}}const C=new b;class m extends Error{constructor(e){super(e.statusText),this.response=e}}class w{constructor(e={}){this.requestPipeline=new Map,this.cachingService=f,this.requestCachingService=C;const{cachingService:t,requestCachingService:r}=e;void 0!==t&&(this.cachingService=t),void 0!==r&&(this.requestCachingService=r)}fetchJSON(e,t={}){return o(this,void 0,void 0,(function*(){return yield this.fetch(e,w.getJSON,t)}))}fetchHTML(e,t={}){return o(this,void 0,void 0,(function*(){return yield this.fetch(e,w.getHTML,t)}))}fetch(e,t,r={}){return o(this,void 0,void 0,(function*(){const{cacheOptions:s}=r;!0===(null==s?void 0:s.forceRefetch)&&this.clearCachedValue(e,s);const i=yield this.getCachedValue(e,s);if(null!==i)return i;try{const i=this.requestPipeline.get(e);if(void 0!==i)return yield t(yield i);const n=this.fetchData(e,r);this.requestPipeline.set(e,n);const o=yield n,a=yield t(o);return this.requestPipeline.delete(e),null===o||null===a?null:(void 0===s||(yield this.cacheResponse(e,o,a,s)),a)}catch(t){if(g.error("APIService.fetch: ",t),this.requestPipeline.delete(e),!0===r.throwError)throw t;return null}}))}fetchResponse(e,t={}){var r,s,i;return o(this,void 0,void 0,(function*(){const{cacheOptions:n}=t,{forceRefetch:o=!1}=null!=n?n:{};!0===o&&(yield this.requestCachingService.clearCachedRequest(new Request(e),null!==(r=null==n?void 0:n.storageType)&&void 0!==r?r:"session"));const a=yield this.requestCachingService.getCachedResponse(new Request(e),null!==(s=null==n?void 0:n.storageType)&&void 0!==s?s:"session");if(null!==a)return a;const c=this.requestPipeline.get(e);if(void 0!==c)return yield c;try{const r=fetch(e,t.fetchOptions);this.requestPipeline.set(e,r);const s=yield r;return this.requestPipeline.delete(e),void 0===n?s:(yield this.requestCachingService.cacheRequest({request:new Request(e),response:s,storage:null!==(i=n.storageType)&&void 0!==i?i:"session",maxAge:n.validFor}),s)}catch(r){if(g.error("APIService.fetchResponse: ",r),this.requestPipeline.delete(e),!0===t.throwError)throw r;return null}}))}fetchData(e,t){return o(this,void 0,void 0,(function*(){const r=yield fetch(e,t.fetchOptions);if(!r.ok)throw new m(r);return 204===r.status?null:r}))}static getJSON(e){return o(this,void 0,void 0,(function*(){if(null===e)return null;const t=e.clone();return yield t.json()}))}static getHTML(e){return o(this,void 0,void 0,(function*(){if(null===e)return null;const t=e.clone();return yield t.text()}))}cacheResponse(e,t,r,s){var i;return o(this,void 0,void 0,(function*(){const n=this.getCacheKey(e,s);!0===s.requestBasedCaching?yield this.requestCachingService.cacheRequest({request:new Request(n),response:t,storage:null!==(i=s.storageType)&&void 0!==i?i:"local",maxAge:s.validFor}):this.cachingService.cacheValue(n,JSON.stringify(r),s)}))}clearCachedValue(e,t){return o(this,void 0,void 0,(function*(){if(void 0===t)return;const{requestBasedCaching:r=!1}=t,s=this.getCacheKey(e,t);!0===r&&(yield this.requestCachingService.clearCachedRequest(new Request(s),t.storageType)),this.cachingService.clearCachedValue(s,t)}))}getCachedValue(e,t){return o(this,void 0,void 0,(function*(){if(void 0===t)return null;const{requestBasedCaching:r=!1}=t,s=this.getCacheKey(e,t);return!0===r?yield this.requestCachingService.getCachedJSON(new Request(s),t.storageType):this.cachingService.getCachedJSON(s,t)}))}getCacheKey(e,t){var r;const s=null!==(r=null==t?void 0:t.cacheKeys)&&void 0!==r?r:[];return 0===s.length?e:i.appendQueryObject(e,{klCacheKeys:s.join("_")})}}const O=new w;class x{constructor(){this.observerMap=new Map}observe(e,t){const r=this.getCallbacks(e);r.add(t),this.observerMap.set(e,r)}unobserve(e,t){const r=this.getCallbacks(e);r.delete(t),this.observerMap.set(e,r)}notifyObservers(e,t){this.getCallbacks(e).forEach((e=>e(t)))}getCallbacks(e){return this.observerMap.get(e)||new Set}}const I=new x;class q{constructor(e,t){this.stateMap=new Map,this.observerService=new x,this.contextName=e,this.contextElement=t}get name(){return this.contextName}get element(){return this.contextElement}isMatchingContext(e,t){return this.contextName===e&&this.contextElement.contains(t)}setState(e,t){this.stateMap.get(e)!==t&&(this.stateMap.set(e,t),this.observerService.notifyObservers(e))}setStates(e){const t=Object.keys(e).filter((t=>this.stateMap.get(t)!==e[t]));t.forEach((t=>{this.stateMap.set(t,e[t])})),t.forEach((e=>{this.observerService.notifyObservers(e)}))}getState(e){return this.stateMap.get(e)}observeState(e,t){this.observerService.observe(e,t)}unobserveState(e,t){this.observerService.unobserve(e,t)}}class E{constructor(){this.contextStateMap=new Map,this.contextInitObserver=new x}getMatchingContextState(e,t){const r=(this.contextStateMap.get(e)||[]).filter((r=>r.isMatchingContext(e,t)));return 0===r.length?null:r[0]}getContextState(e,t){const r=this.getMatchingContextState(e,t);return r?Promise.resolve(r):new Promise((r=>{this.contextInitObserver.observe(e,(()=>{const s=this.getMatchingContextState(e,t);s&&r(s)}))}))}createContextState(e,t){const r=new q(e,t),s=this.contextStateMap.get(e)||[];return s.push(r),this.contextStateMap.set(e,s),this.contextInitObserver.notifyObservers(e),r}}const M=new E;exports.APIError=m,exports.APIService=O,exports.APIServiceImpl=w,exports.AbortableRequestService=class{constructor(e={}){this.abortController=new AbortController,this.abortOptions=null,this.latestOptions=null,this.apiService=O;const{apiService:t}=e;void 0!==t&&(this.apiService=t)}fetchJSON(e){return o(this,void 0,void 0,(function*(){return yield this.makeAbortableRequest(e,this.apiService.fetchJSON.bind(this.apiService))}))}fetchResponse(e){return o(this,void 0,void 0,(function*(){return yield this.makeAbortableRequest(e,this.apiService.fetchResponse.bind(this.apiService))}))}makeAbortableRequest(e,t){var r,s,i;return o(this,void 0,void 0,(function*(){null!==this.latestOptions&&(this.abortOptions=e,this.abortController.abort(),this.abortController=new AbortController),this.latestOptions=e;try{const i=yield t(e.url,{cacheOptions:null===(r=e.options)||void 0===r?void 0:r.cacheOptions,throwError:!0,fetchOptions:Object.assign(Object.assign({},null===(s=e.options)||void 0===s?void 0:s.fetchOptions),{signal:this.abortController.signal})});return this.latestOptions=null,i}catch(t){if(g.error("AbortableRequestService.makeAbortableRequest: ",t),"AbortError"===t.name)return this.handleAbortError(this.fetchJSON.bind(this));if(!0===(null===(i=e.options)||void 0===i?void 0:i.throwError))throw t;return null}}))}handleAbortError(e){return o(this,void 0,void 0,(function*(){const t=this.latestOptions||this.abortOptions;return null===t?null:(this.abortOptions=null,this.latestOptions=null,e(t))}))}},exports.CachingService=f,exports.CachingServiceImpl=y,exports.ContextState=q,exports.ContextStateService=M,exports.ContextStateServiceImpl=E,exports.DebuggerService=g,exports.I18nService=u,exports.IN_VP_EVENT="kl-in-vp",exports.LazyConnectService=v,exports.MQ_CHANGE_EVENT="kl-mq-change",exports.MediaQueryService=a,exports.OUT_VP_EVENT="kl-out-vp",exports.ObserverService=I,exports.ObserverServiceImpl=x,exports.RequestCachingService=C,exports.RequestCachingServiceImpl=b,exports.StorageService=S,exports.StorageServiceImpl=p,exports.URLSearchParamsService=d,exports.ViewportObserver=n; | ||
| ***************************************************************************** */function o(e,t,r,s){return new(r||(r=Promise))((function(i,n){function o(e){try{c(s.next(e))}catch(e){n(e)}}function a(e){try{c(s.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,a)}c((s=s.apply(e,t||[])).next())}))}class a{constructor(){this.eventIdMap=new WeakMap,this.eventBindingMap={},this.lastMQ=t.getCurrentMQ(a.mediaQuerys),t.onEvent(window,"resize",this.handleMQChange,this)}static getInstance(e){return void 0===a.instance&&(a.mediaQuerys=e,a.instance=new a),a.instance}handleMQChange(){const e=t.getCurrentMQ(a.mediaQuerys);e!==this.lastMQ&&(window.dispatchEvent(new CustomEvent("kl-mq-change",{detail:{newMQ:e,oldMQ:this.lastMQ}})),this.lastMQ=e)}}!function(e,t,r,s){var i,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(n<3?i(o):n>3?i(t,r,o):i(t,r))||o);n>3&&o&&Object.defineProperty(t,r,o)}([e.throttle(100)],a.prototype,"handleMQChange",null);const c=Symbol("resolve"),l=Symbol("reject"),h=Symbol("pending");class u{static get PLACEHOLDER_SELECTOR(){return"kl-i18n-placeholder"}static getInstance(){return void 0===u._instance&&(u._instance=new u),u._instance}get isSetUp(){return Boolean(this._url||s.isFilledObject(this._dictionary))}get loaded(){return this._loaded}get ready(){return this._ready[h]||this.fetchI18nDictionary(),this._ready}setUp({url:e,dictionary:t}={}){if(this.isSetUp)console.warn("@kluntje I18nService: service has already been set up. You can't set it up twice!");else if(e)this._url=e;else{if(!t)throw new Error('@kluntje I18nService: a "url" or "dictionary" should have been passed to the setUp function.');this._dictionary=t,this._loaded=!0,this._ready[c](),this._ready[h]=!0}}get(e,{fallback:t,interpolations:r}={}){if(this.loaded){if(this._dictionary.hasOwnProperty(e)){let t=this._dictionary[e];return r&&Object.entries(r).forEach((([e,r])=>{t=t.split(`{${e}}`).join(String(r))})),t}return console.warn(`@kluntje I18nService: i18n for key '${e}' is missing in dictionary!`),void 0!==t?t:this.getHumanReadableName(e)}return this._ready[h]||(this.addStyling(),this.fetchI18nDictionary()),this.getPlaceholder(e,{fallback:t,interpolations:r})}constructor(){this._loaded=!1,this._dictionary={},this._ready=this.getReadyPromise()}getReadyPromise(){let e,t;const r=new Promise(((r,s)=>{e=r,t=s}));return r[c]=e,r[l]=t,r[h]=!1,r}ensureSetup(){if(!this.isSetUp)throw new Error("@kluntje I18nService: should be set up before calling other APIs")}addStyling(){const e=document.head,t=document.createElement("style");t.type="text/css",t.appendChild(document.createTextNode(`\n .${u.PLACEHOLDER_SELECTOR} {\n display: contents;\n }\n `)),e.appendChild(t)}fetchI18nDictionary(){this.ensureSetup(),this._ready[h]=!0,r.fetchJSON(this._url).then((e=>{this._dictionary=e,this._loaded=!0,this._ready[c](),this.fillInPlaceholders()})).catch((e=>{console.error("@kluntje I18nService: unable to fetch keys from server!",e),this._loaded=!0,this._ready[c]()}))}fillInPlaceholders(){Array.from(document.getElementsByClassName(u.PLACEHOLDER_SELECTOR)).forEach((e=>{const{key:t,fallback:r,interpolations:s}=e.dataset;e.replaceWith(this.get(t,{fallback:r,interpolations:s?JSON.parse(s):void 0}))}))}getHumanReadableName(e){return e.split(".").reverse()[0].replace(/[A-Z]/g,(e=>` ${e.toLowerCase()}`))}getPlaceholder(e,{fallback:t,interpolations:r}={}){const s=document.createElement("span");return s.innerText=void 0!==t?t:this.getHumanReadableName(e),s.classList.add(u.PLACEHOLDER_SELECTOR),s.setAttribute("data-key",e),t&&s.setAttribute("data-fallback",t),r&&s.setAttribute("data-interpolations",JSON.stringify(r)),s.outerHTML}}var d=new class{constructor(){this.urlSearchParams=new URLSearchParams(window.location.search)}get(e){return this.urlSearchParams.get(e)}getAll(e){return this.urlSearchParams.getAll(e)}getAllKeys(){return Array.from(this.urlSearchParams.keys())}set(e,t){this.urlSearchParams.set(e,t),this.updateUrl()}delete(e){this.urlSearchParams.delete(e),this.updateUrl()}getString(){return this.urlSearchParams.toString()}get curUrl(){return`${window.location.protocol}//${window.location.host}${window.location.pathname}`}updateUrl(){const e=this.getString(),t=this.curUrl,r=window.location.hash,s=""!==e?`${t}?${e}`:t;window.history.replaceState({path:s},"",s),""!==r&&(window.location.hash=r)}};var g=new Proxy(console,{get:(e,t)=>null!==d.get("js-debug")?e[t]:()=>{}});var v=new class{constructor(){this.componentMap=new WeakMap,this.intersectionObserver=new IntersectionObserver((e=>this.handleIntersectionChange(e)),{rootMargin:"500px 0px"})}subscribe(e,t){this.componentMap.set(e,t),this.intersectionObserver.observe(e)}unsubscribe(e){this.intersectionObserver.unobserve(e),this.componentMap.delete(e)}handleIntersectionChange(e){e.forEach((e=>{const t=e.target;if(!e.isIntersecting||!this.componentMap.has(t))return;const r=this.componentMap.get(t);this.unsubscribe(t),r()}))}};class p{constructor(){this.observedItemsMap=new Map,window.addEventListener("storage",(e=>this.handleStorageChange(e)))}addItem(e,t,r={}){this.getStorage(r).setItem(e,t),this.fireCallbacks(e)}getItem(e,t={}){return this.getStorage(t).getItem(e)}removeItem(e,t={}){this.getStorage(t).removeItem(e)}observeItem(e,t){const r=this.getKeyCallbacks(e);r.add(t),this.observedItemsMap.set(e,r)}unobserveItem(e,t){const r=this.getKeyCallbacks(e);r.delete(t),this.observedItemsMap.set(e,r)}clearStorage(e){this.getStorage({storageType:e}).clear()}handleStorageChange(e){const t=e.key,r=e.oldValue,s=e.newValue;null!==t&&r!==s&&this.observedItemsMap.has(t)&&this.fireCallbacks(t)}getKeyCallbacks(e){return this.observedItemsMap.get(e)||new Set}fireCallbacks(e){this.getKeyCallbacks(e).forEach((e=>e()))}getStorage(e){const{storageType:t="local"}=e;return"local"===t?localStorage:sessionStorage}}const S=new p;class y{constructor(e){this.runtimeCache=new Map,this.storageService=S,this.storageKeyPrefix="kl-caching-service";const{storageService:t,storageKeyPrefix:r}=null!=e?e:{};void 0!==t&&(this.storageService=t),void 0!==r&&(this.storageKeyPrefix=r)}get shouldCache(){return!0}cacheValue(e,t,r){if(!1===this.shouldCache)return;if(0===r.validFor)return void this.runtimeCache.set(this.getStorageKey(e),t);const s={value:t,validUntil:Date.now()+r.validFor};this.storageService.addItem(this.getStorageKey(e),JSON.stringify(s),this.getStorageServiceOptions(r))}getCachedValue(e,t){if(!1===this.shouldCache)return null;const r=this.getStorageKey(e),s=this.runtimeCache.get(r);if(void 0!==s)return s;const i=this.storageService.getItem(r,this.getStorageServiceOptions(t));if(null===i)return null;try{const e=JSON.parse(i);return e.validUntil<Date.now()?(this.storageService.removeItem(r,this.getStorageServiceOptions(t)),null):e.value}catch(e){return g.warn("CachingService: ",e),this.storageService.removeItem(r,this.getStorageServiceOptions(t)),null}}getCachedJSON(e,t){const r=this.getCachedValue(e,t);if(null===r)return null;try{return JSON.parse(r)}catch(e){return g.error("CachingService: ",e),null}}clearCachedValue(e,t){const r=this.getStorageKey(e);0!==(null==t?void 0:t.validFor)?this.storageService.removeItem(r,this.getStorageServiceOptions(t)):this.runtimeCache.delete(r)}getStorageServiceOptions(e){return{storageType:null==e?void 0:e.storageType}}getStorageKey(e){return`${this.storageKeyPrefix}_${e}`}}const f=new y;class b{constructor(e){this.storageService=S,this.requestCacheName="kl-request-cache",this.storageKeyPrefix="kl-request-caching-service";const{storageService:t,requestCacheName:r,storageKeyPrefix:s}=null!=e?e:{};void 0!==t&&(this.storageService=t),void 0!==r&&(this.requestCacheName=r),void 0!==s&&(this.storageKeyPrefix=s)}getCache(){return o(this,void 0,void 0,(function*(){try{return void 0===this._cache&&(this._cache=caches.open(this.requestCacheName)),yield this._cache}catch(e){return g.error("RequestCachingService: ",e),null}}))}getCachedResponse(e,t){return o(this,void 0,void 0,(function*(){const r=yield this.getCache();if(null===r)return null;const s=yield r.match(e);if(void 0===s)return null;const i=this.storageService.getItem(this.getStorageKey(e.url),{storageType:t});if(null===i)return yield r.delete(e),null;return Date.now()>parseInt(i,10)?(yield r.delete(e),null):s}))}getCachedJSON(e,t){return o(this,void 0,void 0,(function*(){const r=yield this.getCachedResponse(e,t);if(null===r)return null;try{return yield r.json()}catch(e){return g.error("RequestCachingService: ",e),null}}))}cacheRequest(e){return o(this,void 0,void 0,(function*(){const{request:t,response:r}=e,s=yield this.getCache();null!==s&&(this.storeExpirationTime(e),yield s.put(t,r))}))}clearCachedRequest(e,t){return o(this,void 0,void 0,(function*(){const r=yield this.getCache();null!==r&&(yield r.delete(e),this.storageService.removeItem(this.getStorageKey(e.url),{storageType:t}))}))}storeExpirationTime(e){const{request:t,maxAge:r}=e,s=Date.now()+r;this.storageService.addItem(this.getStorageKey(t.url),s.toString(),{storageType:e.storage})}getStorageKey(e){return`${this.storageKeyPrefix}_${e}`}}const C=new b;class m extends Error{constructor(e){super(e.statusText),this.response=e}}class w{constructor(e={}){this.requestPipeline=new Map,this.cachingService=f,this.requestCachingService=C;const{cachingService:t,requestCachingService:r}=e;void 0!==t&&(this.cachingService=t),void 0!==r&&(this.requestCachingService=r)}fetchJSON(e,t={}){return o(this,void 0,void 0,(function*(){return yield this.fetch(e,w.getJSON,t)}))}fetchHTML(e,t={}){return o(this,void 0,void 0,(function*(){return yield this.fetch(e,w.getHTML,t)}))}fetch(e,t,r={}){return o(this,void 0,void 0,(function*(){const{cacheOptions:s}=r;!0===(null==s?void 0:s.forceRefetch)&&this.clearCachedValue(e,s);const i=yield this.getCachedValue(e,s);if(null!==i)return i;try{const i=this.requestPipeline.get(e);if(void 0!==i)return yield t(yield i);const n=this.fetchData(e,r);this.requestPipeline.set(e,n);const o=yield n,a=yield t(o);return this.requestPipeline.delete(e),null===o||null===a?null:(void 0===s||(yield this.cacheResponse(e,o,a,s)),a)}catch(t){if(g.error("APIService.fetch: ",t),this.requestPipeline.delete(e),!0===r.throwError)throw t;return null}}))}fetchResponse(e,t={}){var r,s,i;return o(this,void 0,void 0,(function*(){const{cacheOptions:n}=t,{forceRefetch:o=!1}=null!=n?n:{};!0===o&&(yield this.requestCachingService.clearCachedRequest(new Request(e),null!==(r=null==n?void 0:n.storageType)&&void 0!==r?r:"session"));const a=yield this.requestCachingService.getCachedResponse(new Request(e),null!==(s=null==n?void 0:n.storageType)&&void 0!==s?s:"session");if(null!==a)return a;const c=this.requestPipeline.get(e);if(void 0!==c)return yield c;try{const r=fetch(e,t.fetchOptions);this.requestPipeline.set(e,r);const s=yield r;return this.requestPipeline.delete(e),void 0===n?s:(yield this.requestCachingService.cacheRequest({request:new Request(e),response:s.clone(),storage:null!==(i=n.storageType)&&void 0!==i?i:"session",maxAge:n.validFor}),s)}catch(r){if(g.error("APIService.fetchResponse: ",r),this.requestPipeline.delete(e),!0===t.throwError)throw r;return null}}))}fetchData(e,t){return o(this,void 0,void 0,(function*(){const r=yield fetch(e,t.fetchOptions);if(!r.ok)throw new m(r);return 204===r.status?null:r}))}static getJSON(e){return o(this,void 0,void 0,(function*(){if(null===e)return null;const t=e.clone();return yield t.json()}))}static getHTML(e){return o(this,void 0,void 0,(function*(){if(null===e)return null;const t=e.clone();return yield t.text()}))}cacheResponse(e,t,r,s){var i;return o(this,void 0,void 0,(function*(){const n=this.getCacheKey(e,s);!0===s.requestBasedCaching?yield this.requestCachingService.cacheRequest({request:new Request(n),response:t,storage:null!==(i=s.storageType)&&void 0!==i?i:"local",maxAge:s.validFor}):this.cachingService.cacheValue(n,JSON.stringify(r),s)}))}clearCachedValue(e,t){return o(this,void 0,void 0,(function*(){if(void 0===t)return;const{requestBasedCaching:r=!1}=t,s=this.getCacheKey(e,t);!0===r&&(yield this.requestCachingService.clearCachedRequest(new Request(s),t.storageType)),this.cachingService.clearCachedValue(s,t)}))}getCachedValue(e,t){return o(this,void 0,void 0,(function*(){if(void 0===t)return null;const{requestBasedCaching:r=!1}=t,s=this.getCacheKey(e,t);return!0===r?yield this.requestCachingService.getCachedJSON(new Request(s),t.storageType):this.cachingService.getCachedJSON(s,t)}))}getCacheKey(e,t){var r;const s=null!==(r=null==t?void 0:t.cacheKeys)&&void 0!==r?r:[];return 0===s.length?e:i.appendQueryObject(e,{klCacheKeys:s.join("_")})}}const O=new w;class x{constructor(){this.observerMap=new Map}observe(e,t){const r=this.getCallbacks(e);r.add(t),this.observerMap.set(e,r)}unobserve(e,t){const r=this.getCallbacks(e);r.delete(t),this.observerMap.set(e,r)}notifyObservers(e,t){this.getCallbacks(e).forEach((e=>e(t)))}getCallbacks(e){return this.observerMap.get(e)||new Set}}const I=new x;class q{constructor(e,t){this.stateMap=new Map,this.observerService=new x,this.contextName=e,this.contextElement=t}get name(){return this.contextName}get element(){return this.contextElement}isMatchingContext(e,t){return this.contextName===e&&this.contextElement.contains(t)}setState(e,t){this.stateMap.get(e)!==t&&(this.stateMap.set(e,t),this.observerService.notifyObservers(e))}setStates(e){const t=Object.keys(e).filter((t=>this.stateMap.get(t)!==e[t]));t.forEach((t=>{this.stateMap.set(t,e[t])})),t.forEach((e=>{this.observerService.notifyObservers(e)}))}getState(e){return this.stateMap.get(e)}observeState(e,t){this.observerService.observe(e,t)}unobserveState(e,t){this.observerService.unobserve(e,t)}}class E{constructor(){this.contextStateMap=new Map,this.contextInitObserver=new x}getMatchingContextState(e,t){const r=(this.contextStateMap.get(e)||[]).filter((r=>r.isMatchingContext(e,t)));return 0===r.length?null:r[0]}getContextState(e,t){const r=this.getMatchingContextState(e,t);return r?Promise.resolve(r):new Promise((r=>{this.contextInitObserver.observe(e,(()=>{const s=this.getMatchingContextState(e,t);s&&r(s)}))}))}createContextState(e,t){const r=new q(e,t),s=this.contextStateMap.get(e)||[];return s.push(r),this.contextStateMap.set(e,s),this.contextInitObserver.notifyObservers(e),r}}const M=new E;exports.APIError=m,exports.APIService=O,exports.APIServiceImpl=w,exports.AbortableRequestService=class{constructor(e={}){this.abortController=new AbortController,this.abortOptions=null,this.latestOptions=null,this.apiService=O;const{apiService:t}=e;void 0!==t&&(this.apiService=t)}fetchJSON(e){return o(this,void 0,void 0,(function*(){return yield this.makeAbortableRequest(e,this.apiService.fetchJSON.bind(this.apiService))}))}fetchResponse(e){return o(this,void 0,void 0,(function*(){return yield this.makeAbortableRequest(e,this.apiService.fetchResponse.bind(this.apiService))}))}makeAbortableRequest(e,t){var r,s,i;return o(this,void 0,void 0,(function*(){null!==this.latestOptions&&(this.abortOptions=e,this.abortController.abort(),this.abortController=new AbortController),this.latestOptions=e;try{const i=yield t(e.url,{cacheOptions:null===(r=e.options)||void 0===r?void 0:r.cacheOptions,throwError:!0,fetchOptions:Object.assign(Object.assign({},null===(s=e.options)||void 0===s?void 0:s.fetchOptions),{signal:this.abortController.signal})});return this.latestOptions=null,i}catch(t){if(g.error("AbortableRequestService.makeAbortableRequest: ",t),"AbortError"===t.name)return this.handleAbortError(this.fetchJSON.bind(this));if(!0===(null===(i=e.options)||void 0===i?void 0:i.throwError))throw t;return null}}))}handleAbortError(e){return o(this,void 0,void 0,(function*(){const t=this.latestOptions||this.abortOptions;return null===t?null:(this.abortOptions=null,this.latestOptions=null,e(t))}))}},exports.CachingService=f,exports.CachingServiceImpl=y,exports.ContextState=q,exports.ContextStateService=M,exports.ContextStateServiceImpl=E,exports.DebuggerService=g,exports.I18nService=u,exports.IN_VP_EVENT="kl-in-vp",exports.LazyConnectService=v,exports.MQ_CHANGE_EVENT="kl-mq-change",exports.MediaQueryService=a,exports.OUT_VP_EVENT="kl-out-vp",exports.ObserverService=I,exports.ObserverServiceImpl=x,exports.RequestCachingService=C,exports.RequestCachingServiceImpl=b,exports.StorageService=S,exports.StorageServiceImpl=p,exports.URLSearchParamsService=d,exports.ViewportObserver=n; | ||
| //# sourceMappingURL=index.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sources":["../src/ViewportObserver.ts","../src/eventNames.ts","../src/MediaQueryService.ts","../src/I18nService.ts","../src/URLSearchParamsService.ts","../src/DebuggerService.ts","../src/LazyConnectService.ts","../src/StorageService/StorageService.ts","../src/CachingService/CachingService.ts","../src/RequestCachingService/RequestCachingService.ts","../src/APIService/APIService.types.ts","../src/APIService/APIService.ts","../src/ObserverService/ObserverService.ts","../src/ContextStateService/ContextState.ts","../src/ContextStateService/ContextStateService.ts","../src/AbortableRequestService/AbortableRequestService.ts"],"sourcesContent":["import { IN_VP_EVENT, OUT_VP_EVENT } from './eventNames';\n\ntype IntersectionEvent = {\n [key: string]: any;\n};\n\nexport class ViewportObserver {\n private static instance: IntersectionObserver;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {}\n\n static getInstance() {\n if (ViewportObserver.instance === undefined) {\n ViewportObserver.instance = new IntersectionObserver(ViewportObserver.handleIntersectionChange);\n }\n return ViewportObserver.instance;\n }\n\n private static handleIntersectionChange(e: IntersectionEvent) {\n Object.keys(e).forEach((key) => {\n const observedEl = e[key];\n const target = observedEl.target;\n\n if (observedEl.isIntersecting) {\n target.dispatchEvent(new CustomEvent(IN_VP_EVENT, { bubbles: false }));\n } else {\n target.dispatchEvent(new CustomEvent(OUT_VP_EVENT, { bubbles: false }));\n }\n });\n }\n}\n","export const MQ_CHANGE_EVENT = 'kl-mq-change';\nexport const IN_VP_EVENT = 'kl-in-vp';\nexport const OUT_VP_EVENT = 'kl-out-vp';\n","import { throttle } from '@kluntje/js-utils/lib/function-helpers/decorators';\nimport { onEvent, getCurrentMQ, MQDefinition } from '@kluntje/js-utils/lib/dom-helpers';\nimport { MQ_CHANGE_EVENT } from './eventNames';\n\nexport class MediaQueryService {\n private static instance: MediaQueryService;\n static mediaQuerys: Array<MQDefinition>;\n eventIdMap: WeakMap<HTMLElement | Function, string>;\n eventBindingMap: {\n [index: string]: EventListenerOrEventListenerObject;\n };\n lastMQ: string;\n\n private constructor() {\n this.eventIdMap = new WeakMap();\n this.eventBindingMap = {};\n this.lastMQ = getCurrentMQ(MediaQueryService.mediaQuerys);\n onEvent(window, 'resize', this.handleMQChange, this);\n }\n\n static getInstance(mediaQuerys: Array<MQDefinition>) {\n if (MediaQueryService.instance === undefined) {\n MediaQueryService.mediaQuerys = mediaQuerys;\n MediaQueryService.instance = new MediaQueryService();\n }\n return MediaQueryService.instance;\n }\n\n @throttle(100)\n handleMQChange() {\n const newMQ = getCurrentMQ(MediaQueryService.mediaQuerys);\n if (newMQ === this.lastMQ) {\n return;\n }\n\n window.dispatchEvent(\n new CustomEvent(MQ_CHANGE_EVENT, {\n detail: {\n newMQ,\n oldMQ: this.lastMQ,\n },\n }),\n );\n\n this.lastMQ = newMQ;\n }\n}\n","import { fetchJSON } from '@kluntje/js-utils/lib/api-helpers';\nimport { isFilledObject } from '@kluntje/js-utils/lib/object-helpers';\n\nconst resolveSymbol = Symbol('resolve');\nconst rejectSymbol = Symbol('reject');\nconst pendingSymbol = Symbol('pending');\n\n// Promise but with options to resolve/reject from outside\ninterface ExtendedPromise<T> extends Promise<T> {\n [resolveSymbol]: Function;\n [rejectSymbol]: Function;\n [pendingSymbol]: boolean;\n}\n\n/**\n * A service to provide sync/async way to provide internationalization values.\n * With i18n values beeing able to have variable placeholder in them. indexd for arrays e.g. `{0}` or named for objects e.g. `{hour}`\n *\n * @example\n * import I18nService from \"@kluntje/services/I18nService\";\n * // get singleton instance\n * const i18nService = I18nService.getInstance();\n * // provide the url to fetch the dictionary\n * i18nService.setUp({url: \"path/to/i18n/ajax/service\"});\n * // or provide the dictionary itself\n * // i18nService.setUp({dictionary: {\"com.page.filter.notifications\": \"{0} Nachrichten\", ...}});\n * const i18n = i18nService.get;\n * // use API\n * // render markup with i18n value, if the i18n key hasn't been fetched jet, a placeholder `<span class\"kl-i18n-placeholder\"></span>` will be rendered,\n * // with the provided `fallback` text. or the last part of the key.\n * // this `span` will be replaced with the i18n value in den DOM after the keys where successfully fetched from the server\n * render(html`<button>${i18n(\"com.page.filter.notifications\", {fallback: \"Info\", interpolations: [7]})}</button>`, el);\n * // if any actions needs the keys to be ready and shouldn't be replace later in the DOM, the `ready` accessor can be called.\n * // this will automatically trigger the fetch for the keys from the server\n * await i18nService.ready;\n * // the boolean `loaded` can be used to check if the keys have been fetched form the server. This will not trigger the fetch.\n * if (i18nService.loaded) console.log(i18nService.get(\"com.page.filter.submitLabel\"))\n *\n * @export\n * @class I18nService\n */\nexport class I18nService {\n /**\n * class name for the `span`s being used as placeholder for i18n values in the DOM before the actual values have been fetched from the server\n *\n * @readonly\n * @static\n * @memberof I18nService\n */\n static get PLACEHOLDER_SELECTOR() {\n return 'kl-i18n-placeholder';\n }\n\n private static _instance?: I18nService;\n\n /**\n * returns the singleton instance of the I18nService\n *\n * @static\n * @returns\n * @memberof I18nService\n */\n static getInstance() {\n if (I18nService._instance === undefined) {\n I18nService._instance = new I18nService();\n }\n\n return I18nService._instance;\n }\n\n // see `I18nService.loaded` for more information about this property\n private _loaded = false;\n\n // see `I18nService.ready` for more information about this property\n private _ready: ExtendedPromise<undefined>;\n\n // a key-value map of the i18n keys and their internationalizations fetched from the server or provided by the user\n private _dictionary: { [key: string]: string } = {};\n\n // url to the servlet returning the dictionary\n private _url?: string;\n\n /**\n * returns true if the I18nService has been set up already. i.e. has a ajax url or the dictionary provided\n *\n * @readonly\n * @type {boolean}\n * @memberof I18nService\n */\n public get isSetUp(): boolean {\n return Boolean(this._url || isFilledObject(this._dictionary));\n }\n\n /**\n * `loaded` will be true when the keys have been fetched from the server. and `false` otherwise.\n * reading the `loaded` accessor won't trigger the key fetch. For that use {@see I18nService.ready}\n *\n * @readonly\n * @type {boolean}\n * @memberof I18nService\n */\n public get loaded(): boolean {\n return this._loaded;\n }\n\n /**\n * a promise will be returned that resolves when the keys have been fetched from the server, or the server rejected the ajax call.\n * reading the `ready` accessor will automatically trigger the dictionary fetch.\n * use this property when you NEED the keys to be already loaded and can't be replaced in the DOM later.\n *\n * @readonly\n * @type {Promise<undefined>}\n * @memberof I18nService\n */\n public get ready(): Promise<undefined> {\n if (!this._ready[pendingSymbol]) this.fetchI18nDictionary();\n\n return this._ready as Promise<undefined>;\n }\n\n /**\n * providing information necessary for the service to retrieve the i18n dictionary.\n * i.e. a ajax url to fetch data, or a static object with the i18n key-value in it\n *\n * @param {{ url: string; dictionary: Record<string, string> }} { url, dictionary }\n * @returns\n * @memberof I18nService\n */\n public setUp({ url, dictionary }: { url?: string; dictionary?: Record<string, string> } = {}) {\n if (this.isSetUp) {\n console.warn(\"@kluntje I18nService: service has already been set up. You can't set it up twice!\");\n return;\n }\n if (url) {\n this._url = url;\n } else if (dictionary) {\n this._dictionary = dictionary;\n this._loaded = true;\n this._ready[resolveSymbol]();\n this._ready[pendingSymbol] = true;\n } else {\n throw new Error('@kluntje I18nService: a \"url\" or \"dictionary\" should have been passed to the setUp function.');\n }\n }\n\n /**\n * returns the internationalized value for the given i18n key when the value have been fetched from the server,\n * or a placeholder `<span>` with a fallback text based on the key or the provided fallback text\n * which will automatically be replaced with the value in the DOM after server response\n *\n * @param {string} key\n * @param {({ fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> })} [{\n * fallback,\n * interpolations,\n * }={}]\n * @returns {string}\n * @memberof I18nService\n */\n public get(\n key: string,\n {\n fallback,\n interpolations,\n }: { fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> } = {},\n ): string {\n if (this.loaded) {\n if (this._dictionary.hasOwnProperty(key)) {\n let result = this._dictionary[key];\n if (interpolations) {\n Object.entries(interpolations).forEach(([k, v]) => {\n // replaceAll({key}, value)\n result = result.split(`{${k}}`).join(String(v));\n });\n }\n\n return result;\n }\n console.warn(`@kluntje I18nService: i18n for key '${key}' is missing in dictionary!`);\n\n return fallback !== undefined ? fallback : this.getHumanReadableName(key);\n }\n\n if (!this._ready[pendingSymbol]) {\n // add styling for the placeholder first time a placeholder will be added to the DOM\n this.addStyling();\n this.fetchI18nDictionary();\n }\n\n return this.getPlaceholder(key, { fallback, interpolations });\n }\n\n /**\n * Creates an instance of I18nService.\n * @memberof I18nService\n */\n private constructor() {\n this._ready = this.getReadyPromise();\n }\n\n /**\n * returns a Promise like object with properties to allow resolving the promise from the outside\n *\n * @private\n * @returns {ExtendedPromise<undefined>}\n * @memberof I18nService\n */\n private getReadyPromise(): ExtendedPromise<undefined> {\n let resolve: Function;\n let reject: Function;\n\n // @ts-ignore - other properties will be added in next couple of lines\n const _ready: ExtendedPromise<undefined> = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // @ts-ignore - `resolve` is defined in the promise body from lines above\n _ready[resolveSymbol] = resolve;\n // @ts-ignore - `reject` is defined in the promise body from lines above\n _ready[rejectSymbol] = reject;\n // will be set to true when ajax call is sent\n _ready[pendingSymbol] = false;\n\n return _ready;\n }\n\n /**\n * throws an Error when the service is not set up\n *\n * @private\n * @memberof I18nService\n */\n private ensureSetup(): void {\n if (!this.isSetUp) throw new Error('@kluntje I18nService: should be set up before calling other APIs');\n }\n\n /**\n * add minimal styling for the placeholder to look as much as possible as if they were a text node and not a html element,\n * and without the need of an actual .css file to be loaded\n *\n * @private\n * @memberof I18nService\n */\n private addStyling(): void {\n const head = document.head;\n const style = document.createElement('style');\n style.type = 'text/css';\n style.appendChild(\n document.createTextNode(`\n .${I18nService.PLACEHOLDER_SELECTOR} {\n display: contents;\n }\n `),\n );\n head.appendChild(style);\n }\n\n /**\n * retrieves the i18n key.value pairs, and update instance properties regarding the pending/fulfilled status of the request\n *\n * @private\n * @memberof I18nService\n */\n private fetchI18nDictionary() {\n this.ensureSetup();\n this._ready[pendingSymbol] = true;\n\n fetchJSON(this._url!)\n .then((results: Record<string, string>) => {\n this._dictionary = results;\n this._loaded = true;\n this._ready[resolveSymbol]();\n this.fillInPlaceholders();\n })\n .catch((err: Error) => {\n console.error('@kluntje I18nService: unable to fetch keys from server!', err);\n // ? adding a failed flag\n this._loaded = true;\n this._ready[resolveSymbol]();\n });\n }\n\n /**\n * i18n placeholder in the DOM will be fetched with i18n values been fetched from the server.\n *\n * @private\n * @memberof I18nService\n */\n private fillInPlaceholders() {\n Array.from(document.getElementsByClassName(I18nService.PLACEHOLDER_SELECTOR)).forEach((el) => {\n const { key, fallback, interpolations } = (el as HTMLElement).dataset;\n\n el.replaceWith(\n this.get(key!, {\n fallback,\n interpolations: interpolations ? JSON.parse(interpolations) : undefined,\n }),\n );\n });\n }\n\n /**\n * converts the i18n key names to values that can be used as fallback for the i18n text\n * @example\n * getHumanReadableName(\"org.example.hyphenated_name.filter.submitBtn\") === \"submit btn\"\n *\n * @private\n * @param {string} key\n * @returns\n * @memberof I18nService\n */\n private getHumanReadableName(key: string) {\n return (\n key\n // \"org.example.hyphenated_name.filter.submitBtn\" -> \"submitBtn\"\n .split('.')\n .reverse()[0]\n // \"submitBtn\" -> \"submit btn\"\n .replace(/[A-Z]/g, (letter: string) => ` ${letter.toLowerCase()}`)\n );\n }\n\n /**\n * generates a span element whith the fallback text to be replaced with the correct i18n value after server response\n *\n * @private\n * @param {string} key\n * @param {string} [fallback]\n * @returns\n * @memberof I18nService\n */\n private getPlaceholder(\n key: string,\n {\n fallback,\n interpolations,\n }: { fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> } = {},\n ) {\n const span = document.createElement('span');\n span.innerText = fallback !== undefined ? fallback : this.getHumanReadableName(key);\n span.classList.add(I18nService.PLACEHOLDER_SELECTOR);\n span.setAttribute('data-key', key);\n if (fallback) span.setAttribute('data-fallback', fallback);\n // use escaping mechanism of setAttribute to store the stringified json\n if (interpolations) span.setAttribute('data-interpolations', JSON.stringify(interpolations));\n\n return span.outerHTML;\n }\n}\n","export class URLSearchParamsService {\n private urlSearchParams: URLSearchParams = new URLSearchParams(window.location.search);\n\n public get(param: string): string | null {\n return this.urlSearchParams.get(param);\n }\n\n public getAll(param: string): string[] | null {\n return this.urlSearchParams.getAll(param);\n }\n\n public getAllKeys(): Array<string> {\n // @ts-ignore\n return Array.from(this.urlSearchParams.keys());\n }\n\n public set(param: string, value: string): void {\n this.urlSearchParams.set(param, value);\n this.updateUrl();\n }\n\n public delete(param: string): void {\n this.urlSearchParams.delete(param);\n this.updateUrl();\n }\n\n public getString(): string {\n return this.urlSearchParams.toString();\n }\n\n public get curUrl() {\n return `${window.location.protocol}//${window.location.host}${window.location.pathname}`;\n }\n\n private updateUrl() {\n const curQueryString = this.getString();\n const curUrl = this.curUrl;\n const hashCache = window.location.hash;\n const newUrl = curQueryString !== '' ? `${curUrl}?${curQueryString}` : curUrl;\n window.history.replaceState({ path: newUrl }, '', newUrl);\n if (hashCache !== '') window.location.hash = hashCache;\n }\n}\n\nexport default new URLSearchParamsService();\n","import URLSearchParamsService from './URLSearchParamsService';\n\nfunction debugModeActive() {\n return URLSearchParamsService.get('js-debug') !== null;\n}\n\nconst handler = {\n get(target: Console, prop: keyof Console) {\n if (debugModeActive()) return target[prop];\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n else return () => {};\n },\n};\n\nexport default new Proxy(console, handler);\n","class LazyConnectService {\n componentMap = new WeakMap();\n intersectionObserver: IntersectionObserver;\n\n constructor() {\n this.intersectionObserver = new IntersectionObserver((entries: any) => this.handleIntersectionChange(entries), {\n rootMargin: '500px 0px',\n });\n }\n\n subscribe(target: HTMLElement, intersectionCallback: () => void) {\n this.componentMap.set(target, intersectionCallback);\n this.intersectionObserver.observe(target);\n }\n\n unsubscribe(target: HTMLElement) {\n this.intersectionObserver.unobserve(target);\n this.componentMap.delete(target);\n }\n\n handleIntersectionChange(entries: Array<IntersectionObserverEntry>) {\n entries.forEach((intersectionEntry: any) => {\n const target = intersectionEntry.target;\n\n if (!intersectionEntry.isIntersecting || !this.componentMap.has(target)) return;\n\n const intersectionCallback = this.componentMap.get(target);\n this.unsubscribe(target as HTMLElement);\n intersectionCallback();\n });\n }\n}\n\nexport default new LazyConnectService();\n","import { IStorageService } from './StorageService.interface';\nimport { StorageServiceOptions, StorageType } from './StorageService.types';\n\nexport class StorageServiceImpl implements IStorageService {\n private observedItemsMap: Map<string, Set<() => void>> = new Map();\n\n constructor() {\n window.addEventListener('storage', (e) => this.handleStorageChange(e));\n }\n\n public addItem(storageKey: string, storageValue: string, options: StorageServiceOptions = {}) {\n this.getStorage(options).setItem(storageKey, storageValue);\n this.fireCallbacks(storageKey);\n }\n\n public getItem(storageKey: string, options: StorageServiceOptions = {}): string | null {\n return this.getStorage(options).getItem(storageKey);\n }\n\n public removeItem(storageKey: string, options: StorageServiceOptions = {}) {\n this.getStorage(options).removeItem(storageKey);\n }\n\n public observeItem(storageKey: string, callback: () => void) {\n const keyCallbacks = this.getKeyCallbacks(storageKey);\n keyCallbacks.add(callback);\n this.observedItemsMap.set(storageKey, keyCallbacks);\n }\n\n public unobserveItem(storageKey: string, callback: () => void) {\n const keyCallbacks = this.getKeyCallbacks(storageKey);\n keyCallbacks.delete(callback);\n this.observedItemsMap.set(storageKey, keyCallbacks);\n }\n\n public clearStorage(storageType: StorageType) {\n this.getStorage({ storageType }).clear();\n }\n\n private handleStorageChange(e: StorageEvent) {\n const storageKey = e.key;\n const oldValue = e.oldValue;\n const newValue = e.newValue;\n if (storageKey === null || oldValue === newValue || !this.observedItemsMap.has(storageKey)) return;\n\n this.fireCallbacks(storageKey);\n }\n\n private getKeyCallbacks(storageKey: string): Set<() => void> {\n return this.observedItemsMap.get(storageKey) || new Set();\n }\n\n private fireCallbacks(storageKey: string) {\n const callbacks = this.getKeyCallbacks(storageKey);\n callbacks.forEach((callback) => callback());\n }\n\n private getStorage(options: StorageServiceOptions): Storage {\n const { storageType = 'local' } = options;\n return storageType === 'local' ? localStorage : sessionStorage;\n }\n}\n\nexport const StorageService = new StorageServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { StorageServiceOptions, StorageService, IStorageService } from '../StorageService';\nimport { ICachingService } from './CachingService.interface';\nimport { CacheItem, CacheOptions, CachingServiceConstructorOptions } from './CachingService.types';\n\nexport class CachingServiceImpl implements ICachingService {\n private runtimeCache: Map<string, string> = new Map();\n private storageService: IStorageService = StorageService;\n private storageKeyPrefix = 'kl-caching-service';\n\n constructor(options?: CachingServiceConstructorOptions) {\n const { storageService, storageKeyPrefix } = options ?? {};\n\n if (storageService !== undefined) {\n this.storageService = storageService;\n }\n\n if (storageKeyPrefix !== undefined) {\n this.storageKeyPrefix = storageKeyPrefix;\n }\n }\n\n protected get shouldCache(): boolean {\n return true;\n }\n\n public cacheValue(key: string, value: string, options: CacheOptions) {\n if (this.shouldCache === false) return;\n\n if (options.validFor === 0) {\n this.runtimeCache.set(this.getStorageKey(key), value);\n return;\n }\n\n const cacheItem: CacheItem = {\n value,\n validUntil: Date.now() + options.validFor,\n };\n\n this.storageService.addItem(\n this.getStorageKey(key),\n JSON.stringify(cacheItem),\n this.getStorageServiceOptions(options),\n );\n }\n\n public getCachedValue(key: string, cacheOptions?: CacheOptions): string | null {\n if (this.shouldCache === false) return null;\n\n const storageKey = this.getStorageKey(key);\n\n const runtimeValue = this.runtimeCache.get(storageKey);\n\n if (runtimeValue !== undefined) return runtimeValue;\n\n const cachedItemString = this.storageService.getItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n if (cachedItemString === null) return null;\n\n try {\n const cachedItem: CacheItem = JSON.parse(cachedItemString);\n if (cachedItem.validUntil < Date.now()) {\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n return null;\n }\n\n return cachedItem.value;\n } catch (e) {\n DebuggerService.warn('CachingService: ', e);\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n return null;\n }\n }\n\n public getCachedJSON<T>(key: string, cacheOptions?: CacheOptions): T | null {\n const cachedValue = this.getCachedValue(key, cacheOptions);\n if (cachedValue === null) return null;\n try {\n return JSON.parse(cachedValue);\n } catch (error) {\n DebuggerService.error('CachingService: ', error);\n return null;\n }\n }\n\n public clearCachedValue(key: string, cacheOptions?: CacheOptions) {\n const storageKey = this.getStorageKey(key);\n\n if (cacheOptions?.validFor === 0) {\n this.runtimeCache.delete(storageKey);\n return;\n }\n\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n }\n\n private getStorageServiceOptions(cacheOptions?: CacheOptions): StorageServiceOptions {\n return {\n storageType: cacheOptions?.storageType,\n };\n }\n\n private getStorageKey(key: string) {\n return `${this.storageKeyPrefix}_${key}`;\n }\n}\n\nexport const CachingService = new CachingServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { IStorageService, StorageService, StorageType } from '../StorageService';\nimport { IRequestCachingService } from './RequestCachingService.interface';\nimport { RequestCacheOptions, RequestCachingServiceConstructorOptions } from './RequestCachingService.types';\n\nexport class RequestCachingServiceImpl implements IRequestCachingService {\n private _cache?: Promise<Cache>;\n\n private storageService: IStorageService = StorageService;\n private requestCacheName = 'kl-request-cache';\n private storageKeyPrefix = 'kl-request-caching-service';\n\n constructor(options?: RequestCachingServiceConstructorOptions) {\n const { storageService, requestCacheName, storageKeyPrefix } = options ?? {};\n\n if (storageService !== undefined) {\n this.storageService = storageService;\n }\n\n if (requestCacheName !== undefined) {\n this.requestCacheName = requestCacheName;\n }\n\n if (storageKeyPrefix !== undefined) {\n this.storageKeyPrefix = storageKeyPrefix;\n }\n }\n\n private async getCache(): Promise<Cache | null> {\n try {\n if (this._cache === undefined) {\n this._cache = caches.open(this.requestCacheName);\n }\n return await this._cache;\n } catch (error) {\n DebuggerService.error('RequestCachingService: ', error);\n return null;\n }\n }\n\n public async getCachedResponse(request: Request, storage?: StorageType) {\n const cache = await this.getCache();\n if (cache === null) return null;\n\n const response = await cache.match(request);\n if (response === undefined) return null;\n\n const validUntil = this.storageService.getItem(this.getStorageKey(request.url), { storageType: storage });\n if (validUntil === null) {\n await cache.delete(request);\n return null;\n }\n\n const now = Date.now();\n if (now > parseInt(validUntil, 10)) {\n await cache.delete(request);\n return null;\n }\n return response;\n }\n\n public async getCachedJSON<T>(request: Request, storage?: StorageType) {\n const response = await this.getCachedResponse(request, storage);\n if (response === null) return null;\n try {\n return (await response.json()) as T;\n } catch (error) {\n DebuggerService.error('RequestCachingService: ', error);\n return null;\n }\n }\n\n public async cacheRequest(options: RequestCacheOptions) {\n const { request, response } = options;\n const cache = await this.getCache();\n if (cache === null) return;\n this.storeExpirationTime(options);\n await cache.put(request, response);\n }\n\n public async clearCachedRequest(request: Request, storage?: StorageType) {\n const cache = await this.getCache();\n if (cache === null) return;\n await cache.delete(request);\n this.storageService.removeItem(this.getStorageKey(request.url), { storageType: storage });\n }\n\n private storeExpirationTime(options: RequestCacheOptions) {\n const { request, maxAge } = options;\n const validUntil = Date.now() + maxAge;\n this.storageService.addItem(this.getStorageKey(request.url), validUntil.toString(), {\n storageType: options.storage,\n });\n }\n\n private getStorageKey(key: string) {\n return `${this.storageKeyPrefix}_${key}`;\n }\n}\n\nexport const RequestCachingService = new RequestCachingServiceImpl();\n","import { CacheOptions, ICachingService } from '../CachingService';\nimport { IRequestCachingService } from '../RequestCachingService';\n\nexport interface APIServiceCacheOptions extends CacheOptions {\n forceRefetch?: boolean;\n requestBasedCaching?: boolean;\n cacheKeys?: string[];\n}\n\nexport interface APIServiceRequestOptions {\n fetchOptions?: RequestInit;\n cacheOptions?: APIServiceCacheOptions;\n throwError?: boolean;\n}\n\nexport interface APIServiceConstructorOptions {\n cachingService?: ICachingService;\n requestCachingService?: IRequestCachingService;\n}\n\nexport class APIError extends Error {\n public response: Response;\n\n constructor(response: Response) {\n super(response.statusText);\n this.response = response;\n }\n}\n","import { appendQueryObject } from \"@kluntje/js-utils/lib/url-helpers\";\n\nimport DebuggerService from \"../DebuggerService\";\nimport { IRequestCachingService, RequestCachingService } from \"../RequestCachingService\";\nimport { CachingService, ICachingService } from \"../CachingService\";\n\nimport { APIError, APIServiceCacheOptions, APIServiceConstructorOptions, APIServiceRequestOptions } from \"./APIService.types\";\nimport { IAPIService } from \"./APIService.interface\";\n\nexport class APIServiceImpl implements IAPIService {\n private requestPipeline: Map<string, Promise<Response | null>> = new Map();\n\n private cachingService: ICachingService = CachingService;\n private requestCachingService: IRequestCachingService = RequestCachingService;\n\n constructor(options: APIServiceConstructorOptions = {}) {\n const { cachingService, requestCachingService } = options;\n\n if (cachingService !== undefined) this.cachingService = cachingService;\n if (requestCachingService !== undefined) this.requestCachingService = requestCachingService;\n }\n\n public async fetchJSON<T>(url: string, options: APIServiceRequestOptions = {}): Promise<T | null> {\n // eslint-disable-next-line prettier/prettier\n return await this.fetch(url, APIServiceImpl.getJSON<T>, options);\n }\n\n public async fetchHTML(url: string, options: APIServiceRequestOptions = {}): Promise<string | null> {\n return await this.fetch(url, APIServiceImpl.getHTML, options);\n }\n\n private async fetch<T>(\n url: string,\n dataMapper: (response: Response | null) => Promise<T>,\n options: APIServiceRequestOptions = {},\n ): Promise<T | null> {\n const { cacheOptions } = options;\n\n if (cacheOptions?.forceRefetch === true) {\n this.clearCachedValue(url, cacheOptions);\n }\n\n const cachedValue = await this.getCachedValue<T>(url, cacheOptions);\n if (cachedValue !== null) return cachedValue;\n\n try {\n const pipelineRequest = this.requestPipeline.get(url);\n if (pipelineRequest !== undefined) {\n return await dataMapper(await pipelineRequest);\n }\n\n const request = this.fetchData(url, options);\n this.requestPipeline.set(url, request);\n\n const response = await request;\n const responseData = await dataMapper(response);\n this.requestPipeline.delete(url);\n\n if (response === null || responseData === null) return null;\n\n if (cacheOptions === undefined) return responseData;\n await this.cacheResponse(url, response, responseData, cacheOptions);\n\n return responseData;\n } catch (error) {\n DebuggerService.error(\"APIService.fetch: \", error);\n this.requestPipeline.delete(url);\n if (options.throwError === true) throw error;\n return null;\n }\n }\n\n public async fetchResponse(url: string, options: APIServiceRequestOptions = {}): Promise<Response | null> {\n const { cacheOptions } = options;\n const { forceRefetch = false } = cacheOptions ?? {};\n\n if (forceRefetch === true) {\n await this.requestCachingService.clearCachedRequest(new Request(url), cacheOptions?.storageType ?? \"session\");\n }\n\n const cachedResponse = await this.requestCachingService.getCachedResponse(\n new Request(url),\n cacheOptions?.storageType ?? \"session\",\n );\n\n if (cachedResponse !== null) return cachedResponse;\n\n const pipelineRequest = this.requestPipeline.get(url);\n\n if (pipelineRequest !== undefined) {\n return await pipelineRequest;\n }\n\n try {\n const request = fetch(url, options.fetchOptions);\n this.requestPipeline.set(url, request);\n\n const response = await request;\n this.requestPipeline.delete(url);\n\n if (cacheOptions === undefined) return response;\n\n await this.requestCachingService.cacheRequest({\n request: new Request(url),\n response,\n storage: cacheOptions.storageType ?? \"session\",\n maxAge: cacheOptions.validFor,\n });\n\n return response;\n } catch (error) {\n DebuggerService.error(\"APIService.fetchResponse: \", error);\n\n this.requestPipeline.delete(url);\n\n if (options.throwError === true) throw error;\n return null;\n }\n }\n\n private async fetchData(url: string, options: APIServiceRequestOptions): Promise<Response | null> {\n const response = await fetch(url, options.fetchOptions);\n\n if (!response.ok) throw new APIError(response);\n if (response.status === 204) return null;\n\n return response;\n }\n\n private static async getJSON<T>(response: Response | null): Promise<T | null> {\n if (response === null) return null;\n\n const responseClone = response.clone();\n return await responseClone.json();\n }\n\n private static async getHTML(response: Response | null): Promise<string | null> {\n if (response === null) return null;\n\n const responseClone = response.clone();\n return await responseClone.text();\n }\n\n private async cacheResponse<T>(\n url: string,\n response: Response,\n responseData: T,\n cacheOptions: APIServiceCacheOptions,\n ) {\n const cacheKey = this.getCacheKey(url, cacheOptions);\n\n if (cacheOptions.requestBasedCaching === true) {\n await this.requestCachingService.cacheRequest({\n request: new Request(cacheKey),\n response,\n storage: cacheOptions.storageType ?? \"local\",\n maxAge: cacheOptions.validFor,\n });\n } else {\n this.cachingService.cacheValue(cacheKey, JSON.stringify(responseData), cacheOptions);\n }\n }\n\n private async clearCachedValue(url: string, cacheOptions?: APIServiceCacheOptions) {\n if (cacheOptions === undefined) return;\n const { requestBasedCaching = false } = cacheOptions;\n const cacheKey = this.getCacheKey(url, cacheOptions);\n\n if (requestBasedCaching === true) {\n await this.requestCachingService.clearCachedRequest(new Request(cacheKey), cacheOptions.storageType);\n }\n this.cachingService.clearCachedValue(cacheKey, cacheOptions);\n }\n\n private async getCachedValue<T>(url: string, cacheOptions?: APIServiceCacheOptions): Promise<T | null> {\n if (cacheOptions === undefined) return null;\n const { requestBasedCaching = false } = cacheOptions;\n\n const cacheKey = this.getCacheKey(url, cacheOptions);\n if (requestBasedCaching === true) {\n return await this.requestCachingService.getCachedJSON(new Request(cacheKey), cacheOptions.storageType);\n }\n return this.cachingService.getCachedJSON(cacheKey, cacheOptions);\n }\n\n private getCacheKey(url: string, cacheOptions?: APIServiceCacheOptions): string {\n const cacheKeys = cacheOptions?.cacheKeys ?? [];\n if (cacheKeys.length === 0) return url;\n return appendQueryObject(url, { klCacheKeys: cacheKeys.join(\"_\") });\n }\n}\n\nexport const APIService = new APIServiceImpl();\n","import { IObserverService } from './ObserverService.interface';\nimport { ObserverCallback } from './ObserverService.types';\n\nexport class ObserverServiceImpl implements IObserverService {\n private observerMap: Map<string, Set<ObserverCallback>> = new Map();\n\n public observe(observedKey: string, callback: ObserverCallback) {\n const curCallbacks = this.getCallbacks(observedKey);\n curCallbacks.add(callback);\n this.observerMap.set(observedKey, curCallbacks);\n }\n\n public unobserve(observedKey: string, callback: ObserverCallback) {\n const curCallbacks = this.getCallbacks(observedKey);\n curCallbacks.delete(callback);\n this.observerMap.set(observedKey, curCallbacks);\n }\n\n public notifyObservers<T>(observedKey: string, data?: T) {\n const callbacks = this.getCallbacks(observedKey);\n callbacks.forEach((callback) => callback(data));\n }\n\n private getCallbacks(observedKey: string): Set<ObserverCallback> {\n return this.observerMap.get(observedKey) || new Set();\n }\n}\n\nexport const ObserverService = new ObserverServiceImpl();\n","import { ObserverServiceImpl } from '../ObserverService';\n\nexport class ContextState<StateDefinition extends Record<string, any> = Record<string, any>> {\n private stateMap: Map<keyof StateDefinition, any> = new Map();\n private observerService = new ObserverServiceImpl();\n private contextName: string;\n private contextElement: HTMLElement;\n\n constructor(contextName: string, contextElement: HTMLElement) {\n this.contextName = contextName;\n this.contextElement = contextElement;\n }\n\n public get name(): string {\n return this.contextName;\n }\n\n public get element(): HTMLElement {\n return this.contextElement;\n }\n\n public isMatchingContext(contextName: string, consumingElement: HTMLElement): boolean {\n if (this.contextName !== contextName) return false;\n\n return this.contextElement.contains(consumingElement);\n }\n\n public setState<K extends keyof StateDefinition>(key: K, value: StateDefinition[K]): void {\n if (this.stateMap.get(key) === value) return;\n this.stateMap.set(key, value);\n this.observerService.notifyObservers(key as string);\n }\n\n public setStates(newState: Partial<StateDefinition>): void {\n const changedKeys = Object.keys(newState).filter((key) => this.stateMap.get(key) !== newState[key]);\n\n changedKeys.forEach((key) => {\n this.stateMap.set(key, newState[key]);\n });\n\n changedKeys.forEach((key) => {\n this.observerService.notifyObservers(key);\n });\n }\n\n public getState<K extends keyof StateDefinition>(key: K): StateDefinition[K] | undefined {\n return this.stateMap.get(key);\n }\n\n public observeState(key: keyof StateDefinition, callback: () => void): void {\n this.observerService.observe(key as string, callback);\n }\n\n public unobserveState(key: keyof StateDefinition, callback: () => void): void {\n this.observerService.unobserve(key as string, callback);\n }\n}\n","import { ContextState } from './ContextState';\nimport { ObserverServiceImpl } from '../ObserverService';\nimport { IContextStateService } from './ContextStateService.interface';\n\nexport class ContextStateServiceImpl implements IContextStateService {\n private contextStateMap: Map<string, ContextState[]> = new Map();\n private contextInitObserver = new ObserverServiceImpl();\n\n private getMatchingContextState(contextName: string, consumingElement: HTMLElement): ContextState | null {\n const contextList = this.contextStateMap.get(contextName) || [];\n const matchingContexts = contextList.filter((context) => context.isMatchingContext(contextName, consumingElement));\n if (matchingContexts.length === 0) return null;\n return matchingContexts[0];\n }\n\n public getContextState<StateDefinition extends Record<string, any>>(\n contextName: string,\n consumingElement: HTMLElement,\n ): Promise<ContextState<StateDefinition>> {\n const matchingContextState = this.getMatchingContextState(contextName, consumingElement);\n if (matchingContextState) return Promise.resolve(matchingContextState) as Promise<ContextState<StateDefinition>>;\n return new Promise<ContextState<StateDefinition>>((resolve) => {\n this.contextInitObserver.observe(contextName, () => {\n const contextState = this.getMatchingContextState(contextName, consumingElement);\n if (contextState) {\n resolve(contextState as ContextState<StateDefinition>);\n }\n });\n });\n }\n\n public createContextState<StateDefinition extends Record<string, any>>(\n contextName: string,\n contextElement: HTMLElement,\n ): ContextState<StateDefinition> {\n const contextState = new ContextState(contextName, contextElement);\n const contextList = this.contextStateMap.get(contextName) || [];\n contextList.push(contextState);\n this.contextStateMap.set(contextName, contextList);\n this.contextInitObserver.notifyObservers(contextName);\n return contextState as ContextState<StateDefinition>;\n }\n}\n\nexport const ContextStateService = new ContextStateServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { APIService, APIServiceRequestOptions, IAPIService } from '../APIService';\nimport {\n AbortableRequestServiceConstructorOptions,\n AbortableRequestServiceOptions,\n} from './AbortableRequestService.types';\n\nexport class AbortableRequestService {\n private abortController = new AbortController();\n private abortOptions: AbortableRequestServiceOptions | null = null;\n private latestOptions: AbortableRequestServiceOptions | null = null;\n\n protected apiService: IAPIService = APIService;\n\n constructor(options: AbortableRequestServiceConstructorOptions = {}) {\n const { apiService } = options;\n\n if (apiService !== undefined) this.apiService = apiService;\n }\n\n public async fetchJSON<T>(options: AbortableRequestServiceOptions): Promise<T | null> {\n return await this.makeAbortableRequest<T>(options, this.apiService.fetchJSON.bind(this.apiService));\n }\n\n public async fetchResponse(options: AbortableRequestServiceOptions): Promise<Response | null> {\n return await this.makeAbortableRequest<Response>(options, this.apiService.fetchResponse.bind(this.apiService));\n }\n\n private async makeAbortableRequest<R>(\n options: AbortableRequestServiceOptions,\n fetcher: (url: string, options: APIServiceRequestOptions) => Promise<R | null>,\n ): Promise<R | null> {\n if (this.latestOptions !== null) {\n this.abortOptions = options;\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n this.latestOptions = options;\n\n try {\n const response = await fetcher(options.url, {\n cacheOptions: options.options?.cacheOptions,\n throwError: true,\n fetchOptions: {\n ...options.options?.fetchOptions,\n signal: this.abortController.signal,\n },\n });\n this.latestOptions = null;\n return response;\n } catch (error: any) {\n DebuggerService.error('AbortableRequestService.makeAbortableRequest: ', error);\n\n if (error.name === 'AbortError') return this.handleAbortError<R>(this.fetchJSON.bind(this));\n\n if (options.options?.throwError === true) throw error;\n\n return null;\n }\n }\n\n private async handleAbortError<R>(\n nextAction: (options: AbortableRequestServiceOptions) => Promise<R | null>,\n ): Promise<R | null> {\n const latestOptions = this.latestOptions || this.abortOptions;\n if (latestOptions === null) return null;\n this.abortOptions = null;\n this.latestOptions = null;\n return nextAction(latestOptions);\n }\n}\n"],"names":["ViewportObserver","constructor","static","undefined","instance","IntersectionObserver","handleIntersectionChange","e","Object","keys","forEach","key","observedEl","target","isIntersecting","dispatchEvent","CustomEvent","bubbles","MediaQueryService","this","eventIdMap","WeakMap","eventBindingMap","lastMQ","getCurrentMQ","mediaQuerys","onEvent","window","handleMQChange","newMQ","detail","oldMQ","__decorate","throttle","resolveSymbol","Symbol","rejectSymbol","pendingSymbol","I18nService","PLACEHOLDER_SELECTOR","_instance","isSetUp","Boolean","_url","isFilledObject","_dictionary","loaded","_loaded","ready","_ready","fetchI18nDictionary","setUp","url","dictionary","console","warn","Error","get","fallback","interpolations","hasOwnProperty","result","entries","k","v","split","join","String","getHumanReadableName","addStyling","getPlaceholder","getReadyPromise","resolve","reject","Promise","res","rej","ensureSetup","head","document","style","createElement","type","appendChild","createTextNode","fetchJSON","then","results","fillInPlaceholders","catch","err","error","Array","from","getElementsByClassName","el","dataset","replaceWith","JSON","parse","reverse","replace","letter","toLowerCase","span","innerText","classList","add","setAttribute","stringify","outerHTML","URLSearchParams","location","search","param","urlSearchParams","getAll","getAllKeys","set","value","updateUrl","delete","getString","toString","curUrl","protocol","host","pathname","curQueryString","hashCache","hash","newUrl","history","replaceState","path","Proxy","prop","URLSearchParamsService","intersectionObserver","rootMargin","subscribe","intersectionCallback","componentMap","observe","unsubscribe","unobserve","intersectionEntry","has","StorageServiceImpl","Map","addEventListener","handleStorageChange","addItem","storageKey","storageValue","options","getStorage","setItem","fireCallbacks","getItem","removeItem","observeItem","callback","keyCallbacks","getKeyCallbacks","observedItemsMap","unobserveItem","clearStorage","storageType","clear","oldValue","newValue","Set","localStorage","sessionStorage","StorageService","CachingServiceImpl","storageService","storageKeyPrefix","shouldCache","cacheValue","validFor","runtimeCache","getStorageKey","cacheItem","validUntil","Date","now","getStorageServiceOptions","getCachedValue","cacheOptions","runtimeValue","cachedItemString","cachedItem","DebuggerService","getCachedJSON","cachedValue","clearCachedValue","CachingService","RequestCachingServiceImpl","requestCacheName","getCache","_cache","caches","open","getCachedResponse","request","storage","cache","response","match","parseInt","json","cacheRequest","storeExpirationTime","put","clearCachedRequest","maxAge","RequestCachingService","APIError","super","statusText","APIServiceImpl","cachingService","requestCachingService","fetch","fetchHTML","getHTML","dataMapper","forceRefetch","pipelineRequest","requestPipeline","fetchData","responseData","cacheResponse","throwError","fetchResponse","Request","cachedResponse","fetchOptions","ok","status","responseClone","clone","text","cacheKey","getCacheKey","requestBasedCaching","cacheKeys","length","appendQueryObject","klCacheKeys","APIService","ObserverServiceImpl","observedKey","curCallbacks","getCallbacks","observerMap","notifyObservers","data","ObserverService","ContextState","contextName","contextElement","name","element","isMatchingContext","consumingElement","contains","setState","stateMap","observerService","setStates","newState","changedKeys","filter","getState","observeState","unobserveState","ContextStateServiceImpl","getMatchingContextState","matchingContexts","contextStateMap","context","getContextState","matchingContextState","contextInitObserver","contextState","createContextState","contextList","push","ContextStateService","AbortController","apiService","makeAbortableRequest","bind","fetcher","latestOptions","abortOptions","abortController","abort","signal","handleAbortError","nextAction"],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sources":["../src/ViewportObserver.ts","../src/eventNames.ts","../src/MediaQueryService.ts","../src/I18nService.ts","../src/URLSearchParamsService.ts","../src/DebuggerService.ts","../src/LazyConnectService.ts","../src/StorageService/StorageService.ts","../src/CachingService/CachingService.ts","../src/RequestCachingService/RequestCachingService.ts","../src/APIService/APIService.types.ts","../src/APIService/APIService.ts","../src/ObserverService/ObserverService.ts","../src/ContextStateService/ContextState.ts","../src/ContextStateService/ContextStateService.ts","../src/AbortableRequestService/AbortableRequestService.ts"],"sourcesContent":["import { IN_VP_EVENT, OUT_VP_EVENT } from './eventNames';\n\ntype IntersectionEvent = {\n [key: string]: any;\n};\n\nexport class ViewportObserver {\n private static instance: IntersectionObserver;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {}\n\n static getInstance() {\n if (ViewportObserver.instance === undefined) {\n ViewportObserver.instance = new IntersectionObserver(ViewportObserver.handleIntersectionChange);\n }\n return ViewportObserver.instance;\n }\n\n private static handleIntersectionChange(e: IntersectionEvent) {\n Object.keys(e).forEach((key) => {\n const observedEl = e[key];\n const target = observedEl.target;\n\n if (observedEl.isIntersecting) {\n target.dispatchEvent(new CustomEvent(IN_VP_EVENT, { bubbles: false }));\n } else {\n target.dispatchEvent(new CustomEvent(OUT_VP_EVENT, { bubbles: false }));\n }\n });\n }\n}\n","export const MQ_CHANGE_EVENT = 'kl-mq-change';\nexport const IN_VP_EVENT = 'kl-in-vp';\nexport const OUT_VP_EVENT = 'kl-out-vp';\n","import { throttle } from '@kluntje/js-utils/lib/function-helpers/decorators';\nimport { onEvent, getCurrentMQ, MQDefinition } from '@kluntje/js-utils/lib/dom-helpers';\nimport { MQ_CHANGE_EVENT } from './eventNames';\n\nexport class MediaQueryService {\n private static instance: MediaQueryService;\n static mediaQuerys: Array<MQDefinition>;\n eventIdMap: WeakMap<HTMLElement | Function, string>;\n eventBindingMap: {\n [index: string]: EventListenerOrEventListenerObject;\n };\n lastMQ: string;\n\n private constructor() {\n this.eventIdMap = new WeakMap();\n this.eventBindingMap = {};\n this.lastMQ = getCurrentMQ(MediaQueryService.mediaQuerys);\n onEvent(window, 'resize', this.handleMQChange, this);\n }\n\n static getInstance(mediaQuerys: Array<MQDefinition>) {\n if (MediaQueryService.instance === undefined) {\n MediaQueryService.mediaQuerys = mediaQuerys;\n MediaQueryService.instance = new MediaQueryService();\n }\n return MediaQueryService.instance;\n }\n\n @throttle(100)\n handleMQChange() {\n const newMQ = getCurrentMQ(MediaQueryService.mediaQuerys);\n if (newMQ === this.lastMQ) {\n return;\n }\n\n window.dispatchEvent(\n new CustomEvent(MQ_CHANGE_EVENT, {\n detail: {\n newMQ,\n oldMQ: this.lastMQ,\n },\n }),\n );\n\n this.lastMQ = newMQ;\n }\n}\n","import { fetchJSON } from '@kluntje/js-utils/lib/api-helpers';\nimport { isFilledObject } from '@kluntje/js-utils/lib/object-helpers';\n\nconst resolveSymbol = Symbol('resolve');\nconst rejectSymbol = Symbol('reject');\nconst pendingSymbol = Symbol('pending');\n\n// Promise but with options to resolve/reject from outside\ninterface ExtendedPromise<T> extends Promise<T> {\n [resolveSymbol]: Function;\n [rejectSymbol]: Function;\n [pendingSymbol]: boolean;\n}\n\n/**\n * A service to provide sync/async way to provide internationalization values.\n * With i18n values beeing able to have variable placeholder in them. indexd for arrays e.g. `{0}` or named for objects e.g. `{hour}`\n *\n * @example\n * import I18nService from \"@kluntje/services/I18nService\";\n * // get singleton instance\n * const i18nService = I18nService.getInstance();\n * // provide the url to fetch the dictionary\n * i18nService.setUp({url: \"path/to/i18n/ajax/service\"});\n * // or provide the dictionary itself\n * // i18nService.setUp({dictionary: {\"com.page.filter.notifications\": \"{0} Nachrichten\", ...}});\n * const i18n = i18nService.get;\n * // use API\n * // render markup with i18n value, if the i18n key hasn't been fetched jet, a placeholder `<span class\"kl-i18n-placeholder\"></span>` will be rendered,\n * // with the provided `fallback` text. or the last part of the key.\n * // this `span` will be replaced with the i18n value in den DOM after the keys where successfully fetched from the server\n * render(html`<button>${i18n(\"com.page.filter.notifications\", {fallback: \"Info\", interpolations: [7]})}</button>`, el);\n * // if any actions needs the keys to be ready and shouldn't be replace later in the DOM, the `ready` accessor can be called.\n * // this will automatically trigger the fetch for the keys from the server\n * await i18nService.ready;\n * // the boolean `loaded` can be used to check if the keys have been fetched form the server. This will not trigger the fetch.\n * if (i18nService.loaded) console.log(i18nService.get(\"com.page.filter.submitLabel\"))\n *\n * @export\n * @class I18nService\n */\nexport class I18nService {\n /**\n * class name for the `span`s being used as placeholder for i18n values in the DOM before the actual values have been fetched from the server\n *\n * @readonly\n * @static\n * @memberof I18nService\n */\n static get PLACEHOLDER_SELECTOR() {\n return 'kl-i18n-placeholder';\n }\n\n private static _instance?: I18nService;\n\n /**\n * returns the singleton instance of the I18nService\n *\n * @static\n * @returns\n * @memberof I18nService\n */\n static getInstance() {\n if (I18nService._instance === undefined) {\n I18nService._instance = new I18nService();\n }\n\n return I18nService._instance;\n }\n\n // see `I18nService.loaded` for more information about this property\n private _loaded = false;\n\n // see `I18nService.ready` for more information about this property\n private _ready: ExtendedPromise<undefined>;\n\n // a key-value map of the i18n keys and their internationalizations fetched from the server or provided by the user\n private _dictionary: { [key: string]: string } = {};\n\n // url to the servlet returning the dictionary\n private _url?: string;\n\n /**\n * returns true if the I18nService has been set up already. i.e. has a ajax url or the dictionary provided\n *\n * @readonly\n * @type {boolean}\n * @memberof I18nService\n */\n public get isSetUp(): boolean {\n return Boolean(this._url || isFilledObject(this._dictionary));\n }\n\n /**\n * `loaded` will be true when the keys have been fetched from the server. and `false` otherwise.\n * reading the `loaded` accessor won't trigger the key fetch. For that use {@see I18nService.ready}\n *\n * @readonly\n * @type {boolean}\n * @memberof I18nService\n */\n public get loaded(): boolean {\n return this._loaded;\n }\n\n /**\n * a promise will be returned that resolves when the keys have been fetched from the server, or the server rejected the ajax call.\n * reading the `ready` accessor will automatically trigger the dictionary fetch.\n * use this property when you NEED the keys to be already loaded and can't be replaced in the DOM later.\n *\n * @readonly\n * @type {Promise<undefined>}\n * @memberof I18nService\n */\n public get ready(): Promise<undefined> {\n if (!this._ready[pendingSymbol]) this.fetchI18nDictionary();\n\n return this._ready as Promise<undefined>;\n }\n\n /**\n * providing information necessary for the service to retrieve the i18n dictionary.\n * i.e. a ajax url to fetch data, or a static object with the i18n key-value in it\n *\n * @param {{ url: string; dictionary: Record<string, string> }} { url, dictionary }\n * @returns\n * @memberof I18nService\n */\n public setUp({ url, dictionary }: { url?: string; dictionary?: Record<string, string> } = {}) {\n if (this.isSetUp) {\n console.warn(\"@kluntje I18nService: service has already been set up. You can't set it up twice!\");\n return;\n }\n if (url) {\n this._url = url;\n } else if (dictionary) {\n this._dictionary = dictionary;\n this._loaded = true;\n this._ready[resolveSymbol]();\n this._ready[pendingSymbol] = true;\n } else {\n throw new Error('@kluntje I18nService: a \"url\" or \"dictionary\" should have been passed to the setUp function.');\n }\n }\n\n /**\n * returns the internationalized value for the given i18n key when the value have been fetched from the server,\n * or a placeholder `<span>` with a fallback text based on the key or the provided fallback text\n * which will automatically be replaced with the value in the DOM after server response\n *\n * @param {string} key\n * @param {({ fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> })} [{\n * fallback,\n * interpolations,\n * }={}]\n * @returns {string}\n * @memberof I18nService\n */\n public get(\n key: string,\n {\n fallback,\n interpolations,\n }: { fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> } = {},\n ): string {\n if (this.loaded) {\n if (this._dictionary.hasOwnProperty(key)) {\n let result = this._dictionary[key];\n if (interpolations) {\n Object.entries(interpolations).forEach(([k, v]) => {\n // replaceAll({key}, value)\n result = result.split(`{${k}}`).join(String(v));\n });\n }\n\n return result;\n }\n console.warn(`@kluntje I18nService: i18n for key '${key}' is missing in dictionary!`);\n\n return fallback !== undefined ? fallback : this.getHumanReadableName(key);\n }\n\n if (!this._ready[pendingSymbol]) {\n // add styling for the placeholder first time a placeholder will be added to the DOM\n this.addStyling();\n this.fetchI18nDictionary();\n }\n\n return this.getPlaceholder(key, { fallback, interpolations });\n }\n\n /**\n * Creates an instance of I18nService.\n * @memberof I18nService\n */\n private constructor() {\n this._ready = this.getReadyPromise();\n }\n\n /**\n * returns a Promise like object with properties to allow resolving the promise from the outside\n *\n * @private\n * @returns {ExtendedPromise<undefined>}\n * @memberof I18nService\n */\n private getReadyPromise(): ExtendedPromise<undefined> {\n let resolve: Function;\n let reject: Function;\n\n // @ts-ignore - other properties will be added in next couple of lines\n const _ready: ExtendedPromise<undefined> = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // @ts-ignore - `resolve` is defined in the promise body from lines above\n _ready[resolveSymbol] = resolve;\n // @ts-ignore - `reject` is defined in the promise body from lines above\n _ready[rejectSymbol] = reject;\n // will be set to true when ajax call is sent\n _ready[pendingSymbol] = false;\n\n return _ready;\n }\n\n /**\n * throws an Error when the service is not set up\n *\n * @private\n * @memberof I18nService\n */\n private ensureSetup(): void {\n if (!this.isSetUp) throw new Error('@kluntje I18nService: should be set up before calling other APIs');\n }\n\n /**\n * add minimal styling for the placeholder to look as much as possible as if they were a text node and not a html element,\n * and without the need of an actual .css file to be loaded\n *\n * @private\n * @memberof I18nService\n */\n private addStyling(): void {\n const head = document.head;\n const style = document.createElement('style');\n style.type = 'text/css';\n style.appendChild(\n document.createTextNode(`\n .${I18nService.PLACEHOLDER_SELECTOR} {\n display: contents;\n }\n `),\n );\n head.appendChild(style);\n }\n\n /**\n * retrieves the i18n key.value pairs, and update instance properties regarding the pending/fulfilled status of the request\n *\n * @private\n * @memberof I18nService\n */\n private fetchI18nDictionary() {\n this.ensureSetup();\n this._ready[pendingSymbol] = true;\n\n fetchJSON(this._url!)\n .then((results: Record<string, string>) => {\n this._dictionary = results;\n this._loaded = true;\n this._ready[resolveSymbol]();\n this.fillInPlaceholders();\n })\n .catch((err: Error) => {\n console.error('@kluntje I18nService: unable to fetch keys from server!', err);\n // ? adding a failed flag\n this._loaded = true;\n this._ready[resolveSymbol]();\n });\n }\n\n /**\n * i18n placeholder in the DOM will be fetched with i18n values been fetched from the server.\n *\n * @private\n * @memberof I18nService\n */\n private fillInPlaceholders() {\n Array.from(document.getElementsByClassName(I18nService.PLACEHOLDER_SELECTOR)).forEach((el) => {\n const { key, fallback, interpolations } = (el as HTMLElement).dataset;\n\n el.replaceWith(\n this.get(key!, {\n fallback,\n interpolations: interpolations ? JSON.parse(interpolations) : undefined,\n }),\n );\n });\n }\n\n /**\n * converts the i18n key names to values that can be used as fallback for the i18n text\n * @example\n * getHumanReadableName(\"org.example.hyphenated_name.filter.submitBtn\") === \"submit btn\"\n *\n * @private\n * @param {string} key\n * @returns\n * @memberof I18nService\n */\n private getHumanReadableName(key: string) {\n return (\n key\n // \"org.example.hyphenated_name.filter.submitBtn\" -> \"submitBtn\"\n .split('.')\n .reverse()[0]\n // \"submitBtn\" -> \"submit btn\"\n .replace(/[A-Z]/g, (letter: string) => ` ${letter.toLowerCase()}`)\n );\n }\n\n /**\n * generates a span element whith the fallback text to be replaced with the correct i18n value after server response\n *\n * @private\n * @param {string} key\n * @param {string} [fallback]\n * @returns\n * @memberof I18nService\n */\n private getPlaceholder(\n key: string,\n {\n fallback,\n interpolations,\n }: { fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> } = {},\n ) {\n const span = document.createElement('span');\n span.innerText = fallback !== undefined ? fallback : this.getHumanReadableName(key);\n span.classList.add(I18nService.PLACEHOLDER_SELECTOR);\n span.setAttribute('data-key', key);\n if (fallback) span.setAttribute('data-fallback', fallback);\n // use escaping mechanism of setAttribute to store the stringified json\n if (interpolations) span.setAttribute('data-interpolations', JSON.stringify(interpolations));\n\n return span.outerHTML;\n }\n}\n","export class URLSearchParamsService {\n private urlSearchParams: URLSearchParams = new URLSearchParams(window.location.search);\n\n public get(param: string): string | null {\n return this.urlSearchParams.get(param);\n }\n\n public getAll(param: string): string[] | null {\n return this.urlSearchParams.getAll(param);\n }\n\n public getAllKeys(): Array<string> {\n // @ts-ignore\n return Array.from(this.urlSearchParams.keys());\n }\n\n public set(param: string, value: string): void {\n this.urlSearchParams.set(param, value);\n this.updateUrl();\n }\n\n public delete(param: string): void {\n this.urlSearchParams.delete(param);\n this.updateUrl();\n }\n\n public getString(): string {\n return this.urlSearchParams.toString();\n }\n\n public get curUrl() {\n return `${window.location.protocol}//${window.location.host}${window.location.pathname}`;\n }\n\n private updateUrl() {\n const curQueryString = this.getString();\n const curUrl = this.curUrl;\n const hashCache = window.location.hash;\n const newUrl = curQueryString !== '' ? `${curUrl}?${curQueryString}` : curUrl;\n window.history.replaceState({ path: newUrl }, '', newUrl);\n if (hashCache !== '') window.location.hash = hashCache;\n }\n}\n\nexport default new URLSearchParamsService();\n","import URLSearchParamsService from './URLSearchParamsService';\n\nfunction debugModeActive() {\n return URLSearchParamsService.get('js-debug') !== null;\n}\n\nconst handler = {\n get(target: Console, prop: keyof Console) {\n if (debugModeActive()) return target[prop];\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n else return () => {};\n },\n};\n\nexport default new Proxy(console, handler);\n","class LazyConnectService {\n componentMap = new WeakMap();\n intersectionObserver: IntersectionObserver;\n\n constructor() {\n this.intersectionObserver = new IntersectionObserver((entries: any) => this.handleIntersectionChange(entries), {\n rootMargin: '500px 0px',\n });\n }\n\n subscribe(target: HTMLElement, intersectionCallback: () => void) {\n this.componentMap.set(target, intersectionCallback);\n this.intersectionObserver.observe(target);\n }\n\n unsubscribe(target: HTMLElement) {\n this.intersectionObserver.unobserve(target);\n this.componentMap.delete(target);\n }\n\n handleIntersectionChange(entries: Array<IntersectionObserverEntry>) {\n entries.forEach((intersectionEntry: any) => {\n const target = intersectionEntry.target;\n\n if (!intersectionEntry.isIntersecting || !this.componentMap.has(target)) return;\n\n const intersectionCallback = this.componentMap.get(target);\n this.unsubscribe(target as HTMLElement);\n intersectionCallback();\n });\n }\n}\n\nexport default new LazyConnectService();\n","import { IStorageService } from './StorageService.interface';\nimport { StorageServiceOptions, StorageType } from './StorageService.types';\n\nexport class StorageServiceImpl implements IStorageService {\n private observedItemsMap: Map<string, Set<() => void>> = new Map();\n\n constructor() {\n window.addEventListener('storage', (e) => this.handleStorageChange(e));\n }\n\n public addItem(storageKey: string, storageValue: string, options: StorageServiceOptions = {}) {\n this.getStorage(options).setItem(storageKey, storageValue);\n this.fireCallbacks(storageKey);\n }\n\n public getItem(storageKey: string, options: StorageServiceOptions = {}): string | null {\n return this.getStorage(options).getItem(storageKey);\n }\n\n public removeItem(storageKey: string, options: StorageServiceOptions = {}) {\n this.getStorage(options).removeItem(storageKey);\n }\n\n public observeItem(storageKey: string, callback: () => void) {\n const keyCallbacks = this.getKeyCallbacks(storageKey);\n keyCallbacks.add(callback);\n this.observedItemsMap.set(storageKey, keyCallbacks);\n }\n\n public unobserveItem(storageKey: string, callback: () => void) {\n const keyCallbacks = this.getKeyCallbacks(storageKey);\n keyCallbacks.delete(callback);\n this.observedItemsMap.set(storageKey, keyCallbacks);\n }\n\n public clearStorage(storageType: StorageType) {\n this.getStorage({ storageType }).clear();\n }\n\n private handleStorageChange(e: StorageEvent) {\n const storageKey = e.key;\n const oldValue = e.oldValue;\n const newValue = e.newValue;\n if (storageKey === null || oldValue === newValue || !this.observedItemsMap.has(storageKey)) return;\n\n this.fireCallbacks(storageKey);\n }\n\n private getKeyCallbacks(storageKey: string): Set<() => void> {\n return this.observedItemsMap.get(storageKey) || new Set();\n }\n\n private fireCallbacks(storageKey: string) {\n const callbacks = this.getKeyCallbacks(storageKey);\n callbacks.forEach((callback) => callback());\n }\n\n private getStorage(options: StorageServiceOptions): Storage {\n const { storageType = 'local' } = options;\n return storageType === 'local' ? localStorage : sessionStorage;\n }\n}\n\nexport const StorageService = new StorageServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { StorageServiceOptions, StorageService, IStorageService } from '../StorageService';\nimport { ICachingService } from './CachingService.interface';\nimport { CacheItem, CacheOptions, CachingServiceConstructorOptions } from './CachingService.types';\n\nexport class CachingServiceImpl implements ICachingService {\n private runtimeCache: Map<string, string> = new Map();\n private storageService: IStorageService = StorageService;\n private storageKeyPrefix = 'kl-caching-service';\n\n constructor(options?: CachingServiceConstructorOptions) {\n const { storageService, storageKeyPrefix } = options ?? {};\n\n if (storageService !== undefined) {\n this.storageService = storageService;\n }\n\n if (storageKeyPrefix !== undefined) {\n this.storageKeyPrefix = storageKeyPrefix;\n }\n }\n\n protected get shouldCache(): boolean {\n return true;\n }\n\n public cacheValue(key: string, value: string, options: CacheOptions) {\n if (this.shouldCache === false) return;\n\n if (options.validFor === 0) {\n this.runtimeCache.set(this.getStorageKey(key), value);\n return;\n }\n\n const cacheItem: CacheItem = {\n value,\n validUntil: Date.now() + options.validFor,\n };\n\n this.storageService.addItem(\n this.getStorageKey(key),\n JSON.stringify(cacheItem),\n this.getStorageServiceOptions(options),\n );\n }\n\n public getCachedValue(key: string, cacheOptions?: CacheOptions): string | null {\n if (this.shouldCache === false) return null;\n\n const storageKey = this.getStorageKey(key);\n\n const runtimeValue = this.runtimeCache.get(storageKey);\n\n if (runtimeValue !== undefined) return runtimeValue;\n\n const cachedItemString = this.storageService.getItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n if (cachedItemString === null) return null;\n\n try {\n const cachedItem: CacheItem = JSON.parse(cachedItemString);\n if (cachedItem.validUntil < Date.now()) {\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n return null;\n }\n\n return cachedItem.value;\n } catch (e) {\n DebuggerService.warn('CachingService: ', e);\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n return null;\n }\n }\n\n public getCachedJSON<T>(key: string, cacheOptions?: CacheOptions): T | null {\n const cachedValue = this.getCachedValue(key, cacheOptions);\n if (cachedValue === null) return null;\n try {\n return JSON.parse(cachedValue);\n } catch (error) {\n DebuggerService.error('CachingService: ', error);\n return null;\n }\n }\n\n public clearCachedValue(key: string, cacheOptions?: CacheOptions) {\n const storageKey = this.getStorageKey(key);\n\n if (cacheOptions?.validFor === 0) {\n this.runtimeCache.delete(storageKey);\n return;\n }\n\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n }\n\n private getStorageServiceOptions(cacheOptions?: CacheOptions): StorageServiceOptions {\n return {\n storageType: cacheOptions?.storageType,\n };\n }\n\n private getStorageKey(key: string) {\n return `${this.storageKeyPrefix}_${key}`;\n }\n}\n\nexport const CachingService = new CachingServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { IStorageService, StorageService, StorageType } from '../StorageService';\nimport { IRequestCachingService } from './RequestCachingService.interface';\nimport { RequestCacheOptions, RequestCachingServiceConstructorOptions } from './RequestCachingService.types';\n\nexport class RequestCachingServiceImpl implements IRequestCachingService {\n private _cache?: Promise<Cache>;\n\n private storageService: IStorageService = StorageService;\n private requestCacheName = 'kl-request-cache';\n private storageKeyPrefix = 'kl-request-caching-service';\n\n constructor(options?: RequestCachingServiceConstructorOptions) {\n const { storageService, requestCacheName, storageKeyPrefix } = options ?? {};\n\n if (storageService !== undefined) {\n this.storageService = storageService;\n }\n\n if (requestCacheName !== undefined) {\n this.requestCacheName = requestCacheName;\n }\n\n if (storageKeyPrefix !== undefined) {\n this.storageKeyPrefix = storageKeyPrefix;\n }\n }\n\n private async getCache(): Promise<Cache | null> {\n try {\n if (this._cache === undefined) {\n this._cache = caches.open(this.requestCacheName);\n }\n return await this._cache;\n } catch (error) {\n DebuggerService.error('RequestCachingService: ', error);\n return null;\n }\n }\n\n public async getCachedResponse(request: Request, storage?: StorageType) {\n const cache = await this.getCache();\n if (cache === null) return null;\n\n const response = await cache.match(request);\n if (response === undefined) return null;\n\n const validUntil = this.storageService.getItem(this.getStorageKey(request.url), { storageType: storage });\n if (validUntil === null) {\n await cache.delete(request);\n return null;\n }\n\n const now = Date.now();\n if (now > parseInt(validUntil, 10)) {\n await cache.delete(request);\n return null;\n }\n return response;\n }\n\n public async getCachedJSON<T>(request: Request, storage?: StorageType) {\n const response = await this.getCachedResponse(request, storage);\n if (response === null) return null;\n try {\n return (await response.json()) as T;\n } catch (error) {\n DebuggerService.error('RequestCachingService: ', error);\n return null;\n }\n }\n\n public async cacheRequest(options: RequestCacheOptions) {\n const { request, response } = options;\n const cache = await this.getCache();\n if (cache === null) return;\n this.storeExpirationTime(options);\n await cache.put(request, response);\n }\n\n public async clearCachedRequest(request: Request, storage?: StorageType) {\n const cache = await this.getCache();\n if (cache === null) return;\n await cache.delete(request);\n this.storageService.removeItem(this.getStorageKey(request.url), { storageType: storage });\n }\n\n private storeExpirationTime(options: RequestCacheOptions) {\n const { request, maxAge } = options;\n const validUntil = Date.now() + maxAge;\n this.storageService.addItem(this.getStorageKey(request.url), validUntil.toString(), {\n storageType: options.storage,\n });\n }\n\n private getStorageKey(key: string) {\n return `${this.storageKeyPrefix}_${key}`;\n }\n}\n\nexport const RequestCachingService = new RequestCachingServiceImpl();\n","import { CacheOptions, ICachingService } from '../CachingService';\nimport { IRequestCachingService } from '../RequestCachingService';\n\nexport interface APIServiceCacheOptions extends CacheOptions {\n forceRefetch?: boolean;\n requestBasedCaching?: boolean;\n cacheKeys?: string[];\n}\n\nexport interface APIServiceRequestOptions {\n fetchOptions?: RequestInit;\n cacheOptions?: APIServiceCacheOptions;\n throwError?: boolean;\n}\n\nexport interface APIServiceConstructorOptions {\n cachingService?: ICachingService;\n requestCachingService?: IRequestCachingService;\n}\n\nexport class APIError extends Error {\n public response: Response;\n\n constructor(response: Response) {\n super(response.statusText);\n this.response = response;\n }\n}\n","import { appendQueryObject } from \"@kluntje/js-utils/lib/url-helpers\";\n\nimport DebuggerService from \"../DebuggerService\";\nimport { IRequestCachingService, RequestCachingService } from \"../RequestCachingService\";\nimport { CachingService, ICachingService } from \"../CachingService\";\n\nimport { APIError, APIServiceCacheOptions, APIServiceConstructorOptions, APIServiceRequestOptions } from \"./APIService.types\";\nimport { IAPIService } from \"./APIService.interface\";\n\nexport class APIServiceImpl implements IAPIService {\n private requestPipeline: Map<string, Promise<Response | null>> = new Map();\n\n private cachingService: ICachingService = CachingService;\n private requestCachingService: IRequestCachingService = RequestCachingService;\n\n constructor(options: APIServiceConstructorOptions = {}) {\n const { cachingService, requestCachingService } = options;\n\n if (cachingService !== undefined) this.cachingService = cachingService;\n if (requestCachingService !== undefined) this.requestCachingService = requestCachingService;\n }\n\n public async fetchJSON<T>(url: string, options: APIServiceRequestOptions = {}): Promise<T | null> {\n // eslint-disable-next-line prettier/prettier\n return await this.fetch(url, APIServiceImpl.getJSON<T>, options);\n }\n\n public async fetchHTML(url: string, options: APIServiceRequestOptions = {}): Promise<string | null> {\n return await this.fetch(url, APIServiceImpl.getHTML, options);\n }\n\n private async fetch<T>(\n url: string,\n dataMapper: (response: Response | null) => Promise<T>,\n options: APIServiceRequestOptions = {},\n ): Promise<T | null> {\n const { cacheOptions } = options;\n\n if (cacheOptions?.forceRefetch === true) {\n this.clearCachedValue(url, cacheOptions);\n }\n\n const cachedValue = await this.getCachedValue<T>(url, cacheOptions);\n if (cachedValue !== null) return cachedValue;\n\n try {\n const pipelineRequest = this.requestPipeline.get(url);\n if (pipelineRequest !== undefined) {\n return await dataMapper(await pipelineRequest);\n }\n\n const request = this.fetchData(url, options);\n this.requestPipeline.set(url, request);\n\n const response = await request;\n const responseData = await dataMapper(response);\n this.requestPipeline.delete(url);\n\n if (response === null || responseData === null) return null;\n\n if (cacheOptions === undefined) return responseData;\n await this.cacheResponse(url, response, responseData, cacheOptions);\n\n return responseData;\n } catch (error) {\n DebuggerService.error(\"APIService.fetch: \", error);\n this.requestPipeline.delete(url);\n if (options.throwError === true) throw error;\n return null;\n }\n }\n\n public async fetchResponse(url: string, options: APIServiceRequestOptions = {}): Promise<Response | null> {\n const { cacheOptions } = options;\n const { forceRefetch = false } = cacheOptions ?? {};\n\n if (forceRefetch === true) {\n await this.requestCachingService.clearCachedRequest(new Request(url), cacheOptions?.storageType ?? \"session\");\n }\n\n const cachedResponse = await this.requestCachingService.getCachedResponse(\n new Request(url),\n cacheOptions?.storageType ?? \"session\",\n );\n\n if (cachedResponse !== null) return cachedResponse;\n\n const pipelineRequest = this.requestPipeline.get(url);\n\n if (pipelineRequest !== undefined) {\n return await pipelineRequest;\n }\n\n try {\n const request = fetch(url, options.fetchOptions);\n this.requestPipeline.set(url, request);\n\n const response = await request;\n this.requestPipeline.delete(url);\n\n if (cacheOptions === undefined) return response;\n\n await this.requestCachingService.cacheRequest({\n request: new Request(url),\n response: response.clone(),\n storage: cacheOptions.storageType ?? \"session\",\n maxAge: cacheOptions.validFor,\n });\n\n return response;\n } catch (error) {\n DebuggerService.error(\"APIService.fetchResponse: \", error);\n\n this.requestPipeline.delete(url);\n\n if (options.throwError === true) throw error;\n return null;\n }\n }\n\n private async fetchData(url: string, options: APIServiceRequestOptions): Promise<Response | null> {\n const response = await fetch(url, options.fetchOptions);\n\n if (!response.ok) throw new APIError(response);\n if (response.status === 204) return null;\n\n return response;\n }\n\n private static async getJSON<T>(response: Response | null): Promise<T | null> {\n if (response === null) return null;\n\n const responseClone = response.clone();\n return await responseClone.json();\n }\n\n private static async getHTML(response: Response | null): Promise<string | null> {\n if (response === null) return null;\n\n const responseClone = response.clone();\n return await responseClone.text();\n }\n\n private async cacheResponse<T>(\n url: string,\n response: Response,\n responseData: T,\n cacheOptions: APIServiceCacheOptions,\n ) {\n const cacheKey = this.getCacheKey(url, cacheOptions);\n\n if (cacheOptions.requestBasedCaching === true) {\n await this.requestCachingService.cacheRequest({\n request: new Request(cacheKey),\n response,\n storage: cacheOptions.storageType ?? \"local\",\n maxAge: cacheOptions.validFor,\n });\n } else {\n this.cachingService.cacheValue(cacheKey, JSON.stringify(responseData), cacheOptions);\n }\n }\n\n private async clearCachedValue(url: string, cacheOptions?: APIServiceCacheOptions) {\n if (cacheOptions === undefined) return;\n const { requestBasedCaching = false } = cacheOptions;\n const cacheKey = this.getCacheKey(url, cacheOptions);\n\n if (requestBasedCaching === true) {\n await this.requestCachingService.clearCachedRequest(new Request(cacheKey), cacheOptions.storageType);\n }\n this.cachingService.clearCachedValue(cacheKey, cacheOptions);\n }\n\n private async getCachedValue<T>(url: string, cacheOptions?: APIServiceCacheOptions): Promise<T | null> {\n if (cacheOptions === undefined) return null;\n const { requestBasedCaching = false } = cacheOptions;\n\n const cacheKey = this.getCacheKey(url, cacheOptions);\n if (requestBasedCaching === true) {\n return await this.requestCachingService.getCachedJSON(new Request(cacheKey), cacheOptions.storageType);\n }\n return this.cachingService.getCachedJSON(cacheKey, cacheOptions);\n }\n\n private getCacheKey(url: string, cacheOptions?: APIServiceCacheOptions): string {\n const cacheKeys = cacheOptions?.cacheKeys ?? [];\n if (cacheKeys.length === 0) return url;\n return appendQueryObject(url, { klCacheKeys: cacheKeys.join(\"_\") });\n }\n}\n\nexport const APIService = new APIServiceImpl();\n","import { IObserverService } from './ObserverService.interface';\nimport { ObserverCallback } from './ObserverService.types';\n\nexport class ObserverServiceImpl implements IObserverService {\n private observerMap: Map<string, Set<ObserverCallback>> = new Map();\n\n public observe(observedKey: string, callback: ObserverCallback) {\n const curCallbacks = this.getCallbacks(observedKey);\n curCallbacks.add(callback);\n this.observerMap.set(observedKey, curCallbacks);\n }\n\n public unobserve(observedKey: string, callback: ObserverCallback) {\n const curCallbacks = this.getCallbacks(observedKey);\n curCallbacks.delete(callback);\n this.observerMap.set(observedKey, curCallbacks);\n }\n\n public notifyObservers<T>(observedKey: string, data?: T) {\n const callbacks = this.getCallbacks(observedKey);\n callbacks.forEach((callback) => callback(data));\n }\n\n private getCallbacks(observedKey: string): Set<ObserverCallback> {\n return this.observerMap.get(observedKey) || new Set();\n }\n}\n\nexport const ObserverService = new ObserverServiceImpl();\n","import { ObserverServiceImpl } from '../ObserverService';\n\nexport class ContextState<StateDefinition extends Record<string, any> = Record<string, any>> {\n private stateMap: Map<keyof StateDefinition, any> = new Map();\n private observerService = new ObserverServiceImpl();\n private contextName: string;\n private contextElement: HTMLElement;\n\n constructor(contextName: string, contextElement: HTMLElement) {\n this.contextName = contextName;\n this.contextElement = contextElement;\n }\n\n public get name(): string {\n return this.contextName;\n }\n\n public get element(): HTMLElement {\n return this.contextElement;\n }\n\n public isMatchingContext(contextName: string, consumingElement: HTMLElement): boolean {\n if (this.contextName !== contextName) return false;\n\n return this.contextElement.contains(consumingElement);\n }\n\n public setState<K extends keyof StateDefinition>(key: K, value: StateDefinition[K]): void {\n if (this.stateMap.get(key) === value) return;\n this.stateMap.set(key, value);\n this.observerService.notifyObservers(key as string);\n }\n\n public setStates(newState: Partial<StateDefinition>): void {\n const changedKeys = Object.keys(newState).filter((key) => this.stateMap.get(key) !== newState[key]);\n\n changedKeys.forEach((key) => {\n this.stateMap.set(key, newState[key]);\n });\n\n changedKeys.forEach((key) => {\n this.observerService.notifyObservers(key);\n });\n }\n\n public getState<K extends keyof StateDefinition>(key: K): StateDefinition[K] | undefined {\n return this.stateMap.get(key);\n }\n\n public observeState(key: keyof StateDefinition, callback: () => void): void {\n this.observerService.observe(key as string, callback);\n }\n\n public unobserveState(key: keyof StateDefinition, callback: () => void): void {\n this.observerService.unobserve(key as string, callback);\n }\n}\n","import { ContextState } from './ContextState';\nimport { ObserverServiceImpl } from '../ObserverService';\nimport { IContextStateService } from './ContextStateService.interface';\n\nexport class ContextStateServiceImpl implements IContextStateService {\n private contextStateMap: Map<string, ContextState[]> = new Map();\n private contextInitObserver = new ObserverServiceImpl();\n\n private getMatchingContextState(contextName: string, consumingElement: HTMLElement): ContextState | null {\n const contextList = this.contextStateMap.get(contextName) || [];\n const matchingContexts = contextList.filter((context) => context.isMatchingContext(contextName, consumingElement));\n if (matchingContexts.length === 0) return null;\n return matchingContexts[0];\n }\n\n public getContextState<StateDefinition extends Record<string, any>>(\n contextName: string,\n consumingElement: HTMLElement,\n ): Promise<ContextState<StateDefinition>> {\n const matchingContextState = this.getMatchingContextState(contextName, consumingElement);\n if (matchingContextState) return Promise.resolve(matchingContextState) as Promise<ContextState<StateDefinition>>;\n return new Promise<ContextState<StateDefinition>>((resolve) => {\n this.contextInitObserver.observe(contextName, () => {\n const contextState = this.getMatchingContextState(contextName, consumingElement);\n if (contextState) {\n resolve(contextState as ContextState<StateDefinition>);\n }\n });\n });\n }\n\n public createContextState<StateDefinition extends Record<string, any>>(\n contextName: string,\n contextElement: HTMLElement,\n ): ContextState<StateDefinition> {\n const contextState = new ContextState(contextName, contextElement);\n const contextList = this.contextStateMap.get(contextName) || [];\n contextList.push(contextState);\n this.contextStateMap.set(contextName, contextList);\n this.contextInitObserver.notifyObservers(contextName);\n return contextState as ContextState<StateDefinition>;\n }\n}\n\nexport const ContextStateService = new ContextStateServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { APIService, APIServiceRequestOptions, IAPIService } from '../APIService';\nimport {\n AbortableRequestServiceConstructorOptions,\n AbortableRequestServiceOptions,\n} from './AbortableRequestService.types';\n\nexport class AbortableRequestService {\n private abortController = new AbortController();\n private abortOptions: AbortableRequestServiceOptions | null = null;\n private latestOptions: AbortableRequestServiceOptions | null = null;\n\n protected apiService: IAPIService = APIService;\n\n constructor(options: AbortableRequestServiceConstructorOptions = {}) {\n const { apiService } = options;\n\n if (apiService !== undefined) this.apiService = apiService;\n }\n\n public async fetchJSON<T>(options: AbortableRequestServiceOptions): Promise<T | null> {\n return await this.makeAbortableRequest<T>(options, this.apiService.fetchJSON.bind(this.apiService));\n }\n\n public async fetchResponse(options: AbortableRequestServiceOptions): Promise<Response | null> {\n return await this.makeAbortableRequest<Response>(options, this.apiService.fetchResponse.bind(this.apiService));\n }\n\n private async makeAbortableRequest<R>(\n options: AbortableRequestServiceOptions,\n fetcher: (url: string, options: APIServiceRequestOptions) => Promise<R | null>,\n ): Promise<R | null> {\n if (this.latestOptions !== null) {\n this.abortOptions = options;\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n this.latestOptions = options;\n\n try {\n const response = await fetcher(options.url, {\n cacheOptions: options.options?.cacheOptions,\n throwError: true,\n fetchOptions: {\n ...options.options?.fetchOptions,\n signal: this.abortController.signal,\n },\n });\n this.latestOptions = null;\n return response;\n } catch (error: any) {\n DebuggerService.error('AbortableRequestService.makeAbortableRequest: ', error);\n\n if (error.name === 'AbortError') return this.handleAbortError<R>(this.fetchJSON.bind(this));\n\n if (options.options?.throwError === true) throw error;\n\n return null;\n }\n }\n\n private async handleAbortError<R>(\n nextAction: (options: AbortableRequestServiceOptions) => Promise<R | null>,\n ): Promise<R | null> {\n const latestOptions = this.latestOptions || this.abortOptions;\n if (latestOptions === null) return null;\n this.abortOptions = null;\n this.latestOptions = null;\n return nextAction(latestOptions);\n }\n}\n"],"names":["ViewportObserver","constructor","static","undefined","instance","IntersectionObserver","handleIntersectionChange","e","Object","keys","forEach","key","observedEl","target","isIntersecting","dispatchEvent","CustomEvent","bubbles","MediaQueryService","this","eventIdMap","WeakMap","eventBindingMap","lastMQ","getCurrentMQ","mediaQuerys","onEvent","window","handleMQChange","newMQ","detail","oldMQ","__decorate","throttle","resolveSymbol","Symbol","rejectSymbol","pendingSymbol","I18nService","PLACEHOLDER_SELECTOR","_instance","isSetUp","Boolean","_url","isFilledObject","_dictionary","loaded","_loaded","ready","_ready","fetchI18nDictionary","setUp","url","dictionary","console","warn","Error","get","fallback","interpolations","hasOwnProperty","result","entries","k","v","split","join","String","getHumanReadableName","addStyling","getPlaceholder","getReadyPromise","resolve","reject","Promise","res","rej","ensureSetup","head","document","style","createElement","type","appendChild","createTextNode","fetchJSON","then","results","fillInPlaceholders","catch","err","error","Array","from","getElementsByClassName","el","dataset","replaceWith","JSON","parse","reverse","replace","letter","toLowerCase","span","innerText","classList","add","setAttribute","stringify","outerHTML","URLSearchParams","location","search","param","urlSearchParams","getAll","getAllKeys","set","value","updateUrl","delete","getString","toString","curUrl","protocol","host","pathname","curQueryString","hashCache","hash","newUrl","history","replaceState","path","Proxy","prop","URLSearchParamsService","intersectionObserver","rootMargin","subscribe","intersectionCallback","componentMap","observe","unsubscribe","unobserve","intersectionEntry","has","StorageServiceImpl","Map","addEventListener","handleStorageChange","addItem","storageKey","storageValue","options","getStorage","setItem","fireCallbacks","getItem","removeItem","observeItem","callback","keyCallbacks","getKeyCallbacks","observedItemsMap","unobserveItem","clearStorage","storageType","clear","oldValue","newValue","Set","localStorage","sessionStorage","StorageService","CachingServiceImpl","storageService","storageKeyPrefix","shouldCache","cacheValue","validFor","runtimeCache","getStorageKey","cacheItem","validUntil","Date","now","getStorageServiceOptions","getCachedValue","cacheOptions","runtimeValue","cachedItemString","cachedItem","DebuggerService","getCachedJSON","cachedValue","clearCachedValue","CachingService","RequestCachingServiceImpl","requestCacheName","getCache","_cache","caches","open","getCachedResponse","request","storage","cache","response","match","parseInt","json","cacheRequest","storeExpirationTime","put","clearCachedRequest","maxAge","RequestCachingService","APIError","super","statusText","APIServiceImpl","cachingService","requestCachingService","fetch","fetchHTML","getHTML","dataMapper","forceRefetch","pipelineRequest","requestPipeline","fetchData","responseData","cacheResponse","throwError","fetchResponse","Request","cachedResponse","fetchOptions","clone","ok","status","responseClone","text","cacheKey","getCacheKey","requestBasedCaching","cacheKeys","length","appendQueryObject","klCacheKeys","APIService","ObserverServiceImpl","observedKey","curCallbacks","getCallbacks","observerMap","notifyObservers","data","ObserverService","ContextState","contextName","contextElement","name","element","isMatchingContext","consumingElement","contains","setState","stateMap","observerService","setStates","newState","changedKeys","filter","getState","observeState","unobserveState","ContextStateServiceImpl","getMatchingContextState","matchingContexts","contextStateMap","context","getContextState","matchingContextState","contextInitObserver","contextState","createContextState","contextList","push","ContextStateService","AbortController","apiService","makeAbortableRequest","bind","fetcher","latestOptions","abortOptions","abortController","abort","signal","handleAbortError","nextAction"],"mappings":"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"} |
@@ -15,3 +15,3 @@ import{throttle as e}from"@kluntje/js-utils/lib/function-helpers/decorators";import{getCurrentMQ as t,onEvent as r}from"@kluntje/js-utils/lib/dom-helpers";import{fetchJSON as s}from"@kluntje/js-utils/lib/api-helpers";import{isFilledObject as i}from"@kluntje/js-utils/lib/object-helpers";import{appendQueryObject as n}from"@kluntje/js-utils/lib/url-helpers";const o="kl-mq-change",a="kl-in-vp",c="kl-out-vp";class l{constructor(){}static getInstance(){return void 0===l.instance&&(l.instance=new IntersectionObserver(l.handleIntersectionChange)),l.instance}static handleIntersectionChange(e){Object.keys(e).forEach((t=>{const r=e[t],s=r.target;r.isIntersecting?s.dispatchEvent(new CustomEvent("kl-in-vp",{bubbles:!1})):s.dispatchEvent(new CustomEvent("kl-out-vp",{bubbles:!1}))}))}} | ||
| PERFORMANCE OF THIS SOFTWARE. | ||
| ***************************************************************************** */function h(e,t,r,s){return new(r||(r=Promise))((function(i,n){function o(e){try{c(s.next(e))}catch(e){n(e)}}function a(e){try{c(s.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,a)}c((s=s.apply(e,t||[])).next())}))}class u{constructor(){this.eventIdMap=new WeakMap,this.eventBindingMap={},this.lastMQ=t(u.mediaQuerys),r(window,"resize",this.handleMQChange,this)}static getInstance(e){return void 0===u.instance&&(u.mediaQuerys=e,u.instance=new u),u.instance}handleMQChange(){const e=t(u.mediaQuerys);e!==this.lastMQ&&(window.dispatchEvent(new CustomEvent("kl-mq-change",{detail:{newMQ:e,oldMQ:this.lastMQ}})),this.lastMQ=e)}}!function(e,t,r,s){var i,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(n<3?i(o):n>3?i(t,r,o):i(t,r))||o);n>3&&o&&Object.defineProperty(t,r,o)}([e(100)],u.prototype,"handleMQChange",null);const d=Symbol("resolve"),g=Symbol("reject"),v=Symbol("pending");class p{static get PLACEHOLDER_SELECTOR(){return"kl-i18n-placeholder"}static getInstance(){return void 0===p._instance&&(p._instance=new p),p._instance}get isSetUp(){return Boolean(this._url||i(this._dictionary))}get loaded(){return this._loaded}get ready(){return this._ready[v]||this.fetchI18nDictionary(),this._ready}setUp({url:e,dictionary:t}={}){if(this.isSetUp)console.warn("@kluntje I18nService: service has already been set up. You can't set it up twice!");else if(e)this._url=e;else{if(!t)throw new Error('@kluntje I18nService: a "url" or "dictionary" should have been passed to the setUp function.');this._dictionary=t,this._loaded=!0,this._ready[d](),this._ready[v]=!0}}get(e,{fallback:t,interpolations:r}={}){if(this.loaded){if(this._dictionary.hasOwnProperty(e)){let t=this._dictionary[e];return r&&Object.entries(r).forEach((([e,r])=>{t=t.split(`{${e}}`).join(String(r))})),t}return console.warn(`@kluntje I18nService: i18n for key '${e}' is missing in dictionary!`),void 0!==t?t:this.getHumanReadableName(e)}return this._ready[v]||(this.addStyling(),this.fetchI18nDictionary()),this.getPlaceholder(e,{fallback:t,interpolations:r})}constructor(){this._loaded=!1,this._dictionary={},this._ready=this.getReadyPromise()}getReadyPromise(){let e,t;const r=new Promise(((r,s)=>{e=r,t=s}));return r[d]=e,r[g]=t,r[v]=!1,r}ensureSetup(){if(!this.isSetUp)throw new Error("@kluntje I18nService: should be set up before calling other APIs")}addStyling(){const e=document.head,t=document.createElement("style");t.type="text/css",t.appendChild(document.createTextNode(`\n .${p.PLACEHOLDER_SELECTOR} {\n display: contents;\n }\n `)),e.appendChild(t)}fetchI18nDictionary(){this.ensureSetup(),this._ready[v]=!0,s(this._url).then((e=>{this._dictionary=e,this._loaded=!0,this._ready[d](),this.fillInPlaceholders()})).catch((e=>{console.error("@kluntje I18nService: unable to fetch keys from server!",e),this._loaded=!0,this._ready[d]()}))}fillInPlaceholders(){Array.from(document.getElementsByClassName(p.PLACEHOLDER_SELECTOR)).forEach((e=>{const{key:t,fallback:r,interpolations:s}=e.dataset;e.replaceWith(this.get(t,{fallback:r,interpolations:s?JSON.parse(s):void 0}))}))}getHumanReadableName(e){return e.split(".").reverse()[0].replace(/[A-Z]/g,(e=>` ${e.toLowerCase()}`))}getPlaceholder(e,{fallback:t,interpolations:r}={}){const s=document.createElement("span");return s.innerText=void 0!==t?t:this.getHumanReadableName(e),s.classList.add(p.PLACEHOLDER_SELECTOR),s.setAttribute("data-key",e),t&&s.setAttribute("data-fallback",t),r&&s.setAttribute("data-interpolations",JSON.stringify(r)),s.outerHTML}}var y=new class{constructor(){this.urlSearchParams=new URLSearchParams(window.location.search)}get(e){return this.urlSearchParams.get(e)}getAll(e){return this.urlSearchParams.getAll(e)}getAllKeys(){return Array.from(this.urlSearchParams.keys())}set(e,t){this.urlSearchParams.set(e,t),this.updateUrl()}delete(e){this.urlSearchParams.delete(e),this.updateUrl()}getString(){return this.urlSearchParams.toString()}get curUrl(){return`${window.location.protocol}//${window.location.host}${window.location.pathname}`}updateUrl(){const e=this.getString(),t=this.curUrl,r=window.location.hash,s=""!==e?`${t}?${e}`:t;window.history.replaceState({path:s},"",s),""!==r&&(window.location.hash=r)}};var S=new Proxy(console,{get:(e,t)=>null!==y.get("js-debug")?e[t]:()=>{}});var f=new class{constructor(){this.componentMap=new WeakMap,this.intersectionObserver=new IntersectionObserver((e=>this.handleIntersectionChange(e)),{rootMargin:"500px 0px"})}subscribe(e,t){this.componentMap.set(e,t),this.intersectionObserver.observe(e)}unsubscribe(e){this.intersectionObserver.unobserve(e),this.componentMap.delete(e)}handleIntersectionChange(e){e.forEach((e=>{const t=e.target;if(!e.isIntersecting||!this.componentMap.has(t))return;const r=this.componentMap.get(t);this.unsubscribe(t),r()}))}};class b{constructor(){this.observedItemsMap=new Map,window.addEventListener("storage",(e=>this.handleStorageChange(e)))}addItem(e,t,r={}){this.getStorage(r).setItem(e,t),this.fireCallbacks(e)}getItem(e,t={}){return this.getStorage(t).getItem(e)}removeItem(e,t={}){this.getStorage(t).removeItem(e)}observeItem(e,t){const r=this.getKeyCallbacks(e);r.add(t),this.observedItemsMap.set(e,r)}unobserveItem(e,t){const r=this.getKeyCallbacks(e);r.delete(t),this.observedItemsMap.set(e,r)}clearStorage(e){this.getStorage({storageType:e}).clear()}handleStorageChange(e){const t=e.key,r=e.oldValue,s=e.newValue;null!==t&&r!==s&&this.observedItemsMap.has(t)&&this.fireCallbacks(t)}getKeyCallbacks(e){return this.observedItemsMap.get(e)||new Set}fireCallbacks(e){this.getKeyCallbacks(e).forEach((e=>e()))}getStorage(e){const{storageType:t="local"}=e;return"local"===t?localStorage:sessionStorage}}const m=new b;class C{constructor(e){this.runtimeCache=new Map,this.storageService=m,this.storageKeyPrefix="kl-caching-service";const{storageService:t,storageKeyPrefix:r}=null!=e?e:{};void 0!==t&&(this.storageService=t),void 0!==r&&(this.storageKeyPrefix=r)}get shouldCache(){return!0}cacheValue(e,t,r){if(!1===this.shouldCache)return;if(0===r.validFor)return void this.runtimeCache.set(this.getStorageKey(e),t);const s={value:t,validUntil:Date.now()+r.validFor};this.storageService.addItem(this.getStorageKey(e),JSON.stringify(s),this.getStorageServiceOptions(r))}getCachedValue(e,t){if(!1===this.shouldCache)return null;const r=this.getStorageKey(e),s=this.runtimeCache.get(r);if(void 0!==s)return s;const i=this.storageService.getItem(r,this.getStorageServiceOptions(t));if(null===i)return null;try{const e=JSON.parse(i);return e.validUntil<Date.now()?(this.storageService.removeItem(r,this.getStorageServiceOptions(t)),null):e.value}catch(e){return S.warn("CachingService: ",e),this.storageService.removeItem(r,this.getStorageServiceOptions(t)),null}}getCachedJSON(e,t){const r=this.getCachedValue(e,t);if(null===r)return null;try{return JSON.parse(r)}catch(e){return S.error("CachingService: ",e),null}}clearCachedValue(e,t){const r=this.getStorageKey(e);0!==(null==t?void 0:t.validFor)?this.storageService.removeItem(r,this.getStorageServiceOptions(t)):this.runtimeCache.delete(r)}getStorageServiceOptions(e){return{storageType:null==e?void 0:e.storageType}}getStorageKey(e){return`${this.storageKeyPrefix}_${e}`}}const w=new C;class O{constructor(e){this.storageService=m,this.requestCacheName="kl-request-cache",this.storageKeyPrefix="kl-request-caching-service";const{storageService:t,requestCacheName:r,storageKeyPrefix:s}=null!=e?e:{};void 0!==t&&(this.storageService=t),void 0!==r&&(this.requestCacheName=r),void 0!==s&&(this.storageKeyPrefix=s)}getCache(){return h(this,void 0,void 0,(function*(){try{return void 0===this._cache&&(this._cache=caches.open(this.requestCacheName)),yield this._cache}catch(e){return S.error("RequestCachingService: ",e),null}}))}getCachedResponse(e,t){return h(this,void 0,void 0,(function*(){const r=yield this.getCache();if(null===r)return null;const s=yield r.match(e);if(void 0===s)return null;const i=this.storageService.getItem(this.getStorageKey(e.url),{storageType:t});if(null===i)return yield r.delete(e),null;return Date.now()>parseInt(i,10)?(yield r.delete(e),null):s}))}getCachedJSON(e,t){return h(this,void 0,void 0,(function*(){const r=yield this.getCachedResponse(e,t);if(null===r)return null;try{return yield r.json()}catch(e){return S.error("RequestCachingService: ",e),null}}))}cacheRequest(e){return h(this,void 0,void 0,(function*(){const{request:t,response:r}=e,s=yield this.getCache();null!==s&&(this.storeExpirationTime(e),yield s.put(t,r))}))}clearCachedRequest(e,t){return h(this,void 0,void 0,(function*(){const r=yield this.getCache();null!==r&&(yield r.delete(e),this.storageService.removeItem(this.getStorageKey(e.url),{storageType:t}))}))}storeExpirationTime(e){const{request:t,maxAge:r}=e,s=Date.now()+r;this.storageService.addItem(this.getStorageKey(t.url),s.toString(),{storageType:e.storage})}getStorageKey(e){return`${this.storageKeyPrefix}_${e}`}}const k=new O;class M extends Error{constructor(e){super(e.statusText),this.response=e}}class q{constructor(e={}){this.requestPipeline=new Map,this.cachingService=w,this.requestCachingService=k;const{cachingService:t,requestCachingService:r}=e;void 0!==t&&(this.cachingService=t),void 0!==r&&(this.requestCachingService=r)}fetchJSON(e,t={}){return h(this,void 0,void 0,(function*(){return yield this.fetch(e,q.getJSON,t)}))}fetchHTML(e,t={}){return h(this,void 0,void 0,(function*(){return yield this.fetch(e,q.getHTML,t)}))}fetch(e,t,r={}){return h(this,void 0,void 0,(function*(){const{cacheOptions:s}=r;!0===(null==s?void 0:s.forceRefetch)&&this.clearCachedValue(e,s);const i=yield this.getCachedValue(e,s);if(null!==i)return i;try{const i=this.requestPipeline.get(e);if(void 0!==i)return yield t(yield i);const n=this.fetchData(e,r);this.requestPipeline.set(e,n);const o=yield n,a=yield t(o);return this.requestPipeline.delete(e),null===o||null===a?null:(void 0===s||(yield this.cacheResponse(e,o,a,s)),a)}catch(t){if(S.error("APIService.fetch: ",t),this.requestPipeline.delete(e),!0===r.throwError)throw t;return null}}))}fetchResponse(e,t={}){var r,s,i;return h(this,void 0,void 0,(function*(){const{cacheOptions:n}=t,{forceRefetch:o=!1}=null!=n?n:{};!0===o&&(yield this.requestCachingService.clearCachedRequest(new Request(e),null!==(r=null==n?void 0:n.storageType)&&void 0!==r?r:"session"));const a=yield this.requestCachingService.getCachedResponse(new Request(e),null!==(s=null==n?void 0:n.storageType)&&void 0!==s?s:"session");if(null!==a)return a;const c=this.requestPipeline.get(e);if(void 0!==c)return yield c;try{const r=fetch(e,t.fetchOptions);this.requestPipeline.set(e,r);const s=yield r;return this.requestPipeline.delete(e),void 0===n?s:(yield this.requestCachingService.cacheRequest({request:new Request(e),response:s,storage:null!==(i=n.storageType)&&void 0!==i?i:"session",maxAge:n.validFor}),s)}catch(r){if(S.error("APIService.fetchResponse: ",r),this.requestPipeline.delete(e),!0===t.throwError)throw r;return null}}))}fetchData(e,t){return h(this,void 0,void 0,(function*(){const r=yield fetch(e,t.fetchOptions);if(!r.ok)throw new M(r);return 204===r.status?null:r}))}static getJSON(e){return h(this,void 0,void 0,(function*(){if(null===e)return null;const t=e.clone();return yield t.json()}))}static getHTML(e){return h(this,void 0,void 0,(function*(){if(null===e)return null;const t=e.clone();return yield t.text()}))}cacheResponse(e,t,r,s){var i;return h(this,void 0,void 0,(function*(){const n=this.getCacheKey(e,s);!0===s.requestBasedCaching?yield this.requestCachingService.cacheRequest({request:new Request(n),response:t,storage:null!==(i=s.storageType)&&void 0!==i?i:"local",maxAge:s.validFor}):this.cachingService.cacheValue(n,JSON.stringify(r),s)}))}clearCachedValue(e,t){return h(this,void 0,void 0,(function*(){if(void 0===t)return;const{requestBasedCaching:r=!1}=t,s=this.getCacheKey(e,t);!0===r&&(yield this.requestCachingService.clearCachedRequest(new Request(s),t.storageType)),this.cachingService.clearCachedValue(s,t)}))}getCachedValue(e,t){return h(this,void 0,void 0,(function*(){if(void 0===t)return null;const{requestBasedCaching:r=!1}=t,s=this.getCacheKey(e,t);return!0===r?yield this.requestCachingService.getCachedJSON(new Request(s),t.storageType):this.cachingService.getCachedJSON(s,t)}))}getCacheKey(e,t){var r;const s=null!==(r=null==t?void 0:t.cacheKeys)&&void 0!==r?r:[];return 0===s.length?e:n(e,{klCacheKeys:s.join("_")})}}const I=new q;class E{constructor(e={}){this.abortController=new AbortController,this.abortOptions=null,this.latestOptions=null,this.apiService=I;const{apiService:t}=e;void 0!==t&&(this.apiService=t)}fetchJSON(e){return h(this,void 0,void 0,(function*(){return yield this.makeAbortableRequest(e,this.apiService.fetchJSON.bind(this.apiService))}))}fetchResponse(e){return h(this,void 0,void 0,(function*(){return yield this.makeAbortableRequest(e,this.apiService.fetchResponse.bind(this.apiService))}))}makeAbortableRequest(e,t){var r,s,i;return h(this,void 0,void 0,(function*(){null!==this.latestOptions&&(this.abortOptions=e,this.abortController.abort(),this.abortController=new AbortController),this.latestOptions=e;try{const i=yield t(e.url,{cacheOptions:null===(r=e.options)||void 0===r?void 0:r.cacheOptions,throwError:!0,fetchOptions:Object.assign(Object.assign({},null===(s=e.options)||void 0===s?void 0:s.fetchOptions),{signal:this.abortController.signal})});return this.latestOptions=null,i}catch(t){if(S.error("AbortableRequestService.makeAbortableRequest: ",t),"AbortError"===t.name)return this.handleAbortError(this.fetchJSON.bind(this));if(!0===(null===(i=e.options)||void 0===i?void 0:i.throwError))throw t;return null}}))}handleAbortError(e){return h(this,void 0,void 0,(function*(){const t=this.latestOptions||this.abortOptions;return null===t?null:(this.abortOptions=null,this.latestOptions=null,e(t))}))}}class R{constructor(){this.observerMap=new Map}observe(e,t){const r=this.getCallbacks(e);r.add(t),this.observerMap.set(e,r)}unobserve(e,t){const r=this.getCallbacks(e);r.delete(t),this.observerMap.set(e,r)}notifyObservers(e,t){this.getCallbacks(e).forEach((e=>e(t)))}getCallbacks(e){return this.observerMap.get(e)||new Set}}const P=new R;class x{constructor(e,t){this.stateMap=new Map,this.observerService=new R,this.contextName=e,this.contextElement=t}get name(){return this.contextName}get element(){return this.contextElement}isMatchingContext(e,t){return this.contextName===e&&this.contextElement.contains(t)}setState(e,t){this.stateMap.get(e)!==t&&(this.stateMap.set(e,t),this.observerService.notifyObservers(e))}setStates(e){const t=Object.keys(e).filter((t=>this.stateMap.get(t)!==e[t]));t.forEach((t=>{this.stateMap.set(t,e[t])})),t.forEach((e=>{this.observerService.notifyObservers(e)}))}getState(e){return this.stateMap.get(e)}observeState(e,t){this.observerService.observe(e,t)}unobserveState(e,t){this.observerService.unobserve(e,t)}}class _{constructor(){this.contextStateMap=new Map,this.contextInitObserver=new R}getMatchingContextState(e,t){const r=(this.contextStateMap.get(e)||[]).filter((r=>r.isMatchingContext(e,t)));return 0===r.length?null:r[0]}getContextState(e,t){const r=this.getMatchingContextState(e,t);return r?Promise.resolve(r):new Promise((r=>{this.contextInitObserver.observe(e,(()=>{const s=this.getMatchingContextState(e,t);s&&r(s)}))}))}createContextState(e,t){const r=new x(e,t),s=this.contextStateMap.get(e)||[];return s.push(r),this.contextStateMap.set(e,s),this.contextInitObserver.notifyObservers(e),r}}const j=new _;export{M as APIError,I as APIService,q as APIServiceImpl,E as AbortableRequestService,w as CachingService,C as CachingServiceImpl,x as ContextState,j as ContextStateService,_ as ContextStateServiceImpl,S as DebuggerService,p as I18nService,a as IN_VP_EVENT,f as LazyConnectService,o as MQ_CHANGE_EVENT,u as MediaQueryService,c as OUT_VP_EVENT,P as ObserverService,R as ObserverServiceImpl,k as RequestCachingService,O as RequestCachingServiceImpl,m as StorageService,b as StorageServiceImpl,y as URLSearchParamsService,l as ViewportObserver}; | ||
| ***************************************************************************** */function h(e,t,r,s){return new(r||(r=Promise))((function(i,n){function o(e){try{c(s.next(e))}catch(e){n(e)}}function a(e){try{c(s.throw(e))}catch(e){n(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,a)}c((s=s.apply(e,t||[])).next())}))}class u{constructor(){this.eventIdMap=new WeakMap,this.eventBindingMap={},this.lastMQ=t(u.mediaQuerys),r(window,"resize",this.handleMQChange,this)}static getInstance(e){return void 0===u.instance&&(u.mediaQuerys=e,u.instance=new u),u.instance}handleMQChange(){const e=t(u.mediaQuerys);e!==this.lastMQ&&(window.dispatchEvent(new CustomEvent("kl-mq-change",{detail:{newMQ:e,oldMQ:this.lastMQ}})),this.lastMQ=e)}}!function(e,t,r,s){var i,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,r):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,r,s);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(n<3?i(o):n>3?i(t,r,o):i(t,r))||o);n>3&&o&&Object.defineProperty(t,r,o)}([e(100)],u.prototype,"handleMQChange",null);const d=Symbol("resolve"),g=Symbol("reject"),v=Symbol("pending");class p{static get PLACEHOLDER_SELECTOR(){return"kl-i18n-placeholder"}static getInstance(){return void 0===p._instance&&(p._instance=new p),p._instance}get isSetUp(){return Boolean(this._url||i(this._dictionary))}get loaded(){return this._loaded}get ready(){return this._ready[v]||this.fetchI18nDictionary(),this._ready}setUp({url:e,dictionary:t}={}){if(this.isSetUp)console.warn("@kluntje I18nService: service has already been set up. You can't set it up twice!");else if(e)this._url=e;else{if(!t)throw new Error('@kluntje I18nService: a "url" or "dictionary" should have been passed to the setUp function.');this._dictionary=t,this._loaded=!0,this._ready[d](),this._ready[v]=!0}}get(e,{fallback:t,interpolations:r}={}){if(this.loaded){if(this._dictionary.hasOwnProperty(e)){let t=this._dictionary[e];return r&&Object.entries(r).forEach((([e,r])=>{t=t.split(`{${e}}`).join(String(r))})),t}return console.warn(`@kluntje I18nService: i18n for key '${e}' is missing in dictionary!`),void 0!==t?t:this.getHumanReadableName(e)}return this._ready[v]||(this.addStyling(),this.fetchI18nDictionary()),this.getPlaceholder(e,{fallback:t,interpolations:r})}constructor(){this._loaded=!1,this._dictionary={},this._ready=this.getReadyPromise()}getReadyPromise(){let e,t;const r=new Promise(((r,s)=>{e=r,t=s}));return r[d]=e,r[g]=t,r[v]=!1,r}ensureSetup(){if(!this.isSetUp)throw new Error("@kluntje I18nService: should be set up before calling other APIs")}addStyling(){const e=document.head,t=document.createElement("style");t.type="text/css",t.appendChild(document.createTextNode(`\n .${p.PLACEHOLDER_SELECTOR} {\n display: contents;\n }\n `)),e.appendChild(t)}fetchI18nDictionary(){this.ensureSetup(),this._ready[v]=!0,s(this._url).then((e=>{this._dictionary=e,this._loaded=!0,this._ready[d](),this.fillInPlaceholders()})).catch((e=>{console.error("@kluntje I18nService: unable to fetch keys from server!",e),this._loaded=!0,this._ready[d]()}))}fillInPlaceholders(){Array.from(document.getElementsByClassName(p.PLACEHOLDER_SELECTOR)).forEach((e=>{const{key:t,fallback:r,interpolations:s}=e.dataset;e.replaceWith(this.get(t,{fallback:r,interpolations:s?JSON.parse(s):void 0}))}))}getHumanReadableName(e){return e.split(".").reverse()[0].replace(/[A-Z]/g,(e=>` ${e.toLowerCase()}`))}getPlaceholder(e,{fallback:t,interpolations:r}={}){const s=document.createElement("span");return s.innerText=void 0!==t?t:this.getHumanReadableName(e),s.classList.add(p.PLACEHOLDER_SELECTOR),s.setAttribute("data-key",e),t&&s.setAttribute("data-fallback",t),r&&s.setAttribute("data-interpolations",JSON.stringify(r)),s.outerHTML}}var y=new class{constructor(){this.urlSearchParams=new URLSearchParams(window.location.search)}get(e){return this.urlSearchParams.get(e)}getAll(e){return this.urlSearchParams.getAll(e)}getAllKeys(){return Array.from(this.urlSearchParams.keys())}set(e,t){this.urlSearchParams.set(e,t),this.updateUrl()}delete(e){this.urlSearchParams.delete(e),this.updateUrl()}getString(){return this.urlSearchParams.toString()}get curUrl(){return`${window.location.protocol}//${window.location.host}${window.location.pathname}`}updateUrl(){const e=this.getString(),t=this.curUrl,r=window.location.hash,s=""!==e?`${t}?${e}`:t;window.history.replaceState({path:s},"",s),""!==r&&(window.location.hash=r)}};var S=new Proxy(console,{get:(e,t)=>null!==y.get("js-debug")?e[t]:()=>{}});var f=new class{constructor(){this.componentMap=new WeakMap,this.intersectionObserver=new IntersectionObserver((e=>this.handleIntersectionChange(e)),{rootMargin:"500px 0px"})}subscribe(e,t){this.componentMap.set(e,t),this.intersectionObserver.observe(e)}unsubscribe(e){this.intersectionObserver.unobserve(e),this.componentMap.delete(e)}handleIntersectionChange(e){e.forEach((e=>{const t=e.target;if(!e.isIntersecting||!this.componentMap.has(t))return;const r=this.componentMap.get(t);this.unsubscribe(t),r()}))}};class b{constructor(){this.observedItemsMap=new Map,window.addEventListener("storage",(e=>this.handleStorageChange(e)))}addItem(e,t,r={}){this.getStorage(r).setItem(e,t),this.fireCallbacks(e)}getItem(e,t={}){return this.getStorage(t).getItem(e)}removeItem(e,t={}){this.getStorage(t).removeItem(e)}observeItem(e,t){const r=this.getKeyCallbacks(e);r.add(t),this.observedItemsMap.set(e,r)}unobserveItem(e,t){const r=this.getKeyCallbacks(e);r.delete(t),this.observedItemsMap.set(e,r)}clearStorage(e){this.getStorage({storageType:e}).clear()}handleStorageChange(e){const t=e.key,r=e.oldValue,s=e.newValue;null!==t&&r!==s&&this.observedItemsMap.has(t)&&this.fireCallbacks(t)}getKeyCallbacks(e){return this.observedItemsMap.get(e)||new Set}fireCallbacks(e){this.getKeyCallbacks(e).forEach((e=>e()))}getStorage(e){const{storageType:t="local"}=e;return"local"===t?localStorage:sessionStorage}}const m=new b;class C{constructor(e){this.runtimeCache=new Map,this.storageService=m,this.storageKeyPrefix="kl-caching-service";const{storageService:t,storageKeyPrefix:r}=null!=e?e:{};void 0!==t&&(this.storageService=t),void 0!==r&&(this.storageKeyPrefix=r)}get shouldCache(){return!0}cacheValue(e,t,r){if(!1===this.shouldCache)return;if(0===r.validFor)return void this.runtimeCache.set(this.getStorageKey(e),t);const s={value:t,validUntil:Date.now()+r.validFor};this.storageService.addItem(this.getStorageKey(e),JSON.stringify(s),this.getStorageServiceOptions(r))}getCachedValue(e,t){if(!1===this.shouldCache)return null;const r=this.getStorageKey(e),s=this.runtimeCache.get(r);if(void 0!==s)return s;const i=this.storageService.getItem(r,this.getStorageServiceOptions(t));if(null===i)return null;try{const e=JSON.parse(i);return e.validUntil<Date.now()?(this.storageService.removeItem(r,this.getStorageServiceOptions(t)),null):e.value}catch(e){return S.warn("CachingService: ",e),this.storageService.removeItem(r,this.getStorageServiceOptions(t)),null}}getCachedJSON(e,t){const r=this.getCachedValue(e,t);if(null===r)return null;try{return JSON.parse(r)}catch(e){return S.error("CachingService: ",e),null}}clearCachedValue(e,t){const r=this.getStorageKey(e);0!==(null==t?void 0:t.validFor)?this.storageService.removeItem(r,this.getStorageServiceOptions(t)):this.runtimeCache.delete(r)}getStorageServiceOptions(e){return{storageType:null==e?void 0:e.storageType}}getStorageKey(e){return`${this.storageKeyPrefix}_${e}`}}const w=new C;class O{constructor(e){this.storageService=m,this.requestCacheName="kl-request-cache",this.storageKeyPrefix="kl-request-caching-service";const{storageService:t,requestCacheName:r,storageKeyPrefix:s}=null!=e?e:{};void 0!==t&&(this.storageService=t),void 0!==r&&(this.requestCacheName=r),void 0!==s&&(this.storageKeyPrefix=s)}getCache(){return h(this,void 0,void 0,(function*(){try{return void 0===this._cache&&(this._cache=caches.open(this.requestCacheName)),yield this._cache}catch(e){return S.error("RequestCachingService: ",e),null}}))}getCachedResponse(e,t){return h(this,void 0,void 0,(function*(){const r=yield this.getCache();if(null===r)return null;const s=yield r.match(e);if(void 0===s)return null;const i=this.storageService.getItem(this.getStorageKey(e.url),{storageType:t});if(null===i)return yield r.delete(e),null;return Date.now()>parseInt(i,10)?(yield r.delete(e),null):s}))}getCachedJSON(e,t){return h(this,void 0,void 0,(function*(){const r=yield this.getCachedResponse(e,t);if(null===r)return null;try{return yield r.json()}catch(e){return S.error("RequestCachingService: ",e),null}}))}cacheRequest(e){return h(this,void 0,void 0,(function*(){const{request:t,response:r}=e,s=yield this.getCache();null!==s&&(this.storeExpirationTime(e),yield s.put(t,r))}))}clearCachedRequest(e,t){return h(this,void 0,void 0,(function*(){const r=yield this.getCache();null!==r&&(yield r.delete(e),this.storageService.removeItem(this.getStorageKey(e.url),{storageType:t}))}))}storeExpirationTime(e){const{request:t,maxAge:r}=e,s=Date.now()+r;this.storageService.addItem(this.getStorageKey(t.url),s.toString(),{storageType:e.storage})}getStorageKey(e){return`${this.storageKeyPrefix}_${e}`}}const k=new O;class M extends Error{constructor(e){super(e.statusText),this.response=e}}class q{constructor(e={}){this.requestPipeline=new Map,this.cachingService=w,this.requestCachingService=k;const{cachingService:t,requestCachingService:r}=e;void 0!==t&&(this.cachingService=t),void 0!==r&&(this.requestCachingService=r)}fetchJSON(e,t={}){return h(this,void 0,void 0,(function*(){return yield this.fetch(e,q.getJSON,t)}))}fetchHTML(e,t={}){return h(this,void 0,void 0,(function*(){return yield this.fetch(e,q.getHTML,t)}))}fetch(e,t,r={}){return h(this,void 0,void 0,(function*(){const{cacheOptions:s}=r;!0===(null==s?void 0:s.forceRefetch)&&this.clearCachedValue(e,s);const i=yield this.getCachedValue(e,s);if(null!==i)return i;try{const i=this.requestPipeline.get(e);if(void 0!==i)return yield t(yield i);const n=this.fetchData(e,r);this.requestPipeline.set(e,n);const o=yield n,a=yield t(o);return this.requestPipeline.delete(e),null===o||null===a?null:(void 0===s||(yield this.cacheResponse(e,o,a,s)),a)}catch(t){if(S.error("APIService.fetch: ",t),this.requestPipeline.delete(e),!0===r.throwError)throw t;return null}}))}fetchResponse(e,t={}){var r,s,i;return h(this,void 0,void 0,(function*(){const{cacheOptions:n}=t,{forceRefetch:o=!1}=null!=n?n:{};!0===o&&(yield this.requestCachingService.clearCachedRequest(new Request(e),null!==(r=null==n?void 0:n.storageType)&&void 0!==r?r:"session"));const a=yield this.requestCachingService.getCachedResponse(new Request(e),null!==(s=null==n?void 0:n.storageType)&&void 0!==s?s:"session");if(null!==a)return a;const c=this.requestPipeline.get(e);if(void 0!==c)return yield c;try{const r=fetch(e,t.fetchOptions);this.requestPipeline.set(e,r);const s=yield r;return this.requestPipeline.delete(e),void 0===n?s:(yield this.requestCachingService.cacheRequest({request:new Request(e),response:s.clone(),storage:null!==(i=n.storageType)&&void 0!==i?i:"session",maxAge:n.validFor}),s)}catch(r){if(S.error("APIService.fetchResponse: ",r),this.requestPipeline.delete(e),!0===t.throwError)throw r;return null}}))}fetchData(e,t){return h(this,void 0,void 0,(function*(){const r=yield fetch(e,t.fetchOptions);if(!r.ok)throw new M(r);return 204===r.status?null:r}))}static getJSON(e){return h(this,void 0,void 0,(function*(){if(null===e)return null;const t=e.clone();return yield t.json()}))}static getHTML(e){return h(this,void 0,void 0,(function*(){if(null===e)return null;const t=e.clone();return yield t.text()}))}cacheResponse(e,t,r,s){var i;return h(this,void 0,void 0,(function*(){const n=this.getCacheKey(e,s);!0===s.requestBasedCaching?yield this.requestCachingService.cacheRequest({request:new Request(n),response:t,storage:null!==(i=s.storageType)&&void 0!==i?i:"local",maxAge:s.validFor}):this.cachingService.cacheValue(n,JSON.stringify(r),s)}))}clearCachedValue(e,t){return h(this,void 0,void 0,(function*(){if(void 0===t)return;const{requestBasedCaching:r=!1}=t,s=this.getCacheKey(e,t);!0===r&&(yield this.requestCachingService.clearCachedRequest(new Request(s),t.storageType)),this.cachingService.clearCachedValue(s,t)}))}getCachedValue(e,t){return h(this,void 0,void 0,(function*(){if(void 0===t)return null;const{requestBasedCaching:r=!1}=t,s=this.getCacheKey(e,t);return!0===r?yield this.requestCachingService.getCachedJSON(new Request(s),t.storageType):this.cachingService.getCachedJSON(s,t)}))}getCacheKey(e,t){var r;const s=null!==(r=null==t?void 0:t.cacheKeys)&&void 0!==r?r:[];return 0===s.length?e:n(e,{klCacheKeys:s.join("_")})}}const I=new q;class E{constructor(e={}){this.abortController=new AbortController,this.abortOptions=null,this.latestOptions=null,this.apiService=I;const{apiService:t}=e;void 0!==t&&(this.apiService=t)}fetchJSON(e){return h(this,void 0,void 0,(function*(){return yield this.makeAbortableRequest(e,this.apiService.fetchJSON.bind(this.apiService))}))}fetchResponse(e){return h(this,void 0,void 0,(function*(){return yield this.makeAbortableRequest(e,this.apiService.fetchResponse.bind(this.apiService))}))}makeAbortableRequest(e,t){var r,s,i;return h(this,void 0,void 0,(function*(){null!==this.latestOptions&&(this.abortOptions=e,this.abortController.abort(),this.abortController=new AbortController),this.latestOptions=e;try{const i=yield t(e.url,{cacheOptions:null===(r=e.options)||void 0===r?void 0:r.cacheOptions,throwError:!0,fetchOptions:Object.assign(Object.assign({},null===(s=e.options)||void 0===s?void 0:s.fetchOptions),{signal:this.abortController.signal})});return this.latestOptions=null,i}catch(t){if(S.error("AbortableRequestService.makeAbortableRequest: ",t),"AbortError"===t.name)return this.handleAbortError(this.fetchJSON.bind(this));if(!0===(null===(i=e.options)||void 0===i?void 0:i.throwError))throw t;return null}}))}handleAbortError(e){return h(this,void 0,void 0,(function*(){const t=this.latestOptions||this.abortOptions;return null===t?null:(this.abortOptions=null,this.latestOptions=null,e(t))}))}}class R{constructor(){this.observerMap=new Map}observe(e,t){const r=this.getCallbacks(e);r.add(t),this.observerMap.set(e,r)}unobserve(e,t){const r=this.getCallbacks(e);r.delete(t),this.observerMap.set(e,r)}notifyObservers(e,t){this.getCallbacks(e).forEach((e=>e(t)))}getCallbacks(e){return this.observerMap.get(e)||new Set}}const P=new R;class x{constructor(e,t){this.stateMap=new Map,this.observerService=new R,this.contextName=e,this.contextElement=t}get name(){return this.contextName}get element(){return this.contextElement}isMatchingContext(e,t){return this.contextName===e&&this.contextElement.contains(t)}setState(e,t){this.stateMap.get(e)!==t&&(this.stateMap.set(e,t),this.observerService.notifyObservers(e))}setStates(e){const t=Object.keys(e).filter((t=>this.stateMap.get(t)!==e[t]));t.forEach((t=>{this.stateMap.set(t,e[t])})),t.forEach((e=>{this.observerService.notifyObservers(e)}))}getState(e){return this.stateMap.get(e)}observeState(e,t){this.observerService.observe(e,t)}unobserveState(e,t){this.observerService.unobserve(e,t)}}class _{constructor(){this.contextStateMap=new Map,this.contextInitObserver=new R}getMatchingContextState(e,t){const r=(this.contextStateMap.get(e)||[]).filter((r=>r.isMatchingContext(e,t)));return 0===r.length?null:r[0]}getContextState(e,t){const r=this.getMatchingContextState(e,t);return r?Promise.resolve(r):new Promise((r=>{this.contextInitObserver.observe(e,(()=>{const s=this.getMatchingContextState(e,t);s&&r(s)}))}))}createContextState(e,t){const r=new x(e,t),s=this.contextStateMap.get(e)||[];return s.push(r),this.contextStateMap.set(e,s),this.contextInitObserver.notifyObservers(e),r}}const j=new _;export{M as APIError,I as APIService,q as APIServiceImpl,E as AbortableRequestService,w as CachingService,C as CachingServiceImpl,x as ContextState,j as ContextStateService,_ as ContextStateServiceImpl,S as DebuggerService,p as I18nService,a as IN_VP_EVENT,f as LazyConnectService,o as MQ_CHANGE_EVENT,u as MediaQueryService,c as OUT_VP_EVENT,P as ObserverService,R as ObserverServiceImpl,k as RequestCachingService,O as RequestCachingServiceImpl,m as StorageService,b as StorageServiceImpl,y as URLSearchParamsService,l as ViewportObserver}; | ||
| //# sourceMappingURL=index.module.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.module.js","sources":["../src/eventNames.ts","../src/ViewportObserver.ts","../src/MediaQueryService.ts","../src/I18nService.ts","../src/URLSearchParamsService.ts","../src/DebuggerService.ts","../src/LazyConnectService.ts","../src/StorageService/StorageService.ts","../src/CachingService/CachingService.ts","../src/RequestCachingService/RequestCachingService.ts","../src/APIService/APIService.types.ts","../src/APIService/APIService.ts","../src/AbortableRequestService/AbortableRequestService.ts","../src/ObserverService/ObserverService.ts","../src/ContextStateService/ContextState.ts","../src/ContextStateService/ContextStateService.ts"],"sourcesContent":["export const MQ_CHANGE_EVENT = 'kl-mq-change';\nexport const IN_VP_EVENT = 'kl-in-vp';\nexport const OUT_VP_EVENT = 'kl-out-vp';\n","import { IN_VP_EVENT, OUT_VP_EVENT } from './eventNames';\n\ntype IntersectionEvent = {\n [key: string]: any;\n};\n\nexport class ViewportObserver {\n private static instance: IntersectionObserver;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {}\n\n static getInstance() {\n if (ViewportObserver.instance === undefined) {\n ViewportObserver.instance = new IntersectionObserver(ViewportObserver.handleIntersectionChange);\n }\n return ViewportObserver.instance;\n }\n\n private static handleIntersectionChange(e: IntersectionEvent) {\n Object.keys(e).forEach((key) => {\n const observedEl = e[key];\n const target = observedEl.target;\n\n if (observedEl.isIntersecting) {\n target.dispatchEvent(new CustomEvent(IN_VP_EVENT, { bubbles: false }));\n } else {\n target.dispatchEvent(new CustomEvent(OUT_VP_EVENT, { bubbles: false }));\n }\n });\n }\n}\n","import { throttle } from '@kluntje/js-utils/lib/function-helpers/decorators';\nimport { onEvent, getCurrentMQ, MQDefinition } from '@kluntje/js-utils/lib/dom-helpers';\nimport { MQ_CHANGE_EVENT } from './eventNames';\n\nexport class MediaQueryService {\n private static instance: MediaQueryService;\n static mediaQuerys: Array<MQDefinition>;\n eventIdMap: WeakMap<HTMLElement | Function, string>;\n eventBindingMap: {\n [index: string]: EventListenerOrEventListenerObject;\n };\n lastMQ: string;\n\n private constructor() {\n this.eventIdMap = new WeakMap();\n this.eventBindingMap = {};\n this.lastMQ = getCurrentMQ(MediaQueryService.mediaQuerys);\n onEvent(window, 'resize', this.handleMQChange, this);\n }\n\n static getInstance(mediaQuerys: Array<MQDefinition>) {\n if (MediaQueryService.instance === undefined) {\n MediaQueryService.mediaQuerys = mediaQuerys;\n MediaQueryService.instance = new MediaQueryService();\n }\n return MediaQueryService.instance;\n }\n\n @throttle(100)\n handleMQChange() {\n const newMQ = getCurrentMQ(MediaQueryService.mediaQuerys);\n if (newMQ === this.lastMQ) {\n return;\n }\n\n window.dispatchEvent(\n new CustomEvent(MQ_CHANGE_EVENT, {\n detail: {\n newMQ,\n oldMQ: this.lastMQ,\n },\n }),\n );\n\n this.lastMQ = newMQ;\n }\n}\n","import { fetchJSON } from '@kluntje/js-utils/lib/api-helpers';\nimport { isFilledObject } from '@kluntje/js-utils/lib/object-helpers';\n\nconst resolveSymbol = Symbol('resolve');\nconst rejectSymbol = Symbol('reject');\nconst pendingSymbol = Symbol('pending');\n\n// Promise but with options to resolve/reject from outside\ninterface ExtendedPromise<T> extends Promise<T> {\n [resolveSymbol]: Function;\n [rejectSymbol]: Function;\n [pendingSymbol]: boolean;\n}\n\n/**\n * A service to provide sync/async way to provide internationalization values.\n * With i18n values beeing able to have variable placeholder in them. indexd for arrays e.g. `{0}` or named for objects e.g. `{hour}`\n *\n * @example\n * import I18nService from \"@kluntje/services/I18nService\";\n * // get singleton instance\n * const i18nService = I18nService.getInstance();\n * // provide the url to fetch the dictionary\n * i18nService.setUp({url: \"path/to/i18n/ajax/service\"});\n * // or provide the dictionary itself\n * // i18nService.setUp({dictionary: {\"com.page.filter.notifications\": \"{0} Nachrichten\", ...}});\n * const i18n = i18nService.get;\n * // use API\n * // render markup with i18n value, if the i18n key hasn't been fetched jet, a placeholder `<span class\"kl-i18n-placeholder\"></span>` will be rendered,\n * // with the provided `fallback` text. or the last part of the key.\n * // this `span` will be replaced with the i18n value in den DOM after the keys where successfully fetched from the server\n * render(html`<button>${i18n(\"com.page.filter.notifications\", {fallback: \"Info\", interpolations: [7]})}</button>`, el);\n * // if any actions needs the keys to be ready and shouldn't be replace later in the DOM, the `ready` accessor can be called.\n * // this will automatically trigger the fetch for the keys from the server\n * await i18nService.ready;\n * // the boolean `loaded` can be used to check if the keys have been fetched form the server. This will not trigger the fetch.\n * if (i18nService.loaded) console.log(i18nService.get(\"com.page.filter.submitLabel\"))\n *\n * @export\n * @class I18nService\n */\nexport class I18nService {\n /**\n * class name for the `span`s being used as placeholder for i18n values in the DOM before the actual values have been fetched from the server\n *\n * @readonly\n * @static\n * @memberof I18nService\n */\n static get PLACEHOLDER_SELECTOR() {\n return 'kl-i18n-placeholder';\n }\n\n private static _instance?: I18nService;\n\n /**\n * returns the singleton instance of the I18nService\n *\n * @static\n * @returns\n * @memberof I18nService\n */\n static getInstance() {\n if (I18nService._instance === undefined) {\n I18nService._instance = new I18nService();\n }\n\n return I18nService._instance;\n }\n\n // see `I18nService.loaded` for more information about this property\n private _loaded = false;\n\n // see `I18nService.ready` for more information about this property\n private _ready: ExtendedPromise<undefined>;\n\n // a key-value map of the i18n keys and their internationalizations fetched from the server or provided by the user\n private _dictionary: { [key: string]: string } = {};\n\n // url to the servlet returning the dictionary\n private _url?: string;\n\n /**\n * returns true if the I18nService has been set up already. i.e. has a ajax url or the dictionary provided\n *\n * @readonly\n * @type {boolean}\n * @memberof I18nService\n */\n public get isSetUp(): boolean {\n return Boolean(this._url || isFilledObject(this._dictionary));\n }\n\n /**\n * `loaded` will be true when the keys have been fetched from the server. and `false` otherwise.\n * reading the `loaded` accessor won't trigger the key fetch. For that use {@see I18nService.ready}\n *\n * @readonly\n * @type {boolean}\n * @memberof I18nService\n */\n public get loaded(): boolean {\n return this._loaded;\n }\n\n /**\n * a promise will be returned that resolves when the keys have been fetched from the server, or the server rejected the ajax call.\n * reading the `ready` accessor will automatically trigger the dictionary fetch.\n * use this property when you NEED the keys to be already loaded and can't be replaced in the DOM later.\n *\n * @readonly\n * @type {Promise<undefined>}\n * @memberof I18nService\n */\n public get ready(): Promise<undefined> {\n if (!this._ready[pendingSymbol]) this.fetchI18nDictionary();\n\n return this._ready as Promise<undefined>;\n }\n\n /**\n * providing information necessary for the service to retrieve the i18n dictionary.\n * i.e. a ajax url to fetch data, or a static object with the i18n key-value in it\n *\n * @param {{ url: string; dictionary: Record<string, string> }} { url, dictionary }\n * @returns\n * @memberof I18nService\n */\n public setUp({ url, dictionary }: { url?: string; dictionary?: Record<string, string> } = {}) {\n if (this.isSetUp) {\n console.warn(\"@kluntje I18nService: service has already been set up. You can't set it up twice!\");\n return;\n }\n if (url) {\n this._url = url;\n } else if (dictionary) {\n this._dictionary = dictionary;\n this._loaded = true;\n this._ready[resolveSymbol]();\n this._ready[pendingSymbol] = true;\n } else {\n throw new Error('@kluntje I18nService: a \"url\" or \"dictionary\" should have been passed to the setUp function.');\n }\n }\n\n /**\n * returns the internationalized value for the given i18n key when the value have been fetched from the server,\n * or a placeholder `<span>` with a fallback text based on the key or the provided fallback text\n * which will automatically be replaced with the value in the DOM after server response\n *\n * @param {string} key\n * @param {({ fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> })} [{\n * fallback,\n * interpolations,\n * }={}]\n * @returns {string}\n * @memberof I18nService\n */\n public get(\n key: string,\n {\n fallback,\n interpolations,\n }: { fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> } = {},\n ): string {\n if (this.loaded) {\n if (this._dictionary.hasOwnProperty(key)) {\n let result = this._dictionary[key];\n if (interpolations) {\n Object.entries(interpolations).forEach(([k, v]) => {\n // replaceAll({key}, value)\n result = result.split(`{${k}}`).join(String(v));\n });\n }\n\n return result;\n }\n console.warn(`@kluntje I18nService: i18n for key '${key}' is missing in dictionary!`);\n\n return fallback !== undefined ? fallback : this.getHumanReadableName(key);\n }\n\n if (!this._ready[pendingSymbol]) {\n // add styling for the placeholder first time a placeholder will be added to the DOM\n this.addStyling();\n this.fetchI18nDictionary();\n }\n\n return this.getPlaceholder(key, { fallback, interpolations });\n }\n\n /**\n * Creates an instance of I18nService.\n * @memberof I18nService\n */\n private constructor() {\n this._ready = this.getReadyPromise();\n }\n\n /**\n * returns a Promise like object with properties to allow resolving the promise from the outside\n *\n * @private\n * @returns {ExtendedPromise<undefined>}\n * @memberof I18nService\n */\n private getReadyPromise(): ExtendedPromise<undefined> {\n let resolve: Function;\n let reject: Function;\n\n // @ts-ignore - other properties will be added in next couple of lines\n const _ready: ExtendedPromise<undefined> = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // @ts-ignore - `resolve` is defined in the promise body from lines above\n _ready[resolveSymbol] = resolve;\n // @ts-ignore - `reject` is defined in the promise body from lines above\n _ready[rejectSymbol] = reject;\n // will be set to true when ajax call is sent\n _ready[pendingSymbol] = false;\n\n return _ready;\n }\n\n /**\n * throws an Error when the service is not set up\n *\n * @private\n * @memberof I18nService\n */\n private ensureSetup(): void {\n if (!this.isSetUp) throw new Error('@kluntje I18nService: should be set up before calling other APIs');\n }\n\n /**\n * add minimal styling for the placeholder to look as much as possible as if they were a text node and not a html element,\n * and without the need of an actual .css file to be loaded\n *\n * @private\n * @memberof I18nService\n */\n private addStyling(): void {\n const head = document.head;\n const style = document.createElement('style');\n style.type = 'text/css';\n style.appendChild(\n document.createTextNode(`\n .${I18nService.PLACEHOLDER_SELECTOR} {\n display: contents;\n }\n `),\n );\n head.appendChild(style);\n }\n\n /**\n * retrieves the i18n key.value pairs, and update instance properties regarding the pending/fulfilled status of the request\n *\n * @private\n * @memberof I18nService\n */\n private fetchI18nDictionary() {\n this.ensureSetup();\n this._ready[pendingSymbol] = true;\n\n fetchJSON(this._url!)\n .then((results: Record<string, string>) => {\n this._dictionary = results;\n this._loaded = true;\n this._ready[resolveSymbol]();\n this.fillInPlaceholders();\n })\n .catch((err: Error) => {\n console.error('@kluntje I18nService: unable to fetch keys from server!', err);\n // ? adding a failed flag\n this._loaded = true;\n this._ready[resolveSymbol]();\n });\n }\n\n /**\n * i18n placeholder in the DOM will be fetched with i18n values been fetched from the server.\n *\n * @private\n * @memberof I18nService\n */\n private fillInPlaceholders() {\n Array.from(document.getElementsByClassName(I18nService.PLACEHOLDER_SELECTOR)).forEach((el) => {\n const { key, fallback, interpolations } = (el as HTMLElement).dataset;\n\n el.replaceWith(\n this.get(key!, {\n fallback,\n interpolations: interpolations ? JSON.parse(interpolations) : undefined,\n }),\n );\n });\n }\n\n /**\n * converts the i18n key names to values that can be used as fallback for the i18n text\n * @example\n * getHumanReadableName(\"org.example.hyphenated_name.filter.submitBtn\") === \"submit btn\"\n *\n * @private\n * @param {string} key\n * @returns\n * @memberof I18nService\n */\n private getHumanReadableName(key: string) {\n return (\n key\n // \"org.example.hyphenated_name.filter.submitBtn\" -> \"submitBtn\"\n .split('.')\n .reverse()[0]\n // \"submitBtn\" -> \"submit btn\"\n .replace(/[A-Z]/g, (letter: string) => ` ${letter.toLowerCase()}`)\n );\n }\n\n /**\n * generates a span element whith the fallback text to be replaced with the correct i18n value after server response\n *\n * @private\n * @param {string} key\n * @param {string} [fallback]\n * @returns\n * @memberof I18nService\n */\n private getPlaceholder(\n key: string,\n {\n fallback,\n interpolations,\n }: { fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> } = {},\n ) {\n const span = document.createElement('span');\n span.innerText = fallback !== undefined ? fallback : this.getHumanReadableName(key);\n span.classList.add(I18nService.PLACEHOLDER_SELECTOR);\n span.setAttribute('data-key', key);\n if (fallback) span.setAttribute('data-fallback', fallback);\n // use escaping mechanism of setAttribute to store the stringified json\n if (interpolations) span.setAttribute('data-interpolations', JSON.stringify(interpolations));\n\n return span.outerHTML;\n }\n}\n","export class URLSearchParamsService {\n private urlSearchParams: URLSearchParams = new URLSearchParams(window.location.search);\n\n public get(param: string): string | null {\n return this.urlSearchParams.get(param);\n }\n\n public getAll(param: string): string[] | null {\n return this.urlSearchParams.getAll(param);\n }\n\n public getAllKeys(): Array<string> {\n // @ts-ignore\n return Array.from(this.urlSearchParams.keys());\n }\n\n public set(param: string, value: string): void {\n this.urlSearchParams.set(param, value);\n this.updateUrl();\n }\n\n public delete(param: string): void {\n this.urlSearchParams.delete(param);\n this.updateUrl();\n }\n\n public getString(): string {\n return this.urlSearchParams.toString();\n }\n\n public get curUrl() {\n return `${window.location.protocol}//${window.location.host}${window.location.pathname}`;\n }\n\n private updateUrl() {\n const curQueryString = this.getString();\n const curUrl = this.curUrl;\n const hashCache = window.location.hash;\n const newUrl = curQueryString !== '' ? `${curUrl}?${curQueryString}` : curUrl;\n window.history.replaceState({ path: newUrl }, '', newUrl);\n if (hashCache !== '') window.location.hash = hashCache;\n }\n}\n\nexport default new URLSearchParamsService();\n","import URLSearchParamsService from './URLSearchParamsService';\n\nfunction debugModeActive() {\n return URLSearchParamsService.get('js-debug') !== null;\n}\n\nconst handler = {\n get(target: Console, prop: keyof Console) {\n if (debugModeActive()) return target[prop];\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n else return () => {};\n },\n};\n\nexport default new Proxy(console, handler);\n","class LazyConnectService {\n componentMap = new WeakMap();\n intersectionObserver: IntersectionObserver;\n\n constructor() {\n this.intersectionObserver = new IntersectionObserver((entries: any) => this.handleIntersectionChange(entries), {\n rootMargin: '500px 0px',\n });\n }\n\n subscribe(target: HTMLElement, intersectionCallback: () => void) {\n this.componentMap.set(target, intersectionCallback);\n this.intersectionObserver.observe(target);\n }\n\n unsubscribe(target: HTMLElement) {\n this.intersectionObserver.unobserve(target);\n this.componentMap.delete(target);\n }\n\n handleIntersectionChange(entries: Array<IntersectionObserverEntry>) {\n entries.forEach((intersectionEntry: any) => {\n const target = intersectionEntry.target;\n\n if (!intersectionEntry.isIntersecting || !this.componentMap.has(target)) return;\n\n const intersectionCallback = this.componentMap.get(target);\n this.unsubscribe(target as HTMLElement);\n intersectionCallback();\n });\n }\n}\n\nexport default new LazyConnectService();\n","import { IStorageService } from './StorageService.interface';\nimport { StorageServiceOptions, StorageType } from './StorageService.types';\n\nexport class StorageServiceImpl implements IStorageService {\n private observedItemsMap: Map<string, Set<() => void>> = new Map();\n\n constructor() {\n window.addEventListener('storage', (e) => this.handleStorageChange(e));\n }\n\n public addItem(storageKey: string, storageValue: string, options: StorageServiceOptions = {}) {\n this.getStorage(options).setItem(storageKey, storageValue);\n this.fireCallbacks(storageKey);\n }\n\n public getItem(storageKey: string, options: StorageServiceOptions = {}): string | null {\n return this.getStorage(options).getItem(storageKey);\n }\n\n public removeItem(storageKey: string, options: StorageServiceOptions = {}) {\n this.getStorage(options).removeItem(storageKey);\n }\n\n public observeItem(storageKey: string, callback: () => void) {\n const keyCallbacks = this.getKeyCallbacks(storageKey);\n keyCallbacks.add(callback);\n this.observedItemsMap.set(storageKey, keyCallbacks);\n }\n\n public unobserveItem(storageKey: string, callback: () => void) {\n const keyCallbacks = this.getKeyCallbacks(storageKey);\n keyCallbacks.delete(callback);\n this.observedItemsMap.set(storageKey, keyCallbacks);\n }\n\n public clearStorage(storageType: StorageType) {\n this.getStorage({ storageType }).clear();\n }\n\n private handleStorageChange(e: StorageEvent) {\n const storageKey = e.key;\n const oldValue = e.oldValue;\n const newValue = e.newValue;\n if (storageKey === null || oldValue === newValue || !this.observedItemsMap.has(storageKey)) return;\n\n this.fireCallbacks(storageKey);\n }\n\n private getKeyCallbacks(storageKey: string): Set<() => void> {\n return this.observedItemsMap.get(storageKey) || new Set();\n }\n\n private fireCallbacks(storageKey: string) {\n const callbacks = this.getKeyCallbacks(storageKey);\n callbacks.forEach((callback) => callback());\n }\n\n private getStorage(options: StorageServiceOptions): Storage {\n const { storageType = 'local' } = options;\n return storageType === 'local' ? localStorage : sessionStorage;\n }\n}\n\nexport const StorageService = new StorageServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { StorageServiceOptions, StorageService, IStorageService } from '../StorageService';\nimport { ICachingService } from './CachingService.interface';\nimport { CacheItem, CacheOptions, CachingServiceConstructorOptions } from './CachingService.types';\n\nexport class CachingServiceImpl implements ICachingService {\n private runtimeCache: Map<string, string> = new Map();\n private storageService: IStorageService = StorageService;\n private storageKeyPrefix = 'kl-caching-service';\n\n constructor(options?: CachingServiceConstructorOptions) {\n const { storageService, storageKeyPrefix } = options ?? {};\n\n if (storageService !== undefined) {\n this.storageService = storageService;\n }\n\n if (storageKeyPrefix !== undefined) {\n this.storageKeyPrefix = storageKeyPrefix;\n }\n }\n\n protected get shouldCache(): boolean {\n return true;\n }\n\n public cacheValue(key: string, value: string, options: CacheOptions) {\n if (this.shouldCache === false) return;\n\n if (options.validFor === 0) {\n this.runtimeCache.set(this.getStorageKey(key), value);\n return;\n }\n\n const cacheItem: CacheItem = {\n value,\n validUntil: Date.now() + options.validFor,\n };\n\n this.storageService.addItem(\n this.getStorageKey(key),\n JSON.stringify(cacheItem),\n this.getStorageServiceOptions(options),\n );\n }\n\n public getCachedValue(key: string, cacheOptions?: CacheOptions): string | null {\n if (this.shouldCache === false) return null;\n\n const storageKey = this.getStorageKey(key);\n\n const runtimeValue = this.runtimeCache.get(storageKey);\n\n if (runtimeValue !== undefined) return runtimeValue;\n\n const cachedItemString = this.storageService.getItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n if (cachedItemString === null) return null;\n\n try {\n const cachedItem: CacheItem = JSON.parse(cachedItemString);\n if (cachedItem.validUntil < Date.now()) {\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n return null;\n }\n\n return cachedItem.value;\n } catch (e) {\n DebuggerService.warn('CachingService: ', e);\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n return null;\n }\n }\n\n public getCachedJSON<T>(key: string, cacheOptions?: CacheOptions): T | null {\n const cachedValue = this.getCachedValue(key, cacheOptions);\n if (cachedValue === null) return null;\n try {\n return JSON.parse(cachedValue);\n } catch (error) {\n DebuggerService.error('CachingService: ', error);\n return null;\n }\n }\n\n public clearCachedValue(key: string, cacheOptions?: CacheOptions) {\n const storageKey = this.getStorageKey(key);\n\n if (cacheOptions?.validFor === 0) {\n this.runtimeCache.delete(storageKey);\n return;\n }\n\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n }\n\n private getStorageServiceOptions(cacheOptions?: CacheOptions): StorageServiceOptions {\n return {\n storageType: cacheOptions?.storageType,\n };\n }\n\n private getStorageKey(key: string) {\n return `${this.storageKeyPrefix}_${key}`;\n }\n}\n\nexport const CachingService = new CachingServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { IStorageService, StorageService, StorageType } from '../StorageService';\nimport { IRequestCachingService } from './RequestCachingService.interface';\nimport { RequestCacheOptions, RequestCachingServiceConstructorOptions } from './RequestCachingService.types';\n\nexport class RequestCachingServiceImpl implements IRequestCachingService {\n private _cache?: Promise<Cache>;\n\n private storageService: IStorageService = StorageService;\n private requestCacheName = 'kl-request-cache';\n private storageKeyPrefix = 'kl-request-caching-service';\n\n constructor(options?: RequestCachingServiceConstructorOptions) {\n const { storageService, requestCacheName, storageKeyPrefix } = options ?? {};\n\n if (storageService !== undefined) {\n this.storageService = storageService;\n }\n\n if (requestCacheName !== undefined) {\n this.requestCacheName = requestCacheName;\n }\n\n if (storageKeyPrefix !== undefined) {\n this.storageKeyPrefix = storageKeyPrefix;\n }\n }\n\n private async getCache(): Promise<Cache | null> {\n try {\n if (this._cache === undefined) {\n this._cache = caches.open(this.requestCacheName);\n }\n return await this._cache;\n } catch (error) {\n DebuggerService.error('RequestCachingService: ', error);\n return null;\n }\n }\n\n public async getCachedResponse(request: Request, storage?: StorageType) {\n const cache = await this.getCache();\n if (cache === null) return null;\n\n const response = await cache.match(request);\n if (response === undefined) return null;\n\n const validUntil = this.storageService.getItem(this.getStorageKey(request.url), { storageType: storage });\n if (validUntil === null) {\n await cache.delete(request);\n return null;\n }\n\n const now = Date.now();\n if (now > parseInt(validUntil, 10)) {\n await cache.delete(request);\n return null;\n }\n return response;\n }\n\n public async getCachedJSON<T>(request: Request, storage?: StorageType) {\n const response = await this.getCachedResponse(request, storage);\n if (response === null) return null;\n try {\n return (await response.json()) as T;\n } catch (error) {\n DebuggerService.error('RequestCachingService: ', error);\n return null;\n }\n }\n\n public async cacheRequest(options: RequestCacheOptions) {\n const { request, response } = options;\n const cache = await this.getCache();\n if (cache === null) return;\n this.storeExpirationTime(options);\n await cache.put(request, response);\n }\n\n public async clearCachedRequest(request: Request, storage?: StorageType) {\n const cache = await this.getCache();\n if (cache === null) return;\n await cache.delete(request);\n this.storageService.removeItem(this.getStorageKey(request.url), { storageType: storage });\n }\n\n private storeExpirationTime(options: RequestCacheOptions) {\n const { request, maxAge } = options;\n const validUntil = Date.now() + maxAge;\n this.storageService.addItem(this.getStorageKey(request.url), validUntil.toString(), {\n storageType: options.storage,\n });\n }\n\n private getStorageKey(key: string) {\n return `${this.storageKeyPrefix}_${key}`;\n }\n}\n\nexport const RequestCachingService = new RequestCachingServiceImpl();\n","import { CacheOptions, ICachingService } from '../CachingService';\nimport { IRequestCachingService } from '../RequestCachingService';\n\nexport interface APIServiceCacheOptions extends CacheOptions {\n forceRefetch?: boolean;\n requestBasedCaching?: boolean;\n cacheKeys?: string[];\n}\n\nexport interface APIServiceRequestOptions {\n fetchOptions?: RequestInit;\n cacheOptions?: APIServiceCacheOptions;\n throwError?: boolean;\n}\n\nexport interface APIServiceConstructorOptions {\n cachingService?: ICachingService;\n requestCachingService?: IRequestCachingService;\n}\n\nexport class APIError extends Error {\n public response: Response;\n\n constructor(response: Response) {\n super(response.statusText);\n this.response = response;\n }\n}\n","import { appendQueryObject } from \"@kluntje/js-utils/lib/url-helpers\";\n\nimport DebuggerService from \"../DebuggerService\";\nimport { IRequestCachingService, RequestCachingService } from \"../RequestCachingService\";\nimport { CachingService, ICachingService } from \"../CachingService\";\n\nimport { APIError, APIServiceCacheOptions, APIServiceConstructorOptions, APIServiceRequestOptions } from \"./APIService.types\";\nimport { IAPIService } from \"./APIService.interface\";\n\nexport class APIServiceImpl implements IAPIService {\n private requestPipeline: Map<string, Promise<Response | null>> = new Map();\n\n private cachingService: ICachingService = CachingService;\n private requestCachingService: IRequestCachingService = RequestCachingService;\n\n constructor(options: APIServiceConstructorOptions = {}) {\n const { cachingService, requestCachingService } = options;\n\n if (cachingService !== undefined) this.cachingService = cachingService;\n if (requestCachingService !== undefined) this.requestCachingService = requestCachingService;\n }\n\n public async fetchJSON<T>(url: string, options: APIServiceRequestOptions = {}): Promise<T | null> {\n // eslint-disable-next-line prettier/prettier\n return await this.fetch(url, APIServiceImpl.getJSON<T>, options);\n }\n\n public async fetchHTML(url: string, options: APIServiceRequestOptions = {}): Promise<string | null> {\n return await this.fetch(url, APIServiceImpl.getHTML, options);\n }\n\n private async fetch<T>(\n url: string,\n dataMapper: (response: Response | null) => Promise<T>,\n options: APIServiceRequestOptions = {},\n ): Promise<T | null> {\n const { cacheOptions } = options;\n\n if (cacheOptions?.forceRefetch === true) {\n this.clearCachedValue(url, cacheOptions);\n }\n\n const cachedValue = await this.getCachedValue<T>(url, cacheOptions);\n if (cachedValue !== null) return cachedValue;\n\n try {\n const pipelineRequest = this.requestPipeline.get(url);\n if (pipelineRequest !== undefined) {\n return await dataMapper(await pipelineRequest);\n }\n\n const request = this.fetchData(url, options);\n this.requestPipeline.set(url, request);\n\n const response = await request;\n const responseData = await dataMapper(response);\n this.requestPipeline.delete(url);\n\n if (response === null || responseData === null) return null;\n\n if (cacheOptions === undefined) return responseData;\n await this.cacheResponse(url, response, responseData, cacheOptions);\n\n return responseData;\n } catch (error) {\n DebuggerService.error(\"APIService.fetch: \", error);\n this.requestPipeline.delete(url);\n if (options.throwError === true) throw error;\n return null;\n }\n }\n\n public async fetchResponse(url: string, options: APIServiceRequestOptions = {}): Promise<Response | null> {\n const { cacheOptions } = options;\n const { forceRefetch = false } = cacheOptions ?? {};\n\n if (forceRefetch === true) {\n await this.requestCachingService.clearCachedRequest(new Request(url), cacheOptions?.storageType ?? \"session\");\n }\n\n const cachedResponse = await this.requestCachingService.getCachedResponse(\n new Request(url),\n cacheOptions?.storageType ?? \"session\",\n );\n\n if (cachedResponse !== null) return cachedResponse;\n\n const pipelineRequest = this.requestPipeline.get(url);\n\n if (pipelineRequest !== undefined) {\n return await pipelineRequest;\n }\n\n try {\n const request = fetch(url, options.fetchOptions);\n this.requestPipeline.set(url, request);\n\n const response = await request;\n this.requestPipeline.delete(url);\n\n if (cacheOptions === undefined) return response;\n\n await this.requestCachingService.cacheRequest({\n request: new Request(url),\n response,\n storage: cacheOptions.storageType ?? \"session\",\n maxAge: cacheOptions.validFor,\n });\n\n return response;\n } catch (error) {\n DebuggerService.error(\"APIService.fetchResponse: \", error);\n\n this.requestPipeline.delete(url);\n\n if (options.throwError === true) throw error;\n return null;\n }\n }\n\n private async fetchData(url: string, options: APIServiceRequestOptions): Promise<Response | null> {\n const response = await fetch(url, options.fetchOptions);\n\n if (!response.ok) throw new APIError(response);\n if (response.status === 204) return null;\n\n return response;\n }\n\n private static async getJSON<T>(response: Response | null): Promise<T | null> {\n if (response === null) return null;\n\n const responseClone = response.clone();\n return await responseClone.json();\n }\n\n private static async getHTML(response: Response | null): Promise<string | null> {\n if (response === null) return null;\n\n const responseClone = response.clone();\n return await responseClone.text();\n }\n\n private async cacheResponse<T>(\n url: string,\n response: Response,\n responseData: T,\n cacheOptions: APIServiceCacheOptions,\n ) {\n const cacheKey = this.getCacheKey(url, cacheOptions);\n\n if (cacheOptions.requestBasedCaching === true) {\n await this.requestCachingService.cacheRequest({\n request: new Request(cacheKey),\n response,\n storage: cacheOptions.storageType ?? \"local\",\n maxAge: cacheOptions.validFor,\n });\n } else {\n this.cachingService.cacheValue(cacheKey, JSON.stringify(responseData), cacheOptions);\n }\n }\n\n private async clearCachedValue(url: string, cacheOptions?: APIServiceCacheOptions) {\n if (cacheOptions === undefined) return;\n const { requestBasedCaching = false } = cacheOptions;\n const cacheKey = this.getCacheKey(url, cacheOptions);\n\n if (requestBasedCaching === true) {\n await this.requestCachingService.clearCachedRequest(new Request(cacheKey), cacheOptions.storageType);\n }\n this.cachingService.clearCachedValue(cacheKey, cacheOptions);\n }\n\n private async getCachedValue<T>(url: string, cacheOptions?: APIServiceCacheOptions): Promise<T | null> {\n if (cacheOptions === undefined) return null;\n const { requestBasedCaching = false } = cacheOptions;\n\n const cacheKey = this.getCacheKey(url, cacheOptions);\n if (requestBasedCaching === true) {\n return await this.requestCachingService.getCachedJSON(new Request(cacheKey), cacheOptions.storageType);\n }\n return this.cachingService.getCachedJSON(cacheKey, cacheOptions);\n }\n\n private getCacheKey(url: string, cacheOptions?: APIServiceCacheOptions): string {\n const cacheKeys = cacheOptions?.cacheKeys ?? [];\n if (cacheKeys.length === 0) return url;\n return appendQueryObject(url, { klCacheKeys: cacheKeys.join(\"_\") });\n }\n}\n\nexport const APIService = new APIServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { APIService, APIServiceRequestOptions, IAPIService } from '../APIService';\nimport {\n AbortableRequestServiceConstructorOptions,\n AbortableRequestServiceOptions,\n} from './AbortableRequestService.types';\n\nexport class AbortableRequestService {\n private abortController = new AbortController();\n private abortOptions: AbortableRequestServiceOptions | null = null;\n private latestOptions: AbortableRequestServiceOptions | null = null;\n\n protected apiService: IAPIService = APIService;\n\n constructor(options: AbortableRequestServiceConstructorOptions = {}) {\n const { apiService } = options;\n\n if (apiService !== undefined) this.apiService = apiService;\n }\n\n public async fetchJSON<T>(options: AbortableRequestServiceOptions): Promise<T | null> {\n return await this.makeAbortableRequest<T>(options, this.apiService.fetchJSON.bind(this.apiService));\n }\n\n public async fetchResponse(options: AbortableRequestServiceOptions): Promise<Response | null> {\n return await this.makeAbortableRequest<Response>(options, this.apiService.fetchResponse.bind(this.apiService));\n }\n\n private async makeAbortableRequest<R>(\n options: AbortableRequestServiceOptions,\n fetcher: (url: string, options: APIServiceRequestOptions) => Promise<R | null>,\n ): Promise<R | null> {\n if (this.latestOptions !== null) {\n this.abortOptions = options;\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n this.latestOptions = options;\n\n try {\n const response = await fetcher(options.url, {\n cacheOptions: options.options?.cacheOptions,\n throwError: true,\n fetchOptions: {\n ...options.options?.fetchOptions,\n signal: this.abortController.signal,\n },\n });\n this.latestOptions = null;\n return response;\n } catch (error: any) {\n DebuggerService.error('AbortableRequestService.makeAbortableRequest: ', error);\n\n if (error.name === 'AbortError') return this.handleAbortError<R>(this.fetchJSON.bind(this));\n\n if (options.options?.throwError === true) throw error;\n\n return null;\n }\n }\n\n private async handleAbortError<R>(\n nextAction: (options: AbortableRequestServiceOptions) => Promise<R | null>,\n ): Promise<R | null> {\n const latestOptions = this.latestOptions || this.abortOptions;\n if (latestOptions === null) return null;\n this.abortOptions = null;\n this.latestOptions = null;\n return nextAction(latestOptions);\n }\n}\n","import { IObserverService } from './ObserverService.interface';\nimport { ObserverCallback } from './ObserverService.types';\n\nexport class ObserverServiceImpl implements IObserverService {\n private observerMap: Map<string, Set<ObserverCallback>> = new Map();\n\n public observe(observedKey: string, callback: ObserverCallback) {\n const curCallbacks = this.getCallbacks(observedKey);\n curCallbacks.add(callback);\n this.observerMap.set(observedKey, curCallbacks);\n }\n\n public unobserve(observedKey: string, callback: ObserverCallback) {\n const curCallbacks = this.getCallbacks(observedKey);\n curCallbacks.delete(callback);\n this.observerMap.set(observedKey, curCallbacks);\n }\n\n public notifyObservers<T>(observedKey: string, data?: T) {\n const callbacks = this.getCallbacks(observedKey);\n callbacks.forEach((callback) => callback(data));\n }\n\n private getCallbacks(observedKey: string): Set<ObserverCallback> {\n return this.observerMap.get(observedKey) || new Set();\n }\n}\n\nexport const ObserverService = new ObserverServiceImpl();\n","import { ObserverServiceImpl } from '../ObserverService';\n\nexport class ContextState<StateDefinition extends Record<string, any> = Record<string, any>> {\n private stateMap: Map<keyof StateDefinition, any> = new Map();\n private observerService = new ObserverServiceImpl();\n private contextName: string;\n private contextElement: HTMLElement;\n\n constructor(contextName: string, contextElement: HTMLElement) {\n this.contextName = contextName;\n this.contextElement = contextElement;\n }\n\n public get name(): string {\n return this.contextName;\n }\n\n public get element(): HTMLElement {\n return this.contextElement;\n }\n\n public isMatchingContext(contextName: string, consumingElement: HTMLElement): boolean {\n if (this.contextName !== contextName) return false;\n\n return this.contextElement.contains(consumingElement);\n }\n\n public setState<K extends keyof StateDefinition>(key: K, value: StateDefinition[K]): void {\n if (this.stateMap.get(key) === value) return;\n this.stateMap.set(key, value);\n this.observerService.notifyObservers(key as string);\n }\n\n public setStates(newState: Partial<StateDefinition>): void {\n const changedKeys = Object.keys(newState).filter((key) => this.stateMap.get(key) !== newState[key]);\n\n changedKeys.forEach((key) => {\n this.stateMap.set(key, newState[key]);\n });\n\n changedKeys.forEach((key) => {\n this.observerService.notifyObservers(key);\n });\n }\n\n public getState<K extends keyof StateDefinition>(key: K): StateDefinition[K] | undefined {\n return this.stateMap.get(key);\n }\n\n public observeState(key: keyof StateDefinition, callback: () => void): void {\n this.observerService.observe(key as string, callback);\n }\n\n public unobserveState(key: keyof StateDefinition, callback: () => void): void {\n this.observerService.unobserve(key as string, callback);\n }\n}\n","import { ContextState } from './ContextState';\nimport { ObserverServiceImpl } from '../ObserverService';\nimport { IContextStateService } from './ContextStateService.interface';\n\nexport class ContextStateServiceImpl implements IContextStateService {\n private contextStateMap: Map<string, ContextState[]> = new Map();\n private contextInitObserver = new ObserverServiceImpl();\n\n private getMatchingContextState(contextName: string, consumingElement: HTMLElement): ContextState | null {\n const contextList = this.contextStateMap.get(contextName) || [];\n const matchingContexts = contextList.filter((context) => context.isMatchingContext(contextName, consumingElement));\n if (matchingContexts.length === 0) return null;\n return matchingContexts[0];\n }\n\n public getContextState<StateDefinition extends Record<string, any>>(\n contextName: string,\n consumingElement: HTMLElement,\n ): Promise<ContextState<StateDefinition>> {\n const matchingContextState = this.getMatchingContextState(contextName, consumingElement);\n if (matchingContextState) return Promise.resolve(matchingContextState) as Promise<ContextState<StateDefinition>>;\n return new Promise<ContextState<StateDefinition>>((resolve) => {\n this.contextInitObserver.observe(contextName, () => {\n const contextState = this.getMatchingContextState(contextName, consumingElement);\n if (contextState) {\n resolve(contextState as ContextState<StateDefinition>);\n }\n });\n });\n }\n\n public createContextState<StateDefinition extends Record<string, any>>(\n contextName: string,\n contextElement: HTMLElement,\n ): ContextState<StateDefinition> {\n const contextState = new ContextState(contextName, contextElement);\n const contextList = this.contextStateMap.get(contextName) || [];\n contextList.push(contextState);\n this.contextStateMap.set(contextName, contextList);\n this.contextInitObserver.notifyObservers(contextName);\n return contextState as ContextState<StateDefinition>;\n }\n}\n\nexport const ContextStateService = new ContextStateServiceImpl();\n"],"names":["MQ_CHANGE_EVENT","IN_VP_EVENT","OUT_VP_EVENT","ViewportObserver","constructor","static","undefined","instance","IntersectionObserver","handleIntersectionChange","e","Object","keys","forEach","key","observedEl","target","isIntersecting","dispatchEvent","CustomEvent","bubbles","MediaQueryService","this","eventIdMap","WeakMap","eventBindingMap","lastMQ","getCurrentMQ","mediaQuerys","onEvent","window","handleMQChange","newMQ","detail","oldMQ","__decorate","throttle","resolveSymbol","Symbol","rejectSymbol","pendingSymbol","I18nService","PLACEHOLDER_SELECTOR","_instance","isSetUp","Boolean","_url","isFilledObject","_dictionary","loaded","_loaded","ready","_ready","fetchI18nDictionary","setUp","url","dictionary","console","warn","Error","get","fallback","interpolations","hasOwnProperty","result","entries","k","v","split","join","String","getHumanReadableName","addStyling","getPlaceholder","getReadyPromise","resolve","reject","Promise","res","rej","ensureSetup","head","document","style","createElement","type","appendChild","createTextNode","fetchJSON","then","results","fillInPlaceholders","catch","err","error","Array","from","getElementsByClassName","el","dataset","replaceWith","JSON","parse","reverse","replace","letter","toLowerCase","span","innerText","classList","add","setAttribute","stringify","outerHTML","URLSearchParams","location","search","param","urlSearchParams","getAll","getAllKeys","set","value","updateUrl","delete","getString","toString","curUrl","protocol","host","pathname","curQueryString","hashCache","hash","newUrl","history","replaceState","path","Proxy","prop","URLSearchParamsService","intersectionObserver","rootMargin","subscribe","intersectionCallback","componentMap","observe","unsubscribe","unobserve","intersectionEntry","has","StorageServiceImpl","Map","addEventListener","handleStorageChange","addItem","storageKey","storageValue","options","getStorage","setItem","fireCallbacks","getItem","removeItem","observeItem","callback","keyCallbacks","getKeyCallbacks","observedItemsMap","unobserveItem","clearStorage","storageType","clear","oldValue","newValue","Set","localStorage","sessionStorage","StorageService","CachingServiceImpl","storageService","storageKeyPrefix","shouldCache","cacheValue","validFor","runtimeCache","getStorageKey","cacheItem","validUntil","Date","now","getStorageServiceOptions","getCachedValue","cacheOptions","runtimeValue","cachedItemString","cachedItem","DebuggerService","getCachedJSON","cachedValue","clearCachedValue","CachingService","RequestCachingServiceImpl","requestCacheName","getCache","_cache","caches","open","getCachedResponse","request","storage","cache","response","match","parseInt","json","cacheRequest","storeExpirationTime","put","clearCachedRequest","maxAge","RequestCachingService","APIError","super","statusText","APIServiceImpl","cachingService","requestCachingService","fetch","fetchHTML","getHTML","dataMapper","forceRefetch","pipelineRequest","requestPipeline","fetchData","responseData","cacheResponse","throwError","fetchResponse","Request","cachedResponse","fetchOptions","ok","status","responseClone","clone","text","cacheKey","getCacheKey","requestBasedCaching","cacheKeys","length","appendQueryObject","klCacheKeys","APIService","AbortableRequestService","AbortController","apiService","makeAbortableRequest","bind","fetcher","latestOptions","abortOptions","abortController","abort","signal","name","handleAbortError","nextAction","ObserverServiceImpl","observedKey","curCallbacks","getCallbacks","observerMap","notifyObservers","data","ObserverService","ContextState","contextName","contextElement","element","isMatchingContext","consumingElement","contains","setState","stateMap","observerService","setStates","newState","changedKeys","filter","getState","observeState","unobserveState","ContextStateServiceImpl","getMatchingContextState","matchingContexts","contextStateMap","context","getContextState","matchingContextState","contextInitObserver","contextState","createContextState","contextList","push","ContextStateService"],"mappings":"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"} | ||
| {"version":3,"file":"index.module.js","sources":["../src/eventNames.ts","../src/ViewportObserver.ts","../src/MediaQueryService.ts","../src/I18nService.ts","../src/URLSearchParamsService.ts","../src/DebuggerService.ts","../src/LazyConnectService.ts","../src/StorageService/StorageService.ts","../src/CachingService/CachingService.ts","../src/RequestCachingService/RequestCachingService.ts","../src/APIService/APIService.types.ts","../src/APIService/APIService.ts","../src/AbortableRequestService/AbortableRequestService.ts","../src/ObserverService/ObserverService.ts","../src/ContextStateService/ContextState.ts","../src/ContextStateService/ContextStateService.ts"],"sourcesContent":["export const MQ_CHANGE_EVENT = 'kl-mq-change';\nexport const IN_VP_EVENT = 'kl-in-vp';\nexport const OUT_VP_EVENT = 'kl-out-vp';\n","import { IN_VP_EVENT, OUT_VP_EVENT } from './eventNames';\n\ntype IntersectionEvent = {\n [key: string]: any;\n};\n\nexport class ViewportObserver {\n private static instance: IntersectionObserver;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {}\n\n static getInstance() {\n if (ViewportObserver.instance === undefined) {\n ViewportObserver.instance = new IntersectionObserver(ViewportObserver.handleIntersectionChange);\n }\n return ViewportObserver.instance;\n }\n\n private static handleIntersectionChange(e: IntersectionEvent) {\n Object.keys(e).forEach((key) => {\n const observedEl = e[key];\n const target = observedEl.target;\n\n if (observedEl.isIntersecting) {\n target.dispatchEvent(new CustomEvent(IN_VP_EVENT, { bubbles: false }));\n } else {\n target.dispatchEvent(new CustomEvent(OUT_VP_EVENT, { bubbles: false }));\n }\n });\n }\n}\n","import { throttle } from '@kluntje/js-utils/lib/function-helpers/decorators';\nimport { onEvent, getCurrentMQ, MQDefinition } from '@kluntje/js-utils/lib/dom-helpers';\nimport { MQ_CHANGE_EVENT } from './eventNames';\n\nexport class MediaQueryService {\n private static instance: MediaQueryService;\n static mediaQuerys: Array<MQDefinition>;\n eventIdMap: WeakMap<HTMLElement | Function, string>;\n eventBindingMap: {\n [index: string]: EventListenerOrEventListenerObject;\n };\n lastMQ: string;\n\n private constructor() {\n this.eventIdMap = new WeakMap();\n this.eventBindingMap = {};\n this.lastMQ = getCurrentMQ(MediaQueryService.mediaQuerys);\n onEvent(window, 'resize', this.handleMQChange, this);\n }\n\n static getInstance(mediaQuerys: Array<MQDefinition>) {\n if (MediaQueryService.instance === undefined) {\n MediaQueryService.mediaQuerys = mediaQuerys;\n MediaQueryService.instance = new MediaQueryService();\n }\n return MediaQueryService.instance;\n }\n\n @throttle(100)\n handleMQChange() {\n const newMQ = getCurrentMQ(MediaQueryService.mediaQuerys);\n if (newMQ === this.lastMQ) {\n return;\n }\n\n window.dispatchEvent(\n new CustomEvent(MQ_CHANGE_EVENT, {\n detail: {\n newMQ,\n oldMQ: this.lastMQ,\n },\n }),\n );\n\n this.lastMQ = newMQ;\n }\n}\n","import { fetchJSON } from '@kluntje/js-utils/lib/api-helpers';\nimport { isFilledObject } from '@kluntje/js-utils/lib/object-helpers';\n\nconst resolveSymbol = Symbol('resolve');\nconst rejectSymbol = Symbol('reject');\nconst pendingSymbol = Symbol('pending');\n\n// Promise but with options to resolve/reject from outside\ninterface ExtendedPromise<T> extends Promise<T> {\n [resolveSymbol]: Function;\n [rejectSymbol]: Function;\n [pendingSymbol]: boolean;\n}\n\n/**\n * A service to provide sync/async way to provide internationalization values.\n * With i18n values beeing able to have variable placeholder in them. indexd for arrays e.g. `{0}` or named for objects e.g. `{hour}`\n *\n * @example\n * import I18nService from \"@kluntje/services/I18nService\";\n * // get singleton instance\n * const i18nService = I18nService.getInstance();\n * // provide the url to fetch the dictionary\n * i18nService.setUp({url: \"path/to/i18n/ajax/service\"});\n * // or provide the dictionary itself\n * // i18nService.setUp({dictionary: {\"com.page.filter.notifications\": \"{0} Nachrichten\", ...}});\n * const i18n = i18nService.get;\n * // use API\n * // render markup with i18n value, if the i18n key hasn't been fetched jet, a placeholder `<span class\"kl-i18n-placeholder\"></span>` will be rendered,\n * // with the provided `fallback` text. or the last part of the key.\n * // this `span` will be replaced with the i18n value in den DOM after the keys where successfully fetched from the server\n * render(html`<button>${i18n(\"com.page.filter.notifications\", {fallback: \"Info\", interpolations: [7]})}</button>`, el);\n * // if any actions needs the keys to be ready and shouldn't be replace later in the DOM, the `ready` accessor can be called.\n * // this will automatically trigger the fetch for the keys from the server\n * await i18nService.ready;\n * // the boolean `loaded` can be used to check if the keys have been fetched form the server. This will not trigger the fetch.\n * if (i18nService.loaded) console.log(i18nService.get(\"com.page.filter.submitLabel\"))\n *\n * @export\n * @class I18nService\n */\nexport class I18nService {\n /**\n * class name for the `span`s being used as placeholder for i18n values in the DOM before the actual values have been fetched from the server\n *\n * @readonly\n * @static\n * @memberof I18nService\n */\n static get PLACEHOLDER_SELECTOR() {\n return 'kl-i18n-placeholder';\n }\n\n private static _instance?: I18nService;\n\n /**\n * returns the singleton instance of the I18nService\n *\n * @static\n * @returns\n * @memberof I18nService\n */\n static getInstance() {\n if (I18nService._instance === undefined) {\n I18nService._instance = new I18nService();\n }\n\n return I18nService._instance;\n }\n\n // see `I18nService.loaded` for more information about this property\n private _loaded = false;\n\n // see `I18nService.ready` for more information about this property\n private _ready: ExtendedPromise<undefined>;\n\n // a key-value map of the i18n keys and their internationalizations fetched from the server or provided by the user\n private _dictionary: { [key: string]: string } = {};\n\n // url to the servlet returning the dictionary\n private _url?: string;\n\n /**\n * returns true if the I18nService has been set up already. i.e. has a ajax url or the dictionary provided\n *\n * @readonly\n * @type {boolean}\n * @memberof I18nService\n */\n public get isSetUp(): boolean {\n return Boolean(this._url || isFilledObject(this._dictionary));\n }\n\n /**\n * `loaded` will be true when the keys have been fetched from the server. and `false` otherwise.\n * reading the `loaded` accessor won't trigger the key fetch. For that use {@see I18nService.ready}\n *\n * @readonly\n * @type {boolean}\n * @memberof I18nService\n */\n public get loaded(): boolean {\n return this._loaded;\n }\n\n /**\n * a promise will be returned that resolves when the keys have been fetched from the server, or the server rejected the ajax call.\n * reading the `ready` accessor will automatically trigger the dictionary fetch.\n * use this property when you NEED the keys to be already loaded and can't be replaced in the DOM later.\n *\n * @readonly\n * @type {Promise<undefined>}\n * @memberof I18nService\n */\n public get ready(): Promise<undefined> {\n if (!this._ready[pendingSymbol]) this.fetchI18nDictionary();\n\n return this._ready as Promise<undefined>;\n }\n\n /**\n * providing information necessary for the service to retrieve the i18n dictionary.\n * i.e. a ajax url to fetch data, or a static object with the i18n key-value in it\n *\n * @param {{ url: string; dictionary: Record<string, string> }} { url, dictionary }\n * @returns\n * @memberof I18nService\n */\n public setUp({ url, dictionary }: { url?: string; dictionary?: Record<string, string> } = {}) {\n if (this.isSetUp) {\n console.warn(\"@kluntje I18nService: service has already been set up. You can't set it up twice!\");\n return;\n }\n if (url) {\n this._url = url;\n } else if (dictionary) {\n this._dictionary = dictionary;\n this._loaded = true;\n this._ready[resolveSymbol]();\n this._ready[pendingSymbol] = true;\n } else {\n throw new Error('@kluntje I18nService: a \"url\" or \"dictionary\" should have been passed to the setUp function.');\n }\n }\n\n /**\n * returns the internationalized value for the given i18n key when the value have been fetched from the server,\n * or a placeholder `<span>` with a fallback text based on the key or the provided fallback text\n * which will automatically be replaced with the value in the DOM after server response\n *\n * @param {string} key\n * @param {({ fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> })} [{\n * fallback,\n * interpolations,\n * }={}]\n * @returns {string}\n * @memberof I18nService\n */\n public get(\n key: string,\n {\n fallback,\n interpolations,\n }: { fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> } = {},\n ): string {\n if (this.loaded) {\n if (this._dictionary.hasOwnProperty(key)) {\n let result = this._dictionary[key];\n if (interpolations) {\n Object.entries(interpolations).forEach(([k, v]) => {\n // replaceAll({key}, value)\n result = result.split(`{${k}}`).join(String(v));\n });\n }\n\n return result;\n }\n console.warn(`@kluntje I18nService: i18n for key '${key}' is missing in dictionary!`);\n\n return fallback !== undefined ? fallback : this.getHumanReadableName(key);\n }\n\n if (!this._ready[pendingSymbol]) {\n // add styling for the placeholder first time a placeholder will be added to the DOM\n this.addStyling();\n this.fetchI18nDictionary();\n }\n\n return this.getPlaceholder(key, { fallback, interpolations });\n }\n\n /**\n * Creates an instance of I18nService.\n * @memberof I18nService\n */\n private constructor() {\n this._ready = this.getReadyPromise();\n }\n\n /**\n * returns a Promise like object with properties to allow resolving the promise from the outside\n *\n * @private\n * @returns {ExtendedPromise<undefined>}\n * @memberof I18nService\n */\n private getReadyPromise(): ExtendedPromise<undefined> {\n let resolve: Function;\n let reject: Function;\n\n // @ts-ignore - other properties will be added in next couple of lines\n const _ready: ExtendedPromise<undefined> = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n // @ts-ignore - `resolve` is defined in the promise body from lines above\n _ready[resolveSymbol] = resolve;\n // @ts-ignore - `reject` is defined in the promise body from lines above\n _ready[rejectSymbol] = reject;\n // will be set to true when ajax call is sent\n _ready[pendingSymbol] = false;\n\n return _ready;\n }\n\n /**\n * throws an Error when the service is not set up\n *\n * @private\n * @memberof I18nService\n */\n private ensureSetup(): void {\n if (!this.isSetUp) throw new Error('@kluntje I18nService: should be set up before calling other APIs');\n }\n\n /**\n * add minimal styling for the placeholder to look as much as possible as if they were a text node and not a html element,\n * and without the need of an actual .css file to be loaded\n *\n * @private\n * @memberof I18nService\n */\n private addStyling(): void {\n const head = document.head;\n const style = document.createElement('style');\n style.type = 'text/css';\n style.appendChild(\n document.createTextNode(`\n .${I18nService.PLACEHOLDER_SELECTOR} {\n display: contents;\n }\n `),\n );\n head.appendChild(style);\n }\n\n /**\n * retrieves the i18n key.value pairs, and update instance properties regarding the pending/fulfilled status of the request\n *\n * @private\n * @memberof I18nService\n */\n private fetchI18nDictionary() {\n this.ensureSetup();\n this._ready[pendingSymbol] = true;\n\n fetchJSON(this._url!)\n .then((results: Record<string, string>) => {\n this._dictionary = results;\n this._loaded = true;\n this._ready[resolveSymbol]();\n this.fillInPlaceholders();\n })\n .catch((err: Error) => {\n console.error('@kluntje I18nService: unable to fetch keys from server!', err);\n // ? adding a failed flag\n this._loaded = true;\n this._ready[resolveSymbol]();\n });\n }\n\n /**\n * i18n placeholder in the DOM will be fetched with i18n values been fetched from the server.\n *\n * @private\n * @memberof I18nService\n */\n private fillInPlaceholders() {\n Array.from(document.getElementsByClassName(I18nService.PLACEHOLDER_SELECTOR)).forEach((el) => {\n const { key, fallback, interpolations } = (el as HTMLElement).dataset;\n\n el.replaceWith(\n this.get(key!, {\n fallback,\n interpolations: interpolations ? JSON.parse(interpolations) : undefined,\n }),\n );\n });\n }\n\n /**\n * converts the i18n key names to values that can be used as fallback for the i18n text\n * @example\n * getHumanReadableName(\"org.example.hyphenated_name.filter.submitBtn\") === \"submit btn\"\n *\n * @private\n * @param {string} key\n * @returns\n * @memberof I18nService\n */\n private getHumanReadableName(key: string) {\n return (\n key\n // \"org.example.hyphenated_name.filter.submitBtn\" -> \"submitBtn\"\n .split('.')\n .reverse()[0]\n // \"submitBtn\" -> \"submit btn\"\n .replace(/[A-Z]/g, (letter: string) => ` ${letter.toLowerCase()}`)\n );\n }\n\n /**\n * generates a span element whith the fallback text to be replaced with the correct i18n value after server response\n *\n * @private\n * @param {string} key\n * @param {string} [fallback]\n * @returns\n * @memberof I18nService\n */\n private getPlaceholder(\n key: string,\n {\n fallback,\n interpolations,\n }: { fallback?: string; interpolations?: Array<string | number> | Record<string, string | number> } = {},\n ) {\n const span = document.createElement('span');\n span.innerText = fallback !== undefined ? fallback : this.getHumanReadableName(key);\n span.classList.add(I18nService.PLACEHOLDER_SELECTOR);\n span.setAttribute('data-key', key);\n if (fallback) span.setAttribute('data-fallback', fallback);\n // use escaping mechanism of setAttribute to store the stringified json\n if (interpolations) span.setAttribute('data-interpolations', JSON.stringify(interpolations));\n\n return span.outerHTML;\n }\n}\n","export class URLSearchParamsService {\n private urlSearchParams: URLSearchParams = new URLSearchParams(window.location.search);\n\n public get(param: string): string | null {\n return this.urlSearchParams.get(param);\n }\n\n public getAll(param: string): string[] | null {\n return this.urlSearchParams.getAll(param);\n }\n\n public getAllKeys(): Array<string> {\n // @ts-ignore\n return Array.from(this.urlSearchParams.keys());\n }\n\n public set(param: string, value: string): void {\n this.urlSearchParams.set(param, value);\n this.updateUrl();\n }\n\n public delete(param: string): void {\n this.urlSearchParams.delete(param);\n this.updateUrl();\n }\n\n public getString(): string {\n return this.urlSearchParams.toString();\n }\n\n public get curUrl() {\n return `${window.location.protocol}//${window.location.host}${window.location.pathname}`;\n }\n\n private updateUrl() {\n const curQueryString = this.getString();\n const curUrl = this.curUrl;\n const hashCache = window.location.hash;\n const newUrl = curQueryString !== '' ? `${curUrl}?${curQueryString}` : curUrl;\n window.history.replaceState({ path: newUrl }, '', newUrl);\n if (hashCache !== '') window.location.hash = hashCache;\n }\n}\n\nexport default new URLSearchParamsService();\n","import URLSearchParamsService from './URLSearchParamsService';\n\nfunction debugModeActive() {\n return URLSearchParamsService.get('js-debug') !== null;\n}\n\nconst handler = {\n get(target: Console, prop: keyof Console) {\n if (debugModeActive()) return target[prop];\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n else return () => {};\n },\n};\n\nexport default new Proxy(console, handler);\n","class LazyConnectService {\n componentMap = new WeakMap();\n intersectionObserver: IntersectionObserver;\n\n constructor() {\n this.intersectionObserver = new IntersectionObserver((entries: any) => this.handleIntersectionChange(entries), {\n rootMargin: '500px 0px',\n });\n }\n\n subscribe(target: HTMLElement, intersectionCallback: () => void) {\n this.componentMap.set(target, intersectionCallback);\n this.intersectionObserver.observe(target);\n }\n\n unsubscribe(target: HTMLElement) {\n this.intersectionObserver.unobserve(target);\n this.componentMap.delete(target);\n }\n\n handleIntersectionChange(entries: Array<IntersectionObserverEntry>) {\n entries.forEach((intersectionEntry: any) => {\n const target = intersectionEntry.target;\n\n if (!intersectionEntry.isIntersecting || !this.componentMap.has(target)) return;\n\n const intersectionCallback = this.componentMap.get(target);\n this.unsubscribe(target as HTMLElement);\n intersectionCallback();\n });\n }\n}\n\nexport default new LazyConnectService();\n","import { IStorageService } from './StorageService.interface';\nimport { StorageServiceOptions, StorageType } from './StorageService.types';\n\nexport class StorageServiceImpl implements IStorageService {\n private observedItemsMap: Map<string, Set<() => void>> = new Map();\n\n constructor() {\n window.addEventListener('storage', (e) => this.handleStorageChange(e));\n }\n\n public addItem(storageKey: string, storageValue: string, options: StorageServiceOptions = {}) {\n this.getStorage(options).setItem(storageKey, storageValue);\n this.fireCallbacks(storageKey);\n }\n\n public getItem(storageKey: string, options: StorageServiceOptions = {}): string | null {\n return this.getStorage(options).getItem(storageKey);\n }\n\n public removeItem(storageKey: string, options: StorageServiceOptions = {}) {\n this.getStorage(options).removeItem(storageKey);\n }\n\n public observeItem(storageKey: string, callback: () => void) {\n const keyCallbacks = this.getKeyCallbacks(storageKey);\n keyCallbacks.add(callback);\n this.observedItemsMap.set(storageKey, keyCallbacks);\n }\n\n public unobserveItem(storageKey: string, callback: () => void) {\n const keyCallbacks = this.getKeyCallbacks(storageKey);\n keyCallbacks.delete(callback);\n this.observedItemsMap.set(storageKey, keyCallbacks);\n }\n\n public clearStorage(storageType: StorageType) {\n this.getStorage({ storageType }).clear();\n }\n\n private handleStorageChange(e: StorageEvent) {\n const storageKey = e.key;\n const oldValue = e.oldValue;\n const newValue = e.newValue;\n if (storageKey === null || oldValue === newValue || !this.observedItemsMap.has(storageKey)) return;\n\n this.fireCallbacks(storageKey);\n }\n\n private getKeyCallbacks(storageKey: string): Set<() => void> {\n return this.observedItemsMap.get(storageKey) || new Set();\n }\n\n private fireCallbacks(storageKey: string) {\n const callbacks = this.getKeyCallbacks(storageKey);\n callbacks.forEach((callback) => callback());\n }\n\n private getStorage(options: StorageServiceOptions): Storage {\n const { storageType = 'local' } = options;\n return storageType === 'local' ? localStorage : sessionStorage;\n }\n}\n\nexport const StorageService = new StorageServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { StorageServiceOptions, StorageService, IStorageService } from '../StorageService';\nimport { ICachingService } from './CachingService.interface';\nimport { CacheItem, CacheOptions, CachingServiceConstructorOptions } from './CachingService.types';\n\nexport class CachingServiceImpl implements ICachingService {\n private runtimeCache: Map<string, string> = new Map();\n private storageService: IStorageService = StorageService;\n private storageKeyPrefix = 'kl-caching-service';\n\n constructor(options?: CachingServiceConstructorOptions) {\n const { storageService, storageKeyPrefix } = options ?? {};\n\n if (storageService !== undefined) {\n this.storageService = storageService;\n }\n\n if (storageKeyPrefix !== undefined) {\n this.storageKeyPrefix = storageKeyPrefix;\n }\n }\n\n protected get shouldCache(): boolean {\n return true;\n }\n\n public cacheValue(key: string, value: string, options: CacheOptions) {\n if (this.shouldCache === false) return;\n\n if (options.validFor === 0) {\n this.runtimeCache.set(this.getStorageKey(key), value);\n return;\n }\n\n const cacheItem: CacheItem = {\n value,\n validUntil: Date.now() + options.validFor,\n };\n\n this.storageService.addItem(\n this.getStorageKey(key),\n JSON.stringify(cacheItem),\n this.getStorageServiceOptions(options),\n );\n }\n\n public getCachedValue(key: string, cacheOptions?: CacheOptions): string | null {\n if (this.shouldCache === false) return null;\n\n const storageKey = this.getStorageKey(key);\n\n const runtimeValue = this.runtimeCache.get(storageKey);\n\n if (runtimeValue !== undefined) return runtimeValue;\n\n const cachedItemString = this.storageService.getItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n if (cachedItemString === null) return null;\n\n try {\n const cachedItem: CacheItem = JSON.parse(cachedItemString);\n if (cachedItem.validUntil < Date.now()) {\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n return null;\n }\n\n return cachedItem.value;\n } catch (e) {\n DebuggerService.warn('CachingService: ', e);\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n return null;\n }\n }\n\n public getCachedJSON<T>(key: string, cacheOptions?: CacheOptions): T | null {\n const cachedValue = this.getCachedValue(key, cacheOptions);\n if (cachedValue === null) return null;\n try {\n return JSON.parse(cachedValue);\n } catch (error) {\n DebuggerService.error('CachingService: ', error);\n return null;\n }\n }\n\n public clearCachedValue(key: string, cacheOptions?: CacheOptions) {\n const storageKey = this.getStorageKey(key);\n\n if (cacheOptions?.validFor === 0) {\n this.runtimeCache.delete(storageKey);\n return;\n }\n\n this.storageService.removeItem(storageKey, this.getStorageServiceOptions(cacheOptions));\n }\n\n private getStorageServiceOptions(cacheOptions?: CacheOptions): StorageServiceOptions {\n return {\n storageType: cacheOptions?.storageType,\n };\n }\n\n private getStorageKey(key: string) {\n return `${this.storageKeyPrefix}_${key}`;\n }\n}\n\nexport const CachingService = new CachingServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { IStorageService, StorageService, StorageType } from '../StorageService';\nimport { IRequestCachingService } from './RequestCachingService.interface';\nimport { RequestCacheOptions, RequestCachingServiceConstructorOptions } from './RequestCachingService.types';\n\nexport class RequestCachingServiceImpl implements IRequestCachingService {\n private _cache?: Promise<Cache>;\n\n private storageService: IStorageService = StorageService;\n private requestCacheName = 'kl-request-cache';\n private storageKeyPrefix = 'kl-request-caching-service';\n\n constructor(options?: RequestCachingServiceConstructorOptions) {\n const { storageService, requestCacheName, storageKeyPrefix } = options ?? {};\n\n if (storageService !== undefined) {\n this.storageService = storageService;\n }\n\n if (requestCacheName !== undefined) {\n this.requestCacheName = requestCacheName;\n }\n\n if (storageKeyPrefix !== undefined) {\n this.storageKeyPrefix = storageKeyPrefix;\n }\n }\n\n private async getCache(): Promise<Cache | null> {\n try {\n if (this._cache === undefined) {\n this._cache = caches.open(this.requestCacheName);\n }\n return await this._cache;\n } catch (error) {\n DebuggerService.error('RequestCachingService: ', error);\n return null;\n }\n }\n\n public async getCachedResponse(request: Request, storage?: StorageType) {\n const cache = await this.getCache();\n if (cache === null) return null;\n\n const response = await cache.match(request);\n if (response === undefined) return null;\n\n const validUntil = this.storageService.getItem(this.getStorageKey(request.url), { storageType: storage });\n if (validUntil === null) {\n await cache.delete(request);\n return null;\n }\n\n const now = Date.now();\n if (now > parseInt(validUntil, 10)) {\n await cache.delete(request);\n return null;\n }\n return response;\n }\n\n public async getCachedJSON<T>(request: Request, storage?: StorageType) {\n const response = await this.getCachedResponse(request, storage);\n if (response === null) return null;\n try {\n return (await response.json()) as T;\n } catch (error) {\n DebuggerService.error('RequestCachingService: ', error);\n return null;\n }\n }\n\n public async cacheRequest(options: RequestCacheOptions) {\n const { request, response } = options;\n const cache = await this.getCache();\n if (cache === null) return;\n this.storeExpirationTime(options);\n await cache.put(request, response);\n }\n\n public async clearCachedRequest(request: Request, storage?: StorageType) {\n const cache = await this.getCache();\n if (cache === null) return;\n await cache.delete(request);\n this.storageService.removeItem(this.getStorageKey(request.url), { storageType: storage });\n }\n\n private storeExpirationTime(options: RequestCacheOptions) {\n const { request, maxAge } = options;\n const validUntil = Date.now() + maxAge;\n this.storageService.addItem(this.getStorageKey(request.url), validUntil.toString(), {\n storageType: options.storage,\n });\n }\n\n private getStorageKey(key: string) {\n return `${this.storageKeyPrefix}_${key}`;\n }\n}\n\nexport const RequestCachingService = new RequestCachingServiceImpl();\n","import { CacheOptions, ICachingService } from '../CachingService';\nimport { IRequestCachingService } from '../RequestCachingService';\n\nexport interface APIServiceCacheOptions extends CacheOptions {\n forceRefetch?: boolean;\n requestBasedCaching?: boolean;\n cacheKeys?: string[];\n}\n\nexport interface APIServiceRequestOptions {\n fetchOptions?: RequestInit;\n cacheOptions?: APIServiceCacheOptions;\n throwError?: boolean;\n}\n\nexport interface APIServiceConstructorOptions {\n cachingService?: ICachingService;\n requestCachingService?: IRequestCachingService;\n}\n\nexport class APIError extends Error {\n public response: Response;\n\n constructor(response: Response) {\n super(response.statusText);\n this.response = response;\n }\n}\n","import { appendQueryObject } from \"@kluntje/js-utils/lib/url-helpers\";\n\nimport DebuggerService from \"../DebuggerService\";\nimport { IRequestCachingService, RequestCachingService } from \"../RequestCachingService\";\nimport { CachingService, ICachingService } from \"../CachingService\";\n\nimport { APIError, APIServiceCacheOptions, APIServiceConstructorOptions, APIServiceRequestOptions } from \"./APIService.types\";\nimport { IAPIService } from \"./APIService.interface\";\n\nexport class APIServiceImpl implements IAPIService {\n private requestPipeline: Map<string, Promise<Response | null>> = new Map();\n\n private cachingService: ICachingService = CachingService;\n private requestCachingService: IRequestCachingService = RequestCachingService;\n\n constructor(options: APIServiceConstructorOptions = {}) {\n const { cachingService, requestCachingService } = options;\n\n if (cachingService !== undefined) this.cachingService = cachingService;\n if (requestCachingService !== undefined) this.requestCachingService = requestCachingService;\n }\n\n public async fetchJSON<T>(url: string, options: APIServiceRequestOptions = {}): Promise<T | null> {\n // eslint-disable-next-line prettier/prettier\n return await this.fetch(url, APIServiceImpl.getJSON<T>, options);\n }\n\n public async fetchHTML(url: string, options: APIServiceRequestOptions = {}): Promise<string | null> {\n return await this.fetch(url, APIServiceImpl.getHTML, options);\n }\n\n private async fetch<T>(\n url: string,\n dataMapper: (response: Response | null) => Promise<T>,\n options: APIServiceRequestOptions = {},\n ): Promise<T | null> {\n const { cacheOptions } = options;\n\n if (cacheOptions?.forceRefetch === true) {\n this.clearCachedValue(url, cacheOptions);\n }\n\n const cachedValue = await this.getCachedValue<T>(url, cacheOptions);\n if (cachedValue !== null) return cachedValue;\n\n try {\n const pipelineRequest = this.requestPipeline.get(url);\n if (pipelineRequest !== undefined) {\n return await dataMapper(await pipelineRequest);\n }\n\n const request = this.fetchData(url, options);\n this.requestPipeline.set(url, request);\n\n const response = await request;\n const responseData = await dataMapper(response);\n this.requestPipeline.delete(url);\n\n if (response === null || responseData === null) return null;\n\n if (cacheOptions === undefined) return responseData;\n await this.cacheResponse(url, response, responseData, cacheOptions);\n\n return responseData;\n } catch (error) {\n DebuggerService.error(\"APIService.fetch: \", error);\n this.requestPipeline.delete(url);\n if (options.throwError === true) throw error;\n return null;\n }\n }\n\n public async fetchResponse(url: string, options: APIServiceRequestOptions = {}): Promise<Response | null> {\n const { cacheOptions } = options;\n const { forceRefetch = false } = cacheOptions ?? {};\n\n if (forceRefetch === true) {\n await this.requestCachingService.clearCachedRequest(new Request(url), cacheOptions?.storageType ?? \"session\");\n }\n\n const cachedResponse = await this.requestCachingService.getCachedResponse(\n new Request(url),\n cacheOptions?.storageType ?? \"session\",\n );\n\n if (cachedResponse !== null) return cachedResponse;\n\n const pipelineRequest = this.requestPipeline.get(url);\n\n if (pipelineRequest !== undefined) {\n return await pipelineRequest;\n }\n\n try {\n const request = fetch(url, options.fetchOptions);\n this.requestPipeline.set(url, request);\n\n const response = await request;\n this.requestPipeline.delete(url);\n\n if (cacheOptions === undefined) return response;\n\n await this.requestCachingService.cacheRequest({\n request: new Request(url),\n response: response.clone(),\n storage: cacheOptions.storageType ?? \"session\",\n maxAge: cacheOptions.validFor,\n });\n\n return response;\n } catch (error) {\n DebuggerService.error(\"APIService.fetchResponse: \", error);\n\n this.requestPipeline.delete(url);\n\n if (options.throwError === true) throw error;\n return null;\n }\n }\n\n private async fetchData(url: string, options: APIServiceRequestOptions): Promise<Response | null> {\n const response = await fetch(url, options.fetchOptions);\n\n if (!response.ok) throw new APIError(response);\n if (response.status === 204) return null;\n\n return response;\n }\n\n private static async getJSON<T>(response: Response | null): Promise<T | null> {\n if (response === null) return null;\n\n const responseClone = response.clone();\n return await responseClone.json();\n }\n\n private static async getHTML(response: Response | null): Promise<string | null> {\n if (response === null) return null;\n\n const responseClone = response.clone();\n return await responseClone.text();\n }\n\n private async cacheResponse<T>(\n url: string,\n response: Response,\n responseData: T,\n cacheOptions: APIServiceCacheOptions,\n ) {\n const cacheKey = this.getCacheKey(url, cacheOptions);\n\n if (cacheOptions.requestBasedCaching === true) {\n await this.requestCachingService.cacheRequest({\n request: new Request(cacheKey),\n response,\n storage: cacheOptions.storageType ?? \"local\",\n maxAge: cacheOptions.validFor,\n });\n } else {\n this.cachingService.cacheValue(cacheKey, JSON.stringify(responseData), cacheOptions);\n }\n }\n\n private async clearCachedValue(url: string, cacheOptions?: APIServiceCacheOptions) {\n if (cacheOptions === undefined) return;\n const { requestBasedCaching = false } = cacheOptions;\n const cacheKey = this.getCacheKey(url, cacheOptions);\n\n if (requestBasedCaching === true) {\n await this.requestCachingService.clearCachedRequest(new Request(cacheKey), cacheOptions.storageType);\n }\n this.cachingService.clearCachedValue(cacheKey, cacheOptions);\n }\n\n private async getCachedValue<T>(url: string, cacheOptions?: APIServiceCacheOptions): Promise<T | null> {\n if (cacheOptions === undefined) return null;\n const { requestBasedCaching = false } = cacheOptions;\n\n const cacheKey = this.getCacheKey(url, cacheOptions);\n if (requestBasedCaching === true) {\n return await this.requestCachingService.getCachedJSON(new Request(cacheKey), cacheOptions.storageType);\n }\n return this.cachingService.getCachedJSON(cacheKey, cacheOptions);\n }\n\n private getCacheKey(url: string, cacheOptions?: APIServiceCacheOptions): string {\n const cacheKeys = cacheOptions?.cacheKeys ?? [];\n if (cacheKeys.length === 0) return url;\n return appendQueryObject(url, { klCacheKeys: cacheKeys.join(\"_\") });\n }\n}\n\nexport const APIService = new APIServiceImpl();\n","import DebuggerService from '../DebuggerService';\nimport { APIService, APIServiceRequestOptions, IAPIService } from '../APIService';\nimport {\n AbortableRequestServiceConstructorOptions,\n AbortableRequestServiceOptions,\n} from './AbortableRequestService.types';\n\nexport class AbortableRequestService {\n private abortController = new AbortController();\n private abortOptions: AbortableRequestServiceOptions | null = null;\n private latestOptions: AbortableRequestServiceOptions | null = null;\n\n protected apiService: IAPIService = APIService;\n\n constructor(options: AbortableRequestServiceConstructorOptions = {}) {\n const { apiService } = options;\n\n if (apiService !== undefined) this.apiService = apiService;\n }\n\n public async fetchJSON<T>(options: AbortableRequestServiceOptions): Promise<T | null> {\n return await this.makeAbortableRequest<T>(options, this.apiService.fetchJSON.bind(this.apiService));\n }\n\n public async fetchResponse(options: AbortableRequestServiceOptions): Promise<Response | null> {\n return await this.makeAbortableRequest<Response>(options, this.apiService.fetchResponse.bind(this.apiService));\n }\n\n private async makeAbortableRequest<R>(\n options: AbortableRequestServiceOptions,\n fetcher: (url: string, options: APIServiceRequestOptions) => Promise<R | null>,\n ): Promise<R | null> {\n if (this.latestOptions !== null) {\n this.abortOptions = options;\n this.abortController.abort();\n this.abortController = new AbortController();\n }\n\n this.latestOptions = options;\n\n try {\n const response = await fetcher(options.url, {\n cacheOptions: options.options?.cacheOptions,\n throwError: true,\n fetchOptions: {\n ...options.options?.fetchOptions,\n signal: this.abortController.signal,\n },\n });\n this.latestOptions = null;\n return response;\n } catch (error: any) {\n DebuggerService.error('AbortableRequestService.makeAbortableRequest: ', error);\n\n if (error.name === 'AbortError') return this.handleAbortError<R>(this.fetchJSON.bind(this));\n\n if (options.options?.throwError === true) throw error;\n\n return null;\n }\n }\n\n private async handleAbortError<R>(\n nextAction: (options: AbortableRequestServiceOptions) => Promise<R | null>,\n ): Promise<R | null> {\n const latestOptions = this.latestOptions || this.abortOptions;\n if (latestOptions === null) return null;\n this.abortOptions = null;\n this.latestOptions = null;\n return nextAction(latestOptions);\n }\n}\n","import { IObserverService } from './ObserverService.interface';\nimport { ObserverCallback } from './ObserverService.types';\n\nexport class ObserverServiceImpl implements IObserverService {\n private observerMap: Map<string, Set<ObserverCallback>> = new Map();\n\n public observe(observedKey: string, callback: ObserverCallback) {\n const curCallbacks = this.getCallbacks(observedKey);\n curCallbacks.add(callback);\n this.observerMap.set(observedKey, curCallbacks);\n }\n\n public unobserve(observedKey: string, callback: ObserverCallback) {\n const curCallbacks = this.getCallbacks(observedKey);\n curCallbacks.delete(callback);\n this.observerMap.set(observedKey, curCallbacks);\n }\n\n public notifyObservers<T>(observedKey: string, data?: T) {\n const callbacks = this.getCallbacks(observedKey);\n callbacks.forEach((callback) => callback(data));\n }\n\n private getCallbacks(observedKey: string): Set<ObserverCallback> {\n return this.observerMap.get(observedKey) || new Set();\n }\n}\n\nexport const ObserverService = new ObserverServiceImpl();\n","import { ObserverServiceImpl } from '../ObserverService';\n\nexport class ContextState<StateDefinition extends Record<string, any> = Record<string, any>> {\n private stateMap: Map<keyof StateDefinition, any> = new Map();\n private observerService = new ObserverServiceImpl();\n private contextName: string;\n private contextElement: HTMLElement;\n\n constructor(contextName: string, contextElement: HTMLElement) {\n this.contextName = contextName;\n this.contextElement = contextElement;\n }\n\n public get name(): string {\n return this.contextName;\n }\n\n public get element(): HTMLElement {\n return this.contextElement;\n }\n\n public isMatchingContext(contextName: string, consumingElement: HTMLElement): boolean {\n if (this.contextName !== contextName) return false;\n\n return this.contextElement.contains(consumingElement);\n }\n\n public setState<K extends keyof StateDefinition>(key: K, value: StateDefinition[K]): void {\n if (this.stateMap.get(key) === value) return;\n this.stateMap.set(key, value);\n this.observerService.notifyObservers(key as string);\n }\n\n public setStates(newState: Partial<StateDefinition>): void {\n const changedKeys = Object.keys(newState).filter((key) => this.stateMap.get(key) !== newState[key]);\n\n changedKeys.forEach((key) => {\n this.stateMap.set(key, newState[key]);\n });\n\n changedKeys.forEach((key) => {\n this.observerService.notifyObservers(key);\n });\n }\n\n public getState<K extends keyof StateDefinition>(key: K): StateDefinition[K] | undefined {\n return this.stateMap.get(key);\n }\n\n public observeState(key: keyof StateDefinition, callback: () => void): void {\n this.observerService.observe(key as string, callback);\n }\n\n public unobserveState(key: keyof StateDefinition, callback: () => void): void {\n this.observerService.unobserve(key as string, callback);\n }\n}\n","import { ContextState } from './ContextState';\nimport { ObserverServiceImpl } from '../ObserverService';\nimport { IContextStateService } from './ContextStateService.interface';\n\nexport class ContextStateServiceImpl implements IContextStateService {\n private contextStateMap: Map<string, ContextState[]> = new Map();\n private contextInitObserver = new ObserverServiceImpl();\n\n private getMatchingContextState(contextName: string, consumingElement: HTMLElement): ContextState | null {\n const contextList = this.contextStateMap.get(contextName) || [];\n const matchingContexts = contextList.filter((context) => context.isMatchingContext(contextName, consumingElement));\n if (matchingContexts.length === 0) return null;\n return matchingContexts[0];\n }\n\n public getContextState<StateDefinition extends Record<string, any>>(\n contextName: string,\n consumingElement: HTMLElement,\n ): Promise<ContextState<StateDefinition>> {\n const matchingContextState = this.getMatchingContextState(contextName, consumingElement);\n if (matchingContextState) return Promise.resolve(matchingContextState) as Promise<ContextState<StateDefinition>>;\n return new Promise<ContextState<StateDefinition>>((resolve) => {\n this.contextInitObserver.observe(contextName, () => {\n const contextState = this.getMatchingContextState(contextName, consumingElement);\n if (contextState) {\n resolve(contextState as ContextState<StateDefinition>);\n }\n });\n });\n }\n\n public createContextState<StateDefinition extends Record<string, any>>(\n contextName: string,\n contextElement: HTMLElement,\n ): ContextState<StateDefinition> {\n const contextState = new ContextState(contextName, contextElement);\n const contextList = this.contextStateMap.get(contextName) || [];\n contextList.push(contextState);\n this.contextStateMap.set(contextName, contextList);\n this.contextInitObserver.notifyObservers(contextName);\n return contextState as ContextState<StateDefinition>;\n }\n}\n\nexport const ContextStateService = new ContextStateServiceImpl();\n"],"names":["MQ_CHANGE_EVENT","IN_VP_EVENT","OUT_VP_EVENT","ViewportObserver","constructor","static","undefined","instance","IntersectionObserver","handleIntersectionChange","e","Object","keys","forEach","key","observedEl","target","isIntersecting","dispatchEvent","CustomEvent","bubbles","MediaQueryService","this","eventIdMap","WeakMap","eventBindingMap","lastMQ","getCurrentMQ","mediaQuerys","onEvent","window","handleMQChange","newMQ","detail","oldMQ","__decorate","throttle","resolveSymbol","Symbol","rejectSymbol","pendingSymbol","I18nService","PLACEHOLDER_SELECTOR","_instance","isSetUp","Boolean","_url","isFilledObject","_dictionary","loaded","_loaded","ready","_ready","fetchI18nDictionary","setUp","url","dictionary","console","warn","Error","get","fallback","interpolations","hasOwnProperty","result","entries","k","v","split","join","String","getHumanReadableName","addStyling","getPlaceholder","getReadyPromise","resolve","reject","Promise","res","rej","ensureSetup","head","document","style","createElement","type","appendChild","createTextNode","fetchJSON","then","results","fillInPlaceholders","catch","err","error","Array","from","getElementsByClassName","el","dataset","replaceWith","JSON","parse","reverse","replace","letter","toLowerCase","span","innerText","classList","add","setAttribute","stringify","outerHTML","URLSearchParams","location","search","param","urlSearchParams","getAll","getAllKeys","set","value","updateUrl","delete","getString","toString","curUrl","protocol","host","pathname","curQueryString","hashCache","hash","newUrl","history","replaceState","path","Proxy","prop","URLSearchParamsService","intersectionObserver","rootMargin","subscribe","intersectionCallback","componentMap","observe","unsubscribe","unobserve","intersectionEntry","has","StorageServiceImpl","Map","addEventListener","handleStorageChange","addItem","storageKey","storageValue","options","getStorage","setItem","fireCallbacks","getItem","removeItem","observeItem","callback","keyCallbacks","getKeyCallbacks","observedItemsMap","unobserveItem","clearStorage","storageType","clear","oldValue","newValue","Set","localStorage","sessionStorage","StorageService","CachingServiceImpl","storageService","storageKeyPrefix","shouldCache","cacheValue","validFor","runtimeCache","getStorageKey","cacheItem","validUntil","Date","now","getStorageServiceOptions","getCachedValue","cacheOptions","runtimeValue","cachedItemString","cachedItem","DebuggerService","getCachedJSON","cachedValue","clearCachedValue","CachingService","RequestCachingServiceImpl","requestCacheName","getCache","_cache","caches","open","getCachedResponse","request","storage","cache","response","match","parseInt","json","cacheRequest","storeExpirationTime","put","clearCachedRequest","maxAge","RequestCachingService","APIError","super","statusText","APIServiceImpl","cachingService","requestCachingService","fetch","fetchHTML","getHTML","dataMapper","forceRefetch","pipelineRequest","requestPipeline","fetchData","responseData","cacheResponse","throwError","fetchResponse","Request","cachedResponse","fetchOptions","clone","ok","status","responseClone","text","cacheKey","getCacheKey","requestBasedCaching","cacheKeys","length","appendQueryObject","klCacheKeys","APIService","AbortableRequestService","AbortController","apiService","makeAbortableRequest","bind","fetcher","latestOptions","abortOptions","abortController","abort","signal","name","handleAbortError","nextAction","ObserverServiceImpl","observedKey","curCallbacks","getCallbacks","observerMap","notifyObservers","data","ObserverService","ContextState","contextName","contextElement","element","isMatchingContext","consumingElement","contains","setState","stateMap","observerService","setStates","newState","changedKeys","filter","getState","observeState","unobserveState","ContextStateServiceImpl","getMatchingContextState","matchingContexts","contextStateMap","context","getContextState","matchingContextState","contextInitObserver","contextState","createContextState","contextList","push","ContextStateService"],"mappings":"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"} |
+2
-2
| { | ||
| "name": "@kluntje/services", | ||
| "version": "0.10.1", | ||
| "version": "0.10.2", | ||
| "description": "Collection of useful services, when creating kluntje-components", | ||
@@ -28,3 +28,3 @@ "author": "Frederik Riewerts <frederik.riewerts@gmail.com>", | ||
| }, | ||
| "gitHead": "ab448d95ce5a90f536583067a4c7fc28d0a32a4a" | ||
| "gitHead": "2d45f8a98b21e068cf47a4cf476794e490dc9fcc" | ||
| } |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
210557
0.21%