@recats/cdeebee 3.0.0-beta.13 → 3.0.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -171,7 +171,7 @@ function ForumsList() {
171
171
  - `useStorage()` - Get the entire storage
172
172
  - `useRequestHistory(api)` - Get successful request history for an API
173
173
  - `useRequestErrors(api)` - Get error history for an API
174
- - `useLastResultIdList(api)` - Get the IDs returned by the last request to an API (for filtering storage)
174
+ - `useLastResultIdList(api, listName)` - Get the IDs returned by the last request for a specific list (for filtering storage)
175
175
 
176
176
  See the [React Hooks](#react-hooks) section for detailed documentation.
177
177
 
@@ -650,9 +650,9 @@ function ErrorDisplay({ api }: { api: string }) {
650
650
 
651
651
  ### Result ID List Hook
652
652
 
653
- #### `useLastResultIdList(api: string)`
653
+ #### `useLastResultIdList(api: string, listName: string)`
654
654
 
655
- Get the list of IDs returned by the last successful request to an API. This is useful for filtering storage data when using `merge` strategy, so you can display only the results from the current search/request.
655
+ Get the list of IDs returned by the last successful request to an API for a specific list. This is useful for filtering storage data when using `merge` strategy, so you can display only the results from the current search/request.
656
656
 
657
657
  ```typescript
658
658
  import { useStorageList, useLastResultIdList } from '@recats/cdeebee';
@@ -665,11 +665,11 @@ function SearchResults() {
665
665
  // Get all products from storage (accumulated via merge strategy)
666
666
  const products = useStorageList<MyStorage, 'productList'>('productList');
667
667
 
668
- // Get only the IDs from the last search request
669
- const lastSearchIds = useLastResultIdList('/api/search');
668
+ // Get only the IDs from the last search request for productList
669
+ const lastSearchIDList = useLastResultIdList('/api/search', 'productList');
670
670
 
671
671
  // Filter to show only results from current search
672
- const displayResults = lastSearchIds
672
+ const displayResults = lastSearchIDList
673
673
  .map(id => products[id])
674
674
  .filter(Boolean);
675
675
 
@@ -685,7 +685,7 @@ function SearchResults() {
685
685
 
686
686
  **Why use this?** When using `replace` strategy with search/filter pages, navigating away and using browser back loses the previous results. With `merge` strategy + `useLastResultIdList`:
687
687
  - Data accumulates in storage (never lost on navigation)
688
- - `lastResultIdList` tracks which IDs belong to the current request
688
+ - `lastResultIdList[api][listName]` tracks which IDs belong to the current request per list
689
689
  - Filter storage by those IDs to display the correct results
690
690
 
691
691
  ### Advanced: Custom State Path
@@ -748,7 +748,7 @@ export {
748
748
  useStorage, // Get entire storage
749
749
  useRequestHistory, // Get successful request history
750
750
  useRequestErrors, // Get error history
751
- useLastResultIdList, // Get IDs from last request (for filtering storage)
751
+ useLastResultIdList, // Get IDs from last request for a list (for filtering storage)
752
752
  } from '@recats/cdeebee';
753
753
 
754
754
  // Types
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("@reduxjs/toolkit"),d=require("react-redux");function y(e,r,n){e.modules.includes(r)&&n()}function f(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function p(e,r){if(!f(e)||!f(r))return r;const n={...e},s=r;for(const t in s)if(Object.prototype.hasOwnProperty.call(s,t)){const i=n[t],o=s[t];f(i)&&f(o)&&!Array.isArray(i)&&!Array.isArray(o)?n[t]=p(i,o):n[t]=o}return n}function x(e,r){const n={...r};for(const s of e)delete n[s];return n}function N(e){if(!f(e))return[];const r=[];for(const n of Object.keys(e)){const s=e[n];if(f(s)&&Array.isArray(s.data)&&typeof s.primaryKey=="string"){const t=s.primaryKey;for(const i of s.data)f(i)&&t in i&&r.push(String(i[t]))}}return r}function K(e,r){for(let n=0;n<r.length;n++){const s=r[n],t=s.key,i=s.value;if(t.length===0)continue;let o=e;for(let u=0;u<t.length-1;u++){const a=t[u];if(Array.isArray(o)){const c=typeof a=="number"?a:Number(a);(!(c in o)||!f(o[c]))&&(o[c]={}),o=o[c]}else{const c=String(a);if(!(c in o)){const g=typeof t[u+1]=="number"||!isNaN(Number(t[u+1]))&&String(Number(t[u+1]))===String(t[u+1]);o[c]=g?[]:{}}const l=o[c];o=Array.isArray(l)||f(l)?l:{}}}Array.isArray(o)||(o[String(t[t.length-1])]=i)}}class T{constructor(){this.byRequestId=new Map,this.byApi=new Map}add(r,n,s){const t={requestId:n,controller:s,api:r};this.byRequestId.set(n,t),this.byApi.has(r)||this.byApi.set(r,new Set),this.byApi.get(r).add(n)}delete(r){const n=this.byRequestId.get(r);if(!n)return;this.byRequestId.delete(r);const s=this.byApi.get(n.api);s&&(s.delete(r),s.size===0&&this.byApi.delete(n.api))}abortAllForApi(r,n){const s=this.byApi.get(r);s&&s.forEach(t=>{if(t!==n){const i=this.byRequestId.get(t);i&&(i.controller.abort(),this.delete(t))}})}}const L=new T;function j(e,r){L.abortAllForApi(e,r)}function C(e,r,n){const s=new AbortController,t=()=>{L.delete(n)};return e.addEventListener("abort",()=>{s.abort(),t()}),{controller:s,init:()=>L.add(r,n,s),drop:t}}class E{constructor(){this.currentPromise=Promise.resolve(),this.queueLength=0}async enqueue(r){this.queueLength++;const n=this.currentPromise;return this.currentPromise=n.then(()=>r(),()=>r()).finally(()=>{this.queueLength--}),this.currentPromise}getQueueLength(){return this.queueLength}clear(){this.queueLength=0}}const O=new E,h=R.createAsyncThunk("cdeebee/request",async(e,{rejectWithValue:r,getState:n,requestId:s,signal:t})=>{const i=new Date().toUTCString(),{cdeebee:{settings:o}}=n(),u=C(t,e.api,s),a=e.onResult&&typeof e.onResult=="function";y(o,"cancelation",u.init);const c=async()=>{try{const{method:l="POST",body:g,headers:H={}}=e,z={...typeof o.mergeWithHeaders=="function"?o.mergeWithHeaders():o.mergeWithHeaders??{},...H},P={...typeof o.mergeWithData=="function"?o.mergeWithData():o.mergeWithData??{},...g??{}};let q=JSON.stringify(P);if(e.files){const S=new FormData,w=e.fileKey||o.fileKey,I=e.bodyKey||o.bodyKey;for(let A=0;A<e.files.length;A+=1)w&&S.append(w,e.files[A]);I&&S.append(I,q),q=S}const m=await fetch(e.api,{method:l,headers:{"ui-request-id":s,"Content-Type":"application/json",...z},signal:u.controller.signal,body:q});y(o,"cancelation",u.drop);let b;const k=e.responseType||"json";return k==="text"?b=await m.text():k==="blob"?b=await m.blob():b=await m.json(),m.ok?(a&&e.onResult(b),{result:b,startedAt:i,endedAt:new Date().toUTCString()}):(a&&e.onResult(b),r(m))}catch(l){return y(o,"cancelation",u.drop),a&&e.onResult(l),l instanceof Error&&l.name==="AbortError"?r({message:"Request was cancelled",cancelled:!0}):r({message:l instanceof Error?l.message:"Unknown error occurred"})}};return o.modules.includes("queryQueue")?O.enqueue(c):c()});function W(e){return f(e)&&Array.isArray(e.data)&&typeof e.primaryKey=="string"}function Q(e,r){const n={};for(const s of e)if(f(s)&&r in s){const t=String(s[r]);n[t]=s}return n}function D(e,r,n,s){return n==="replace"?r:n==="merge"?p(e,r):n==="skip"?e:(console.warn(`Cdeebee: Unknown strategy "${n}" for key "${s}". Skipping normalization.`),p(e,r))}function v(e,r,n){const s=Object.keys(r),t=f(e.storage)?e.storage:{},i={...t},o=new Set;for(const u of s){const a=r[u];if(a==null||typeof a=="string"){o.add(u);continue}const c=n[u]??"merge";if(c==="skip"&&!(u in t))continue;const l=u in t?t[u]:{};if(W(a)){const g=Q(a.data,a.primaryKey);i[u]=D(l,g,c,u);continue}f(a)?i[u]=D(l,a,c,u):i[u]=a}return o.size>0?x(Array.from(o),i):i}const U={settings:{modules:["history","listener","storage","cancelation"],fileKey:"file",bodyKey:"value",listStrategy:{},mergeWithData:{},mergeWithHeaders:{}},storage:{},request:{active:[],errors:{},done:{},lastResultIdList:{}}},M=(e,r)=>R.createSlice({name:"cdeebee",initialState:p(U,{settings:e,storage:r??{}}),reducers:{set(s,t){K(s.storage,t.payload)},historyClear(s,t){const i=t.payload;i?(delete s.request.done[i],delete s.request.errors[i]):(s.request.done={},s.request.errors={})}},extraReducers:s=>{s.addCase(h.pending,(t,i)=>{const o=i.meta.arg.api,u=i.meta.requestId;i.meta.arg.historyClear&&y(t.settings,"history",()=>{delete t.request.done[o],delete t.request.errors[o]}),y(t.settings,"cancelation",()=>{j(o,u)}),y(t.settings,"listener",()=>{t.request.active.push({api:o,requestId:u})})}).addCase(h.fulfilled,(t,i)=>{const o=i.meta.requestId,u=i.meta.arg.api;y(t.settings,"listener",()=>{t.request.active=t.request.active.filter(a=>!(a.api===u&&a.requestId===o))}),y(t.settings,"history",()=>{t.request.done[u]||(t.request.done[u]=[]),t.request.done[u].push({api:u,request:i.payload,requestId:o})}),y(t.settings,"storage",()=>{if(i.meta.arg.ignore)return;const a=i.meta.arg.listStrategy??t.settings.listStrategy??{},c=i.meta.arg.normalize??t.settings.normalize??v,l=R.current(t),g=c(l,i.payload.result,a);t.storage=g,t.request.lastResultIdList[u]=N(i.payload.result)})}).addCase(h.rejected,(t,i)=>{const o=i.meta.requestId,u=i.meta.arg.api;y(t.settings,"listener",()=>{t.request.active=t.request.active.filter(a=>!(a.api===u&&a.requestId===o))}),y(t.settings,"history",()=>{t.request.errors[u]||(t.request.errors[u]=[]),t.request.errors[u].push({requestId:o,api:u,request:i.error})})})}});function F(e){function r(a){return d.useSelector(c=>e(c).request.active.some(g=>a.includes(g.api)))}function n(a){return d.useSelector(c=>e(c).request.done[a]??[])}function s(a){return d.useSelector(c=>e(c).request.errors[a]??[])}function t(a){return d.useSelector(c=>e(c).storage[a])}function i(){return d.useSelector(a=>e(a).storage)}function o(){return d.useSelector(a=>e(a).request.active.length>0)}function u(a){return d.useSelector(c=>e(c).request.lastResultIdList[a]??[])}return{useLoading:r,useRequestHistory:n,useRequestErrors:s,useStorageList:t,useStorage:i,useIsLoading:o,useLastResultIdList:u}}function $(e){return d.useSelector(r=>r.cdeebee.request.active.some(n=>e.includes(n.api)))}function J(e){return d.useSelector(r=>r.cdeebee.request.done[e]??[])}function B(e){return d.useSelector(r=>r.cdeebee.request.errors[e]??[])}function G(e){return d.useSelector(r=>r.cdeebee.storage[e])}function X(){return d.useSelector(e=>e.cdeebee.storage)}function Y(){return d.useSelector(e=>e.cdeebee.request.active.length>0)}function Z(e){return d.useSelector(r=>r.cdeebee.request.lastResultIdList[e]??[])}exports.batchingUpdate=K;exports.createCdeebeeHooks=F;exports.defaultNormalize=v;exports.factory=M;exports.request=h;exports.useIsLoading=Y;exports.useLastResultIdList=Z;exports.useLoading=$;exports.useRequestErrors=B;exports.useRequestHistory=J;exports.useStorage=X;exports.useStorageList=G;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("@reduxjs/toolkit"),d=require("react-redux");function y(e,r,o){e.modules.includes(r)&&o()}function f(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function q(e,r){if(!f(e)||!f(r))return r;const o={...e},s=r;for(const t in s)if(Object.prototype.hasOwnProperty.call(s,t)){const i=o[t],n=s[t];f(i)&&f(n)&&!Array.isArray(i)&&!Array.isArray(n)?o[t]=q(i,n):o[t]=n}return o}function N(e,r){const o={...r};for(const s of e)delete o[s];return o}function x(e){if(!f(e))return{};const r={};for(const o of Object.keys(e)){const s=e[o];if(f(s)&&Array.isArray(s.data)&&typeof s.primaryKey=="string"){const t=s.primaryKey,i=[];for(const n of s.data)f(n)&&t in n&&i.push(String(n[t]));r[o]=i}}return r}function v(e,r){for(let o=0;o<r.length;o++){const s=r[o],t=s.key,i=s.value;if(t.length===0)continue;let n=e;for(let u=0;u<t.length-1;u++){const a=t[u];if(Array.isArray(n)){const c=typeof a=="number"?a:Number(a);(!(c in n)||!f(n[c]))&&(n[c]={}),n=n[c]}else{const c=String(a);if(!(c in n)){const g=typeof t[u+1]=="number"||!isNaN(Number(t[u+1]))&&String(Number(t[u+1]))===String(t[u+1]);n[c]=g?[]:{}}const l=n[c];n=Array.isArray(l)||f(l)?l:{}}}Array.isArray(n)||(n[String(t[t.length-1])]=i)}}class T{constructor(){this.byRequestId=new Map,this.byApi=new Map}add(r,o,s){const t={requestId:o,controller:s,api:r};this.byRequestId.set(o,t),this.byApi.has(r)||this.byApi.set(r,new Set),this.byApi.get(r).add(o)}delete(r){const o=this.byRequestId.get(r);if(!o)return;this.byRequestId.delete(r);const s=this.byApi.get(o.api);s&&(s.delete(r),s.size===0&&this.byApi.delete(o.api))}abortAllForApi(r,o){const s=this.byApi.get(r);s&&s.forEach(t=>{if(t!==o){const i=this.byRequestId.get(t);i&&(i.controller.abort(),this.delete(t))}})}}const k=new T;function j(e,r){k.abortAllForApi(e,r)}function C(e,r,o){const s=new AbortController,t=()=>{k.delete(o)};return e.addEventListener("abort",()=>{s.abort(),t()}),{controller:s,init:()=>k.add(r,o,s),drop:t}}class E{constructor(){this.currentPromise=Promise.resolve(),this.queueLength=0}async enqueue(r){this.queueLength++;const o=this.currentPromise;return this.currentPromise=o.then(()=>r(),()=>r()).finally(()=>{this.queueLength--}),this.currentPromise}getQueueLength(){return this.queueLength}clear(){this.queueLength=0}}const O=new E,p=R.createAsyncThunk("cdeebee/request",async(e,{rejectWithValue:r,getState:o,requestId:s,signal:t})=>{const i=new Date().toUTCString(),{cdeebee:{settings:n}}=o(),u=C(t,e.api,s),a=e.onResult&&typeof e.onResult=="function";y(n,"cancelation",u.init);const c=async()=>{try{const{method:l="POST",body:g,headers:h={}}=e,z={...typeof n.mergeWithHeaders=="function"?n.mergeWithHeaders():n.mergeWithHeaders??{},...h},P={...typeof n.mergeWithData=="function"?n.mergeWithData():n.mergeWithData??{},...g??{}};let S=JSON.stringify(P);if(e.files){const A=new FormData,I=e.fileKey||n.fileKey,D=e.bodyKey||n.bodyKey;for(let L=0;L<e.files.length;L+=1)I&&A.append(I,e.files[L]);D&&A.append(D,S),S=A}const m=await fetch(e.api,{method:l,headers:{"ui-request-id":s,"Content-Type":"application/json",...z},signal:u.controller.signal,body:S});y(n,"cancelation",u.drop);let b;const w=e.responseType||"json";return w==="text"?b=await m.text():w==="blob"?b=await m.blob():b=await m.json(),m.ok?(a&&e.onResult(b),{result:b,startedAt:i,endedAt:new Date().toUTCString()}):(a&&e.onResult(b),r(m))}catch(l){return y(n,"cancelation",u.drop),a&&e.onResult(l),l instanceof Error&&l.name==="AbortError"?r({message:"Request was cancelled",cancelled:!0}):r({message:l instanceof Error?l.message:"Unknown error occurred"})}};return n.modules.includes("queryQueue")?O.enqueue(c):c()});function W(e){return f(e)&&Array.isArray(e.data)&&typeof e.primaryKey=="string"}function Q(e,r){const o={};for(const s of e)if(f(s)&&r in s){const t=String(s[r]);o[t]=s}return o}function K(e,r,o,s){return o==="replace"?r:o==="merge"?q(e,r):o==="skip"?e:(console.warn(`Cdeebee: Unknown strategy "${o}" for key "${s}". Skipping normalization.`),q(e,r))}function H(e,r,o){const s=Object.keys(r),t=f(e.storage)?e.storage:{},i={...t},n=new Set;for(const u of s){const a=r[u];if(a==null||typeof a=="string"){n.add(u);continue}const c=o[u]??"merge";if(c==="skip"&&!(u in t))continue;const l=u in t?t[u]:{};if(W(a)){const g=Q(a.data,a.primaryKey);i[u]=K(l,g,c,u);continue}f(a)?i[u]=K(l,a,c,u):i[u]=a}return n.size>0?N(Array.from(n),i):i}const U={settings:{modules:["history","listener","storage","cancelation"],fileKey:"file",bodyKey:"value",listStrategy:{},mergeWithData:{},mergeWithHeaders:{}},storage:{},request:{active:[],errors:{},done:{},lastResultIdList:{}}},M=(e,r)=>R.createSlice({name:"cdeebee",initialState:q(U,{settings:e,storage:r??{}}),reducers:{set(s,t){v(s.storage,t.payload)},historyClear(s,t){const i=t.payload;i?(delete s.request.done[i],delete s.request.errors[i]):(s.request.done={},s.request.errors={})}},extraReducers:s=>{s.addCase(p.pending,(t,i)=>{const n=i.meta.arg.api,u=i.meta.requestId;i.meta.arg.historyClear&&y(t.settings,"history",()=>{delete t.request.done[n],delete t.request.errors[n]}),y(t.settings,"cancelation",()=>{j(n,u)}),y(t.settings,"listener",()=>{t.request.active.push({api:n,requestId:u})})}).addCase(p.fulfilled,(t,i)=>{const n=i.meta.requestId,u=i.meta.arg.api;y(t.settings,"listener",()=>{t.request.active=t.request.active.filter(a=>!(a.api===u&&a.requestId===n))}),y(t.settings,"history",()=>{t.request.done[u]||(t.request.done[u]=[]),t.request.done[u].push({api:u,request:i.payload,requestId:n})}),y(t.settings,"storage",()=>{if(i.meta.arg.ignore)return;const a=i.meta.arg.listStrategy??t.settings.listStrategy??{},c=i.meta.arg.normalize??t.settings.normalize??H,l=R.current(t),g=c(l,i.payload.result,a);t.storage=g,t.request.lastResultIdList[u]=x(i.payload.result)})}).addCase(p.rejected,(t,i)=>{const n=i.meta.requestId,u=i.meta.arg.api;y(t.settings,"listener",()=>{t.request.active=t.request.active.filter(a=>!(a.api===u&&a.requestId===n))}),y(t.settings,"history",()=>{t.request.errors[u]||(t.request.errors[u]=[]),t.request.errors[u].push({requestId:n,api:u,request:i.error})})})}});function F(e){function r(a){return d.useSelector(c=>e(c).request.active.some(g=>a.includes(g.api)))}function o(a){return d.useSelector(c=>e(c).request.done[a]??[])}function s(a){return d.useSelector(c=>e(c).request.errors[a]??[])}function t(a){return d.useSelector(c=>e(c).storage[a])}function i(){return d.useSelector(a=>e(a).storage)}function n(){return d.useSelector(a=>e(a).request.active.length>0)}function u(a,c){return d.useSelector(l=>{var h;return((h=e(l).request.lastResultIdList[a])==null?void 0:h[c])??[]})}return{useLoading:r,useRequestHistory:o,useRequestErrors:s,useStorageList:t,useStorage:i,useIsLoading:n,useLastResultIdList:u}}function $(e){return d.useSelector(r=>r.cdeebee.request.active.some(o=>e.includes(o.api)))}function J(e){return d.useSelector(r=>r.cdeebee.request.done[e]??[])}function B(e){return d.useSelector(r=>r.cdeebee.request.errors[e]??[])}function G(e){return d.useSelector(r=>r.cdeebee.storage[e])}function X(){return d.useSelector(e=>e.cdeebee.storage)}function Y(){return d.useSelector(e=>e.cdeebee.request.active.length>0)}function Z(e,r){return d.useSelector(o=>{var s;return((s=o.cdeebee.request.lastResultIdList[e])==null?void 0:s[r])??[]})}exports.batchingUpdate=v;exports.createCdeebeeHooks=F;exports.defaultNormalize=H;exports.factory=M;exports.request=p;exports.useIsLoading=Y;exports.useLastResultIdList=Z;exports.useLoading=$;exports.useRequestErrors=B;exports.useRequestHistory=J;exports.useStorage=X;exports.useStorageList=G;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../lib/reducer/helpers.ts","../lib/reducer/abortController.ts","../lib/reducer/queryQueue.ts","../lib/reducer/request.ts","../lib/reducer/storage.ts","../lib/reducer/index.ts","../lib/hooks/createCdeebeeHooks.ts","../lib/hooks/selectors.ts"],"sourcesContent":["import { type WritableDraft } from '@reduxjs/toolkit';\nimport { type CdeebeeSettings, type CdeebeeModule, CdeebeeValueList } from './types';\n\nexport function checkModule(settings: CdeebeeSettings<unknown> | WritableDraft<CdeebeeSettings<unknown>>, module: CdeebeeModule, result: () => void) {\n if (settings.modules.includes(module)) {\n result();\n }\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function mergeDeepRight<T>(\n left: T,\n right: Partial<T> | Record<string, unknown>\n): T {\n if (!isRecord(left) || !isRecord(right)) {\n return right as T;\n }\n\n const result = { ...left } as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n\n for (const key in rightRecord) {\n if (Object.prototype.hasOwnProperty.call(rightRecord, key)) {\n const leftValue = result[key];\n const rightValue = rightRecord[key];\n\n if (\n isRecord(leftValue) &&\n isRecord(rightValue) &&\n !Array.isArray(leftValue) &&\n !Array.isArray(rightValue)\n ) {\n result[key] = mergeDeepRight(leftValue, rightValue);\n } else {\n result[key] = rightValue;\n }\n }\n }\n\n return result as T;\n}\n\nexport function omit<T extends Record<string, unknown>>(keys: string[], obj: T): Omit<T, keyof T> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, keyof T>;\n}\n\n/**\n * Extract primary key values from API response data.\n * Handles responses with format: { listName: { data: [...], primaryKey: 'id' } }\n * Returns a flat array of all extracted IDs from all lists.\n */\nexport function extractResultIdList(response: unknown): string[] {\n if (!isRecord(response)) {\n return [];\n }\n\n const ids: string[] = [];\n\n for (const key of Object.keys(response)) {\n const value = response[key];\n\n if (\n isRecord(value) &&\n Array.isArray(value.data) &&\n typeof value.primaryKey === 'string'\n ) {\n const primaryKey = value.primaryKey;\n for (const item of value.data) {\n if (isRecord(item) && primaryKey in item) {\n ids.push(String(item[primaryKey]));\n }\n }\n }\n }\n\n return ids;\n}\n\nexport function batchingUpdate<T extends Record<string, unknown>>(\n state: T,\n valueList: CdeebeeValueList<T>\n): void {\n for (let i = 0; i < valueList.length; i++) {\n const item = valueList[i] as { key: readonly (string | number)[]; value: unknown };\n const path = item.key;\n const value = item.value;\n\n if (path.length === 0) {\n continue;\n }\n\n let current: Record<string, unknown> | unknown[] = state as Record<string, unknown>;\n\n for (let j = 0; j < path.length - 1; j++) {\n const pathKey = path[j];\n\n if (Array.isArray(current)) {\n const index = typeof pathKey === 'number' ? pathKey : Number(pathKey);\n if (!(index in current) || !isRecord(current[index])) {\n current[index] = {};\n }\n current = current[index] as Record<string, unknown>;\n } else {\n const key = String(pathKey);\n if (!(key in current)) {\n const nextIsNumeric = typeof path[j + 1] === 'number' || (!isNaN(Number(path[j + 1])) && String(Number(path[j + 1])) === String(path[j + 1]));\n current[key] = nextIsNumeric ? [] : {};\n }\n const next = current[key];\n current = (Array.isArray(next) ? next : (isRecord(next) ? next : {})) as Record<string, unknown> | unknown[];\n }\n }\n\n if (Array.isArray(current)) {\n continue; // Can't update array element directly\n }\n current[String(path[path.length - 1])] = value;\n }\n}\n","interface RequestController {\n requestId: string;\n controller: AbortController;\n api: string;\n}\n\nclass AbortControllerStore {\n private byRequestId = new Map<string, RequestController>();\n private byApi = new Map<string, Set<string>>();\n\n add(api: string, requestId: string, controller: AbortController): void {\n const item: RequestController = { requestId, controller, api };\n this.byRequestId.set(requestId, item);\n\n if (!this.byApi.has(api)) {\n this.byApi.set(api, new Set());\n }\n this.byApi.get(api)!.add(requestId);\n }\n\n delete(requestId: string): void {\n const item = this.byRequestId.get(requestId);\n if (!item) return;\n\n this.byRequestId.delete(requestId);\n const apiSet = this.byApi.get(item.api);\n if (apiSet) {\n apiSet.delete(requestId);\n if (apiSet.size === 0) {\n this.byApi.delete(item.api);\n }\n }\n }\n\n abortAllForApi(api: string, excludeRequestId: string): void {\n const requestIds = this.byApi.get(api);\n if (!requestIds) return;\n\n requestIds.forEach(requestId => {\n if (requestId !== excludeRequestId) {\n const item = this.byRequestId.get(requestId);\n if (item) {\n item.controller.abort();\n this.delete(requestId);\n }\n }\n });\n }\n}\n\nconst abortStore = new AbortControllerStore();\n\nexport function abortQuery(api: string, currentRequestId: string): void {\n abortStore.abortAllForApi(api, currentRequestId);\n}\n\nexport function abortManager(signal: AbortSignal, api: string, requestId: string) {\n const controller = new AbortController();\n\n const cleanup = () => {\n abortStore.delete(requestId);\n };\n\n signal.addEventListener('abort', () => {\n controller.abort();\n cleanup();\n });\n\n return {\n controller,\n init: () => abortStore.add(api, requestId, controller),\n drop: cleanup,\n };\n}\n","class QueryQueue {\n private currentPromise: Promise<unknown> = Promise.resolve();\n private queueLength = 0;\n\n async enqueue<T>(task: () => Promise<T>): Promise<T> {\n this.queueLength++;\n\n const previousPromise = this.currentPromise;\n\n this.currentPromise = previousPromise\n .then(() => task(), () => task())\n .finally(() => {\n this.queueLength--;\n });\n\n return this.currentPromise as Promise<T>;\n }\n\n getQueueLength(): number {\n return this.queueLength;\n }\n\n clear(): void {\n this.queueLength = 0;\n }\n}\n\nexport const queryQueue = new QueryQueue();\n\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { checkModule } from './helpers';\nimport { abortManager } from './abortController';\nimport { queryQueue } from './queryQueue';\nimport { type CdeebeeState, type CdeebeeRequestOptions } from './types';\n\nexport const request = createAsyncThunk(\n 'cdeebee/request',\n async (options: CdeebeeRequestOptions<unknown>, { rejectWithValue, getState, requestId, signal }) => {\n const startedAt = new Date().toUTCString();\n const { cdeebee: { settings } } = getState() as { cdeebee: CdeebeeState<unknown> };\n\n const abort = abortManager(signal, options.api, requestId);\n const withCallback = options.onResult && typeof options.onResult === 'function';\n\n checkModule(settings, 'cancelation', abort.init);\n\n const executeRequest = async () => {\n try {\n const { method = 'POST', body, headers = {} } = options;\n const baseHeaders = typeof settings.mergeWithHeaders === 'function'\n ? settings.mergeWithHeaders()\n : (settings.mergeWithHeaders ?? {});\n\n const extraHeaders: Record<string, string> = { ...baseHeaders, ...headers };\n\n const baseData = typeof settings.mergeWithData === 'function'\n ? settings.mergeWithData()\n : (settings.mergeWithData ?? {});\n\n const b = { ...baseData, ...(body ?? {}) };\n let requestData: FormData | string = JSON.stringify(b);\n\n // handling files\n if (options.files) {\n const formData = new FormData();\n const fileKey = options.fileKey || settings.fileKey;\n const bodyKey = options.bodyKey || settings.bodyKey;\n\n for (let i = 0; i < options.files.length; i += 1) {\n if (fileKey) {\n formData.append(fileKey, options.files[i]);\n }\n }\n\n if (bodyKey) {\n formData.append(bodyKey, requestData);\n }\n requestData = formData;\n }\n // [end] handling files\n\n const response = await fetch(options.api, {\n method,\n headers: {\n 'ui-request-id': requestId,\n 'Content-Type': 'application/json',\n ...extraHeaders,\n },\n signal: abort.controller.signal,\n body: requestData,\n });\n\n checkModule(settings, 'cancelation', abort.drop);\n\n let result: unknown;\n const responseType = options.responseType || 'json';\n\n if (responseType === 'text') {\n result = await response.text();\n } else if (responseType === 'blob') {\n result = await response.blob();\n } else {\n // default: json\n result = await response.json();\n }\n\n if (!response.ok) {\n if (withCallback) options.onResult!(result);\n return rejectWithValue(response);\n }\n\n if (withCallback) options.onResult!(result);\n return { result, startedAt, endedAt: new Date().toUTCString() };\n } catch (error) {\n checkModule(settings, 'cancelation', abort.drop);\n\n if (withCallback) options.onResult!(error);\n\n if (error instanceof Error && error.name === 'AbortError') {\n return rejectWithValue({ message: 'Request was cancelled', cancelled: true });\n }\n\n return rejectWithValue({ message: error instanceof Error ? error.message : 'Unknown error occurred' });\n }\n };\n\n if (settings.modules.includes('queryQueue')) {\n return queryQueue.enqueue(executeRequest);\n }\n\n return executeRequest();\n },\n);\n\n","import { type CdeebeeListStrategy, type CdeebeeState } from './types';\nimport { isRecord, mergeDeepRight, omit } from './helpers';\n\ntype ResponseValue = Record<string, unknown>;\n\ntype IResponse = Record<string, ResponseValue>;\n\ntype StorageData = Record<string, unknown>;\n\nfunction isDataWithPrimaryKey(value: unknown): value is { data: unknown[]; primaryKey: string } {\n return (\n isRecord(value) &&\n Array.isArray(value.data) &&\n typeof value.primaryKey === 'string'\n );\n}\nfunction normalizeDataWithPrimaryKey(data: unknown[], primaryKey: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n \n for (const item of data) {\n if (isRecord(item) && primaryKey in item) {\n const key = String(item[primaryKey]);\n result[key] = item;\n }\n }\n \n return result;\n}\n\nfunction applyStrategy(\n existingValue: StorageData,\n newValue: StorageData | ResponseValue,\n strategy: string,\n key: string\n): ResponseValue {\n if (strategy === 'replace') {\n return newValue as ResponseValue;\n } else if (strategy === 'merge') {\n return mergeDeepRight(existingValue, newValue as StorageData) as ResponseValue;\n } else if (strategy === 'skip') {\n return existingValue as ResponseValue;\n } else {\n console.warn(`Cdeebee: Unknown strategy \"${strategy}\" for key \"${key}\". Skipping normalization.`);\n return mergeDeepRight(existingValue, newValue as StorageData) as ResponseValue;\n }\n}\n\nexport function defaultNormalize<T>(\n cdeebee: CdeebeeState<T>,\n response: IResponse,\n strategyList: CdeebeeListStrategy<T> \n): Record<string, ResponseValue> {\n const keyList = Object.keys(response);\n const currentStorage = isRecord(cdeebee.storage) ? (cdeebee.storage as Record<string, unknown>) : {};\n \n const result = { ...currentStorage } as Record<string, ResponseValue>;\n const keyListToOmit = new Set<string>();\n\n for (const key of keyList) {\n const responseValue = response[key];\n\n if (responseValue === null || responseValue === undefined || typeof responseValue === 'string') {\n keyListToOmit.add(key);\n continue;\n }\n\n const strategy = strategyList[key as keyof T] ?? 'merge';\n \n // For 'skip' strategy, if key doesn't exist in storage, skip it entirely\n if (strategy === 'skip' && !(key in currentStorage)) {\n continue;\n }\n \n const existingValue = key in currentStorage ? (currentStorage[key] as StorageData) : {};\n\n if (isDataWithPrimaryKey(responseValue)) {\n const normalizedValue = normalizeDataWithPrimaryKey(responseValue.data, responseValue.primaryKey);\n result[key] = applyStrategy(existingValue, normalizedValue, strategy, key);\n continue;\n }\n\n if (isRecord(responseValue)) {\n result[key] = applyStrategy(existingValue, responseValue as StorageData, strategy, key);\n } else {\n result[key] = responseValue;\n }\n }\n\n return keyListToOmit.size > 0 ? omit(Array.from(keyListToOmit), result) : result;\n}\n","import { createSlice, current, type PayloadAction } from '@reduxjs/toolkit';\n\nimport { type CdeebeeSettings, type CdeebeeState, type CdeebeeValueList, type CdeebeeListStrategy } from './types';\nimport { checkModule, mergeDeepRight, batchingUpdate, extractResultIdList } from './helpers';\nimport { abortQuery } from './abortController';\nimport { request } from './request';\nimport { defaultNormalize } from './storage';\n\nconst initialState: CdeebeeState<unknown> = {\n settings: {\n modules: ['history', 'listener', 'storage', 'cancelation'],\n fileKey: 'file',\n bodyKey: 'value',\n listStrategy: {},\n mergeWithData: {},\n mergeWithHeaders: {},\n },\n storage: {},\n request: {\n active: [],\n errors: {},\n done: {},\n lastResultIdList: {},\n },\n};\n\nexport const factory = <T>(settings: CdeebeeSettings<T>, storage?: T) => {\n const slice = createSlice({\n name: 'cdeebee',\n initialState: mergeDeepRight(initialState, { settings, storage: storage ?? {} }) as CdeebeeState<T>,\n reducers: {\n set(state, action: { payload: CdeebeeValueList<T> }) {\n // Directly mutate state.storage using Immer Draft\n // This is more performant than creating a new object\n // Immer will track changes and create minimal updates\n batchingUpdate(state.storage as Record<string, unknown>, action.payload);\n },\n historyClear(state, action: PayloadAction<string | undefined>) {\n const api = action.payload;\n\n if (api) {\n delete state.request.done[api];\n delete state.request.errors[api];\n } else {\n state.request.done = {};\n state.request.errors = {};\n }\n }\n },\n extraReducers: builder => {\n builder\n .addCase(request.pending, (state, action) => {\n const api = action.meta.arg.api;\n const requestId = action.meta.requestId;\n\n if (action.meta.arg.historyClear) {\n checkModule(state.settings, 'history', () => {\n delete state.request.done[api];\n delete state.request.errors[api];\n });\n }\n\n checkModule(state.settings, 'cancelation', () => {\n abortQuery(api, requestId);\n });\n checkModule(state.settings, 'listener', () => {\n state.request.active.push({ api, requestId });\n });\n })\n .addCase(request.fulfilled, (state, action) => {\n const requestId = action.meta.requestId;\n const api = action.meta.arg.api;\n\n checkModule(state.settings, 'listener', () => {\n state.request.active = state.request.active.filter(q => !(q.api === api && q.requestId === requestId));\n });\n checkModule(state.settings, 'history', () => {\n if (!state.request.done[api]) state.request.done[api] = [];\n state.request.done[api].push({ api, request: action.payload, requestId });\n });\n checkModule(state.settings, 'storage', () => {\n if (action.meta.arg.ignore) {\n return;\n }\n\n const strategyList = (action.meta.arg.listStrategy ?? state.settings.listStrategy ?? {}) as CdeebeeListStrategy<T>;\n const normalize = action.meta.arg.normalize ?? state.settings.normalize ?? defaultNormalize;\n\n const currentState = current(state) as CdeebeeState<T>;\n // Type assertion is safe here because we've already checked isRecord\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const normalizedData = normalize(currentState, action.payload.result as any, strategyList);\n\n // Normalize already handles merge/replace/skip and preserves keys not in response\n // Simply apply the result\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.storage as any) = normalizedData;\n\n // Extract and store result IDs for filtering\n state.request.lastResultIdList[api] = extractResultIdList(action.payload.result);\n });\n })\n .addCase(request.rejected, (state, action) => {\n const requestId = action.meta.requestId;\n const api = action.meta.arg.api;\n\n checkModule(state.settings, 'listener', () => {\n state.request.active = state.request.active.filter(q => !(q.api === api && q.requestId === requestId));\n });\n checkModule(state.settings, 'history', () => {\n if (!state.request.errors[api]) state.request.errors[api] = [];\n state.request.errors[api].push({ requestId: requestId, api, request: action.error });\n });\n });\n },\n });\n\n return slice;\n};\n","import { useSelector } from 'react-redux';\nimport { type CdeebeeState } from '../reducer/types';\n\n/**\n * Generic hook factory that creates a selector hook for cdeebee state.\n * This allows the hooks to work with any Redux root state structure.\n *\n * @template RootState - The shape of the Redux root state\n * @template Storage - The shape of the cdeebee storage\n * @param selectCdeebee - Function to select the cdeebee slice from root state\n * @returns An object containing all cdeebee hooks\n */\nexport function createCdeebeeHooks<RootState, Storage>(\n selectCdeebee: (state: RootState) => CdeebeeState<Storage>\n) {\n /**\n * Check if any of the specified APIs are currently loading.\n *\n * @param apiList - Array of API endpoints to check\n * @returns true if any of the APIs are currently active/loading\n *\n * @example\n * const isLoading = useLoading(['/api/forums', '/api/threads']);\n * if (isLoading) return <Spinner />;\n */\n function useLoading(apiList: string[]): boolean {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.active.some(q => apiList.includes(q.api));\n });\n }\n\n /**\n * Get the successful request history for a specific API endpoint.\n *\n * @param api - The API endpoint\n * @returns Array of successful request history entries\n *\n * @example\n * const history = useRequestHistory('/api/forums');\n * console.log(`Made ${history.length} successful requests`);\n */\n function useRequestHistory(api: string) {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.done[api] ?? [];\n });\n }\n\n /**\n * Get the error history for a specific API endpoint.\n *\n * @param api - The API endpoint\n * @returns Array of error history entries\n *\n * @example\n * const errors = useRequestErrors('/api/forums');\n * if (errors.length > 0) {\n * console.error('Last error:', errors[errors.length - 1]);\n * }\n */\n function useRequestErrors(api: string) {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.errors[api] ?? [];\n });\n }\n\n /**\n * Get a specific list from storage with full type safety.\n *\n * @param listName - The name of the list in storage\n * @returns The list data\n *\n * @example\n * const forums = useStorageList('forumList');\n * const forumArray = Object.values(forums);\n */\n function useStorageList<K extends keyof Storage>(listName: K): Storage[K] {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.storage[listName];\n });\n }\n\n /**\n * Get the entire cdeebee storage.\n *\n * @returns The complete storage object\n *\n * @example\n * const storage = useStorage();\n * console.log(Object.keys(storage)); // ['forumList', 'threadList', ...]\n */\n function useStorage(): Storage {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.storage;\n });\n }\n\n /**\n * Check if any request is currently loading (across all APIs).\n *\n * @returns true if any request is active\n *\n * @example\n * const isAnythingLoading = useIsLoading();\n * if (isAnythingLoading) return <GlobalSpinner />;\n */\n function useIsLoading(): boolean {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.active.length > 0;\n });\n }\n\n /**\n * Get the list of IDs returned by the last successful request to an API.\n * Useful for filtering storage data to show only results from a specific request.\n *\n * @param api - The API endpoint\n * @returns Array of primary key IDs from the last response\n *\n * @example\n * const productList = useStorageList('productList');\n * const lastIds = useLastResultIdList('/api/search');\n * const displayResults = lastIds.map(id => productList[id]).filter(Boolean);\n */\n function useLastResultIdList(api: string): string[] {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.lastResultIdList[api] ?? [];\n });\n }\n\n return {\n useLoading,\n useRequestHistory,\n useRequestErrors,\n useStorageList,\n useStorage,\n useIsLoading,\n useLastResultIdList,\n };\n}\n","import { useSelector } from 'react-redux';\nimport { type CdeebeeState } from '../reducer/types';\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param apiList - Array of API endpoints to check\n * @returns true if any of the APIs are currently active/loading\n *\n * @example\n * const isLoading = useLoading(['/api/forums', '/api/threads']);\n */\nexport function useLoading<Storage = unknown>(apiList: string[]): boolean {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.active.some(q => apiList.includes(q.api));\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param api - The API endpoint\n * @returns Array of successful request history entries\n */\nexport function useRequestHistory<Storage = unknown>(api: string) {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.done[api] ?? [];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param api - The API endpoint\n * @returns Array of error history entries\n */\nexport function useRequestErrors<Storage = unknown>(api: string) {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.errors[api] ?? [];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param listName - The name of the list in storage\n * @returns The list data\n */\nexport function useStorageList<Storage, K extends keyof Storage>(listName: K): Storage[K] {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.storage[listName];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @returns The complete storage object\n */\nexport function useStorage<Storage>(): Storage {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.storage;\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @returns true if any request is active\n */\nexport function useIsLoading<Storage = unknown>(): boolean {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.active.length > 0;\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * Get the list of IDs returned by the last successful request to an API.\n * Useful for filtering storage data to show only results from a specific request.\n *\n * @param api - The API endpoint\n * @returns Array of primary key IDs from the last response\n *\n * @example\n * const productList = useStorageList('productList');\n * const lastIds = useLastResultIdList('/api/search');\n * const displayResults = lastIds.map(id => productList[id]).filter(Boolean);\n */\nexport function useLastResultIdList<Storage = unknown>(api: string): string[] {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.lastResultIdList[api] ?? [];\n });\n}\n"],"names":["checkModule","settings","module","result","isRecord","value","mergeDeepRight","left","right","rightRecord","key","leftValue","rightValue","omit","keys","obj","extractResultIdList","response","ids","primaryKey","item","batchingUpdate","state","valueList","i","path","current","j","pathKey","index","nextIsNumeric","next","AbortControllerStore","api","requestId","controller","apiSet","excludeRequestId","requestIds","abortStore","abortQuery","currentRequestId","abortManager","signal","cleanup","QueryQueue","task","previousPromise","queryQueue","request","createAsyncThunk","options","rejectWithValue","getState","startedAt","abort","withCallback","executeRequest","method","body","headers","extraHeaders","b","requestData","formData","fileKey","bodyKey","responseType","error","isDataWithPrimaryKey","normalizeDataWithPrimaryKey","data","applyStrategy","existingValue","newValue","strategy","defaultNormalize","cdeebee","strategyList","keyList","currentStorage","keyListToOmit","responseValue","normalizedValue","initialState","factory","storage","createSlice","action","builder","q","normalize","currentState","normalizedData","createCdeebeeHooks","selectCdeebee","useLoading","apiList","useSelector","useRequestHistory","useRequestErrors","useStorageList","listName","useStorage","useIsLoading","useLastResultIdList"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../lib/reducer/helpers.ts","../lib/reducer/abortController.ts","../lib/reducer/queryQueue.ts","../lib/reducer/request.ts","../lib/reducer/storage.ts","../lib/reducer/index.ts","../lib/hooks/createCdeebeeHooks.ts","../lib/hooks/selectors.ts"],"sourcesContent":["import { type WritableDraft } from '@reduxjs/toolkit';\nimport { type CdeebeeSettings, type CdeebeeModule, CdeebeeValueList } from './types';\n\nexport function checkModule(settings: CdeebeeSettings<unknown> | WritableDraft<CdeebeeSettings<unknown>>, module: CdeebeeModule, result: () => void) {\n if (settings.modules.includes(module)) {\n result();\n }\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function mergeDeepRight<T>(\n left: T,\n right: Partial<T> | Record<string, unknown>\n): T {\n if (!isRecord(left) || !isRecord(right)) {\n return right as T;\n }\n\n const result = { ...left } as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n\n for (const key in rightRecord) {\n if (Object.prototype.hasOwnProperty.call(rightRecord, key)) {\n const leftValue = result[key];\n const rightValue = rightRecord[key];\n\n if (\n isRecord(leftValue) &&\n isRecord(rightValue) &&\n !Array.isArray(leftValue) &&\n !Array.isArray(rightValue)\n ) {\n result[key] = mergeDeepRight(leftValue, rightValue);\n } else {\n result[key] = rightValue;\n }\n }\n }\n\n return result as T;\n}\n\nexport function omit<T extends Record<string, unknown>>(keys: string[], obj: T): Omit<T, keyof T> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, keyof T>;\n}\n\n/**\n * Extract primary key values from API response data per list.\n * Handles responses with format: { listName: { data: [...], primaryKey: 'id' } }\n * Returns a map of listName -> array of IDs.\n */\nexport function extractLastResultIdList(response: unknown): Record<string, string[]> {\n if (!isRecord(response)) {\n return {};\n }\n\n const result: Record<string, string[]> = {};\n\n for (const listName of Object.keys(response)) {\n const value = response[listName];\n\n if (\n isRecord(value) &&\n Array.isArray(value.data) &&\n typeof value.primaryKey === 'string'\n ) {\n const primaryKey = value.primaryKey;\n const idList: string[] = [];\n\n for (const item of value.data) {\n if (isRecord(item) && primaryKey in item) {\n idList.push(String(item[primaryKey]));\n }\n }\n\n result[listName] = idList;\n }\n }\n\n return result;\n}\n\nexport function batchingUpdate<T extends Record<string, unknown>>(\n state: T,\n valueList: CdeebeeValueList<T>\n): void {\n for (let i = 0; i < valueList.length; i++) {\n const item = valueList[i] as { key: readonly (string | number)[]; value: unknown };\n const path = item.key;\n const value = item.value;\n\n if (path.length === 0) {\n continue;\n }\n\n let current: Record<string, unknown> | unknown[] = state as Record<string, unknown>;\n\n for (let j = 0; j < path.length - 1; j++) {\n const pathKey = path[j];\n\n if (Array.isArray(current)) {\n const index = typeof pathKey === 'number' ? pathKey : Number(pathKey);\n if (!(index in current) || !isRecord(current[index])) {\n current[index] = {};\n }\n current = current[index] as Record<string, unknown>;\n } else {\n const key = String(pathKey);\n if (!(key in current)) {\n const nextIsNumeric = typeof path[j + 1] === 'number' || (!isNaN(Number(path[j + 1])) && String(Number(path[j + 1])) === String(path[j + 1]));\n current[key] = nextIsNumeric ? [] : {};\n }\n const next = current[key];\n current = (Array.isArray(next) ? next : (isRecord(next) ? next : {})) as Record<string, unknown> | unknown[];\n }\n }\n\n if (Array.isArray(current)) {\n continue; // Can't update array element directly\n }\n current[String(path[path.length - 1])] = value;\n }\n}\n","interface RequestController {\n requestId: string;\n controller: AbortController;\n api: string;\n}\n\nclass AbortControllerStore {\n private byRequestId = new Map<string, RequestController>();\n private byApi = new Map<string, Set<string>>();\n\n add(api: string, requestId: string, controller: AbortController): void {\n const item: RequestController = { requestId, controller, api };\n this.byRequestId.set(requestId, item);\n\n if (!this.byApi.has(api)) {\n this.byApi.set(api, new Set());\n }\n this.byApi.get(api)!.add(requestId);\n }\n\n delete(requestId: string): void {\n const item = this.byRequestId.get(requestId);\n if (!item) return;\n\n this.byRequestId.delete(requestId);\n const apiSet = this.byApi.get(item.api);\n if (apiSet) {\n apiSet.delete(requestId);\n if (apiSet.size === 0) {\n this.byApi.delete(item.api);\n }\n }\n }\n\n abortAllForApi(api: string, excludeRequestId: string): void {\n const requestIDList = this.byApi.get(api);\n if (!requestIDList) return;\n\n requestIDList.forEach(requestId => {\n if (requestId !== excludeRequestId) {\n const item = this.byRequestId.get(requestId);\n if (item) {\n item.controller.abort();\n this.delete(requestId);\n }\n }\n });\n }\n}\n\nconst abortStore = new AbortControllerStore();\n\nexport function abortQuery(api: string, currentRequestId: string): void {\n abortStore.abortAllForApi(api, currentRequestId);\n}\n\nexport function abortManager(signal: AbortSignal, api: string, requestId: string) {\n const controller = new AbortController();\n\n const cleanup = () => {\n abortStore.delete(requestId);\n };\n\n signal.addEventListener('abort', () => {\n controller.abort();\n cleanup();\n });\n\n return {\n controller,\n init: () => abortStore.add(api, requestId, controller),\n drop: cleanup,\n };\n}\n","class QueryQueue {\n private currentPromise: Promise<unknown> = Promise.resolve();\n private queueLength = 0;\n\n async enqueue<T>(task: () => Promise<T>): Promise<T> {\n this.queueLength++;\n\n const previousPromise = this.currentPromise;\n\n this.currentPromise = previousPromise\n .then(() => task(), () => task())\n .finally(() => {\n this.queueLength--;\n });\n\n return this.currentPromise as Promise<T>;\n }\n\n getQueueLength(): number {\n return this.queueLength;\n }\n\n clear(): void {\n this.queueLength = 0;\n }\n}\n\nexport const queryQueue = new QueryQueue();\n\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { checkModule } from './helpers';\nimport { abortManager } from './abortController';\nimport { queryQueue } from './queryQueue';\nimport { type CdeebeeState, type CdeebeeRequestOptions } from './types';\n\nexport const request = createAsyncThunk(\n 'cdeebee/request',\n async (options: CdeebeeRequestOptions<unknown>, { rejectWithValue, getState, requestId, signal }) => {\n const startedAt = new Date().toUTCString();\n const { cdeebee: { settings } } = getState() as { cdeebee: CdeebeeState<unknown> };\n\n const abort = abortManager(signal, options.api, requestId);\n const withCallback = options.onResult && typeof options.onResult === 'function';\n\n checkModule(settings, 'cancelation', abort.init);\n\n const executeRequest = async () => {\n try {\n const { method = 'POST', body, headers = {} } = options;\n const baseHeaders = typeof settings.mergeWithHeaders === 'function'\n ? settings.mergeWithHeaders()\n : (settings.mergeWithHeaders ?? {});\n\n const extraHeaders: Record<string, string> = { ...baseHeaders, ...headers };\n\n const baseData = typeof settings.mergeWithData === 'function'\n ? settings.mergeWithData()\n : (settings.mergeWithData ?? {});\n\n const b = { ...baseData, ...(body ?? {}) };\n let requestData: FormData | string = JSON.stringify(b);\n\n // handling files\n if (options.files) {\n const formData = new FormData();\n const fileKey = options.fileKey || settings.fileKey;\n const bodyKey = options.bodyKey || settings.bodyKey;\n\n for (let i = 0; i < options.files.length; i += 1) {\n if (fileKey) {\n formData.append(fileKey, options.files[i]);\n }\n }\n\n if (bodyKey) {\n formData.append(bodyKey, requestData);\n }\n requestData = formData;\n }\n // [end] handling files\n\n const response = await fetch(options.api, {\n method,\n headers: {\n 'ui-request-id': requestId,\n 'Content-Type': 'application/json',\n ...extraHeaders,\n },\n signal: abort.controller.signal,\n body: requestData,\n });\n\n checkModule(settings, 'cancelation', abort.drop);\n\n let result: unknown;\n const responseType = options.responseType || 'json';\n\n if (responseType === 'text') {\n result = await response.text();\n } else if (responseType === 'blob') {\n result = await response.blob();\n } else {\n // default: json\n result = await response.json();\n }\n\n if (!response.ok) {\n if (withCallback) options.onResult!(result);\n return rejectWithValue(response);\n }\n\n if (withCallback) options.onResult!(result);\n return { result, startedAt, endedAt: new Date().toUTCString() };\n } catch (error) {\n checkModule(settings, 'cancelation', abort.drop);\n\n if (withCallback) options.onResult!(error);\n\n if (error instanceof Error && error.name === 'AbortError') {\n return rejectWithValue({ message: 'Request was cancelled', cancelled: true });\n }\n\n return rejectWithValue({ message: error instanceof Error ? error.message : 'Unknown error occurred' });\n }\n };\n\n if (settings.modules.includes('queryQueue')) {\n return queryQueue.enqueue(executeRequest);\n }\n\n return executeRequest();\n },\n);\n\n","import { type CdeebeeListStrategy, type CdeebeeState } from './types';\nimport { isRecord, mergeDeepRight, omit } from './helpers';\n\ntype ResponseValue = Record<string, unknown>;\n\ntype IResponse = Record<string, ResponseValue>;\n\ntype StorageData = Record<string, unknown>;\n\nfunction isDataWithPrimaryKey(value: unknown): value is { data: unknown[]; primaryKey: string } {\n return (\n isRecord(value) &&\n Array.isArray(value.data) &&\n typeof value.primaryKey === 'string'\n );\n}\nfunction normalizeDataWithPrimaryKey(data: unknown[], primaryKey: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const item of data) {\n if (isRecord(item) && primaryKey in item) {\n const key = String(item[primaryKey]);\n result[key] = item;\n }\n }\n\n return result;\n}\n\nfunction applyStrategy(\n existingValue: StorageData,\n newValue: StorageData | ResponseValue,\n strategy: string,\n key: string\n): ResponseValue {\n if (strategy === 'replace') {\n return newValue as ResponseValue;\n } else if (strategy === 'merge') {\n return mergeDeepRight(existingValue, newValue as StorageData) as ResponseValue;\n } else if (strategy === 'skip') {\n return existingValue as ResponseValue;\n } else {\n console.warn(`Cdeebee: Unknown strategy \"${strategy}\" for key \"${key}\". Skipping normalization.`);\n return mergeDeepRight(existingValue, newValue as StorageData) as ResponseValue;\n }\n}\n\nexport function defaultNormalize<T>(\n cdeebee: CdeebeeState<T>,\n response: IResponse,\n strategyList: CdeebeeListStrategy<T>\n): Record<string, ResponseValue> {\n const keyList = Object.keys(response);\n const currentStorage = isRecord(cdeebee.storage) ? (cdeebee.storage as Record<string, unknown>) : {};\n\n const result = { ...currentStorage } as Record<string, ResponseValue>;\n const keyListToOmit = new Set<string>();\n\n for (const key of keyList) {\n const responseValue = response[key];\n\n if (responseValue === null || responseValue === undefined || typeof responseValue === 'string') {\n keyListToOmit.add(key);\n continue;\n }\n\n const strategy = strategyList[key as keyof T] ?? 'merge';\n\n // For 'skip' strategy, if key doesn't exist in storage, skip it entirely\n if (strategy === 'skip' && !(key in currentStorage)) {\n continue;\n }\n\n const existingValue = key in currentStorage ? (currentStorage[key] as StorageData) : {};\n\n if (isDataWithPrimaryKey(responseValue)) {\n const normalizedValue = normalizeDataWithPrimaryKey(responseValue.data, responseValue.primaryKey);\n result[key] = applyStrategy(existingValue, normalizedValue, strategy, key);\n continue;\n }\n\n if (isRecord(responseValue)) {\n result[key] = applyStrategy(existingValue, responseValue as StorageData, strategy, key);\n } else {\n result[key] = responseValue;\n }\n }\n\n return keyListToOmit.size > 0 ? omit(Array.from(keyListToOmit), result) : result;\n}\n","import { createSlice, current, type PayloadAction } from '@reduxjs/toolkit';\n\nimport { type CdeebeeSettings, type CdeebeeState, type CdeebeeValueList, type CdeebeeListStrategy } from './types';\nimport { checkModule, mergeDeepRight, batchingUpdate, extractLastResultIdList } from './helpers';\nimport { abortQuery } from './abortController';\nimport { request } from './request';\nimport { defaultNormalize } from './storage';\n\nconst initialState: CdeebeeState<unknown> = {\n settings: {\n modules: ['history', 'listener', 'storage', 'cancelation'],\n fileKey: 'file',\n bodyKey: 'value',\n listStrategy: {},\n mergeWithData: {},\n mergeWithHeaders: {},\n },\n storage: {},\n request: {\n active: [],\n errors: {},\n done: {},\n lastResultIdList: {},\n },\n};\n\nexport const factory = <T>(settings: CdeebeeSettings<T>, storage?: T) => {\n const slice = createSlice({\n name: 'cdeebee',\n initialState: mergeDeepRight(initialState, { settings, storage: storage ?? {} }) as CdeebeeState<T>,\n reducers: {\n set(state, action: { payload: CdeebeeValueList<T> }) {\n // Directly mutate state.storage using Immer Draft\n // This is more performant than creating a new object\n // Immer will track changes and create minimal updates\n batchingUpdate(state.storage as Record<string, unknown>, action.payload);\n },\n historyClear(state, action: PayloadAction<string | undefined>) {\n const api = action.payload;\n\n if (api) {\n delete state.request.done[api];\n delete state.request.errors[api];\n } else {\n state.request.done = {};\n state.request.errors = {};\n }\n }\n },\n extraReducers: builder => {\n builder\n .addCase(request.pending, (state, action) => {\n const api = action.meta.arg.api;\n const requestId = action.meta.requestId;\n\n if (action.meta.arg.historyClear) {\n checkModule(state.settings, 'history', () => {\n delete state.request.done[api];\n delete state.request.errors[api];\n });\n }\n\n checkModule(state.settings, 'cancelation', () => {\n abortQuery(api, requestId);\n });\n checkModule(state.settings, 'listener', () => {\n state.request.active.push({ api, requestId });\n });\n })\n .addCase(request.fulfilled, (state, action) => {\n const requestId = action.meta.requestId;\n const api = action.meta.arg.api;\n\n checkModule(state.settings, 'listener', () => {\n state.request.active = state.request.active.filter(q => !(q.api === api && q.requestId === requestId));\n });\n checkModule(state.settings, 'history', () => {\n if (!state.request.done[api]) state.request.done[api] = [];\n state.request.done[api].push({ api, request: action.payload, requestId });\n });\n checkModule(state.settings, 'storage', () => {\n if (action.meta.arg.ignore) {\n return;\n }\n\n const strategyList = (action.meta.arg.listStrategy ?? state.settings.listStrategy ?? {}) as CdeebeeListStrategy<T>;\n const normalize = action.meta.arg.normalize ?? state.settings.normalize ?? defaultNormalize;\n\n const currentState = current(state) as CdeebeeState<T>;\n // Type assertion is safe here because we've already checked isRecord\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const normalizedData = normalize(currentState, action.payload.result as any, strategyList);\n\n // Normalize already handles merge/replace/skip and preserves keys not in response\n // Simply apply the result\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.storage as any) = normalizedData;\n\n // Extract and store result IDs for filtering per list\n state.request.lastResultIdList[api] = extractLastResultIdList(action.payload.result);\n });\n })\n .addCase(request.rejected, (state, action) => {\n const requestId = action.meta.requestId;\n const api = action.meta.arg.api;\n\n checkModule(state.settings, 'listener', () => {\n state.request.active = state.request.active.filter(q => !(q.api === api && q.requestId === requestId));\n });\n checkModule(state.settings, 'history', () => {\n if (!state.request.errors[api]) state.request.errors[api] = [];\n state.request.errors[api].push({ requestId: requestId, api, request: action.error });\n });\n });\n },\n });\n\n return slice;\n};\n","import { useSelector } from 'react-redux';\nimport { type CdeebeeState } from '../reducer/types';\n\n/**\n * Generic hook factory that creates a selector hook for cdeebee state.\n * This allows the hooks to work with any Redux root state structure.\n *\n * @template RootState - The shape of the Redux root state\n * @template Storage - The shape of the cdeebee storage\n * @param selectCdeebee - Function to select the cdeebee slice from root state\n * @returns An object containing all cdeebee hooks\n */\nexport function createCdeebeeHooks<RootState, Storage>(\n selectCdeebee: (state: RootState) => CdeebeeState<Storage>\n) {\n /**\n * Check if any of the specified APIs are currently loading.\n *\n * @param apiList - Array of API endpoints to check\n * @returns true if any of the APIs are currently active/loading\n *\n * @example\n * const isLoading = useLoading(['/api/forums', '/api/threads']);\n * if (isLoading) return <Spinner />;\n */\n function useLoading(apiList: string[]): boolean {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.active.some(q => apiList.includes(q.api));\n });\n }\n\n /**\n * Get the successful request history for a specific API endpoint.\n *\n * @param api - The API endpoint\n * @returns Array of successful request history entries\n *\n * @example\n * const history = useRequestHistory('/api/forums');\n * console.log(`Made ${history.length} successful requests`);\n */\n function useRequestHistory(api: string) {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.done[api] ?? [];\n });\n }\n\n /**\n * Get the error history for a specific API endpoint.\n *\n * @param api - The API endpoint\n * @returns Array of error history entries\n *\n * @example\n * const errors = useRequestErrors('/api/forums');\n * if (errors.length > 0) {\n * console.error('Last error:', errors[errors.length - 1]);\n * }\n */\n function useRequestErrors(api: string) {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.errors[api] ?? [];\n });\n }\n\n /**\n * Get a specific list from storage with full type safety.\n *\n * @param listName - The name of the list in storage\n * @returns The list data\n *\n * @example\n * const forums = useStorageList('forumList');\n * const forumArray = Object.values(forums);\n */\n function useStorageList<K extends keyof Storage>(listName: K): Storage[K] {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.storage[listName];\n });\n }\n\n /**\n * Get the entire cdeebee storage.\n *\n * @returns The complete storage object\n *\n * @example\n * const storage = useStorage();\n * console.log(Object.keys(storage)); // ['forumList', 'threadList', ...]\n */\n function useStorage(): Storage {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.storage;\n });\n }\n\n /**\n * Check if any request is currently loading (across all APIs).\n *\n * @returns true if any request is active\n *\n * @example\n * const isAnythingLoading = useIsLoading();\n * if (isAnythingLoading) return <GlobalSpinner />;\n */\n function useIsLoading(): boolean {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.active.length > 0;\n });\n }\n\n /**\n * Get the list of IDs returned by the last successful request to an API for a specific list.\n * Useful for filtering storage data to show only results from a specific request.\n *\n * @param api - The API endpoint\n * @param listName - The name of the list in storage (typed from Storage)\n * @returns Array of primary key IDs from the last response for that list\n *\n * @example\n * const productList = useStorageList('productList');\n * const lastIDList = useLastResultIdList('/api/search', 'productList');\n * const displayResults = lastIDList.map(id => productList[id]).filter(Boolean);\n */\n function useLastResultIdList<K extends keyof Storage>(api: string, listName: K): string[] {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.lastResultIdList[api]?.[listName as string] ?? [];\n });\n }\n\n return {\n useLoading,\n useRequestHistory,\n useRequestErrors,\n useStorageList,\n useStorage,\n useIsLoading,\n useLastResultIdList,\n };\n}\n","import { useSelector } from 'react-redux';\nimport { type CdeebeeState } from '../reducer/types';\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param apiList - Array of API endpoints to check\n * @returns true if any of the APIs are currently active/loading\n *\n * @example\n * const isLoading = useLoading(['/api/forums', '/api/threads']);\n */\nexport function useLoading<Storage = unknown>(apiList: string[]): boolean {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.active.some(q => apiList.includes(q.api));\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param api - The API endpoint\n * @returns Array of successful request history entries\n */\nexport function useRequestHistory<Storage = unknown>(api: string) {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.done[api] ?? [];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param api - The API endpoint\n * @returns Array of error history entries\n */\nexport function useRequestErrors<Storage = unknown>(api: string) {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.errors[api] ?? [];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param listName - The name of the list in storage\n * @returns The list data\n */\nexport function useStorageList<Storage, K extends keyof Storage>(listName: K): Storage[K] {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.storage[listName];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @returns The complete storage object\n */\nexport function useStorage<Storage>(): Storage {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.storage;\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @returns true if any request is active\n */\nexport function useIsLoading<Storage = unknown>(): boolean {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.active.length > 0;\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * Get the list of IDs returned by the last successful request to an API for a specific list.\n * Useful for filtering storage data to show only results from a specific request.\n *\n * @param api - The API endpoint\n * @param listName - The name of the list in storage (typed from Storage)\n * @returns Array of primary key IDs from the last response for that list\n *\n * @example\n * const productList = useStorageList('productList');\n * const lastIDList = useLastResultIdList('/api/search', 'productList');\n * const displayResults = lastIDList.map(id => productList[id]).filter(Boolean);\n */\nexport function useLastResultIdList<Storage, K extends keyof Storage>(api: string, listName: K): string[] {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.lastResultIdList[api]?.[listName as string] ?? [];\n });\n}\n"],"names":["checkModule","settings","module","result","isRecord","value","mergeDeepRight","left","right","rightRecord","key","leftValue","rightValue","omit","keys","obj","extractLastResultIdList","response","listName","primaryKey","idList","item","batchingUpdate","state","valueList","i","path","current","j","pathKey","index","nextIsNumeric","next","AbortControllerStore","api","requestId","controller","apiSet","excludeRequestId","requestIDList","abortStore","abortQuery","currentRequestId","abortManager","signal","cleanup","QueryQueue","task","previousPromise","queryQueue","request","createAsyncThunk","options","rejectWithValue","getState","startedAt","abort","withCallback","executeRequest","method","body","headers","extraHeaders","b","requestData","formData","fileKey","bodyKey","responseType","error","isDataWithPrimaryKey","normalizeDataWithPrimaryKey","data","applyStrategy","existingValue","newValue","strategy","defaultNormalize","cdeebee","strategyList","keyList","currentStorage","keyListToOmit","responseValue","normalizedValue","initialState","factory","storage","createSlice","action","builder","q","normalize","currentState","normalizedData","createCdeebeeHooks","selectCdeebee","useLoading","apiList","useSelector","useRequestHistory","useRequestErrors","useStorageList","useStorage","useIsLoading","useLastResultIdList","_a"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -43,7 +43,7 @@ declare interface CdeebeeRequestState {
43
43
  active: CdeebeeActiveRequest[];
44
44
  errors: Record<string, CdeebeeHistoryState[]>;
45
45
  done: Record<string, CdeebeeHistoryState[]>;
46
- lastResultIdList: Record<string, string[]>;
46
+ lastResultIdList: Record<string, Record<string, string[]>>;
47
47
  }
48
48
 
49
49
  declare interface CdeebeeSettings<T> {
@@ -87,7 +87,7 @@ export declare function createCdeebeeHooks<RootState, Storage>(selectCdeebee: (s
87
87
  useStorageList: <K extends keyof Storage>(listName: K) => Storage[K];
88
88
  useStorage: () => Storage;
89
89
  useIsLoading: () => boolean;
90
- useLastResultIdList: (api: string) => string[];
90
+ useLastResultIdList: <K extends keyof Storage>(api: string, listName: K) => string[];
91
91
  };
92
92
 
93
93
  export declare function defaultNormalize<T>(cdeebee: CdeebeeState<T>, response: IResponse, strategyList: CdeebeeListStrategy<T>): Record<string, ResponseValue>;
@@ -128,9 +128,11 @@ request: unknown;
128
128
  }[];
129
129
  };
130
130
  lastResultIdList: {
131
+ [x: string]: {
131
132
  [x: string]: string[];
132
133
  };
133
134
  };
135
+ };
134
136
  }, action: {
135
137
  payload: CdeebeeValueList<T>;
136
138
  }): void;
@@ -169,9 +171,11 @@ request: unknown;
169
171
  }[];
170
172
  };
