stunk 3.0.0-rc → 3.0.0-rc.2
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/dist/index.d.ts +22 -11
- package/dist/index.js +1 -1
- package/dist/{mutation-CH7ZTMUa.d.ts → mutation-Cz-E2NUk.d.ts} +22 -11
- package/dist/query/index.d.ts +2 -2
- package/dist/query/index.js +1 -1
- package/dist/use-react/index.d.ts +10 -3
- package/dist/use-react/index.js +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -276,18 +276,30 @@ interface PaginationState {
|
|
|
276
276
|
interface AsyncStateWithPagination<T, E extends Error> extends AsyncState<T, E> {
|
|
277
277
|
pagination?: PaginationState;
|
|
278
278
|
}
|
|
279
|
+
interface ParamAsyncChunk<T, E extends Error = Error, P extends Record<string, any> = {}> extends AsyncChunk<T, E> {
|
|
280
|
+
setParams: (params: Partial<Record<keyof P, P[keyof P] | null>>) => void;
|
|
281
|
+
clearParams: () => void;
|
|
282
|
+
reload: (params?: Partial<P>) => Promise<void>;
|
|
283
|
+
refresh: (params?: Partial<P>) => Promise<void>;
|
|
284
|
+
}
|
|
285
|
+
interface PaginatedParamAsyncChunk<T, E extends Error = Error, P extends Record<string, any> = {}> extends PaginatedAsyncChunk<T, E> {
|
|
286
|
+
setParams: (params: Partial<Record<keyof P, P[keyof P] | null>>) => void;
|
|
287
|
+
clearParams: () => void;
|
|
288
|
+
reload: (params?: Partial<P>) => Promise<void>;
|
|
289
|
+
refresh: (params?: Partial<P>) => Promise<void>;
|
|
290
|
+
}
|
|
279
291
|
interface FetcherResponse<T> {
|
|
280
292
|
data: T;
|
|
281
293
|
total?: number;
|
|
282
294
|
hasMore?: boolean;
|
|
283
295
|
}
|
|
284
|
-
interface AsyncChunkOptions<T, E extends Error = Error> {
|
|
296
|
+
interface AsyncChunkOptions<T, E extends Error = Error, P extends Record<string, any> = {}> {
|
|
285
297
|
/** Deduplication key — concurrent calls with the same key share one in-flight request */
|
|
286
298
|
key?: string;
|
|
287
299
|
/** Seed data shown before the first fetch completes */
|
|
288
300
|
initialData?: T | null;
|
|
289
301
|
/** Disable fetching until ready — pass a function for dynamic evaluation */
|
|
290
|
-
enabled?: boolean | (() => boolean);
|
|
302
|
+
enabled?: boolean | ((params: Partial<P>) => boolean);
|
|
291
303
|
/** Called after every successful fetch */
|
|
292
304
|
onSuccess?: (data: T) => void;
|
|
293
305
|
/** Called when all retries are exhausted */
|
|
@@ -341,15 +353,14 @@ interface PaginatedAsyncChunk<T, E extends Error = Error> extends AsyncChunk<T,
|
|
|
341
353
|
/** Reset pagination to page 1 and re-fetch */
|
|
342
354
|
resetPagination: () => Promise<void>;
|
|
343
355
|
}
|
|
344
|
-
declare function asyncChunk<T, E extends Error = Error>(fetcher: () => Promise<T | FetcherResponse<T>>, options?: AsyncChunkOptions<T, E>): AsyncChunk<T, E
|
|
345
|
-
declare function asyncChunk<T, E extends Error = Error
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
}) => Promise<T | FetcherResponse<T>>, options?: AsyncChunkOptions<T, E>):
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
};
|
|
356
|
+
declare function asyncChunk<T, E extends Error = Error>(fetcher: () => Promise<T | FetcherResponse<T>>, options?: AsyncChunkOptions<T, E>): AsyncChunk<T, E>;
|
|
357
|
+
declare function asyncChunk<T, E extends Error = Error>(fetcher: () => Promise<T | FetcherResponse<T>>, options: AsyncChunkOptions<T, E> & {
|
|
358
|
+
pagination: NonNullable<AsyncChunkOptions<T, E>['pagination']>;
|
|
359
|
+
}): PaginatedAsyncChunk<T, E>;
|
|
360
|
+
declare function asyncChunk<T, E extends Error = Error, P extends Record<string, any> = {}>(fetcher: (params: P) => Promise<T | FetcherResponse<T>>, options?: AsyncChunkOptions<T, E, P>): ParamAsyncChunk<T, E, P>;
|
|
361
|
+
declare function asyncChunk<T, E extends Error = Error, P extends Record<string, any> = {}>(fetcher: (params: P) => Promise<T | FetcherResponse<T>>, options: AsyncChunkOptions<T, E, P> & {
|
|
362
|
+
pagination: NonNullable<AsyncChunkOptions<T, E, P>['pagination']>;
|
|
363
|
+
}): PaginatedParamAsyncChunk<T, E, P>;
|
|
353
364
|
|
|
354
365
|
type InfiniteAsyncChunkOptions<T, E extends Error = Error> = Omit<AsyncChunkOptions<T[], E>, 'pagination'> & {
|
|
355
366
|
/** Items per page (default: 10) */
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var ke=Object.defineProperty;var ne=(e,r)=>{for(var t in r)ke(e,t,{get:r[t],enumerable:true});};function oe(e,r){if(e===void 0)throw new Error("Value cannot be undefined.");if(r.length===0)return e;let t=e;for(let c=0;c<r.length;c++){let o=r[c],i=typeof o=="function"?o:o.fn,p=typeof o=="function"?`index ${c}`:o.name||`index ${c}`;try{let s=i(t);if(s===void 0)break;if(s===null)throw new Error(`Middleware "${p}" returned null value.`);t=s;}catch(s){let a=s instanceof Error?s.message:String(s);throw new Error(`Middleware "${p}" threw an error: ${a}`)}}return t}function j(e,r){if(e===r)return true;if(!e||!r||typeof e!=typeof r)return false;if(Array.isArray(e)&&Array.isArray(r)){if(e.length!==r.length)return false;for(let t=0;t<e.length;t++)if(e[t]!==r[t])return false;return true}if(typeof e=="object"&&typeof r=="object"){let t=Object.keys(e),c=Object.keys(r);if(t.length!==c.length)return false;for(let o of t)if(!Object.prototype.hasOwnProperty.call(r,o)||e[o]!==r[o])return false;return true}return false}function Ee(e){return e[Symbol.for("stunk.meta")]}var I=null;function J(e){let r=new Set,t=I;I=r;try{return [e(),Array.from(r)]}finally{I=t;}}function ve(e){I&&I.add(e);}var Q=false,G=new Set,W=new Map,Ce=0;function Pe(e){let r=Q;Q=true;try{e();}finally{if(!r){Q=false;let t=[...G];G.clear(),t.forEach(c=>{let o=W.get(c);o&&o.notify();});}}}function x(e,r={}){let t=Ce++,c=`chunk_${t}`,o=r.middleware||[];r.strict??false;if(e===void 0)throw new Error(`[${c}] Initial value cannot be undefined.`);let s=o.length>0,a=false,h=e,u=new Set,n=()=>{u.forEach(b=>b(h));};W.set(t,{notify:n});let f=()=>{if(u.size===0){W.delete(t);return}Q?G.add(t):n();},l=()=>(ve(M),h),m=()=>h,v=b=>{let y;if(typeof b=="function"?y=b(h):y=b,a);let g=s?oe(y,o):y;g!==h&&(h=g,f());},T=b=>{if(typeof b!="function")throw new Error("Callback must be a function.");return u.add(b),()=>u.delete(b)},M={get:l,peek:m,set:v,subscribe:T,derive:b=>{if(typeof b!="function")throw new Error("Derive function must be a function.");let y=b(h),g=x(y),w=T(()=>{let V=b(h);g.set(V);}),C=g.destroy;return g.destroy=()=>{w(),C();},g},reset:()=>{h=e,f();},destroy:()=>{u.clear(),h=e,G.delete(t),W.delete(t);}};return M}function ae(e){let[r,t]=J(e),c=r,o=t,i=false,p=[],s=new Set,a=x(c),h=l=>l.map(m=>m.subscribe(()=>{i=true,(s.size>0||a.subscribe!==void 0)&&u();})),u=()=>{if(!i)return;i=false;let[l,m]=J(e);(m.length!==o.length||m.some((k,A)=>k!==o[A]))&&(p.forEach(k=>k()),p=h(m),o=m),(typeof l=="object"&&l!==null&&typeof c=="object"&&c!==null?!j(l,c):l!==c)&&(c=l,a.set(l),s.forEach(k=>k(c)));},n=()=>()=>{i=true,s.size>0&&u();};p=o.map(l=>l.subscribe(n()));let f;return f={get:()=>(i&&u(),a.get()),peek:()=>c,subscribe:l=>(s.add(l),()=>{s.delete(l);}),derive:l=>{let m=f.subscribe(()=>{}),v=ae(()=>l(f.get())),T=v.destroy;return v.destroy=()=>{m(),T();},v},recompute:()=>{i=true,u();},isDirty:()=>i,destroy:()=>{p.forEach(l=>l()),s.clear(),a.destroy();}},f}function ie(e,r,t={}){let{useShallowEqual:c=false}=t,o=e.get(),i=r(o),p=x(i),s=()=>{let f=e.get(),l=r(f);(c?!j(l,i):l!==i)&&(i=l,p.set(l));},a=e.subscribe(s),{set:h,reset:u,...n}=p;return {...n,derive:f=>ie(p,f,t),destroy:()=>{a(),p.destroy();}}}var de={};ne(de,{history:()=>le,logger:()=>se,nonNegativeValidator:()=>ue,persist:()=>ce});function se(){return e=>(console.log("Setting value:",e),e)}var ue=e=>{if(e<0)throw new Error("Value must be non-negative!");return e};function le(e,r={}){let{maxHistory:t=100,skipDuplicates:c=false}=r,o=[e.get()],i=0;return {...e,get:()=>e.get(),peek:()=>e.peek(),set:s=>{let a;if(typeof s=="function"?a=s(e.get()):a=s,c){let h=o[i];if(a===h||c==="shallow"&&typeof a=="object"&&typeof h=="object"&&a!==null&&h!==null&&j(a,h))return}if(o.splice(i+1),o.push(a),o.length>t){let h=o.length-t;o.splice(0,h);}i=o.length-1,e.set(a);},undo:()=>{i<=0||(i--,e.set(o[i]));},redo:()=>{i>=o.length-1||(i++,e.set(o[i]));},canUndo:()=>i>0,canRedo:()=>i<o.length-1,getHistory:()=>[...o],clearHistory:()=>{let s=e.get();o.length=0,o.push(s),i=0;},reset:()=>{e.reset(),o.length=0,o.push(e.get()),i=0;},destroy:()=>{o.length=0,e.destroy();},subscribe:s=>e.subscribe(s)}}function ce(e,r){let{key:t,serialize:c=JSON.stringify,deserialize:o=JSON.parse,onError:i}=r,p="storage"in r?r.storage:typeof window<"u"?localStorage:void 0;if(!p)return console.warn(`persist: Storage not available for key "${t}". Persistence disabled.`),{...e,clearStorage:()=>{}};let s=e.get();try{let u=p.getItem(t);if(u!==null){let n=o(u);if(n!==null&&s!==null&&(typeof n!=typeof s||Array.isArray(n)!==Array.isArray(s))){let m=`persist: Type mismatch for "${t}". Expected ${Array.isArray(s)?"array":typeof s}, got ${Array.isArray(n)?"array":typeof n}. Using initial value.`;console.warn(m),i?.(new Error(m),"load");}else e.set(n);}}catch(u){let n=u instanceof Error?u:new Error(String(u));console.error(`persist: Failed to load state for "${t}":`,n),i?.(n,"load");}let a=e.subscribe(u=>{try{p.setItem(t,c(u));}catch(n){let f=n instanceof Error?n:new Error(String(n));console.error(`persist: Failed to save state for "${t}":`,f),i?.(f,"save");}});return {...e,get:()=>e.get(),peek:()=>e.peek(),set:u=>e.set(u),subscribe:u=>e.subscribe(u),derive:u=>e.derive(u),reset:()=>e.reset(),destroy:()=>{a(),e.destroy();},clearStorage:()=>{try{p.removeItem(t);}catch(u){let n=u instanceof Error?u:new Error(String(u));console.error(`persist: Failed to clear storage for "${t}":`,n),i?.(n,"save");}}}}var me={};ne(me,{asyncChunk:()=>H,combineAsyncChunks:()=>he,configureQuery:()=>fe,getGlobalQueryConfig:()=>F,infiniteAsyncChunk:()=>pe,mutation:()=>ge,resetQueryConfig:()=>ye});var _={};function fe(e){_={...e.query!==void 0&&{query:{..._.query,...e.query}},...e.mutation!==void 0&&{mutation:{..._.mutation,...e.mutation}}};}function F(){return _}function ye(){_={};}var q=new Map,xe=0;function H(e,r={}){let t=F().query??{},{key:c,initialData:o=null,enabled:i=true,onSuccess:p=t.onSuccess,onError:s=t.onError,retryCount:a=t.retryCount??0,retryDelay:h=t.retryDelay??1e3,keepPreviousData:u=false,staleTime:n=t.staleTime??0,cacheTime:f=t.cacheTime??5*60*1e3,refetchInterval:l=t.refetchInterval,refetchOnWindowFocus:m=t.refetchOnWindowFocus??false,pagination:v}=r,T=c??`async_chunk_${xe++}`,k=()=>typeof i=="function"?i():i,A=!!v,K=v?.mode||"replace",M=e.length>0,b={loading:k()&&!M,error:null,data:o,lastFetched:void 0,isPlaceholderData:false,pagination:A?{page:v.initialPage||1,pageSize:v.pageSize||10,total:void 0,hasMore:void 0}:void 0},y=x(b),g={},w=null,C=null,V=null,U=0,X=()=>{let d=y.get();return !d.lastFetched||n===0?true:Date.now()-d.lastFetched>n},Te=()=>{y.set({...y.get(),data:o,lastFetched:void 0});},be=()=>{C&&clearTimeout(C),f>0&&(C=setTimeout(Te,f));},B=()=>{w&&(clearInterval(w),w=null),C&&(clearTimeout(C),C=null),V&&typeof window<"u"&&(window.removeEventListener("focus",V),V=null);},Y=()=>{k()&&(typeof window>"u"||(l&&l>0&&(w=setInterval(()=>{P(void 0,0,false);},l)),m&&(V=()=>{X()&&P(void 0,0,false);},window.addEventListener("focus",V))));},P=async(d,E=a,O=false)=>{if(!k()||(d!==void 0&&(g={...g,...d}),!O&&!X()&&y.get().data!==null))return;if(q.has(T))return q.get(T);let L=y.get();y.set({...L,loading:true,error:null,data:L.data,isPlaceholderData:u&&L.data!==null});let ee=(async()=>{try{let R={...g};if(A){let $=y.get().pagination;$&&(R.page=$.page,R.pageSize=$.pageSize);}let S=M?await e(R):await e(),D,te,re;if(S&&typeof S=="object"&&"data"in S){let $=S;D=$.data,te=$.total,re=$.hasMore;}else D=S;let z=y.get();A&&K==="accumulate"&&z.data&&Array.isArray(z.data)&&Array.isArray(D)&&(D=[...z.data,...D]),y.set({loading:!1,error:null,data:D,lastFetched:Date.now(),isPlaceholderData:!1,pagination:A?{...z.pagination,total:te,hasMore:re}:void 0}),be(),p&&p(D);}catch(R){if(E>0)return await new Promise(D=>setTimeout(D,h)),q.delete(T),P(d,E-1,O);let S=y.get();y.set({loading:false,error:R,data:S.data,lastFetched:S.lastFetched,isPlaceholderData:false,pagination:S.pagination}),s&&s(R);}finally{q.delete(T);}})();return q.set(T,ee),ee};Y(),k()&&!M&&P();let Z={...y,subscribe:d=>{U++;let E=y.subscribe(d);return ()=>{E(),U--;}},reload:async d=>{await P(d,a,true);},refresh:async d=>{await P(d,a,false);},mutate:d=>{let E=y.get();y.set({...E,data:d(E.data)});},reset:()=>{B(),g={},y.set({...b,loading:k()&&!M}),Y(),k()&&!M&&P();},cleanup:()=>{U<=0&&B();},forceCleanup:()=>{B();},setParams:d=>{let E={...g};for(let O in d)d[O]===null?delete E[O]:E[O]=d[O];g=E,k()&&P(g,a,true);},clearParams:()=>{g={},k()&&P(void 0,a,true);}};return A?{...Z,nextPage:async()=>{let d=y.get();!d.pagination||d.pagination.hasMore===false||(y.set({...d,pagination:{...d.pagination,page:d.pagination.page+1}}),await P(g,a,true));},prevPage:async()=>{let d=y.get();!d.pagination||d.pagination.page<=1||(y.set({...d,pagination:{...d.pagination,page:d.pagination.page-1}}),await P(g,a,true));},goToPage:async d=>{let E=y.get();!E.pagination||d<1||(y.set({...E,pagination:{...E.pagination,page:d}}),await P(g,a,true));},resetPagination:async()=>{let d=y.get();d.pagination&&(y.set({...d,data:K==="accumulate"?o:d.data,pagination:{...d.pagination,page:v?.initialPage||1}}),await P(g,a,true));}}:Z}function pe(e,r={}){let{pageSize:t=10,...c}=r;return H(e,{...c,pagination:{pageSize:t,mode:"accumulate",initialPage:1}})}function he(e){let r=Object.entries(e),t=r.reduce((a,[h,u])=>(a[h]=u.get().data,a),{}),c=r.reduce((a,[h,u])=>{let n=u.get().error;return n&&(a[h]=n),a},{}),o=r.some(([,a])=>a.get().loading),i=r.find(([,a])=>a.get().error)?.[1].get().error??null,s=x({loading:o,error:i,errors:c,data:t});return r.forEach(([a,h])=>{h.subscribe(()=>{let u=false,n=null,f={},l={...s.get().data};r.forEach(([m,v])=>{let T=v.get();T.loading&&(u=true),T.error&&(n||(n=T.error),f[m]=T.error),l[m]=T.data;}),s.set({loading:u,error:n,errors:f,data:l});});}),s}function ge(e,r={}){let t=F().mutation??{},{invalidates:c=[],onSuccess:o=t.onSuccess,onError:i=t.onError,onSettled:p}=r,s={loading:false,data:null,error:null,isSuccess:false},a=x(s);return {mutate:async(...u)=>{let n=u[0];a.set({loading:true,data:null,error:null,isSuccess:false});try{let f=await e(n);return a.set({loading:!1,data:f,error:null,isSuccess:!0}),c.length>0&&await Promise.all(c.map(l=>l.reload())),o&&o(f,n),p&&p(f,null,n),{data:f,error:null}}catch(f){let l=f;return a.set({loading:false,data:null,error:l,isSuccess:false}),i&&i(l,n),p&&p(null,l,n),{data:null,error:l}}},get:()=>a.get(),subscribe:u=>a.subscribe(u),reset:()=>a.set(s)}}export{Pe as batch,x as chunk,ae as computed,Ee as getChunkMeta,de as middleware,me as query,ie as select};
|
|
1
|
+
var Ee=Object.defineProperty;var ne=(e,r)=>{for(var t in r)Ee(e,t,{get:r[t],enumerable:true});};function oe(e,r){if(e===void 0)throw new Error("Value cannot be undefined.");if(r.length===0)return e;let t=e;for(let c=0;c<r.length;c++){let o=r[c],s=typeof o=="function"?o:o.fn,y=typeof o=="function"?`index ${c}`:o.name||`index ${c}`;try{let i=s(t);if(i===void 0)break;if(i===null)throw new Error(`Middleware "${y}" returned null value.`);t=i;}catch(i){let a=i instanceof Error?i.message:String(i);throw new Error(`Middleware "${y}" threw an error: ${a}`)}}return t}function j(e,r){if(e===r)return true;if(!e||!r||typeof e!=typeof r)return false;if(Array.isArray(e)&&Array.isArray(r)){if(e.length!==r.length)return false;for(let t=0;t<e.length;t++)if(e[t]!==r[t])return false;return true}if(typeof e=="object"&&typeof r=="object"){let t=Object.keys(e),c=Object.keys(r);if(t.length!==c.length)return false;for(let o of t)if(!Object.prototype.hasOwnProperty.call(r,o)||e[o]!==r[o])return false;return true}return false}function Pe(e){return e[Symbol.for("stunk.meta")]}var _=null;function J(e){let r=new Set,t=_;_=r;try{return [e(),Array.from(r)]}finally{_=t;}}function ve(e){_&&_.add(e);}var W=false,H=new Set,G=new Map,xe=0;function Ce(e){let r=W;W=true;try{e();}finally{if(!r){W=false;let t=[...H];H.clear(),t.forEach(c=>{let o=G.get(c);o&&o.notify();});}}}function C(e,r={}){let t=xe++,c=`chunk_${t}`,o=r.middleware||[];r.strict??false;if(e===void 0)throw new Error(`[${c}] Initial value cannot be undefined.`);let i=o.length>0,a=false,p=e,u=new Set,n=()=>{u.forEach(m=>m(p));};G.set(t,{notify:n});let f=()=>{if(u.size===0){G.delete(t);return}W?H.add(t):n();},l=()=>(ve(I),p),T=()=>p,k=m=>{let E;if(typeof m=="function"?E=m(p):E=m,a);let h=i?oe(E,o):E;h!==p&&(p=h,f());},g=m=>{if(typeof m!="function")throw new Error("Callback must be a function.");return u.add(m),()=>u.delete(m)},I={get:l,peek:T,set:k,subscribe:g,derive:m=>{if(typeof m!="function")throw new Error("Derive function must be a function.");let E=m(p),h=C(E),S=g(()=>{let V=m(p);h.set(V);}),P=h.destroy;return h.destroy=()=>{S(),P();},h},reset:()=>{p=e,f();},destroy:()=>{u.clear(),p=e,H.delete(t),G.delete(t);}};return I}function ae(e){let[r,t]=J(e),c=r,o=t,s=false,y=[],i=new Set,a=C(c),p=l=>l.map(T=>T.subscribe(()=>{s=true,(i.size>0||a.subscribe!==void 0)&&u();})),u=()=>{if(!s)return;s=false;let[l,T]=J(e);(T.length!==o.length||T.some((x,w)=>x!==o[w]))&&(y.forEach(x=>x()),y=p(T),o=T),(typeof l=="object"&&l!==null&&typeof c=="object"&&c!==null?!j(l,c):l!==c)&&(c=l,a.set(l),i.forEach(x=>x(c)));},n=()=>()=>{s=true,i.size>0&&u();};y=o.map(l=>l.subscribe(n()));let f;return f={get:()=>(s&&u(),a.get()),peek:()=>c,subscribe:l=>(i.add(l),()=>{i.delete(l);}),derive:l=>{let T=f.subscribe(()=>{}),k=ae(()=>l(f.get())),g=k.destroy;return k.destroy=()=>{T(),g();},k},recompute:()=>{s=true,u();},isDirty:()=>s,destroy:()=>{y.forEach(l=>l()),i.clear(),a.destroy();}},f}function se(e,r,t={}){let{useShallowEqual:c=false}=t,o=e.get(),s=r(o),y=C(s),i=()=>{let f=e.get(),l=r(f);(c?!j(l,s):l!==s)&&(s=l,y.set(l));},a=e.subscribe(i),{set:p,reset:u,...n}=y;return {...n,derive:f=>se(y,f,t),destroy:()=>{a(),y.destroy();}}}var de={};ne(de,{history:()=>le,logger:()=>ie,nonNegativeValidator:()=>ue,persist:()=>ce});function ie(){return e=>(console.log("Setting value:",e),e)}var ue=e=>{if(e<0)throw new Error("Value must be non-negative!");return e};function le(e,r={}){let{maxHistory:t=100,skipDuplicates:c=false}=r,o=[e.get()],s=0;return {...e,get:()=>e.get(),peek:()=>e.peek(),set:i=>{let a;if(typeof i=="function"?a=i(e.get()):a=i,c){let p=o[s];if(a===p||c==="shallow"&&typeof a=="object"&&typeof p=="object"&&a!==null&&p!==null&&j(a,p))return}if(o.splice(s+1),o.push(a),o.length>t){let p=o.length-t;o.splice(0,p);}s=o.length-1,e.set(a);},undo:()=>{s<=0||(s--,e.set(o[s]));},redo:()=>{s>=o.length-1||(s++,e.set(o[s]));},canUndo:()=>s>0,canRedo:()=>s<o.length-1,getHistory:()=>[...o],clearHistory:()=>{let i=e.get();o.length=0,o.push(i),s=0;},reset:()=>{e.reset(),o.length=0,o.push(e.get()),s=0;},destroy:()=>{o.length=0,e.destroy();},subscribe:i=>e.subscribe(i)}}function ce(e,r){let{key:t,serialize:c=JSON.stringify,deserialize:o=JSON.parse,onError:s}=r,y="storage"in r?r.storage:typeof window<"u"?localStorage:void 0;if(!y)return console.warn(`persist: Storage not available for key "${t}". Persistence disabled.`),{...e,clearStorage:()=>{}};let i=e.get();try{let u=y.getItem(t);if(u!==null){let n=o(u);if(n!==null&&i!==null&&(typeof n!=typeof i||Array.isArray(n)!==Array.isArray(i))){let T=`persist: Type mismatch for "${t}". Expected ${Array.isArray(i)?"array":typeof i}, got ${Array.isArray(n)?"array":typeof n}. Using initial value.`;console.warn(T),s?.(new Error(T),"load");}else e.set(n);}}catch(u){let n=u instanceof Error?u:new Error(String(u));console.error(`persist: Failed to load state for "${t}":`,n),s?.(n,"load");}let a=e.subscribe(u=>{try{y.setItem(t,c(u));}catch(n){let f=n instanceof Error?n:new Error(String(n));console.error(`persist: Failed to save state for "${t}":`,f),s?.(f,"save");}});return {...e,get:()=>e.get(),peek:()=>e.peek(),set:u=>e.set(u),subscribe:u=>e.subscribe(u),derive:u=>e.derive(u),reset:()=>e.reset(),destroy:()=>{a(),e.destroy();},clearStorage:()=>{try{y.removeItem(t);}catch(u){let n=u instanceof Error?u:new Error(String(u));console.error(`persist: Failed to clear storage for "${t}":`,n),s?.(n,"save");}}}}var me={};ne(me,{asyncChunk:()=>K,combineAsyncChunks:()=>he,configureQuery:()=>fe,getGlobalQueryConfig:()=>F,infiniteAsyncChunk:()=>pe,mutation:()=>ge,resetQueryConfig:()=>ye});var N={};function fe(e){N={...e.query!==void 0&&{query:{...N.query,...e.query}},...e.mutation!==void 0&&{mutation:{...N.mutation,...e.mutation}}};}function F(){return N}function ye(){N={};}var q=new Map,we=0;function K(e,r={}){let t=F().query??{},{key:c,initialData:o=null,enabled:s=true,onSuccess:y=t.onSuccess,onError:i=t.onError,retryCount:a=t.retryCount??0,retryDelay:p=t.retryDelay??1e3,keepPreviousData:u=false,staleTime:n=t.staleTime??0,cacheTime:f=t.cacheTime??5*60*1e3,refetchInterval:l=t.refetchInterval,refetchOnWindowFocus:T=t.refetchOnWindowFocus??false,pagination:k}=r,g={},x=c??`async_chunk_${we++}`,w=()=>typeof s=="function"?s(g):s??true,M=!!k,I=k?.mode||"replace",m=e.length>0,E={loading:w()&&!m,error:null,data:o,lastFetched:void 0,isPlaceholderData:false,pagination:M?{page:k.initialPage||1,pageSize:k.pageSize||10,total:void 0,hasMore:void 0}:void 0},h=C(E),S=null,P=null,V=null,U=0,X=()=>{let d=h.get();return !d.lastFetched||n===0?true:Date.now()-d.lastFetched>n},Te=()=>{h.set({...h.get(),data:o,lastFetched:void 0});},be=()=>{P&&clearTimeout(P),f>0&&(P=setTimeout(Te,f));},B=()=>{S&&(clearInterval(S),S=null),P&&(clearTimeout(P),P=null),V&&typeof window<"u"&&(window.removeEventListener("focus",V),V=null);},Y=()=>{w()&&(typeof window>"u"||(l&&l>0&&(S=setInterval(()=>{v(void 0,0,false);},l)),T&&(V=()=>{X()&&v(void 0,0,false);},window.addEventListener("focus",V))));},v=async(d,b=a,O=false)=>{if(!w()||(d!==void 0&&(g={...g,...d}),!O&&!X()&&h.get().data!==null))return;if(q.has(x))return q.get(x);let z=h.get(),L=z.data;h.set({...z,loading:true,error:null,data:z.data,isPlaceholderData:u&&z.data!==null});let ee=(async()=>{try{let $={...g};if(M){let R=h.get().pagination;R&&($.page=R.page,$.pageSize=R.pageSize);}let A=m?await e($):await e(),D,te,re;if(A&&typeof A=="object"&&"data"in A){let R=A;D=R.data,te=R.total,re=R.hasMore;}else D=A;let ke=h.get();M&&I==="accumulate"&&L&&Array.isArray(L)&&Array.isArray(D)&&(D=[...L,...D]),h.set({loading:!1,error:null,data:D,lastFetched:Date.now(),isPlaceholderData:!1,pagination:M?{...ke.pagination,total:te,hasMore:re}:void 0}),be(),y&&y(D);}catch($){if(b>0)return await new Promise(D=>setTimeout(D,p)),q.delete(x),v(d,b-1,O);let A=h.get();h.set({loading:false,error:$,data:A.data,lastFetched:A.lastFetched,isPlaceholderData:false,pagination:A.pagination}),i&&i($);}finally{q.delete(x);}})();return q.set(x,ee),ee};Y(),w()&&!m&&v();let Z={...h,subscribe:d=>{U++;let b=h.subscribe(d);return ()=>{b(),U--;}},reload:async d=>{m&&!M&&Object.keys(g).length===0||await v(d,a,true);},refresh:async d=>{await v(d,a,false);},mutate:d=>{let b=h.get();h.set({...b,data:d(b.data)});},reset:()=>{B(),g={},h.set({...E,loading:w()&&!m}),Y(),w()&&!m&&v();},cleanup:()=>{U<=0&&B();},forceCleanup:()=>{B();},setParams:d=>{let b={...g};for(let O in d)d[O]===null?delete b[O]:b[O]=d[O];g=b,w()&&v(g,a,true);},clearParams:()=>{g={},w()&&v(void 0,a,true);}};return M?{...Z,nextPage:async()=>{let d=h.get();!d.pagination||d.pagination.hasMore===false||(h.set({...d,pagination:{...d.pagination,page:d.pagination.page+1}}),await v(g,a,true));},prevPage:async()=>{let d=h.get();!d.pagination||d.pagination.page<=1||(h.set({...d,pagination:{...d.pagination,page:d.pagination.page-1}}),await v(g,a,true));},goToPage:async d=>{let b=h.get();!b.pagination||d<1||(h.set({...b,pagination:{...b.pagination,page:d}}),await v(g,a,true));},resetPagination:async()=>{let d=h.get();d.pagination&&(h.set({...d,data:I==="accumulate"?o:d.data,pagination:{...d.pagination,page:k?.initialPage||1}}),await v(g,a,true));}}:Z}function pe(e,r={}){let{pageSize:t=10,...c}=r;return K(e,{...c,pagination:{pageSize:t,mode:"accumulate",initialPage:1}})}function he(e){let r=Object.entries(e),t=r.reduce((a,[p,u])=>(a[p]=u.get().data,a),{}),c=r.reduce((a,[p,u])=>{let n=u.get().error;return n&&(a[p]=n),a},{}),o=r.some(([,a])=>a.get().loading),s=r.find(([,a])=>a.get().error)?.[1].get().error??null,i=C({loading:o,error:s,errors:c,data:t});return r.forEach(([a,p])=>{p.subscribe(()=>{let u=false,n=null,f={},l={...i.get().data};r.forEach(([T,k])=>{let g=k.get();g.loading&&(u=true),g.error&&(n||(n=g.error),f[T]=g.error),l[T]=g.data;}),i.set({loading:u,error:n,errors:f,data:l});});}),i}function ge(e,r={}){let t=F().mutation??{},{invalidates:c=[],onSuccess:o=t.onSuccess,onError:s=t.onError,onSettled:y}=r,i={loading:false,data:null,error:null,isSuccess:false},a=C(i);return {mutate:async(...u)=>{let n=u[0];a.set({loading:true,data:null,error:null,isSuccess:false});try{let f=await e(n);return a.set({loading:!1,data:f,error:null,isSuccess:!0}),c.length>0&&await Promise.all(c.map(l=>l.reload())),o&&o(f,n),y&&y(f,null,n),{data:f,error:null}}catch(f){let l=f;return a.set({loading:false,data:null,error:l,isSuccess:false}),s&&s(l,n),y&&y(null,l,n),{data:null,error:l}}},get:()=>a.get(),subscribe:u=>a.subscribe(u),reset:()=>a.set(i)}}export{Ce as batch,C as chunk,ae as computed,Pe as getChunkMeta,de as middleware,me as query,se as select};
|
|
@@ -17,18 +17,30 @@ interface PaginationState {
|
|
|
17
17
|
interface AsyncStateWithPagination<T, E extends Error> extends AsyncState<T, E> {
|
|
18
18
|
pagination?: PaginationState;
|
|
19
19
|
}
|
|
20
|
+
interface ParamAsyncChunk<T, E extends Error = Error, P extends Record<string, any> = {}> extends AsyncChunk<T, E> {
|
|
21
|
+
setParams: (params: Partial<Record<keyof P, P[keyof P] | null>>) => void;
|
|
22
|
+
clearParams: () => void;
|
|
23
|
+
reload: (params?: Partial<P>) => Promise<void>;
|
|
24
|
+
refresh: (params?: Partial<P>) => Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
interface PaginatedParamAsyncChunk<T, E extends Error = Error, P extends Record<string, any> = {}> extends PaginatedAsyncChunk<T, E> {
|
|
27
|
+
setParams: (params: Partial<Record<keyof P, P[keyof P] | null>>) => void;
|
|
28
|
+
clearParams: () => void;
|
|
29
|
+
reload: (params?: Partial<P>) => Promise<void>;
|
|
30
|
+
refresh: (params?: Partial<P>) => Promise<void>;
|
|
31
|
+
}
|
|
20
32
|
interface FetcherResponse<T> {
|
|
21
33
|
data: T;
|
|
22
34
|
total?: number;
|
|
23
35
|
hasMore?: boolean;
|
|
24
36
|
}
|
|
25
|
-
interface AsyncChunkOptions<T, E extends Error = Error> {
|
|
37
|
+
interface AsyncChunkOptions<T, E extends Error = Error, P extends Record<string, any> = {}> {
|
|
26
38
|
/** Deduplication key — concurrent calls with the same key share one in-flight request */
|
|
27
39
|
key?: string;
|
|
28
40
|
/** Seed data shown before the first fetch completes */
|
|
29
41
|
initialData?: T | null;
|
|
30
42
|
/** Disable fetching until ready — pass a function for dynamic evaluation */
|
|
31
|
-
enabled?: boolean | (() => boolean);
|
|
43
|
+
enabled?: boolean | ((params: Partial<P>) => boolean);
|
|
32
44
|
/** Called after every successful fetch */
|
|
33
45
|
onSuccess?: (data: T) => void;
|
|
34
46
|
/** Called when all retries are exhausted */
|
|
@@ -82,15 +94,14 @@ interface PaginatedAsyncChunk<T, E extends Error = Error> extends AsyncChunk<T,
|
|
|
82
94
|
/** Reset pagination to page 1 and re-fetch */
|
|
83
95
|
resetPagination: () => Promise<void>;
|
|
84
96
|
}
|
|
85
|
-
declare function asyncChunk<T, E extends Error = Error>(fetcher: () => Promise<T | FetcherResponse<T>>, options?: AsyncChunkOptions<T, E>): AsyncChunk<T, E
|
|
86
|
-
declare function asyncChunk<T, E extends Error = Error
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}) => Promise<T | FetcherResponse<T>>, options?: AsyncChunkOptions<T, E>):
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
};
|
|
97
|
+
declare function asyncChunk<T, E extends Error = Error>(fetcher: () => Promise<T | FetcherResponse<T>>, options?: AsyncChunkOptions<T, E>): AsyncChunk<T, E>;
|
|
98
|
+
declare function asyncChunk<T, E extends Error = Error>(fetcher: () => Promise<T | FetcherResponse<T>>, options: AsyncChunkOptions<T, E> & {
|
|
99
|
+
pagination: NonNullable<AsyncChunkOptions<T, E>['pagination']>;
|
|
100
|
+
}): PaginatedAsyncChunk<T, E>;
|
|
101
|
+
declare function asyncChunk<T, E extends Error = Error, P extends Record<string, any> = {}>(fetcher: (params: P) => Promise<T | FetcherResponse<T>>, options?: AsyncChunkOptions<T, E, P>): ParamAsyncChunk<T, E, P>;
|
|
102
|
+
declare function asyncChunk<T, E extends Error = Error, P extends Record<string, any> = {}>(fetcher: (params: P) => Promise<T | FetcherResponse<T>>, options: AsyncChunkOptions<T, E, P> & {
|
|
103
|
+
pagination: NonNullable<AsyncChunkOptions<T, E, P>['pagination']>;
|
|
104
|
+
}): PaginatedParamAsyncChunk<T, E, P>;
|
|
94
105
|
|
|
95
106
|
type InfiniteAsyncChunkOptions<T, E extends Error = Error> = Omit<AsyncChunkOptions<T[], E>, 'pagination'> & {
|
|
96
107
|
/** Items per page (default: 10) */
|
package/dist/query/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as AsyncChunk } from '../mutation-
|
|
2
|
-
export { c as AsyncState, d as AsyncStateWithPagination, M as Mutation, h as MutationFn, f as MutationOptions, b as MutationResult, g as MutationState, P as PaginatedAsyncChunk, e as asyncChunk, i as infiniteAsyncChunk, m as mutation } from '../mutation-
|
|
1
|
+
import { A as AsyncChunk } from '../mutation-Cz-E2NUk.js';
|
|
2
|
+
export { c as AsyncState, d as AsyncStateWithPagination, M as Mutation, h as MutationFn, f as MutationOptions, b as MutationResult, g as MutationState, P as PaginatedAsyncChunk, e as asyncChunk, i as infiniteAsyncChunk, m as mutation } from '../mutation-Cz-E2NUk.js';
|
|
3
3
|
import { C as Chunk } from '../core-DAc7hZla.js';
|
|
4
4
|
|
|
5
5
|
interface GlobalQueryConfig {
|
package/dist/query/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {a}from'../chunk-7PLFRQ2T.js';import'../chunk-PZ7A72TA.js';var
|
|
1
|
+
import {a}from'../chunk-7PLFRQ2T.js';import'../chunk-PZ7A72TA.js';var R={};function Z(s){R={...s.query!==void 0&&{query:{...R.query,...s.query}},...s.mutation!==void 0&&{mutation:{...R.mutation,...s.mutation}}};}function O(){return R}function ee(){R={};}var V=new Map,ae=0;function N(s,c={}){let n=O().query??{},{key:m,initialData:T=null,enabled:P=true,onSuccess:h=n.onSuccess,onError:p=n.onError,retryCount:a$1=n.retryCount??0,retryDelay:E=n.retryDelay??1e3,keepPreviousData:d=false,staleTime:o=n.staleTime??0,cacheTime:f=n.cacheTime??5*60*1e3,refetchInterval:u=n.refetchInterval,refetchOnWindowFocus:Q=n.refetchOnWindowFocus??false,pagination:k}=c,t={},M=m??`async_chunk_${ae++}`,b=()=>typeof P=="function"?P(t):P??true,x=!!k,j=k?.mode||"replace",S=s.length>0,L={loading:b()&&!S,error:null,data:T,lastFetched:void 0,isPlaceholderData:false,pagination:x?{page:k.initialPage||1,pageSize:k.pageSize||10,total:void 0,hasMore:void 0}:void 0},r=a(L),I=null,A=null,F=null,q=0,K=()=>{let e=r.get();return !e.lastFetched||o===0?true:Date.now()-e.lastFetched>o},U=()=>{r.set({...r.get(),data:T,lastFetched:void 0});},X=()=>{A&&clearTimeout(A),f>0&&(A=setTimeout(U,f));},z=()=>{I&&(clearInterval(I),I=null),A&&(clearTimeout(A),A=null),F&&typeof window<"u"&&(window.removeEventListener("focus",F),F=null);},_=()=>{b()&&(typeof window>"u"||(u&&u>0&&(I=setInterval(()=>{l(void 0,0,false);},u)),Q&&(F=()=>{K()&&l(void 0,0,false);},window.addEventListener("focus",F))));},l=async(e,i=a$1,C=false)=>{if(!b()||(e!==void 0&&(t={...t,...e}),!C&&!K()&&r.get().data!==null))return;if(V.has(M))return V.get(M);let G=r.get(),W=G.data;r.set({...G,loading:true,error:null,data:G.data,isPlaceholderData:d&&G.data!==null});let $=(async()=>{try{let D={...t};if(x){let v=r.get().pagination;v&&(D.page=v.page,D.pageSize=v.pageSize);}let g=S?await s(D):await s(),y,B,J;if(g&&typeof g=="object"&&"data"in g){let v=g;y=v.data,B=v.total,J=v.hasMore;}else y=g;let Y=r.get();x&&j==="accumulate"&&W&&Array.isArray(W)&&Array.isArray(y)&&(y=[...W,...y]),r.set({loading:!1,error:null,data:y,lastFetched:Date.now(),isPlaceholderData:!1,pagination:x?{...Y.pagination,total:B,hasMore:J}:void 0}),X(),h&&h(y);}catch(D){if(i>0)return await new Promise(y=>setTimeout(y,E)),V.delete(M),l(e,i-1,C);let g=r.get();r.set({loading:false,error:D,data:g.data,lastFetched:g.lastFetched,isPlaceholderData:false,pagination:g.pagination}),p&&p(D);}finally{V.delete(M);}})();return V.set(M,$),$};_(),b()&&!S&&l();let H={...r,subscribe:e=>{q++;let i=r.subscribe(e);return ()=>{i(),q--;}},reload:async e=>{S&&!x&&Object.keys(t).length===0||await l(e,a$1,true);},refresh:async e=>{await l(e,a$1,false);},mutate:e=>{let i=r.get();r.set({...i,data:e(i.data)});},reset:()=>{z(),t={},r.set({...L,loading:b()&&!S}),_(),b()&&!S&&l();},cleanup:()=>{q<=0&&z();},forceCleanup:()=>{z();},setParams:e=>{let i={...t};for(let C in e)e[C]===null?delete i[C]:i[C]=e[C];t=i,b()&&l(t,a$1,true);},clearParams:()=>{t={},b()&&l(void 0,a$1,true);}};return x?{...H,nextPage:async()=>{let e=r.get();!e.pagination||e.pagination.hasMore===false||(r.set({...e,pagination:{...e.pagination,page:e.pagination.page+1}}),await l(t,a$1,true));},prevPage:async()=>{let e=r.get();!e.pagination||e.pagination.page<=1||(r.set({...e,pagination:{...e.pagination,page:e.pagination.page-1}}),await l(t,a$1,true));},goToPage:async e=>{let i=r.get();!i.pagination||e<1||(r.set({...i,pagination:{...i.pagination,page:e}}),await l(t,a$1,true));},resetPagination:async()=>{let e=r.get();e.pagination&&(r.set({...e,data:j==="accumulate"?T:e.data,pagination:{...e.pagination,page:k?.initialPage||1}}),await l(t,a$1,true));}}:H}function re(s,c={}){let{pageSize:n=10,...m}=c;return N(s,{...m,pagination:{pageSize:n,mode:"accumulate",initialPage:1}})}function te(s){let c=Object.entries(s),n=c.reduce((a,[E,d])=>(a[E]=d.get().data,a),{}),m=c.reduce((a,[E,d])=>{let o=d.get().error;return o&&(a[E]=o),a},{}),T=c.some(([,a])=>a.get().loading),P=c.find(([,a])=>a.get().error)?.[1].get().error??null,p=a({loading:T,error:P,errors:m,data:n});return c.forEach(([a,E])=>{E.subscribe(()=>{let d=false,o=null,f={},u={...p.get().data};c.forEach(([Q,k])=>{let t=k.get();t.loading&&(d=true),t.error&&(o||(o=t.error),f[Q]=t.error),u[Q]=t.data;}),p.set({loading:d,error:o,errors:f,data:u});});}),p}function ne(s,c={}){let n=O().mutation??{},{invalidates:m=[],onSuccess:T=n.onSuccess,onError:P=n.onError,onSettled:h}=c,p={loading:false,data:null,error:null,isSuccess:false},a$1=a(p);return {mutate:async(...d)=>{let o=d[0];a$1.set({loading:true,data:null,error:null,isSuccess:false});try{let f=await s(o);return a$1.set({loading:!1,data:f,error:null,isSuccess:!0}),m.length>0&&await Promise.all(m.map(u=>u.reload())),T&&T(f,o),h&&h(f,null,o),{data:f,error:null}}catch(f){let u=f;return a$1.set({loading:false,data:null,error:u,isSuccess:false}),P&&P(u,o),h&&h(null,u,o),{data:null,error:u}}},get:()=>a$1.get(),subscribe:d=>a$1.subscribe(d),reset:()=>a$1.set(p)}}export{N as asyncChunk,te as combineAsyncChunks,Z as configureQuery,O as getGlobalQueryConfig,re as infiniteAsyncChunk,ne as mutation,ee as resetQueryConfig};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { C as Chunk, R as ReadOnlyChunk } from '../core-DAc7hZla.js';
|
|
2
|
-
import { P as PaginatedAsyncChunk, a as PaginationState, A as AsyncChunk, I as InfiniteAsyncChunk, M as Mutation, b as MutationResult } from '../mutation-
|
|
2
|
+
import { P as PaginatedAsyncChunk, a as PaginationState, A as AsyncChunk, I as InfiniteAsyncChunk, M as Mutation, b as MutationResult } from '../mutation-Cz-E2NUk.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Subscribes to a chunk and returns its current value along with setters,
|
|
@@ -64,11 +64,18 @@ interface UseAsyncChunkResultWithPagination<T, E extends Error, P extends Record
|
|
|
64
64
|
interface UseAsyncChunkResultWithParamsAndPagination<T, E extends Error, P extends Record<string, any>> extends UseAsyncChunkResultWithParams<T, E, P>, Omit<UseAsyncChunkResultWithPagination<T, E, P>, keyof UseAsyncChunkResult<T, E, P>> {
|
|
65
65
|
}
|
|
66
66
|
interface UseAsyncChunkOptions<P extends Record<string, any> = {}> {
|
|
67
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Parameters to pass to the fetcher. When these change between renders,
|
|
69
|
+
* the chunk automatically re-fetches with the new values.
|
|
70
|
+
*/
|
|
71
|
+
params?: Partial<P>;
|
|
72
|
+
/**
|
|
73
|
+
* @deprecated Use `params` instead. Will be removed in v3 stable.
|
|
74
|
+
*/
|
|
68
75
|
initialParams?: Partial<P>;
|
|
69
76
|
/**
|
|
70
77
|
* Force a fetch on mount even when the chunk has no params.
|
|
71
|
-
* Ignored if
|
|
78
|
+
* Ignored if params is provided.
|
|
72
79
|
* (default: false)
|
|
73
80
|
*/
|
|
74
81
|
fetchOnMount?: boolean;
|
package/dist/use-react/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {a}from'../chunk-7PLFRQ2T.js';import {b}from'../chunk-PZ7A72TA.js';import {useState,useEffect,useCallback,useRef}from'react';function
|
|
1
|
+
import {a}from'../chunk-7PLFRQ2T.js';import {b}from'../chunk-PZ7A72TA.js';import {useState,useEffect,useCallback,useRef}from'react';function S(e,r,t={}){let{useShallowEqual:i=false}=t,u=e.get(),n=r(u),a$1=a(n),l=()=>{let m=e.get(),c=r(m);(i?!b(c,n):c!==n)&&(n=c,a$1.set(c));},o=e.subscribe(l),{set:d,reset:T,...E}=a$1;return {...E,derive:m=>S(a$1,m,t),destroy:()=>{o(),a$1.destroy();}}}function M(e,r){let t=r?S(e,r):e,[i,u]=useState(()=>t.get());useEffect(()=>{let o=t.subscribe(d=>{u(()=>d);});return ()=>o()},[t]);let n=useCallback(o=>{"set"in e&&e.set(o);},[e]),a=useCallback(()=>{"reset"in e&&e.reset();},[e]),l=useCallback(()=>{e.destroy();},[e]);return [i,n,a,l]}function K(e,r){let[t]=M(e,r);return t}function y(e){return "nextPage"in e}function A(e){return "setParams"in e}function B(e){return "clearParams"in e}function O(e,r={}){let t=r.params??r.initialParams,{fetchOnMount:i=false}=r,[u,n]=useState(()=>e.get()),a=useRef({resolvedParams:t,fetchOnMount:i});a.current={resolvedParams:t,fetchOnMount:i},useEffect(()=>{n(e.get());let s=e.subscribe(j=>{n(j);}),{resolvedParams:D,fetchOnMount:_}=a.current;return D&&A(e)?e.setParams(D):_&&e.reload(),()=>{s(),e.cleanup();}},[e]);let l=useRef(false),o=t?JSON.stringify(t):null;useEffect(()=>{if(!l.current){l.current=true;return}t&&A(e)&&e.setParams(t);},[o]);let d=useCallback(s=>e.reload(s),[e]),T=useCallback(s=>e.refresh(s),[e]),E=useCallback(s=>e.mutate(s),[e]),m=useCallback(()=>e.reset(),[e]),c=useCallback(s=>{A(e)&&e.setParams(s);},[e]),f=useCallback(()=>{B(e)&&e.clearParams();},[e]),h=useCallback(()=>y(e)?e.nextPage():Promise.resolve(),[e]),x=useCallback(()=>y(e)?e.prevPage():Promise.resolve(),[e]),v=useCallback(s=>y(e)?e.goToPage(s):Promise.resolve(),[e]),C=useCallback(()=>y(e)?e.resetPagination():Promise.resolve(),[e]),{data:p,loading:g,error:k,lastFetched:q,isPlaceholderData:L=false,pagination:H}=u,R={data:p,loading:g,error:k,lastFetched:q,isPlaceholderData:L,reload:d,refresh:T,mutate:E,reset:m};if(A(e)&&(R.setParams=c,R.clearParams=f),y(e)){let s=R;s.pagination=H,s.nextPage=h,s.prevPage=x,s.goToPage=v,s.resetPagination=C;}return R}function X(e,r={}){let{initialParams:t,autoLoad:i=true,threshold:u=1,fetchOnMount:n}=r,a=O(e,{...t&&{initialParams:t},fetchOnMount:n}),{loading:l,pagination:o,nextPage:d,data:T,error:E,isPlaceholderData:m}=a,c=useRef(l),f=useRef(o?.hasMore??false),h=useRef(d);c.current=l,f.current=o?.hasMore??false,h.current=d;let x=useRef(null);useEffect(()=>{if(!i||typeof window>"u"||!("IntersectionObserver"in window))return;let p=new IntersectionObserver(k=>{k[0].isIntersecting&&!c.current&&f.current&&h.current();},{threshold:u}),g=x.current;return g&&p.observe(g),()=>{g&&p.unobserve(g),p.disconnect();}},[i,u]);let v=useCallback(()=>{!c.current&&f.current&&h.current();},[]),C=l&&T!==null&&T.length>0&&(o?.page??1)>1;return {...a,data:T,error:E,isPlaceholderData:m??false,isFetchingMore:C,hasMore:o?.hasMore??false,loadMore:v,observerTarget:x}}function $(e){let[r,t]=useState(()=>e.get());useEffect(()=>(t(e.get()),e.subscribe(a=>{t(a);})),[e]);let i=useCallback((...n)=>e.mutate(...n),[e]),u=useCallback(()=>e.reset(),[e]);return {loading:r.loading,data:r.data,error:r.error,isSuccess:r.isSuccess,mutate:i,reset:u}}export{O as useAsyncChunk,M as useChunk,K as useChunkValue,X as useInfiniteAsyncChunk,$ as useMutation};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stunk",
|
|
3
|
-
"version": "3.0.0-rc",
|
|
3
|
+
"version": "3.0.0-rc.2",
|
|
4
4
|
"description": "Stunk is a lightweight, framework-agnostic state management library for JavaScript and TypeScript. It uses chunk-based state units for efficient updates, reactivity, and performance optimization in React, Vue(WIP), Svelte(Coming soon), and Vanilla JS/TS applications.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|