qortex-core
Version:
Framework-agnostic query cache & fetch registry (MFE friendly).
17 lines (14 loc) • 5.09 kB
JavaScript
'use strict';
function c(t){return Array.isArray(t)?t.join(","):String(t)}function y(t,r,a="shallow"){if(t===r)return !0;if(t==null||r==null)return t===r;if(typeof t!="object"||typeof r!="object")return !1;try{let e=t,n=r;if(Array.isArray(e)&&Array.isArray(n)){if(e.length!==n.length)return !1;for(let o=0;o<e.length;o++)if(a==="deep"){if(!y(e[o],n[o],a))return !1}else if(e[o]!==n[o])return !1;return !0}if(Array.isArray(e)||Array.isArray(n))return !1;let s=Object.keys(e),u=Object.keys(n);if(s.length!==u.length)return !1;for(let o=0;o<s.length;o++){let l=s[o];if(a==="deep"){if(!y(e[l],n[l],a))return !1}else if(e[l]!==n[l])return !1}return !0}catch{return !1}}function g(t,r){return r||((a,e)=>y(a,e,t||"shallow"))}function h(t,r){return {status:"idle",updatedAt:void 0,staleTime:t?.staleTime??0,isInvalidated:!1,fetcher:t?.fetcher,equalityFn:g(t?.equalityStrategy,t?.equalityFn),equalityStrategy:t?.equalityStrategy??"shallow",placeholderData:t?.placeholderData,usePreviousDataOnError:t?.usePreviousDataOnError??!1,usePlaceholderOnError:t?.usePlaceholderOnError??!1,refetchOnSubscribe:t?.refetchOnSubscribe??"stale",enabled:t?.enabled!==!1,refetch:r||(()=>Promise.resolve(void 0)),isSuccess:!1,isError:!1,lastReturnedState:void 0}}function d(t){let r=Date.now(),a=t.updatedAt!==void 0&&r-t.updatedAt>t.staleTime||t.isInvalidated,e,n=!1;switch(t.status){case"error":t.usePreviousDataOnError&&t.data!==void 0?e=t.data:t.usePlaceholderOnError&&t.placeholderData!==void 0&&(e=t.placeholderData,n=!0);break;case"fetching":t.data!==void 0?(e=t.data,n=!1):t.placeholderData&&(e=t.placeholderData,n=!0);break;case"success":case"idle":e=t.data??t.placeholderData,n=t.data?!1:!!t.placeholderData;break}return {data:e,error:t.error,status:t.status,updatedAt:t.updatedAt,isStale:a,isPlaceholderData:n,isLoading:t.status==="fetching"&&!t.updatedAt,isFetching:t.status==="fetching",isError:t.isError,isSuccess:t.isSuccess,refetch:t.refetch}}function Q(t){console.warn(`[qortex] No fetcher or data for key "${c(t)}". Register a fetcher or set initial data.`);}var f=class{constructor(){this.cache=new Map;this.subs=new Map;this.defaultConfig={};this.throttleTime=50;}dangerClearCache(){this.cache.clear(),this.subs.clear();}setDefaultConfig({throttleTime:r,...a}){this.defaultConfig={...this.defaultConfig,...a},r!==void 0&&(this.throttleTime=r);}ensureState(r,a={}){let e=c(r),n=this.cache.get(e);if(n){let s={...this.defaultConfig,...n,...a};Object.assign(n,s),n.enabled=s.enabled!==!1,this.cache.set(e,n);}else {let s={...this.defaultConfig,...a},u=h(s,()=>this.fetchQuery(r));this.cache.set(e,u);}return this.cache.get(e)}emit(r,a){let e=c(r);this.cache.set(e,a);let n=this.subs.get(e);if(!n)return;let s=d(a);for(let u of Array.from(n))u(s);}registerFetcher(r,a){let e=this.ensureState(r,a);this.handleMountLogic(r,e);}fetchQuery(r,a){let e=this.ensureState(r,a);if(e.fetchPromise)return e.fetchPromise;let n=e.fetcher;if(!n)return e.updatedAt===void 0&&Q(r),Promise.resolve(e.data);let s=n();return e.fetchPromise=s,e.status="fetching",e.lastFetchTime=Date.now(),this.emit(r,e),s.then(u=>{e.data=e.equalityFn(e.data,u)?e.data:u,e.status="success",e.isError=!1,e.isSuccess=!0,e.updatedAt=Date.now(),e.fetchPromise=void 0,e.error=void 0,this.emit(r,e);}).catch(u=>{e.error=u,e.status="error",e.isError=!0,e.isSuccess=!1,e.updatedAt=Date.now(),e.fetchPromise=void 0,this.emit(r,e);}),s}setQueryData(r,a){let e=this.ensureState(r),n=e.data;e.equalityFn(n,a)||(e.data=a,e.updatedAt=Date.now(),e.error=void 0,e.status="success",e.isInvalidated=!1,e.isError=!1,e.isSuccess=!0,this.emit(r,e));}getQueryData(r,a){let e=this.ensureState(r,a);return this.handleMountLogic(r,e),d(e).data}getQueryState(r,a){let e=this.ensureState(r,a);this.handleMountLogic(r,e);let n=d(e),s=e.lastReturnedState;return !s||!y(s,n,"shallow")?(e.lastReturnedState=n,n):s}invalidateQuery(r){let a=this.ensureState(r);a.isInvalidated=!0,this.emit(r,a),this.fetchQuery(r);}subscribeQuery(r,a,e){let n=c(r),s=this.ensureState(r,e);return this.subs.has(n)||this.subs.set(n,new Set),this.subs.get(n).add(a),this.handleMountLogic(r,s),()=>{this.subs.get(n).delete(a);}}handleMountLogic(r,a){let e=a.lastFetchTime&&Date.now()-a.lastFetchTime<this.throttleTime;if(a.status==="fetching"||!a.enabled||e||!a.fetcher)return;let n=Date.now(),s=a.updatedAt==null||n-(a.updatedAt||0)>a.staleTime||a.isInvalidated,u=!1;a.updatedAt==null?u=!0:(a.refetchOnSubscribe==="always"&&(u=!0),a.refetchOnSubscribe==="stale"&&(u=s)),u&&this.fetchQuery(r);}},p=f;var i=new p,v=i.registerFetcher.bind(i),O=i.fetchQuery.bind(i),K=i.setQueryData.bind(i),C=i.getQueryData.bind(i),w=i.getQueryState.bind(i),x=i.invalidateQuery.bind(i),A=i.subscribeQuery.bind(i),E=i.setDefaultConfig.bind(i),I=i.dangerClearCache.bind(i);
exports.QueryManagerCore = f;
exports._queryManager = i;
exports.dangerClearCache = I;
exports.fetchQuery = O;
exports.getQueryData = C;
exports.getQueryState = w;
exports.invalidateQuery = x;
exports.registerFetcher = v;
exports.serializeKey = c;
exports.setDefaultConfig = E;
exports.setQueryData = K;
exports.subscribeQuery = A;