171
173
  lastResultIdList: {
174
+ [x: string]: {
172
175
  [x: string]: string[];
173
176
  };
174
177
  };
178
+ };
175
179
  }, action: PayloadAction<string | undefined>): void;
176
180
  }, "cdeebee", "cdeebee", SliceSelectors<CdeebeeState<T>>>;
177
181
 
@@ -207,18 +211,19 @@ export declare function useIsLoading<Storage = unknown>(): boolean;
207
211
  * Standalone hook that can be used without createCdeebeeHooks.
208
212
  * Assumes the cdeebee slice is at state.cdeebee.
209
213
  *
210
- * Get the list of IDs returned by the last successful request to an API.
214
+ * Get the list of IDs returned by the last successful request to an API for a specific list.
211
215
  * Useful for filtering storage data to show only results from a specific request.
212
216
  *
213
217
  * @param api - The API endpoint
214
- * @returns Array of primary key IDs from the last response
218
+ * @param listName - The name of the list in storage (typed from Storage)
219
+ * @returns Array of primary key IDs from the last response for that list
215
220
  *
216
221
  * @example
217
222
  * const productList = useStorageList('productList');
218
- * const lastIds = useLastResultIdList('/api/search');
219
- * const displayResults = lastIds.map(id => productList[id]).filter(Boolean);
223
+ * const lastIDList = useLastResultIdList('/api/search', 'productList');
224
+ * const displayResults = lastIDList.map(id => productList[id]).filter(Boolean);
220
225
  */
