state-jet 2.0.11 → 2.0.13

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
@@ -41,7 +41,9 @@ Or if you're using `cdn`:
41
41
  <script src="https://cdn.jsdelivr.net/npm/state-jet@latest/dist/index.cjs"></script>
42
42
  ```
43
43
 
44
- ## Introduction to GlobalState
44
+ ## GlobalState
45
+
46
+ The `useStateGlobal` hook is the simplest entry point to State-Jet. It allows you to create stateful values that can be accessed and updated from any component in your application, regardless of their location in the component tree.
45
47
 
46
48
  ### Create GlobalState
47
49
 
@@ -56,7 +58,7 @@ function Counter() {
56
58
  }
57
59
  ```
58
60
 
59
- ## Introduction to Slices
61
+ ## Slices
60
62
 
61
63
  Slices in state-jet represent logical groupings of state that help organize application data into manageable pieces. Unlike the global state approach which uses a single namespace, slices allow for partitioning state into named segments, making state management more modular and maintainable.
62
64
 
@@ -74,9 +76,9 @@ export const useProductSlice = () => productSlice("list", []);
74
76
  export const useCartSlice = () => cartSlice("list", []);
75
77
  ```
76
78
 
77
- ## Introduction to Store
79
+ ## Store
78
80
 
79
- The useStore hook serves as a mechanism to group related slices of state into a cohesive store, enabling modular and organized state management in React applications. It creates a persistent reference to a collection of slice instances that can be accessed throughout an application component tree.
81
+ The `useStore` hook serves as a mechanism to group related slices of state into a cohesive store, enabling modular and organized state management in React applications. It creates a persistent reference to a collection of slice instances that can be accessed throughout an application component tree.
80
82
 
81
83
  ### Create Store
82
84
 
@@ -94,6 +96,8 @@ export const store = () => useStore(initializer);
94
96
 
95
97
  ## Middlewares
96
98
 
99
+ Middleware in state-jet is a powerful mechanism for intercepting, transforming, and processing state updates before they are applied to the store.
100
+
97
101
  Unlike other libraries, you do not need to rely on any external dependencies. A `middleware` property from `options` helps to add middleware for state-jet.
98
102
 
99
103
  ```bash
@@ -252,16 +256,23 @@ const todoState = useStateGlobal<Todo[]>("todos", []);
252
256
 
253
257
  ## Why state-jet Is More Advanced Than Zustand
254
258
 
255
- - **No Proxies Needed** → Zustand uses proxies for state updates, but state-jet uses signals, making it even faster.
256
- - **Derived State Is Automatic** No need for selectors; state updates only trigger where necessary.
257
- - **Optimistic Updates & Rollback** → Unlike Zustand, state-jet has built-in support for instant UI updates and auto-revert on failures.
258
- - **Multi-Tab Sync** global state persists across browser tabs and devices.
259
- - **CRDT Support** Automatic conflict resolution for real-time apps, something even Zustand lacks.
259
+ - **No Proxies Needed**
260
+ Zustand uses proxies for state updates, but state-jet uses signals, making it even faster.
261
+ - **Derived State Is Automatic**
262
+ No need for selectors; state updates only trigger where necessary.
263
+ - **Optimistic Updates & Rollback**
264
+ → Unlike Zustand, state-jet has built-in support for instant UI updates and auto-revert on failures.
265
+ - **Multi-Tab Sync**
266
+ → global state persists across browser tabs and devices.
267
+ - **CRDT Support**
268
+ → Automatic conflict resolution for real-time apps, something even Zustand lacks.
269
+
260
270
 
261
271
  ### ✅ Conclusion
262
272
 
263
273
  If you need the simplest, fastest, and most advanced state management solution for React, state-jet beats Redux, Recoil, MobX, Jotai, and even Zustand in performance, reactivity, and developer experience. 🚀
264
274
 
275
+
265
276
  ## ⚡ Comparison Table
266
277
  | Feature | Redux | Recoil | MobX | Jotai | Zustand | state-jet |
267
278
  |--------------------------|--------|--------|-------|--------|------------------------|----------------------|
package/dist/index.cjs CHANGED
@@ -16,4 +16,4 @@
16
16
  *
17
17
  * This source code is licensed under the MIT license found in the
18
18
  * LICENSE file in the root directory of this source tree.