221
- export declare function useLastResultIdList<Storage = unknown>(api: string): string[];
226
+ export declare function useLastResultIdList<Storage, K extends keyof Storage>(api: string, listName: K): string[];
222
227
 
223
228
  /**
224
229
  * Standalone hook that can be used without createCdeebeeHooks.
package/dist/index.js CHANGED
@@ -1,85 +1,86 @@
1
1
  import { createAsyncThunk as z, createSlice as H, current as P } from "@reduxjs/toolkit";
2
2
  import { useSelector as d } from "react-redux";
3
- function y(e, r, s) {
4
- e.modules.includes(r) && s();
3
+ function y(e, r, i) {
4
+ e.modules.includes(r) && i();
5
5
  }
6
6
  function f(e) {
7
7
  return e !== null && typeof e == "object" && !Array.isArray(e);
8
8
  }
9
- function h(e, r) {
9
+ function p(e, r) {
10
10
  if (!f(e) || !f(r))
11
11
  return r;
12
- const s = { ...e }, n = r;
12
+ const i = { ...e }, n = r;
13
13
  for (const t in n)
14
14
  if (Object.prototype.hasOwnProperty.call(n, t)) {
15
- const o = s[t], i = n[t];
16
- f(o) && f(i) && !Array.isArray(o) && !Array.isArray(i) ? s[t] = h(o, i) : s[t] = i;
15
+ const o = i[t], s = n[t];
16
+ f(o) && f(s) && !Array.isArray(o) && !Array.isArray(s) ? i[t] = p(o, s) : i[t] = s;
17
17
  }
18
- return s;
18
+ return i;
19
19
  }
20
20
  function x(e, r) {
21
- const s = { ...r };
21
+ const i = { ...r };
22
22
  for (const n of e)
23
- delete s[n];
24
- return s;
23
+ delete i[n];
24
+ return i;
25
25
  }
26
26
  function N(e) {
27
27
  if (!f(e))
28
- return [];
29
- const r = [];
30
- for (const s of Object.keys(e)) {
31
- const n = e[s];
28
+ return {};
29
+ const r = {};
30
+ for (const i of Object.keys(e)) {
31
+ const n = e[i];
32
32
  if (f(n) && Array.isArray(n.data) && typeof n.primaryKey == "string") {
33
- const t = n.primaryKey;
34
- for (const o of n.data)
35
- f(o) && t in o && r.push(String(o[t]));
33
+ const t = n.primaryKey, o = [];
34
+ for (const s of n.data)
35
+ f(s) && t in s && o.push(String(s[t]));
36
+ r[i] = o;
36
37
  }
37
38
  }
38
39
  return r;
39
40
  }
40
41
  function T(e, r) {
41
- for (let s = 0; s < r.length; s++) {
42
- const n = r[s], t = n.key, o = n.value;
42
+ for (let i = 0; i < r.length; i++) {
43
+ const n = r[i], t = n.key, o = n.value;
43
44
  if (t.length === 0)
44
45
  continue;
45
- let i = e;
46
+ let s = e;
46
47
  for (let u = 0; u < t.length - 1; u++) {
47
48
  const a = t[u];
48
- if (Array.isArray(i)) {
49
+ if (Array.isArray(s)) {
49
50
  const c = typeof a == "number" ? a : Number(a);
50
- (!(c in i) || !f(i[c])) && (i[c] = {}), i = i[c];
51
+ (!(c in s) || !f(s[c])) && (s[c] = {}), s = s[c];
51
52
  } else {
52
53
  const c = String(a);
53
- if (!(c in i)) {
54
+ if (!(c in s)) {
54
55
  const g = typeof t[u + 1] == "number" || !isNaN(Number(t[u + 1])) && String(Number(t[u + 1])) === String(t[u + 1]);
55
- i[c] = g ? [] : {};
56
+ s[c] = g ? [] : {};
56
57
  }
57
- const l = i[c];
58
- i = Array.isArray(l) || f(l) ? l : {};
58
+ const l = s[c];
59
+ s = Array.isArray(l) || f(l) ? l : {};
59
60
  }
60
61
  }
61
- Array.isArray(i) || (i[String(t[t.length - 1])] = o);
62
+ Array.isArray(s) || (s[String(t[t.length - 1])] = o);
62
63
  }
63
64
  }
64
65
  class W {
65
66
  constructor() {
66
67
  this.byRequestId = /* @__PURE__ */ new Map(), this.byApi = /* @__PURE__ */ new Map();
67
68
  }
68
- add(r, s, n) {
69
- const t = { requestId: s, controller: n, api: r };
70
- this.byRequestId.set(s, t), this.byApi.has(r) || this.byApi.set(r, /* @__PURE__ */ new Set()), this.byApi.get(r).add(s);
69
+ add(r, i, n) {
70
+ const t = { requestId: i, controller: n, api: r };
71
+ this.byRequestId.set(i, t), this.byApi.has(r) || this.byApi.set(r, /* @__PURE__ */ new Set()), this.byApi.get(r).add(i);
71
72
  }
72
73
  delete(r) {
73
- const s = this.byRequestId.get(r);
74
- if (!s) return;
74
+ const i = this.byRequestId.get(r);
75
+ if (!i) return;
75
76
  this.byRequestId.delete(r);
76
- const n = this.byApi.get(s.api);
77
- n && (n.delete(r), n.size === 0 && this.byApi.delete(s.api));
77
+ const n = this.byApi.get(i.api);
78
+ n && (n.delete(r), n.size === 0 && this.byApi.delete(i.api));
78
79
  }
79
- abortAllForApi(r, s) {
80
+ abortAllForApi(r, i) {
80
81
  const n = this.byApi.get(r);
81
82
  n && n.forEach((t) => {
82
- if (t !== s) {
83
+ if (t !== i) {
83
84
  const o = this.byRequestId.get(t);
84
85
  o && (o.controller.abort(), this.delete(t));
85
86
  }
@@ -90,15 +91,15 @@ const R = new W();
90
91
  function j(e, r) {
91
92
  R.abortAllForApi(e, r);
92
93
  }
93
- function C(e, r, s) {
94
+ function C(e, r, i) {
94
95
  const n = new AbortController(), t = () => {
95
- R.delete(s);
96
+ R.delete(i);
96
97
  };
97
98
  return e.addEventListener("abort", () => {
98
99
  n.abort(), t();
99
100
  }), {
100
101
  controller: n,
101
- init: () => R.add(r, s, n),
102
+ init: () => R.add(r, i, n),
102
103
  drop: t
103
104
  };
104
105
  }
@@ -108,8 +109,8 @@ class E {
108
109
  }
109
110
  async enqueue(r) {
110
111
  this.queueLength++;
111
- const s = this.currentPromise;
112
- return this.currentPromise = s.then(() => r(), () => r()).finally(() => {
112
+ const i = this.currentPromise;
113
+ return this.currentPromise = i.then(() => r(), () => r()).finally(() => {
113
114
  this.queueLength--;
114
115
  }), this.currentPromise;
115
116
  }
@@ -120,20 +121,20 @@ class E {
120
121
  this.queueLength = 0;
121
122
  }
122
123
  }
123
- const O = new E(), S = z(
124
+ const O = new E(), L = z(
124
125
  "cdeebee/request",
125
- async (e, { rejectWithValue: r, getState: s, requestId: n, signal: t }) => {
126
- const o = (/* @__PURE__ */ new Date()).toUTCString(), { cdeebee: { settings: i } } = s(), u = C(t, e.api, n), a = e.onResult && typeof e.onResult == "function";
127
- y(i, "cancelation", u.init);
126
+ async (e, { rejectWithValue: r, getState: i, requestId: n, signal: t }) => {
127
+ const o = (/* @__PURE__ */ new Date()).toUTCString(), { cdeebee: { settings: s } } = i(), u = C(t, e.api, n), a = e.onResult && typeof e.onResult == "function";
128
+ y(s, "cancelation", u.init);
128
129
  const c = async () => {
129
130
  try {
130
- const { method: l = "POST", body: g, headers: D = {} } = e, K = { ...typeof i.mergeWithHeaders == "function" ? i.mergeWithHeaders() : i.mergeWithHeaders ?? {}, ...D }, v = { ...typeof i.mergeWithData == "function" ? i.mergeWithData() : i.mergeWithData ?? {}, ...g ?? {} };
131
- let p = JSON.stringify(v);
131
+ const { method: l = "POST", body: g, headers: h = {} } = e, K = { ...typeof s.mergeWithHeaders == "function" ? s.mergeWithHeaders() : s.mergeWithHeaders ?? {}, ...h }, v = { ...typeof s.mergeWithData == "function" ? s.mergeWithData() : s.mergeWithData ?? {}, ...g ?? {} };
132
+ let q = JSON.stringify(v);
132
133
  if (e.files) {
133
- const q = new FormData(), k = e.fileKey || i.fileKey, w = e.bodyKey || i.bodyKey;
134
- for (let A = 0; A < e.files.length; A += 1)
135
- k && q.append(k, e.files[A]);
136
- w && q.append(w, p), p = q;
134
+ const A = new FormData(), w = e.fileKey || s.fileKey, D = e.bodyKey || s.bodyKey;
135
+ for (let S = 0; S < e.files.length; S += 1)
136
+ w && A.append(w, e.files[S]);
137
+ D && A.append(D, q), q = A;
137
138
  }
138
139
  const b = await fetch(e.api, {
139
140
  method: l,
@@ -143,43 +144,43 @@ const O = new E(), S = z(
143
144
  ...K
144
145
  },
145
146
  signal: u.controller.signal,
146
- body: p
147
+ body: q
147
148
  });
148
- y(i, "cancelation", u.drop);
149
+ y(s, "cancelation", u.drop);
149
150
  let m;
150
- const L = e.responseType || "json";
151
- return L === "text" ? m = await b.text() : L === "blob" ? m = await b.blob() : m = await b.json(), b.ok ? (a && e.onResult(m), { result: m, startedAt: o, endedAt: (/* @__PURE__ */ new Date()).toUTCString() }) : (a && e.onResult(m), r(b));
151
+ const k = e.responseType || "json";
152
+ return k === "text" ? m = await b.text() : k === "blob" ? m = await b.blob() : m = await b.json(), b.ok ? (a && e.onResult(m), { result: m, startedAt: o, endedAt: (/* @__PURE__ */ new Date()).toUTCString() }) : (a && e.onResult(m), r(b));
152
153
  } catch (l) {
153
- return y(i, "cancelation", u.drop), a && e.onResult(l), l instanceof Error && l.name === "AbortError" ? r({ message: "Request was cancelled", cancelled: !0 }) : r({ message: l instanceof Error ? l.message : "Unknown error occurred" });
154
+ return y(s, "cancelation", u.drop), a && e.onResult(l), l instanceof Error && l.name === "AbortError" ? r({ message: "Request was cancelled", cancelled: !0 }) : r({ message: l instanceof Error ? l.message : "Unknown error occurred" });
154
155
  }
155
156
  };
156
- return i.modules.includes("queryQueue") ? O.enqueue(c) : c();
157
+ return s.modules.includes("queryQueue") ? O.enqueue(c) : c();
157
158
  }
158
159
  );
159
160
  function Q(e) {
160
161
  return f(e) && Array.isArray(e.data) && typeof e.primaryKey == "string";
161
162
  }
162
163
  function U(e, r) {
163
- const s = {};
164
+ const i = {};
164
165
  for (const n of e)
165
166
  if (f(n) && r in n) {
166
167
  const t = String(n[r]);
167
- s[t] = n;
168
+ i[t] = n;
168
169
  }
169
- return s;
170
+ return i;
170
171
  }
171
- function I(e, r, s, n) {
172
- return s === "replace" ? r : s === "merge" ? h(e, r) : s === "skip" ? e : (console.warn(`Cdeebee: Unknown strategy "${s}" for key "${n}". Skipping normalization.`), h(e, r));
172
+ function I(e, r, i, n) {
173
+ return i === "replace" ? r : i === "merge" ? p(e, r) : i === "skip" ? e : (console.warn(`Cdeebee: Unknown strategy "${i}" for key "${n}". Skipping normalization.`), p(e, r));
173
174
  }
174
- function M(e, r, s) {
175
- const n = Object.keys(r), t = f(e.storage) ? e.storage : {}, o = { ...t }, i = /* @__PURE__ */ new Set();
175
+ function M(e, r, i) {
176
+ const n = Object.keys(r), t = f(e.storage) ? e.storage : {}, o = { ...t }, s = /* @__PURE__ */ new Set();
176
177
  for (const u of n) {
177
178
  const a = r[u];
178
179
  if (a == null || typeof a == "string") {
179
- i.add(u);
180
+ s.add(u);
180
181
  continue;
181
182
  }
182
- const c = s[u] ?? "merge";
183
+ const c = i[u] ?? "merge";
183
184
  if (c === "skip" && !(u in t))
184
185
  continue;
185
186
  const l = u in t ? t[u] : {};
@@ -190,7 +191,7 @@ function M(e, r, s) {
190
191
  }
191
192
  f(a) ? o[u] = I(l, a, c, u) : o[u] = a;
192
193
  }
193
- return i.size > 0 ? x(Array.from(i), o) : o;
194
+ return s.size > 0 ? x(Array.from(s), o) : o;
194
195
  }
195
196
  const F = {
196
197
  settings: {
@@ -210,7 +211,7 @@ const F = {
210
211
  }
211
212
  }, X = (e, r) => H({
212
213
  name: "cdeebee",
213
- initialState: h(F, { settings: e, storage: r ?? {} }),
214
+ initialState: p(F, { settings: e, storage: r ?? {} }),
214
215
  reducers: {
215
216
  set(n, t) {
216
217
  T(n.storage, t.payload);
@@ -221,33 +222,33 @@ const F = {
221
222
  }
222
223
  },
223
224
  extraReducers: (n) => {
224
- n.addCase(S.pending, (t, o) => {
225
- const i = o.meta.arg.api, u = o.meta.requestId;
225
+ n.addCase(L.pending, (t, o) => {
226
+ const s = o.meta.arg.api, u = o.meta.requestId;
226
227
  o.meta.arg.historyClear && y(t.settings, "history", () => {
227
- delete t.request.done[i], delete t.request.errors[i];
228
+ delete t.request.done[s], delete t.request.errors[s];
228
229
  }), y(t.settings, "cancelation", () => {
229
- j(i, u);
230
+ j(s, u);
230
231
  }), y(t.settings, "listener", () => {
231
- t.request.active.push({ api: i, requestId: u });
232
+ t.request.active.push({ api: s, requestId: u });
232
233
  });
233
- }).addCase(S.fulfilled, (t, o) => {
234
- const i = o.meta.requestId, u = o.meta.arg.api;
234
+ }).addCase(L.fulfilled, (t, o) => {
235
+ const s = o.meta.requestId, u = o.meta.arg.api;
235
236
  y(t.settings, "listener", () => {
236
- t.request.active = t.request.active.filter((a) => !(a.api === u && a.requestId === i));
237
+ t.request.active = t.request.active.filter((a) => !(a.api === u && a.requestId === s));
237
238
  }), y(t.settings, "history", () => {
238
- t.request.done[u] || (t.request.done[u] = []), t.request.done[u].push({ api: u, request: o.payload, requestId: i });
239
+ t.request.done[u] || (t.request.done[u] = []), t.request.done[u].push({ api: u, request: o.payload, requestId: s });
239
240
  }), y(t.settings, "storage", () => {
240
241
  if (o.meta.arg.ignore)
241
242
  return;
242
243
  const a = o.meta.arg.listStrategy ?? t.settings.listStrategy ?? {}, c = o.meta.arg.normalize ?? t.settings.normalize ?? M, l = P(t), g = c(l, o.payload.result, a);
243
244
  t.storage = g, t.request.lastResultIdList[u] = N(o.payload.result);
244
245
  });
245
- }).addCase(S.rejected, (t, o) => {
246
- const i = o.meta.requestId, u = o.meta.arg.api;
246
+ }).addCase(L.rejected, (t, o) => {
247
+ const s = o.meta.requestId, u = o.meta.arg.api;
247
248
  y(t.settings, "listener", () => {
248
- t.request.active = t.request.active.filter((a) => !(a.api === u && a.requestId === i));
249
+ t.request.active = t.request.active.filter((a) => !(a.api === u && a.requestId === s));
249
250
  }), y(t.settings, "history", () => {
250
- t.request.errors[u] || (t.request.errors[u] = []), t.request.errors[u].push({ requestId: i, api: u, request: o.error });
251
+ t.request.errors[u] || (t.request.errors[u] = []), t.request.errors[u].push({ requestId: s, api: u, request: o.error });
251
252
  });
252
253
  });
253
254
  }
@@ -256,7 +257,7 @@ function Y(e) {
256
257
  function r(a) {
257
258
  return d((c) => e(c).request.active.some((g) => a.includes(g.api)));
258
259
  }
259
- function s(a) {
260
+ function i(a) {
260
261
  return d((c) => e(c).request.done[a] ?? []);
261
262
  }
262
263
  function n(a) {
@@ -268,24 +269,27 @@ function Y(e) {
268
269
  function o() {
269
270
  return d((a) => e(a).storage);
270
271
  }
271
- function i() {
272
+ function s() {
272
273
  return d((a) => e(a).request.active.length > 0);
273
274
  }
274
- function u(a) {
275
- return d((c) => e(c).request.lastResultIdList[a] ?? []);
275
+ function u(a, c) {
276
+ return d((l) => {
277
+ var h;
278
+ return ((h = e(l).request.lastResultIdList[a]) == null ? void 0 : h[c]) ?? [];
279
+ });
276
280
  }
277
281
  return {
278
282
  useLoading: r,
279
- useRequestHistory: s,
283
+ useRequestHistory: i,
280
284
  useRequestErrors: n,
281
285
  useStorageList: t,
282
286
  useStorage: o,
283
- useIsLoading: i,
287
+ useIsLoading: s,
284
288
  useLastResultIdList: u
285
289
  };
286
290
  }
287
291
  function Z(e) {
288
- return d((r) => r.cdeebee.request.active.some((s) => e.includes(s.api)));
292
+ return d((r) => r.cdeebee.request.active.some((i) => e.includes(i.api)));
289
293
  }
290
294
  function _(e) {
291
295
  return d((r) => r.cdeebee.request.done[e] ?? []);
@@ -302,15 +306,18 @@ function te() {
302
306
  function re() {
303
307
  return d((e) => e.cdeebee.request.active.length > 0);
304
308
  }
305
- function ne(e) {
306
- return d((r) => r.cdeebee.request.lastResultIdList[e] ?? []);
309
+ function ne(e, r) {
310
+ return d((i) => {
311
+ var n;
312
+ return ((n = i.cdeebee.request.lastResultIdList[e]) == null ? void 0 : n[r]) ?? [];
313
+ });
307
314
  }
308
315
  export {
309
316
  T as batchingUpdate,
310
317
  Y as createCdeebeeHooks,
311
318
  M as defaultNormalize,
312
319
  X as factory,
313
- S as request,
320
+ L as request,
314
321
  re as useIsLoading,
315
322
  ne as useLastResultIdList,
316
323
  Z as useLoading,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../lib/reducer/helpers.ts","../lib/reducer/abortController.ts","../lib/reducer/queryQueue.ts","../lib/reducer/request.ts","../lib/reducer/storage.ts","../lib/reducer/index.ts","../lib/hooks/createCdeebeeHooks.ts","../lib/hooks/selectors.ts"],"sourcesContent":["import { type WritableDraft } from '@reduxjs/toolkit';\nimport { type CdeebeeSettings, type CdeebeeModule, CdeebeeValueList } from './types';\n\nexport function checkModule(settings: CdeebeeSettings<unknown> | WritableDraft<CdeebeeSettings<unknown>>, module: CdeebeeModule, result: () => void) {\n if (settings.modules.includes(module)) {\n result();\n }\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function mergeDeepRight<T>(\n left: T,\n right: Partial<T> | Record<string, unknown>\n): T {\n if (!isRecord(left) || !isRecord(right)) {\n return right as T;\n }\n\n const result = { ...left } as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n\n for (const key in rightRecord) {\n if (Object.prototype.hasOwnProperty.call(rightRecord, key)) {\n const leftValue = result[key];\n const rightValue = rightRecord[key];\n\n if (\n isRecord(leftValue) &&\n isRecord(rightValue) &&\n !Array.isArray(leftValue) &&\n !Array.isArray(rightValue)\n ) {\n result[key] = mergeDeepRight(leftValue, rightValue);\n } else {\n result[key] = rightValue;\n }\n }\n }\n\n return result as T;\n}\n\nexport function omit<T extends Record<string, unknown>>(keys: string[], obj: T): Omit<T, keyof T> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, keyof T>;\n}\n\n/**\n * Extract primary key values from API response data.\n * Handles responses with format: { listName: { data: [...], primaryKey: 'id' } }\n * Returns a flat array of all extracted IDs from all lists.\n */\nexport function extractResultIdList(response: unknown): string[] {\n if (!isRecord(response)) {\n return [];\n }\n\n const ids: string[] = [];\n\n for (const key of Object.keys(response)) {\n const value = response[key];\n\n if (\n isRecord(value) &&\n Array.isArray(value.data) &&\n typeof value.primaryKey === 'string'\n ) {\n const primaryKey = value.primaryKey;\n for (const item of value.data) {\n if (isRecord(item) && primaryKey in item) {\n ids.push(String(item[primaryKey]));\n }\n }\n }\n }\n\n return ids;\n}\n\nexport function batchingUpdate<T extends Record<string, unknown>>(\n state: T,\n valueList: CdeebeeValueList<T>\n): void {\n for (let i = 0; i < valueList.length; i++) {\n const item = valueList[i] as { key: readonly (string | number)[]; value: unknown };\n const path = item.key;\n const value = item.value;\n\n if (path.length === 0) {\n continue;\n }\n\n let current: Record<string, unknown> | unknown[] = state as Record<string, unknown>;\n\n for (let j = 0; j < path.length - 1; j++) {\n const pathKey = path[j];\n\n if (Array.isArray(current)) {\n const index = typeof pathKey === 'number' ? pathKey : Number(pathKey);\n if (!(index in current) || !isRecord(current[index])) {\n current[index] = {};\n }\n current = current[index] as Record<string, unknown>;\n } else {\n const key = String(pathKey);\n if (!(key in current)) {\n const nextIsNumeric = typeof path[j + 1] === 'number' || (!isNaN(Number(path[j + 1])) && String(Number(path[j + 1])) === String(path[j + 1]));\n current[key] = nextIsNumeric ? [] : {};\n }\n const next = current[key];\n current = (Array.isArray(next) ? next : (isRecord(next) ? next : {})) as Record<string, unknown> | unknown[];\n }\n }\n\n if (Array.isArray(current)) {\n continue; // Can't update array element directly\n }\n current[String(path[path.length - 1])] = value;\n }\n}\n","interface RequestController {\n requestId: string;\n controller: AbortController;\n api: string;\n}\n\nclass AbortControllerStore {\n private byRequestId = new Map<string, RequestController>();\n private byApi = new Map<string, Set<string>>();\n\n add(api: string, requestId: string, controller: AbortController): void {\n const item: RequestController = { requestId, controller, api };\n this.byRequestId.set(requestId, item);\n\n if (!this.byApi.has(api)) {\n this.byApi.set(api, new Set());\n }\n this.byApi.get(api)!.add(requestId);\n }\n\n delete(requestId: string): void {\n const item = this.byRequestId.get(requestId);\n if (!item) return;\n\n this.byRequestId.delete(requestId);\n const apiSet = this.byApi.get(item.api);\n if (apiSet) {\n apiSet.delete(requestId);\n if (apiSet.size === 0) {\n this.byApi.delete(item.api);\n }\n }\n }\n\n abortAllForApi(api: string, excludeRequestId: string): void {\n const requestIds = this.byApi.get(api);\n if (!requestIds) return;\n\n requestIds.forEach(requestId => {\n if (requestId !== excludeRequestId) {\n const item = this.byRequestId.get(requestId);\n if (item) {\n item.controller.abort();\n this.delete(requestId);\n }\n }\n });\n }\n}\n\nconst abortStore = new AbortControllerStore();\n\nexport function abortQuery(api: string, currentRequestId: string): void {\n abortStore.abortAllForApi(api, currentRequestId);\n}\n\nexport function abortManager(signal: AbortSignal, api: string, requestId: string) {\n const controller = new AbortController();\n\n const cleanup = () => {\n abortStore.delete(requestId);\n };\n\n signal.addEventListener('abort', () => {\n controller.abort();\n cleanup();\n });\n\n return {\n controller,\n init: () => abortStore.add(api, requestId, controller),\n drop: cleanup,\n };\n}\n","class QueryQueue {\n private currentPromise: Promise<unknown> = Promise.resolve();\n private queueLength = 0;\n\n async enqueue<T>(task: () => Promise<T>): Promise<T> {\n this.queueLength++;\n\n const previousPromise = this.currentPromise;\n\n this.currentPromise = previousPromise\n .then(() => task(), () => task())\n .finally(() => {\n this.queueLength--;\n });\n\n return this.currentPromise as Promise<T>;\n }\n\n getQueueLength(): number {\n return this.queueLength;\n }\n\n clear(): void {\n this.queueLength = 0;\n }\n}\n\nexport const queryQueue = new QueryQueue();\n\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { checkModule } from './helpers';\nimport { abortManager } from './abortController';\nimport { queryQueue } from './queryQueue';\nimport { type CdeebeeState, type CdeebeeRequestOptions } from './types';\n\nexport const request = createAsyncThunk(\n 'cdeebee/request',\n async (options: CdeebeeRequestOptions<unknown>, { rejectWithValue, getState, requestId, signal }) => {\n const startedAt = new Date().toUTCString();\n const { cdeebee: { settings } } = getState() as { cdeebee: CdeebeeState<unknown> };\n\n const abort = abortManager(signal, options.api, requestId);\n const withCallback = options.onResult && typeof options.onResult === 'function';\n\n checkModule(settings, 'cancelation', abort.init);\n\n const executeRequest = async () => {\n try {\n const { method = 'POST', body, headers = {} } = options;\n const baseHeaders = typeof settings.mergeWithHeaders === 'function'\n ? settings.mergeWithHeaders()\n : (settings.mergeWithHeaders ?? {});\n\n const extraHeaders: Record<string, string> = { ...baseHeaders, ...headers };\n\n const baseData = typeof settings.mergeWithData === 'function'\n ? settings.mergeWithData()\n : (settings.mergeWithData ?? {});\n\n const b = { ...baseData, ...(body ?? {}) };\n let requestData: FormData | string = JSON.stringify(b);\n\n // handling files\n if (options.files) {\n const formData = new FormData();\n const fileKey = options.fileKey || settings.fileKey;\n const bodyKey = options.bodyKey || settings.bodyKey;\n\n for (let i = 0; i < options.files.length; i += 1) {\n if (fileKey) {\n formData.append(fileKey, options.files[i]);\n }\n }\n\n if (bodyKey) {\n formData.append(bodyKey, requestData);\n }\n requestData = formData;\n }\n // [end] handling files\n\n const response = await fetch(options.api, {\n method,\n headers: {\n 'ui-request-id': requestId,\n 'Content-Type': 'application/json',\n ...extraHeaders,\n },\n signal: abort.controller.signal,\n body: requestData,\n });\n\n checkModule(settings, 'cancelation', abort.drop);\n\n let result: unknown;\n const responseType = options.responseType || 'json';\n\n if (responseType === 'text') {\n result = await response.text();\n } else if (responseType === 'blob') {\n result = await response.blob();\n } else {\n // default: json\n result = await response.json();\n }\n\n if (!response.ok) {\n if (withCallback) options.onResult!(result);\n return rejectWithValue(response);\n }\n\n if (withCallback) options.onResult!(result);\n return { result, startedAt, endedAt: new Date().toUTCString() };\n } catch (error) {\n checkModule(settings, 'cancelation', abort.drop);\n\n if (withCallback) options.onResult!(error);\n\n if (error instanceof Error && error.name === 'AbortError') {\n return rejectWithValue({ message: 'Request was cancelled', cancelled: true });\n }\n\n return rejectWithValue({ message: error instanceof Error ? error.message : 'Unknown error occurred' });\n }\n };\n\n if (settings.modules.includes('queryQueue')) {\n return queryQueue.enqueue(executeRequest);\n }\n\n return executeRequest();\n },\n);\n\n","import { type CdeebeeListStrategy, type CdeebeeState } from './types';\nimport { isRecord, mergeDeepRight, omit } from './helpers';\n\ntype ResponseValue = Record<string, unknown>;\n\ntype IResponse = Record<string, ResponseValue>;\n\ntype StorageData = Record<string, unknown>;\n\nfunction isDataWithPrimaryKey(value: unknown): value is { data: unknown[]; primaryKey: string } {\n return (\n isRecord(value) &&\n Array.isArray(value.data) &&\n typeof value.primaryKey === 'string'\n );\n}\nfunction normalizeDataWithPrimaryKey(data: unknown[], primaryKey: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n \n for (const item of data) {\n if (isRecord(item) && primaryKey in item) {\n const key = String(item[primaryKey]);\n result[key] = item;\n }\n }\n \n return result;\n}\n\nfunction applyStrategy(\n existingValue: StorageData,\n newValue: StorageData | ResponseValue,\n strategy: string,\n key: string\n): ResponseValue {\n if (strategy === 'replace') {\n return newValue as ResponseValue;\n } else if (strategy === 'merge') {\n return mergeDeepRight(existingValue, newValue as StorageData) as ResponseValue;\n } else if (strategy === 'skip') {\n return existingValue as ResponseValue;\n } else {\n console.warn(`Cdeebee: Unknown strategy \"${strategy}\" for key \"${key}\". Skipping normalization.`);\n return mergeDeepRight(existingValue, newValue as StorageData) as ResponseValue;\n }\n}\n\nexport function defaultNormalize<T>(\n cdeebee: CdeebeeState<T>,\n response: IResponse,\n strategyList: CdeebeeListStrategy<T> \n): Record<string, ResponseValue> {\n const keyList = Object.keys(response);\n const currentStorage = isRecord(cdeebee.storage) ? (cdeebee.storage as Record<string, unknown>) : {};\n \n const result = { ...currentStorage } as Record<string, ResponseValue>;\n const keyListToOmit = new Set<string>();\n\n for (const key of keyList) {\n const responseValue = response[key];\n\n if (responseValue === null || responseValue === undefined || typeof responseValue === 'string') {\n keyListToOmit.add(key);\n continue;\n }\n\n const strategy = strategyList[key as keyof T] ?? 'merge';\n \n // For 'skip' strategy, if key doesn't exist in storage, skip it entirely\n if (strategy === 'skip' && !(key in currentStorage)) {\n continue;\n }\n \n const existingValue = key in currentStorage ? (currentStorage[key] as StorageData) : {};\n\n if (isDataWithPrimaryKey(responseValue)) {\n const normalizedValue = normalizeDataWithPrimaryKey(responseValue.data, responseValue.primaryKey);\n result[key] = applyStrategy(existingValue, normalizedValue, strategy, key);\n continue;\n }\n\n if (isRecord(responseValue)) {\n result[key] = applyStrategy(existingValue, responseValue as StorageData, strategy, key);\n } else {\n result[key] = responseValue;\n }\n }\n\n return keyListToOmit.size > 0 ? omit(Array.from(keyListToOmit), result) : result;\n}\n","import { createSlice, current, type PayloadAction } from '@reduxjs/toolkit';\n\nimport { type CdeebeeSettings, type CdeebeeState, type CdeebeeValueList, type CdeebeeListStrategy } from './types';\nimport { checkModule, mergeDeepRight, batchingUpdate, extractResultIdList } from './helpers';\nimport { abortQuery } from './abortController';\nimport { request } from './request';\nimport { defaultNormalize } from './storage';\n\nconst initialState: CdeebeeState<unknown> = {\n settings: {\n modules: ['history', 'listener', 'storage', 'cancelation'],\n fileKey: 'file',\n bodyKey: 'value',\n listStrategy: {},\n mergeWithData: {},\n mergeWithHeaders: {},\n },\n storage: {},\n request: {\n active: [],\n errors: {},\n done: {},\n lastResultIdList: {},\n },\n};\n\nexport const factory = <T>(settings: CdeebeeSettings<T>, storage?: T) => {\n const slice = createSlice({\n name: 'cdeebee',\n initialState: mergeDeepRight(initialState, { settings, storage: storage ?? {} }) as CdeebeeState<T>,\n reducers: {\n set(state, action: { payload: CdeebeeValueList<T> }) {\n // Directly mutate state.storage using Immer Draft\n // This is more performant than creating a new object\n // Immer will track changes and create minimal updates\n batchingUpdate(state.storage as Record<string, unknown>, action.payload);\n },\n historyClear(state, action: PayloadAction<string | undefined>) {\n const api = action.payload;\n\n if (api) {\n delete state.request.done[api];\n delete state.request.errors[api];\n } else {\n state.request.done = {};\n state.request.errors = {};\n }\n }\n },\n extraReducers: builder => {\n builder\n .addCase(request.pending, (state, action) => {\n const api = action.meta.arg.api;\n const requestId = action.meta.requestId;\n\n if (action.meta.arg.historyClear) {\n checkModule(state.settings, 'history', () => {\n delete state.request.done[api];\n delete state.request.errors[api];\n });\n }\n\n checkModule(state.settings, 'cancelation', () => {\n abortQuery(api, requestId);\n });\n checkModule(state.settings, 'listener', () => {\n state.request.active.push({ api, requestId });\n });\n })\n .addCase(request.fulfilled, (state, action) => {\n const requestId = action.meta.requestId;\n const api = action.meta.arg.api;\n\n checkModule(state.settings, 'listener', () => {\n state.request.active = state.request.active.filter(q => !(q.api === api && q.requestId === requestId));\n });\n checkModule(state.settings, 'history', () => {\n if (!state.request.done[api]) state.request.done[api] = [];\n state.request.done[api].push({ api, request: action.payload, requestId });\n });\n checkModule(state.settings, 'storage', () => {\n if (action.meta.arg.ignore) {\n return;\n }\n\n const strategyList = (action.meta.arg.listStrategy ?? state.settings.listStrategy ?? {}) as CdeebeeListStrategy<T>;\n const normalize = action.meta.arg.normalize ?? state.settings.normalize ?? defaultNormalize;\n\n const currentState = current(state) as CdeebeeState<T>;\n // Type assertion is safe here because we've already checked isRecord\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const normalizedData = normalize(currentState, action.payload.result as any, strategyList);\n\n // Normalize already handles merge/replace/skip and preserves keys not in response\n // Simply apply the result\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.storage as any) = normalizedData;\n\n // Extract and store result IDs for filtering\n state.request.lastResultIdList[api] = extractResultIdList(action.payload.result);\n });\n })\n .addCase(request.rejected, (state, action) => {\n const requestId = action.meta.requestId;\n const api = action.meta.arg.api;\n\n checkModule(state.settings, 'listener', () => {\n state.request.active = state.request.active.filter(q => !(q.api === api && q.requestId === requestId));\n });\n checkModule(state.settings, 'history', () => {\n if (!state.request.errors[api]) state.request.errors[api] = [];\n state.request.errors[api].push({ requestId: requestId, api, request: action.error });\n });\n });\n },\n });\n\n return slice;\n};\n","import { useSelector } from 'react-redux';\nimport { type CdeebeeState } from '../reducer/types';\n\n/**\n * Generic hook factory that creates a selector hook for cdeebee state.\n * This allows the hooks to work with any Redux root state structure.\n *\n * @template RootState - The shape of the Redux root state\n * @template Storage - The shape of the cdeebee storage\n * @param selectCdeebee - Function to select the cdeebee slice from root state\n * @returns An object containing all cdeebee hooks\n */\nexport function createCdeebeeHooks<RootState, Storage>(\n selectCdeebee: (state: RootState) => CdeebeeState<Storage>\n) {\n /**\n * Check if any of the specified APIs are currently loading.\n *\n * @param apiList - Array of API endpoints to check\n * @returns true if any of the APIs are currently active/loading\n *\n * @example\n * const isLoading = useLoading(['/api/forums', '/api/threads']);\n * if (isLoading) return <Spinner />;\n */\n function useLoading(apiList: string[]): boolean {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.active.some(q => apiList.includes(q.api));\n });\n }\n\n /**\n * Get the successful request history for a specific API endpoint.\n *\n * @param api - The API endpoint\n * @returns Array of successful request history entries\n *\n * @example\n * const history = useRequestHistory('/api/forums');\n * console.log(`Made ${history.length} successful requests`);\n */\n function useRequestHistory(api: string) {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.done[api] ?? [];\n });\n }\n\n /**\n * Get the error history for a specific API endpoint.\n *\n * @param api - The API endpoint\n * @returns Array of error history entries\n *\n * @example\n * const errors = useRequestErrors('/api/forums');\n * if (errors.length > 0) {\n * console.error('Last error:', errors[errors.length - 1]);\n * }\n */\n function useRequestErrors(api: string) {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.errors[api] ?? [];\n });\n }\n\n /**\n * Get a specific list from storage with full type safety.\n *\n * @param listName - The name of the list in storage\n * @returns The list data\n *\n * @example\n * const forums = useStorageList('forumList');\n * const forumArray = Object.values(forums);\n */\n function useStorageList<K extends keyof Storage>(listName: K): Storage[K] {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.storage[listName];\n });\n }\n\n /**\n * Get the entire cdeebee storage.\n *\n * @returns The complete storage object\n *\n * @example\n * const storage = useStorage();\n * console.log(Object.keys(storage)); // ['forumList', 'threadList', ...]\n */\n function useStorage(): Storage {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.storage;\n });\n }\n\n /**\n * Check if any request is currently loading (across all APIs).\n *\n * @returns true if any request is active\n *\n * @example\n * const isAnythingLoading = useIsLoading();\n * if (isAnythingLoading) return <GlobalSpinner />;\n */\n function useIsLoading(): boolean {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.active.length > 0;\n });\n }\n\n /**\n * Get the list of IDs returned by the last successful request to an API.\n * Useful for filtering storage data to show only results from a specific request.\n *\n * @param api - The API endpoint\n * @returns Array of primary key IDs from the last response\n *\n * @example\n * const productList = useStorageList('productList');\n * const lastIds = useLastResultIdList('/api/search');\n * const displayResults = lastIds.map(id => productList[id]).filter(Boolean);\n */\n function useLastResultIdList(api: string): string[] {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.lastResultIdList[api] ?? [];\n });\n }\n\n return {\n useLoading,\n useRequestHistory,\n useRequestErrors,\n useStorageList,\n useStorage,\n useIsLoading,\n useLastResultIdList,\n };\n}\n","import { useSelector } from 'react-redux';\nimport { type CdeebeeState } from '../reducer/types';\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param apiList - Array of API endpoints to check\n * @returns true if any of the APIs are currently active/loading\n *\n * @example\n * const isLoading = useLoading(['/api/forums', '/api/threads']);\n */\nexport function useLoading<Storage = unknown>(apiList: string[]): boolean {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.active.some(q => apiList.includes(q.api));\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param api - The API endpoint\n * @returns Array of successful request history entries\n */\nexport function useRequestHistory<Storage = unknown>(api: string) {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.done[api] ?? [];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param api - The API endpoint\n * @returns Array of error history entries\n */\nexport function useRequestErrors<Storage = unknown>(api: string) {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.errors[api] ?? [];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param listName - The name of the list in storage\n * @returns The list data\n */\nexport function useStorageList<Storage, K extends keyof Storage>(listName: K): Storage[K] {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.storage[listName];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @returns The complete storage object\n */\nexport function useStorage<Storage>(): Storage {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.storage;\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @returns true if any request is active\n */\nexport function useIsLoading<Storage = unknown>(): boolean {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.active.length > 0;\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * Get the list of IDs returned by the last successful request to an API.\n * Useful for filtering storage data to show only results from a specific request.\n *\n * @param api - The API endpoint\n * @returns Array of primary key IDs from the last response\n *\n * @example\n * const productList = useStorageList('productList');\n * const lastIds = useLastResultIdList('/api/search');\n * const displayResults = lastIds.map(id => productList[id]).filter(Boolean);\n */\nexport function useLastResultIdList<Storage = unknown>(api: string): string[] {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.lastResultIdList[api] ?? [];\n });\n}\n"],"names":["checkModule","settings","module","result","isRecord","value","mergeDeepRight","left","right","rightRecord","key","leftValue","rightValue","omit","keys","obj","extractResultIdList","response","ids","primaryKey","item","batchingUpdate","state","valueList","i","path","current","j","pathKey","index","nextIsNumeric","next","AbortControllerStore","api","requestId","controller","apiSet","excludeRequestId","requestIds","abortStore","abortQuery","currentRequestId","abortManager","signal","cleanup","QueryQueue","task","previousPromise","queryQueue","request","createAsyncThunk","options","rejectWithValue","getState","startedAt","abort","withCallback","executeRequest","method","body","headers","extraHeaders","b","requestData","formData","fileKey","bodyKey","responseType","error","isDataWithPrimaryKey","normalizeDataWithPrimaryKey","data","applyStrategy","existingValue","newValue","strategy","defaultNormalize","cdeebee","strategyList","keyList","currentStorage","keyListToOmit","responseValue","normalizedValue","initialState","factory","storage","createSlice","action","builder","q","normalize","currentState","normalizedData","createCdeebeeHooks","selectCdeebee","useLoading","apiList","useSelector","useRequestHistory","useRequestErrors","useStorageList","listName","useStorage","useIsLoading","useLastResultIdList"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../lib/reducer/helpers.ts","../lib/reducer/abortController.ts","../lib/reducer/queryQueue.ts","../lib/reducer/request.ts","../lib/reducer/storage.ts","../lib/reducer/index.ts","../lib/hooks/createCdeebeeHooks.ts","../lib/hooks/selectors.ts"],"sourcesContent":["import { type WritableDraft } from '@reduxjs/toolkit';\nimport { type CdeebeeSettings, type CdeebeeModule, CdeebeeValueList } from './types';\n\nexport function checkModule(settings: CdeebeeSettings<unknown> | WritableDraft<CdeebeeSettings<unknown>>, module: CdeebeeModule, result: () => void) {\n if (settings.modules.includes(module)) {\n result();\n }\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function mergeDeepRight<T>(\n left: T,\n right: Partial<T> | Record<string, unknown>\n): T {\n if (!isRecord(left) || !isRecord(right)) {\n return right as T;\n }\n\n const result = { ...left } as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n\n for (const key in rightRecord) {\n if (Object.prototype.hasOwnProperty.call(rightRecord, key)) {\n const leftValue = result[key];\n const rightValue = rightRecord[key];\n\n if (\n isRecord(leftValue) &&\n isRecord(rightValue) &&\n !Array.isArray(leftValue) &&\n !Array.isArray(rightValue)\n ) {\n result[key] = mergeDeepRight(leftValue, rightValue);\n } else {\n result[key] = rightValue;\n }\n }\n }\n\n return result as T;\n}\n\nexport function omit<T extends Record<string, unknown>>(keys: string[], obj: T): Omit<T, keyof T> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, keyof T>;\n}\n\n/**\n * Extract primary key values from API response data per list.\n * Handles responses with format: { listName: { data: [...], primaryKey: 'id' } }\n * Returns a map of listName -> array of IDs.\n */\nexport function extractLastResultIdList(response: unknown): Record<string, string[]> {\n if (!isRecord(response)) {\n return {};\n }\n\n const result: Record<string, string[]> = {};\n\n for (const listName of Object.keys(response)) {\n const value = response[listName];\n\n if (\n isRecord(value) &&\n Array.isArray(value.data) &&\n typeof value.primaryKey === 'string'\n ) {\n const primaryKey = value.primaryKey;\n const idList: string[] = [];\n\n for (const item of value.data) {\n if (isRecord(item) && primaryKey in item) {\n idList.push(String(item[primaryKey]));\n }\n }\n\n result[listName] = idList;\n }\n }\n\n return result;\n}\n\nexport function batchingUpdate<T extends Record<string, unknown>>(\n state: T,\n valueList: CdeebeeValueList<T>\n): void {\n for (let i = 0; i < valueList.length; i++) {\n const item = valueList[i] as { key: readonly (string | number)[]; value: unknown };\n const path = item.key;\n const value = item.value;\n\n if (path.length === 0) {\n continue;\n }\n\n let current: Record<string, unknown> | unknown[] = state as Record<string, unknown>;\n\n for (let j = 0; j < path.length - 1; j++) {\n const pathKey = path[j];\n\n if (Array.isArray(current)) {\n const index = typeof pathKey === 'number' ? pathKey : Number(pathKey);\n if (!(index in current) || !isRecord(current[index])) {\n current[index] = {};\n }\n current = current[index] as Record<string, unknown>;\n } else {\n const key = String(pathKey);\n if (!(key in current)) {\n const nextIsNumeric = typeof path[j + 1] === 'number' || (!isNaN(Number(path[j + 1])) && String(Number(path[j + 1])) === String(path[j + 1]));\n current[key] = nextIsNumeric ? [] : {};\n }\n const next = current[key];\n current = (Array.isArray(next) ? next : (isRecord(next) ? next : {})) as Record<string, unknown> | unknown[];\n }\n }\n\n if (Array.isArray(current)) {\n continue; // Can't update array element directly\n }\n current[String(path[path.length - 1])] = value;\n }\n}\n","interface RequestController {\n requestId: string;\n controller: AbortController;\n api: string;\n}\n\nclass AbortControllerStore {\n private byRequestId = new Map<string, RequestController>();\n private byApi = new Map<string, Set<string>>();\n\n add(api: string, requestId: string, controller: AbortController): void {\n const item: RequestController = { requestId, controller, api };\n this.byRequestId.set(requestId, item);\n\n if (!this.byApi.has(api)) {\n this.byApi.set(api, new Set());\n }\n this.byApi.get(api)!.add(requestId);\n }\n\n delete(requestId: string): void {\n const item = this.byRequestId.get(requestId);\n if (!item) return;\n\n this.byRequestId.delete(requestId);\n const apiSet = this.byApi.get(item.api);\n if (apiSet) {\n apiSet.delete(requestId);\n if (apiSet.size === 0) {\n this.byApi.delete(item.api);\n }\n }\n }\n\n abortAllForApi(api: string, excludeRequestId: string): void {\n const requestIDList = this.byApi.get(api);\n if (!requestIDList) return;\n\n requestIDList.forEach(requestId => {\n if (requestId !== excludeRequestId) {\n const item = this.byRequestId.get(requestId);\n if (item) {\n item.controller.abort();\n this.delete(requestId);\n }\n }\n });\n }\n}\n\nconst abortStore = new AbortControllerStore();\n\nexport function abortQuery(api: string, currentRequestId: string): void {\n abortStore.abortAllForApi(api, currentRequestId);\n}\n\nexport function abortManager(signal: AbortSignal, api: string, requestId: string) {\n const controller = new AbortController();\n\n const cleanup = () => {\n abortStore.delete(requestId);\n };\n\n signal.addEventListener('abort', () => {\n controller.abort();\n cleanup();\n });\n\n return {\n controller,\n init: () => abortStore.add(api, requestId, controller),\n drop: cleanup,\n };\n}\n","class QueryQueue {\n private currentPromise: Promise<unknown> = Promise.resolve();\n private queueLength = 0;\n\n async enqueue<T>(task: () => Promise<T>): Promise<T> {\n this.queueLength++;\n\n const previousPromise = this.currentPromise;\n\n this.currentPromise = previousPromise\n .then(() => task(), () => task())\n .finally(() => {\n this.queueLength--;\n });\n\n return this.currentPromise as Promise<T>;\n }\n\n getQueueLength(): number {\n return this.queueLength;\n }\n\n clear(): void {\n this.queueLength = 0;\n }\n}\n\nexport const queryQueue = new QueryQueue();\n\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { checkModule } from './helpers';\nimport { abortManager } from './abortController';\nimport { queryQueue } from './queryQueue';\nimport { type CdeebeeState, type CdeebeeRequestOptions } from './types';\n\nexport const request = createAsyncThunk(\n 'cdeebee/request',\n async (options: CdeebeeRequestOptions<unknown>, { rejectWithValue, getState, requestId, signal }) => {\n const startedAt = new Date().toUTCString();\n const { cdeebee: { settings } } = getState() as { cdeebee: CdeebeeState<unknown> };\n\n const abort = abortManager(signal, options.api, requestId);\n const withCallback = options.onResult && typeof options.onResult === 'function';\n\n checkModule(settings, 'cancelation', abort.init);\n\n const executeRequest = async () => {\n try {\n const { method = 'POST', body, headers = {} } = options;\n const baseHeaders = typeof settings.mergeWithHeaders === 'function'\n ? settings.mergeWithHeaders()\n : (settings.mergeWithHeaders ?? {});\n\n const extraHeaders: Record<string, string> = { ...baseHeaders, ...headers };\n\n const baseData = typeof settings.mergeWithData === 'function'\n ? settings.mergeWithData()\n : (settings.mergeWithData ?? {});\n\n const b = { ...baseData, ...(body ?? {}) };\n let requestData: FormData | string = JSON.stringify(b);\n\n // handling files\n if (options.files) {\n const formData = new FormData();\n const fileKey = options.fileKey || settings.fileKey;\n const bodyKey = options.bodyKey || settings.bodyKey;\n\n for (let i = 0; i < options.files.length; i += 1) {\n if (fileKey) {\n formData.append(fileKey, options.files[i]);\n }\n }\n\n if (bodyKey) {\n formData.append(bodyKey, requestData);\n }\n requestData = formData;\n }\n // [end] handling files\n\n const response = await fetch(options.api, {\n method,\n headers: {\n 'ui-request-id': requestId,\n 'Content-Type': 'application/json',\n ...extraHeaders,\n },\n signal: abort.controller.signal,\n body: requestData,\n });\n\n checkModule(settings, 'cancelation', abort.drop);\n\n let result: unknown;\n const responseType = options.responseType || 'json';\n\n if (responseType === 'text') {\n result = await response.text();\n } else if (responseType === 'blob') {\n result = await response.blob();\n } else {\n // default: json\n result = await response.json();\n }\n\n if (!response.ok) {\n if (withCallback) options.onResult!(result);\n return rejectWithValue(response);\n }\n\n if (withCallback) options.onResult!(result);\n return { result, startedAt, endedAt: new Date().toUTCString() };\n } catch (error) {\n checkModule(settings, 'cancelation', abort.drop);\n\n if (withCallback) options.onResult!(error);\n\n if (error instanceof Error && error.name === 'AbortError') {\n return rejectWithValue({ message: 'Request was cancelled', cancelled: true });\n }\n\n return rejectWithValue({ message: error instanceof Error ? error.message : 'Unknown error occurred' });\n }\n };\n\n if (settings.modules.includes('queryQueue')) {\n return queryQueue.enqueue(executeRequest);\n }\n\n return executeRequest();\n },\n);\n\n","import { type CdeebeeListStrategy, type CdeebeeState } from './types';\nimport { isRecord, mergeDeepRight, omit } from './helpers';\n\ntype ResponseValue = Record<string, unknown>;\n\ntype IResponse = Record<string, ResponseValue>;\n\ntype StorageData = Record<string, unknown>;\n\nfunction isDataWithPrimaryKey(value: unknown): value is { data: unknown[]; primaryKey: string } {\n return (\n isRecord(value) &&\n Array.isArray(value.data) &&\n typeof value.primaryKey === 'string'\n );\n}\nfunction normalizeDataWithPrimaryKey(data: unknown[], primaryKey: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const item of data) {\n if (isRecord(item) && primaryKey in item) {\n const key = String(item[primaryKey]);\n result[key] = item;\n }\n }\n\n return result;\n}\n\nfunction applyStrategy(\n existingValue: StorageData,\n newValue: StorageData | ResponseValue,\n strategy: string,\n key: string\n): ResponseValue {\n if (strategy === 'replace') {\n return newValue as ResponseValue;\n } else if (strategy === 'merge') {\n return mergeDeepRight(existingValue, newValue as StorageData) as ResponseValue;\n } else if (strategy === 'skip') {\n return existingValue as ResponseValue;\n } else {\n console.warn(`Cdeebee: Unknown strategy \"${strategy}\" for key \"${key}\". Skipping normalization.`);\n return mergeDeepRight(existingValue, newValue as StorageData) as ResponseValue;\n }\n}\n\nexport function defaultNormalize<T>(\n cdeebee: CdeebeeState<T>,\n response: IResponse,\n strategyList: CdeebeeListStrategy<T>\n): Record<string, ResponseValue> {\n const keyList = Object.keys(response);\n const currentStorage = isRecord(cdeebee.storage) ? (cdeebee.storage as Record<string, unknown>) : {};\n\n const result = { ...currentStorage } as Record<string, ResponseValue>;\n const keyListToOmit = new Set<string>();\n\n for (const key of keyList) {\n const responseValue = response[key];\n\n if (responseValue === null || responseValue === undefined || typeof responseValue === 'string') {\n keyListToOmit.add(key);\n continue;\n }\n\n const strategy = strategyList[key as keyof T] ?? 'merge';\n\n // For 'skip' strategy, if key doesn't exist in storage, skip it entirely\n if (strategy === 'skip' && !(key in currentStorage)) {\n continue;\n }\n\n const existingValue = key in currentStorage ? (currentStorage[key] as StorageData) : {};\n\n if (isDataWithPrimaryKey(responseValue)) {\n const normalizedValue = normalizeDataWithPrimaryKey(responseValue.data, responseValue.primaryKey);\n result[key] = applyStrategy(existingValue, normalizedValue, strategy, key);\n continue;\n }\n\n if (isRecord(responseValue)) {\n result[key] = applyStrategy(existingValue, responseValue as StorageData, strategy, key);\n } else {\n result[key] = responseValue;\n }\n }\n\n return keyListToOmit.size > 0 ? omit(Array.from(keyListToOmit), result) : result;\n}\n","import { createSlice, current, type PayloadAction } from '@reduxjs/toolkit';\n\nimport { type CdeebeeSettings, type CdeebeeState, type CdeebeeValueList, type CdeebeeListStrategy } from './types';\nimport { checkModule, mergeDeepRight, batchingUpdate, extractLastResultIdList } from './helpers';\nimport { abortQuery } from './abortController';\nimport { request } from './request';\nimport { defaultNormalize } from './storage';\n\nconst initialState: CdeebeeState<unknown> = {\n settings: {\n modules: ['history', 'listener', 'storage', 'cancelation'],\n fileKey: 'file',\n bodyKey: 'value',\n listStrategy: {},\n mergeWithData: {},\n mergeWithHeaders: {},\n },\n storage: {},\n request: {\n active: [],\n errors: {},\n done: {},\n lastResultIdList: {},\n },\n};\n\nexport const factory = <T>(settings: CdeebeeSettings<T>, storage?: T) => {\n const slice = createSlice({\n name: 'cdeebee',\n initialState: mergeDeepRight(initialState, { settings, storage: storage ?? {} }) as CdeebeeState<T>,\n reducers: {\n set(state, action: { payload: CdeebeeValueList<T> }) {\n // Directly mutate state.storage using Immer Draft\n // This is more performant than creating a new object\n // Immer will track changes and create minimal updates\n batchingUpdate(state.storage as Record<string, unknown>, action.payload);\n },\n historyClear(state, action: PayloadAction<string | undefined>) {\n const api = action.payload;\n\n if (api) {\n delete state.request.done[api];\n delete state.request.errors[api];\n } else {\n state.request.done = {};\n state.request.errors = {};\n }\n }\n },\n extraReducers: builder => {\n builder\n .addCase(request.pending, (state, action) => {\n const api = action.meta.arg.api;\n const requestId = action.meta.requestId;\n\n if (action.meta.arg.historyClear) {\n checkModule(state.settings, 'history', () => {\n delete state.request.done[api];\n delete state.request.errors[api];\n });\n }\n\n checkModule(state.settings, 'cancelation', () => {\n abortQuery(api, requestId);\n });\n checkModule(state.settings, 'listener', () => {\n state.request.active.push({ api, requestId });\n });\n })\n .addCase(request.fulfilled, (state, action) => {\n const requestId = action.meta.requestId;\n const api = action.meta.arg.api;\n\n checkModule(state.settings, 'listener', () => {\n state.request.active = state.request.active.filter(q => !(q.api === api && q.requestId === requestId));\n });\n checkModule(state.settings, 'history', () => {\n if (!state.request.done[api]) state.request.done[api] = [];\n state.request.done[api].push({ api, request: action.payload, requestId });\n });\n checkModule(state.settings, 'storage', () => {\n if (action.meta.arg.ignore) {\n return;\n }\n\n const strategyList = (action.meta.arg.listStrategy ?? state.settings.listStrategy ?? {}) as CdeebeeListStrategy<T>;\n const normalize = action.meta.arg.normalize ?? state.settings.normalize ?? defaultNormalize;\n\n const currentState = current(state) as CdeebeeState<T>;\n // Type assertion is safe here because we've already checked isRecord\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const normalizedData = normalize(currentState, action.payload.result as any, strategyList);\n\n // Normalize already handles merge/replace/skip and preserves keys not in response\n // Simply apply the result\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (state.storage as any) = normalizedData;\n\n // Extract and store result IDs for filtering per list\n state.request.lastResultIdList[api] = extractLastResultIdList(action.payload.result);\n });\n })\n .addCase(request.rejected, (state, action) => {\n const requestId = action.meta.requestId;\n const api = action.meta.arg.api;\n\n checkModule(state.settings, 'listener', () => {\n state.request.active = state.request.active.filter(q => !(q.api === api && q.requestId === requestId));\n });\n checkModule(state.settings, 'history', () => {\n if (!state.request.errors[api]) state.request.errors[api] = [];\n state.request.errors[api].push({ requestId: requestId, api, request: action.error });\n });\n });\n },\n });\n\n return slice;\n};\n","import { useSelector } from 'react-redux';\nimport { type CdeebeeState } from '../reducer/types';\n\n/**\n * Generic hook factory that creates a selector hook for cdeebee state.\n * This allows the hooks to work with any Redux root state structure.\n *\n * @template RootState - The shape of the Redux root state\n * @template Storage - The shape of the cdeebee storage\n * @param selectCdeebee - Function to select the cdeebee slice from root state\n * @returns An object containing all cdeebee hooks\n */\nexport function createCdeebeeHooks<RootState, Storage>(\n selectCdeebee: (state: RootState) => CdeebeeState<Storage>\n) {\n /**\n * Check if any of the specified APIs are currently loading.\n *\n * @param apiList - Array of API endpoints to check\n * @returns true if any of the APIs are currently active/loading\n *\n * @example\n * const isLoading = useLoading(['/api/forums', '/api/threads']);\n * if (isLoading) return <Spinner />;\n */\n function useLoading(apiList: string[]): boolean {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.active.some(q => apiList.includes(q.api));\n });\n }\n\n /**\n * Get the successful request history for a specific API endpoint.\n *\n * @param api - The API endpoint\n * @returns Array of successful request history entries\n *\n * @example\n * const history = useRequestHistory('/api/forums');\n * console.log(`Made ${history.length} successful requests`);\n */\n function useRequestHistory(api: string) {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.done[api] ?? [];\n });\n }\n\n /**\n * Get the error history for a specific API endpoint.\n *\n * @param api - The API endpoint\n * @returns Array of error history entries\n *\n * @example\n * const errors = useRequestErrors('/api/forums');\n * if (errors.length > 0) {\n * console.error('Last error:', errors[errors.length - 1]);\n * }\n */\n function useRequestErrors(api: string) {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.errors[api] ?? [];\n });\n }\n\n /**\n * Get a specific list from storage with full type safety.\n *\n * @param listName - The name of the list in storage\n * @returns The list data\n *\n * @example\n * const forums = useStorageList('forumList');\n * const forumArray = Object.values(forums);\n */\n function useStorageList<K extends keyof Storage>(listName: K): Storage[K] {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.storage[listName];\n });\n }\n\n /**\n * Get the entire cdeebee storage.\n *\n * @returns The complete storage object\n *\n * @example\n * const storage = useStorage();\n * console.log(Object.keys(storage)); // ['forumList', 'threadList', ...]\n */\n function useStorage(): Storage {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.storage;\n });\n }\n\n /**\n * Check if any request is currently loading (across all APIs).\n *\n * @returns true if any request is active\n *\n * @example\n * const isAnythingLoading = useIsLoading();\n * if (isAnythingLoading) return <GlobalSpinner />;\n */\n function useIsLoading(): boolean {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.active.length > 0;\n });\n }\n\n /**\n * Get the list of IDs returned by the last successful request to an API for a specific list.\n * Useful for filtering storage data to show only results from a specific request.\n *\n * @param api - The API endpoint\n * @param listName - The name of the list in storage (typed from Storage)\n * @returns Array of primary key IDs from the last response for that list\n *\n * @example\n * const productList = useStorageList('productList');\n * const lastIDList = useLastResultIdList('/api/search', 'productList');\n * const displayResults = lastIDList.map(id => productList[id]).filter(Boolean);\n */\n function useLastResultIdList<K extends keyof Storage>(api: string, listName: K): string[] {\n return useSelector((state: RootState) => {\n const cdeebee = selectCdeebee(state);\n return cdeebee.request.lastResultIdList[api]?.[listName as string] ?? [];\n });\n }\n\n return {\n useLoading,\n useRequestHistory,\n useRequestErrors,\n useStorageList,\n useStorage,\n useIsLoading,\n useLastResultIdList,\n };\n}\n","import { useSelector } from 'react-redux';\nimport { type CdeebeeState } from '../reducer/types';\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param apiList - Array of API endpoints to check\n * @returns true if any of the APIs are currently active/loading\n *\n * @example\n * const isLoading = useLoading(['/api/forums', '/api/threads']);\n */\nexport function useLoading<Storage = unknown>(apiList: string[]): boolean {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.active.some(q => apiList.includes(q.api));\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param api - The API endpoint\n * @returns Array of successful request history entries\n */\nexport function useRequestHistory<Storage = unknown>(api: string) {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.done[api] ?? [];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param api - The API endpoint\n * @returns Array of error history entries\n */\nexport function useRequestErrors<Storage = unknown>(api: string) {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.errors[api] ?? [];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @param listName - The name of the list in storage\n * @returns The list data\n */\nexport function useStorageList<Storage, K extends keyof Storage>(listName: K): Storage[K] {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.storage[listName];\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @returns The complete storage object\n */\nexport function useStorage<Storage>(): Storage {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.storage;\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * @returns true if any request is active\n */\nexport function useIsLoading<Storage = unknown>(): boolean {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.active.length > 0;\n });\n}\n\n/**\n * Standalone hook that can be used without createCdeebeeHooks.\n * Assumes the cdeebee slice is at state.cdeebee.\n *\n * Get the list of IDs returned by the last successful request to an API for a specific list.\n * Useful for filtering storage data to show only results from a specific request.\n *\n * @param api - The API endpoint\n * @param listName - The name of the list in storage (typed from Storage)\n * @returns Array of primary key IDs from the last response for that list\n *\n * @example\n * const productList = useStorageList('productList');\n * const lastIDList = useLastResultIdList('/api/search', 'productList');\n * const displayResults = lastIDList.map(id => productList[id]).filter(Boolean);\n */\nexport function useLastResultIdList<Storage, K extends keyof Storage>(api: string, listName: K): string[] {\n return useSelector((state: { cdeebee: CdeebeeState<Storage> }) => {\n return state.cdeebee.request.lastResultIdList[api]?.[listName as string] ?? [];\n });\n}\n"],"names":["checkModule","settings","module","result","isRecord","value","mergeDeepRight","left","right","rightRecord","key","leftValue","rightValue","omit","keys","obj","extractLastResultIdList","response","listName","primaryKey","idList","item","batchingUpdate","state","valueList","path","current","j","pathKey","index","nextIsNumeric","next","AbortControllerStore","api","requestId","controller","apiSet","excludeRequestId","requestIDList","abortStore","abortQuery","currentRequestId","abortManager","signal","cleanup","QueryQueue","task","previousPromise","queryQueue","request","createAsyncThunk","options","rejectWithValue","getState","startedAt","abort","withCallback","executeRequest","method","body","headers","extraHeaders","b","requestData","formData","fileKey","bodyKey","i","responseType","error","isDataWithPrimaryKey","normalizeDataWithPrimaryKey","data","applyStrategy","existingValue","newValue","strategy","defaultNormalize","cdeebee","strategyList","keyList","currentStorage","keyListToOmit","responseValue","normalizedValue","initialState","factory","storage","createSlice","action","builder","q","normalize","currentState","normalizedData","createCdeebeeHooks","selectCdeebee","useLoading","apiList","useSelector","useRequestHistory","useRequestErrors","useStorageList","useStorage","useIsLoading","useLastResultIdList","_a"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@recats/cdeebee",
3
- "version": "3.0.0-beta.13",
3
+ "version": "3.0.0-beta.14",
4
4
  "description": "React Redux data-logic library",
5
5
  "repository": "git@github.com:recats/cdeebee.git",
6
6
  "author": "recats",