19
- */var re=(ee||(ee=1,"production"===process.env.NODE_ENV?Y.exports=function(){if(X)return Q;X=1;var t=e,r="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},n=t.useState,o=t.useEffect,a=t.useLayoutEffect,s=t.useDebugValue;function i(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch{return!0}}var c=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?function(e,t){return t()}:function(e,t){var r=t(),c=n({inst:{value:r,getSnapshot:t}}),u=c[0].inst,f=c[1];return a((function(){u.value=r,u.getSnapshot=t,i(u)&&f({inst:u})}),[e,r,t]),o((function(){return i(u)&&f({inst:u}),e((function(){i(u)&&f({inst:u})}))}),[e]),s(r),r};return Q.useSyncExternalStore=void 0!==t.useSyncExternalStore?t.useSyncExternalStore:c,Q}():Y.exports=(Z||(Z=1,"production"!==process.env.NODE_ENV&&function(){function t(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!n(e,r)}catch{return!0}}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var r=e,n="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,a=r.useEffect,s=r.useLayoutEffect,i=r.useDebugValue,c=!1,u=!1,f=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?function(e,t){return t()}:function(e,f){c||void 0===r.startTransition||(c=!0,console.error("You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."));var l=f();if(!u){var p=f();n(l,p)||(console.error("The result of getSnapshot should be cached to avoid an infinite loop"),u=!0)}var d=(p=o({inst:{value:l,getSnapshot:f}}))[0].inst,_=p[1];return s((function(){d.value=l,d.getSnapshot=f,t(d)&&_({inst:d})}),[e,l,f]),a((function(){return t(d)&&_({inst:d}),e((function(){t(d)&&_({inst:d})}))}),[e]),i(l),l};te.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:f,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),te)),Y.exports);const ne={},oe={},ae={},se=B.__STATE_JET_DEVTOOLS__,ie=(e,t)=>{ne[e]||(ne[e]=[]),void 0===oe[e]&&(oe[e]=-1),ne[e]=ne[e].slice(0,oe[e]+1),ne[e].push(t),oe[e]++,se?.updateState&&se.updateState(e,t,[...ne[e]])},ce=(e,t)=>{ae[e]||(ae[e]=[]);const r=performance.now();t();const n=performance.now()-r;ae[e].push(n),se?.updatePerformance&&se.updatePerformance(e,n)},ue=new Set,fe=new Map,le=new Map,pe={};let de=!1;const _e=e=>(fe.has(e)||fe.set(e,{}),(t,r,n)=>{const o=fe.get(e),a=`${e}:${t}`;if(!o[t]){let e=r;n?.persist&&(e=n?.encrypt?W(a,r):J(a,r)),o[t]={value:e,listeners:new Set,...n}}const s=o[t],i=async()=>{de=!1;const e=Array.from(le.entries());le.clear();for(const[t,r]of e){const[e,n]=t.split(":"),o=fe.get(e);if(!o)continue;const a=o[n];if(!a)continue;if(ue.has(t)){console.warn(`[state-jet] Skipping recursive middleware for: ${t}`);continue}let s=r;const i=a.value;if(pe[t]||(pe[t]={past:[],present:i,future:[]}),pe[t].past.push(i),pe[t].present=s,pe[t].future=[],ue.add(t),a?.middleware)for(const e of a.middleware)try{console.log(`[state-jet] Running middleware for ${t}`);const r=e(t,i,s,(e=>{s=e}));if(void 0!==r)if(r instanceof Promise){const e=await r;void 0!==e&&(s=e)}else s=r}catch(e){console.error(`[state-jet] Middleware error in ${t}:`,e)}ue.delete(t),"function"==typeof s?a.value=U(a.value,s):i!==s&&(a.value=s,a.listeners.forEach((e=>e())),ie(`${e}.${n}`,s),ce(`${e}.${n}`,(()=>{})),a?.persist&&(a?.encrypt?q(t,s):H(t,s)))}};return{useState:()=>re.useSyncExternalStore((e=>(s.listeners.add(e),()=>s.listeners.delete(e))),(()=>s.value)),set:async(r,n=!1)=>{const o=s.value,c="function"==typeof r?r(o):r;if(n)return s.value=c,s.listeners.forEach((e=>e())),void ie(`${e}.${t}`,c);le.set(a,c),de||(de=!0,s.frameSync&&B?.requestAnimationFrame?await new Promise((e=>B.requestAnimationFrame((()=>e(i()))))):await i())},undo:()=>{pe[a]?.past.length&&(pe[a].future.unshift(pe[a].present),pe[a].present=pe[a].past.pop(),s.value=pe[a].present,s.listeners.forEach((e=>e())),(e=>{if(oe[e]>0)oe[e]--,ne[e][oe[e]]})(a),ie(`${e}.undo`,pe[a].present))},redo:()=>{pe[a]?.future.length&&(pe[a].past.push(pe[a].present),pe[a].present=pe[a].future.shift(),s.value=pe[a].present,s.listeners.forEach((e=>e())),(e=>{if(oe[e]<ne[e]?.length-1)oe[e]++,ne[e][oe[e]]})(a),ie(`${e}.redo`,pe[a].present))},clear:()=>{s.value=r,fe.clear(),Object.keys(pe).forEach((e=>delete pe[e])),ie(`${e}.clear`,r)}}}),ye=(e,t)=>({...e,...t,lastUpdated:Date.now()});exports.derivedState=(e,t)=>()=>{const r=e.map((e=>e.useState()));return t(...r)},exports.mergeCRDT=ye,exports.optimisticUpdate=async(e,t,r,n)=>{const o=e.useState(),a=t(o);e.set(a);try{await r()}catch(t){console.error("API request failed:",t),e.set(n?n(o):o)}},exports.restoreEncryptedState=W,exports.restoreState=J,exports.saveEncryptedState=q,exports.saveState=H,exports.syncCRDT=(e,t)=>{const r=t.useState(),n=ye(r,e);t.set(n)},exports.useSlice=_e,exports.useStateGlobal=(e,t,r)=>_e("global")(e,t,r),exports.useStore=t=>{const r=e.useRef(null);return r.current||(r.current=t()),r.current};
19
+ */var re=(ee||(ee=1,"production"===process.env.NODE_ENV?Y.exports=function(){if(X)return Q;X=1;var t=e,r="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},n=t.useState,o=t.useEffect,a=t.useLayoutEffect,s=t.useDebugValue;function i(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch{return!0}}var c=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?function(e,t){return t()}:function(e,t){var r=t(),c=n({inst:{value:r,getSnapshot:t}}),u=c[0].inst,f=c[1];return a((function(){u.value=r,u.getSnapshot=t,i(u)&&f({inst:u})}),[e,r,t]),o((function(){return i(u)&&f({inst:u}),e((function(){i(u)&&f({inst:u})}))}),[e]),s(r),r};return Q.useSyncExternalStore=void 0!==t.useSyncExternalStore?t.useSyncExternalStore:c,Q}():Y.exports=(Z||(Z=1,"production"!==process.env.NODE_ENV&&function(){function t(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!n(e,r)}catch{return!0}}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var r=e,n="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,a=r.useEffect,s=r.useLayoutEffect,i=r.useDebugValue,c=!1,u=!1,f=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?function(e,t){return t()}:function(e,f){c||void 0===r.startTransition||(c=!0,console.error("You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."));var l=f();if(!u){var p=f();n(l,p)||(console.error("The result of getSnapshot should be cached to avoid an infinite loop"),u=!0)}var d=(p=o({inst:{value:l,getSnapshot:f}}))[0].inst,_=p[1];return s((function(){d.value=l,d.getSnapshot=f,t(d)&&_({inst:d})}),[e,l,f]),a((function(){return t(d)&&_({inst:d}),e((function(){t(d)&&_({inst:d})}))}),[e]),i(l),l};te.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:f,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),te)),Y.exports);const ne={},oe={},ae={},se=B.__STATE_JET_DEVTOOLS__,ie=(e,t)=>{ne[e]||(ne[e]=[]),void 0===oe[e]&&(oe[e]=-1),ne[e]=ne[e].slice(0,oe[e]+1),ne[e].push(t),oe[e]++,se?.updateState&&se.updateState(e,t,[...ne[e]])},ce=(e,t)=>{ae[e]||(ae[e]=[]);const r=performance.now();t();const n=performance.now()-r;ae[e].push(n),se?.updatePerformance&&se.updatePerformance(e,n)},ue=new Set,fe=new Map,le=new Map,pe={};let de=!1;const _e=e=>(fe.has(e)||fe.set(e,{}),(t,r,n)=>{const o=fe.get(e),a=`${e}:${t}`;if(!o[t]){let e=r;n?.persist&&(e=n?.encrypt?W(a,r):J(a,r)),o[t]={value:e,listeners:new Set,...n}}const s=o[t],i=async()=>{de=!1;const e=Array.from(le.entries());le.clear();for(const[t,r]of e){const[e,n]=t.split(":"),o=fe.get(e);if(!o)continue;const a=o[n];if(!a)continue;if(ue.has(t)){console.warn(`[state-jet] Skipping recursive middleware for: ${t}`);continue}let s=r;const i=a.value;if(pe[t]||(pe[t]={past:[],present:i,future:[]}),pe[t].past.push(i),pe[t].present=s,pe[t].future=[],ue.add(t),a?.middleware)for(const e of a.middleware)try{console.log(`[state-jet] Running middleware for ${t}`);const r=e(t,i,s,(e=>{s=e}));if(void 0!==r)if(r instanceof Promise){const e=await r;void 0!==e&&(s=e)}else s=r}catch(e){console.error(`[state-jet] Middleware error in ${t}:`,e)}ue.delete(t),"function"==typeof s?a.value=U(a.value,s):i!==s&&(a.value=s,a.listeners.forEach((e=>e())),ie(`${e}.${n}`,s),ce(`${e}.${n}`,(()=>{})),a?.persist&&(a?.encrypt?q(t,s):H(t,s)))}};return{useState:()=>re.useSyncExternalStore((e=>(s.listeners.add(e),()=>s.listeners.delete(e))),(()=>s.value)),set:async(r,n=!1)=>{const o=s.value,c="function"==typeof r?r(o):r;if(n)return s.value=c,s.listeners.forEach((e=>e())),void ie(`${e}.${t}`,c);le.set(a,c),de||(de=!0,s.frameSync&&B?.requestAnimationFrame?await new Promise((e=>B.requestAnimationFrame((()=>e(i()))))):await i())},get:()=>s.value,undo:()=>{pe[a]?.past.length&&(pe[a].future.unshift(pe[a].present),pe[a].present=pe[a].past.pop(),s.value=pe[a].present,s.listeners.forEach((e=>e())),(e=>{if(oe[e]>0)oe[e]--,ne[e][oe[e]]})(a),ie(`${e}.undo`,pe[a].present))},redo:()=>{pe[a]?.future.length&&(pe[a].past.push(pe[a].present),pe[a].present=pe[a].future.shift(),s.value=pe[a].present,s.listeners.forEach((e=>e())),(e=>{if(oe[e]<ne[e]?.length-1)oe[e]++,ne[e][oe[e]]})(a),ie(`${e}.redo`,pe[a].present))},clear:()=>{s.value=r,fe.clear(),Object.keys(pe).forEach((e=>delete pe[e])),ie(`${e}.clear`,r)}}}),ye=(e,t)=>({...e,...t,lastUpdated:Date.now()});exports.derivedState=(e,t)=>()=>{const r=e.map((e=>e.useState()));return t(...r)},exports.mergeCRDT=ye,exports.optimisticUpdate=async(e,t,r,n)=>{const o=e.useState(),a=t(o);e.set(a);try{await r()}catch(t){console.error("API request failed:",t),e.set(n?n(o):o)}},exports.restoreEncryptedState=W,exports.restoreState=J,exports.saveEncryptedState=q,exports.saveState=H,exports.syncCRDT=(e,t)=>{const r=t.useState(),n=ye(r,e);t.set(n)},exports.useSlice=_e,exports.useStateGlobal=(e,t,r)=>_e("global")(e,t,r),exports.useStore=t=>{const r=e.useRef(null);return r.current||(r.current=t()),r.current};
package/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ type Action<T> = {
15
15
  declare const useStateGlobal: <T>(key: string, initialValue?: T, options?: Options<T>) => {
16
16
  useState: () => T | undefined;
17
17
  set: (newValue: T | Action<T | undefined> | ((prev: T | undefined) => T | undefined) | undefined, immediate?: boolean) => Promise<void>;
18
+ get: () => T | undefined;
18
19
  undo: () => void;
19
20
  redo: () => void;
20
21
  clear: () => void;
@@ -25,6 +26,7 @@ declare const useStateGlobal: <T>(key: string, initialValue?: T, options?: Optio
25
26
  declare const useSlice: (sliceName: string) => <T>(key: string, initialValue: T, options?: Options<T | undefined>) => {
26
27
  useState: () => T;
27
28
  set: (newValue: T | ((prev: T) => T) | Action<T>, immediate?: boolean) => Promise<void>;
29
+ get: () => T;
28
30
  undo: () => void;
29
31
  redo: () => void;
30
32
  clear: () => void;
package/dist/index.mjs CHANGED
@@ -16,4 +16,4 @@ import e,{useRef as t}from"react";var r=Symbol.for("immer-nothing"),n=Symbol.for
16
16
  *
17
17
  * This source code is licensed under the MIT license found in the
18
18
  * LICENSE file in the root directory of this source tree.
19
- */var ne=(te||(te=1,"production"===process.env.NODE_ENV?Q.exports=function(){if(Y)return Z;Y=1;var t=e,r="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},n=t.useState,o=t.useEffect,a=t.useLayoutEffect,s=t.useDebugValue;function i(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch{return!0}}var c=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?function(e,t){return t()}:function(e,t){var r=t(),c=n({inst:{value:r,getSnapshot:t}}),u=c[0].inst,f=c[1];return a((function(){u.value=r,u.getSnapshot=t,i(u)&&f({inst:u})}),[e,r,t]),o((function(){return i(u)&&f({inst:u}),e((function(){i(u)&&f({inst:u})}))}),[e]),s(r),r};return Z.useSyncExternalStore=void 0!==t.useSyncExternalStore?t.useSyncExternalStore:c,Z}():Q.exports=(ee||(ee=1,"production"!==process.env.NODE_ENV&&function(){function t(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!n(e,r)}catch{return!0}}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var r=e,n="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,a=r.useEffect,s=r.useLayoutEffect,i=r.useDebugValue,c=!1,u=!1,f=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?function(e,t){return t()}:function(e,f){c||void 0===r.startTransition||(c=!0,console.error("You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."));var l=f();if(!u){var p=f();n(l,p)||(console.error("The result of getSnapshot should be cached to avoid an infinite loop"),u=!0)}var d=(p=o({inst:{value:l,getSnapshot:f}}))[0].inst,_=p[1];return s((function(){d.value=l,d.getSnapshot=f,t(d)&&_({inst:d})}),[e,l,f]),a((function(){return t(d)&&_({inst:d}),e((function(){t(d)&&_({inst:d})}))}),[e]),i(l),l};re.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:f,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),re)),Q.exports);const oe={},ae={},se={},ie=H.__STATE_JET_DEVTOOLS__,ce=(e,t)=>{oe[e]||(oe[e]=[]),void 0===ae[e]&&(ae[e]=-1),oe[e]=oe[e].slice(0,ae[e]+1),oe[e].push(t),ae[e]++,ie?.updateState&&ie.updateState(e,t,[...oe[e]])},ue=(e,t)=>{se[e]||(se[e]=[]);const r=performance.now();t();const n=performance.now()-r;se[e].push(n),ie?.updatePerformance&&ie.updatePerformance(e,n)},fe=new Set,le=new Map,pe=new Map,de={};let _e=!1;const ye=(e,t,r)=>he("global")(e,t,r),he=e=>(le.has(e)||le.set(e,{}),(t,r,n)=>{const o=le.get(e),a=`${e}:${t}`;if(!o[t]){let e=r;n?.persist&&(e=n?.encrypt?X(a,r):W(a,r)),o[t]={value:e,listeners:new Set,...n}}const s=o[t],i=async()=>{_e=!1;const e=Array.from(pe.entries());pe.clear();for(const[t,r]of e){const[e,n]=t.split(":"),o=le.get(e);if(!o)continue;const a=o[n];if(!a)continue;if(fe.has(t)){console.warn(`[state-jet] Skipping recursive middleware for: ${t}`);continue}let s=r;const i=a.value;if(de[t]||(de[t]={past:[],present:i,future:[]}),de[t].past.push(i),de[t].present=s,de[t].future=[],fe.add(t),a?.middleware)for(const e of a.middleware)try{console.log(`[state-jet] Running middleware for ${t}`);const r=e(t,i,s,(e=>{s=e}));if(void 0!==r)if(r instanceof Promise){const e=await r;void 0!==e&&(s=e)}else s=r}catch(e){console.error(`[state-jet] Middleware error in ${t}:`,e)}fe.delete(t),"function"==typeof s?a.value=B(a.value,s):i!==s&&(a.value=s,a.listeners.forEach((e=>e())),ce(`${e}.${n}`,s),ue(`${e}.${n}`,(()=>{})),a?.persist&&(a?.encrypt?q(t,s):J(t,s)))}};return{useState:()=>ne.useSyncExternalStore((e=>(s.listeners.add(e),()=>s.listeners.delete(e))),(()=>s.value)),set:async(r,n=!1)=>{const o=s.value,c="function"==typeof r?r(o):r;if(n)return s.value=c,s.listeners.forEach((e=>e())),void ce(`${e}.${t}`,c);pe.set(a,c),_e||(_e=!0,s.frameSync&&H?.requestAnimationFrame?await new Promise((e=>H.requestAnimationFrame((()=>e(i()))))):await i())},undo:()=>{de[a]?.past.length&&(de[a].future.unshift(de[a].present),de[a].present=de[a].past.pop(),s.value=de[a].present,s.listeners.forEach((e=>e())),(e=>{if(ae[e]>0)ae[e]--,oe[e][ae[e]]})(a),ce(`${e}.undo`,de[a].present))},redo:()=>{de[a]?.future.length&&(de[a].past.push(de[a].present),de[a].present=de[a].future.shift(),s.value=de[a].present,s.listeners.forEach((e=>e())),(e=>{if(ae[e]<oe[e]?.length-1)ae[e]++,oe[e][ae[e]]})(a),ce(`${e}.redo`,de[a].present))},clear:()=>{s.value=r,le.clear(),Object.keys(de).forEach((e=>delete de[e])),ce(`${e}.clear`,r)}}}),be=e=>{const r=t(null);return r.current||(r.current=e()),r.current},me=async(e,t,r,n)=>{const o=e.useState(),a=t(o);e.set(a);try{await r()}catch(t){console.error("API request failed:",t),e.set(n?n(o):o)}},Se=(e,t)=>({...e,...t,lastUpdated:Date.now()}),ge=(e,t)=>{const r=t.useState(),n=Se(r,e);t.set(n)},ve=(e,t)=>()=>{const r=e.map((e=>e.useState()));return t(...r)};export{ve as derivedState,Se as mergeCRDT,me as optimisticUpdate,X as restoreEncryptedState,W as restoreState,q as saveEncryptedState,J as saveState,ge as syncCRDT,he as useSlice,ye as useStateGlobal,be as useStore};
19
+ */var ne=(te||(te=1,"production"===process.env.NODE_ENV?Q.exports=function(){if(Y)return Z;Y=1;var t=e,r="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},n=t.useState,o=t.useEffect,a=t.useLayoutEffect,s=t.useDebugValue;function i(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!r(e,n)}catch{return!0}}var c=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?function(e,t){return t()}:function(e,t){var r=t(),c=n({inst:{value:r,getSnapshot:t}}),u=c[0].inst,f=c[1];return a((function(){u.value=r,u.getSnapshot=t,i(u)&&f({inst:u})}),[e,r,t]),o((function(){return i(u)&&f({inst:u}),e((function(){i(u)&&f({inst:u})}))}),[e]),s(r),r};return Z.useSyncExternalStore=void 0!==t.useSyncExternalStore?t.useSyncExternalStore:c,Z}():Q.exports=(ee||(ee=1,"production"!==process.env.NODE_ENV&&function(){function t(e){var t=e.getSnapshot;e=e.value;try{var r=t();return!n(e,r)}catch{return!0}}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var r=e,n="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},o=r.useState,a=r.useEffect,s=r.useLayoutEffect,i=r.useDebugValue,c=!1,u=!1,f=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?function(e,t){return t()}:function(e,f){c||void 0===r.startTransition||(c=!0,console.error("You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."));var l=f();if(!u){var p=f();n(l,p)||(console.error("The result of getSnapshot should be cached to avoid an infinite loop"),u=!0)}var d=(p=o({inst:{value:l,getSnapshot:f}}))[0].inst,_=p[1];return s((function(){d.value=l,d.getSnapshot=f,t(d)&&_({inst:d})}),[e,l,f]),a((function(){return t(d)&&_({inst:d}),e((function(){t(d)&&_({inst:d})}))}),[e]),i(l),l};re.useSyncExternalStore=void 0!==r.useSyncExternalStore?r.useSyncExternalStore:f,typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())}()),re)),Q.exports);const oe={},ae={},se={},ie=H.__STATE_JET_DEVTOOLS__,ce=(e,t)=>{oe[e]||(oe[e]=[]),void 0===ae[e]&&(ae[e]=-1),oe[e]=oe[e].slice(0,ae[e]+1),oe[e].push(t),ae[e]++,ie?.updateState&&ie.updateState(e,t,[...oe[e]])},ue=(e,t)=>{se[e]||(se[e]=[]);const r=performance.now();t();const n=performance.now()-r;se[e].push(n),ie?.updatePerformance&&ie.updatePerformance(e,n)},fe=new Set,le=new Map,pe=new Map,de={};let _e=!1;const ye=(e,t,r)=>he("global")(e,t,r),he=e=>(le.has(e)||le.set(e,{}),(t,r,n)=>{const o=le.get(e),a=`${e}:${t}`;if(!o[t]){let e=r;n?.persist&&(e=n?.encrypt?X(a,r):W(a,r)),o[t]={value:e,listeners:new Set,...n}}const s=o[t],i=async()=>{_e=!1;const e=Array.from(pe.entries());pe.clear();for(const[t,r]of e){const[e,n]=t.split(":"),o=le.get(e);if(!o)continue;const a=o[n];if(!a)continue;if(fe.has(t)){console.warn(`[state-jet] Skipping recursive middleware for: ${t}`);continue}let s=r;const i=a.value;if(de[t]||(de[t]={past:[],present:i,future:[]}),de[t].past.push(i),de[t].present=s,de[t].future=[],fe.add(t),a?.middleware)for(const e of a.middleware)try{console.log(`[state-jet] Running middleware for ${t}`);const r=e(t,i,s,(e=>{s=e}));if(void 0!==r)if(r instanceof Promise){const e=await r;void 0!==e&&(s=e)}else s=r}catch(e){console.error(`[state-jet] Middleware error in ${t}:`,e)}fe.delete(t),"function"==typeof s?a.value=B(a.value,s):i!==s&&(a.value=s,a.listeners.forEach((e=>e())),ce(`${e}.${n}`,s),ue(`${e}.${n}`,(()=>{})),a?.persist&&(a?.encrypt?q(t,s):J(t,s)))}};return{useState:()=>ne.useSyncExternalStore((e=>(s.listeners.add(e),()=>s.listeners.delete(e))),(()=>s.value)),set:async(r,n=!1)=>{const o=s.value,c="function"==typeof r?r(o):r;if(n)return s.value=c,s.listeners.forEach((e=>e())),void ce(`${e}.${t}`,c);pe.set(a,c),_e||(_e=!0,s.frameSync&&H?.requestAnimationFrame?await new Promise((e=>H.requestAnimationFrame((()=>e(i()))))):await i())},get:()=>s.value,undo:()=>{de[a]?.past.length&&(de[a].future.unshift(de[a].present),de[a].present=de[a].past.pop(),s.value=de[a].present,s.listeners.forEach((e=>e())),(e=>{if(ae[e]>0)ae[e]--,oe[e][ae[e]]})(a),ce(`${e}.undo`,de[a].present))},redo:()=>{de[a]?.future.length&&(de[a].past.push(de[a].present),de[a].present=de[a].future.shift(),s.value=de[a].present,s.listeners.forEach((e=>e())),(e=>{if(ae[e]<oe[e]?.length-1)ae[e]++,oe[e][ae[e]]})(a),ce(`${e}.redo`,de[a].present))},clear:()=>{s.value=r,le.clear(),Object.keys(de).forEach((e=>delete de[e])),ce(`${e}.clear`,r)}}}),be=e=>{const r=t(null);return r.current||(r.current=e()),r.current},me=async(e,t,r,n)=>{const o=e.useState(),a=t(o);e.set(a);try{await r()}catch(t){console.error("API request failed:",t),e.set(n?n(o):o)}},Se=(e,t)=>({...e,...t,lastUpdated:Date.now()}),ge=(e,t)=>{const r=t.useState(),n=Se(r,e);t.set(n)},ve=(e,t)=>()=>{const r=e.map((e=>e.useState()));return t(...r)};export{ve as derivedState,Se as mergeCRDT,me as optimisticUpdate,X as restoreEncryptedState,W as restoreState,q as saveEncryptedState,J as saveState,ge as syncCRDT,he as useSlice,ye as useStateGlobal,be as useStore};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "state-jet",
3
- "version": "2.0.11",
3
+ "version": "2.0.13",
4
4
  "description": "Ultra-lightweight global state management for React",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",