dev-react-microstore 1.1.2 → 1.1.3

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.js CHANGED
@@ -1 +1 @@
1
- "use strict";var h=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames,P=Object.getOwnPropertySymbols;var I=Object.prototype.hasOwnProperty,V=Object.prototype.propertyIsEnumerable;var v=(r,e,t)=>e in r?h(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,j=(r,e)=>{for(var t in e||(e={}))I.call(e,t)&&v(r,t,e[t]);if(P)for(var t of P(e))V.call(e,t)&&v(r,t,e[t]);return r};var C=(r,e)=>{for(var t in e)h(r,t,{get:e[t],enumerable:!0})},F=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of z(e))!I.call(r,o)&&o!==t&&h(r,o,{get:()=>e[o],enumerable:!(s=R(e,o))||s.enumerable});return r};var O=r=>F(h({},"__esModule",{value:!0}),r);var A={};C(A,{createStoreState:()=>w,useStoreSelector:()=>N});module.exports=O(A);var y=require("react");function w(r){let e=r,t=new Map;return{get:()=>e,set:n=>{var i;if(n==null||typeof n!="object"||Array.isArray(n)){console.error(`set() called with invalid value: ${n===null?"null":n===void 0?"undefined":typeof n}`);return}let u=!1,c=[];for(let S in n)if(Object.prototype.hasOwnProperty.call(n,S)){let d=S;d in e&&!Object.is(e[d],n[d])&&(u=!0,c.push(d))}if(u){e=j(j({},e),n);for(let S of c)(i=t.get(S))==null||i.forEach(d=>d())}},subscribe:(n,u)=>{for(let c of n)t.has(c)||t.set(c,new Set),t.get(c).add(u);return()=>{var c;for(let i of n)(c=t.get(i))==null||c.delete(u)}},select:n=>{let u={},c=e;for(let i of n)u[i]=c[i];return u}}}function E(r,e){return r.length===e.length&&r.every((t,s)=>t===e[s])}function L(r,e,t){let s={};for(let{key:o,compare:p}of t){let T=e[o],n=r[o],u=T===void 0?!0:p?p(T,n):!Object.is(T,n);s[o]=u?n:T}return s}function N(r,e){let t=(0,y.useRef)(r.get()),s=(0,y.useRef)({}),o=(0,y.useRef)(null),p=(0,y.useRef)(null),T=(0,y.useRef)(null),n=(0,y.useRef)(!0);if(!o.current||!E(o.current,e)){let l=[],f=[];for(let a of e)if(typeof a=="string"){let b=a;l.push({key:b}),f.push(b)}else for(let[b,m]of Object.entries(a)){let k=b;l.push({key:k,compare:m}),f.push(k)}p.current=l,T.current=f,o.current=e}let u=p.current,c=T.current,i=()=>{let l=r.get(),f=t.current,a=n.current;return(a||u.some(({key:m,compare:k})=>{var x;let K=f[m],g=l[m];return(x=k==null?void 0:k(K,g))!=null?x:!Object.is(K,g)}))&&(a&&(n.current=!1),t.current=l,s.current=L(l,s.current,u)),s.current},S=(()=>{let l=r.get();return c.reduce((f,a)=>(f[a]=l[a],f),{})})();return(0,y.useSyncExternalStore)(l=>r.subscribe(c,l),i,()=>S)}0&&(module.exports={createStoreState,useStoreSelector});
1
+ "use strict";var m=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var g=(n,e)=>{for(var t in e)m(n,t,{get:e[t],enumerable:!0})},v=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of j(e))!P.call(n,c)&&c!==t&&m(n,c,{get:()=>e[c],enumerable:!(i=h(e,c))||i.enumerable});return n};var I=n=>v(m({},"__esModule",{value:!0}),n);var F={};g(F,{createStoreState:()=>R,useStoreSelector:()=>C});module.exports=I(F);var y=require("react");function R(n){let e=n,t=new Map;return{get:()=>e,set:o=>{var s;let r=[];for(let u in o){let d=u;Object.is(e[d],o[d])||r.push(d)}if(r.length!==0){for(let u in o)e[u]=o[u];for(let u of r)(s=t.get(u))==null||s.forEach(d=>d())}},subscribe:(o,r)=>{for(let s of o)t.has(s)||t.set(s,new Set),t.get(s).add(r);return()=>{var s;for(let u of o)(s=t.get(u))==null||s.delete(r)}},select:o=>{let r={},s=e;for(let u of o)r[u]=s[u];return r}}}function V(n,e){return n.length===e.length&&n.every((t,i)=>t===e[i])}function z(n,e,t){let i={};for(let{key:c,compare:p}of t){let f=e[c],o=n[c],r=f===void 0?!0:p?p(f,o):!Object.is(f,o);i[c]=r?o:f}return i}function C(n,e){let t=(0,y.useRef)({}),i=(0,y.useRef)(null),c=(0,y.useRef)(null),p=(0,y.useRef)(null),f=(0,y.useRef)(!0),o=(0,y.useRef)({});if(!i.current||!V(i.current,e)){let a=[],T=[];for(let S of e)if(typeof S=="string"){let l=S;a.push({key:l}),T.push(l)}else for(let[l,b]of Object.entries(S)){let k=l;a.push({key:k,compare:b}),T.push(k)}c.current=a,p.current=T,i.current=e}let r=c.current,s=p.current,u=()=>{let a=n.get(),T=f.current;if(!(T||r.some(({key:l,compare:b})=>{var K;let k=o.current[l],x=a[l];return k===void 0?!0:(K=b==null?void 0:b(k,x))!=null?K:!Object.is(k,x)})))return t.current;T&&(f.current=!1);for(let{key:l}of r)o.current[l]=a[l];return t.current=z(a,t.current,r),t.current},d=(()=>{let a=n.get();return s.reduce((T,S)=>(T[S]=a[S],T),{})})();return(0,y.useSyncExternalStore)(a=>n.subscribe(s,a),u,()=>d)}0&&(module.exports={createStoreState,useStoreSelector});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var v=Object.defineProperty;var x=Object.getOwnPropertySymbols;var I=Object.prototype.hasOwnProperty,R=Object.prototype.propertyIsEnumerable;var P=(n,e,t)=>e in n?v(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,h=(n,e)=>{for(var t in e||(e={}))I.call(e,t)&&P(n,t,e[t]);if(x)for(var t of x(e))R.call(e,t)&&P(n,t,e[t]);return n};import{useRef as k,useSyncExternalStore as z}from"react";function w(n){let e=n,t=new Map;return{get:()=>e,set:r=>{var l;if(r==null||typeof r!="object"||Array.isArray(r)){console.error(`set() called with invalid value: ${r===null?"null":r===void 0?"undefined":typeof r}`);return}let c=!1,o=[];for(let p in r)if(Object.prototype.hasOwnProperty.call(r,p)){let f=p;f in e&&!Object.is(e[f],r[f])&&(c=!0,o.push(f))}if(c){e=h(h({},e),r);for(let p of o)(l=t.get(p))==null||l.forEach(f=>f())}},subscribe:(r,c)=>{for(let o of r)t.has(o)||t.set(o,new Set),t.get(o).add(c);return()=>{var o;for(let l of r)(o=t.get(l))==null||o.delete(c)}},select:r=>{let c={},o=e;for(let l of r)c[l]=o[l];return c}}}function V(n,e){return n.length===e.length&&n.every((t,u)=>t===e[u])}function C(n,e,t){let u={};for(let{key:a,compare:d}of t){let y=e[a],r=n[a],c=y===void 0?!0:d?d(y,r):!Object.is(y,r);u[a]=c?r:y}return u}function E(n,e){let t=k(n.get()),u=k({}),a=k(null),d=k(null),y=k(null),r=k(!0);if(!a.current||!V(a.current,e)){let s=[],T=[];for(let i of e)if(typeof i=="string"){let b=i;s.push({key:b}),T.push(b)}else for(let[b,m]of Object.entries(i)){let S=b;s.push({key:S,compare:m}),T.push(S)}d.current=s,y.current=T,a.current=e}let c=d.current,o=y.current,l=()=>{let s=n.get(),T=t.current,i=r.current;return(i||c.some(({key:m,compare:S})=>{var g;let j=T[m],K=s[m];return(g=S==null?void 0:S(j,K))!=null?g:!Object.is(j,K)}))&&(i&&(r.current=!1),t.current=s,u.current=C(s,u.current,c)),u.current},p=(()=>{let s=n.get();return o.reduce((T,i)=>(T[i]=s[i],T),{})})();return z(s=>n.subscribe(o,s),l,()=>p)}export{w as createStoreState,E as useStoreSelector};
1
+ import{useRef as k,useSyncExternalStore as K}from"react";function v(u){let r=u,n=new Map;return{get:()=>r,set:e=>{var o;let t=[];for(let s in e){let f=s;Object.is(r[f],e[f])||t.push(f)}if(t.length!==0){for(let s in e)r[s]=e[s];for(let s of t)(o=n.get(s))==null||o.forEach(f=>f())}},subscribe:(e,t)=>{for(let o of e)n.has(o)||n.set(o,new Set),n.get(o).add(t);return()=>{var o;for(let s of e)(o=n.get(s))==null||o.delete(t)}},select:e=>{let t={},o=r;for(let s of e)t[s]=o[s];return t}}}function h(u,r){return u.length===r.length&&u.every((n,a)=>n===r[a])}function j(u,r,n){let a={};for(let{key:y,compare:S}of n){let T=r[y],e=u[y],t=T===void 0?!0:S?S(T,e):!Object.is(T,e);a[y]=t?e:T}return a}function I(u,r){let n=k({}),a=k(null),y=k(null),S=k(null),T=k(!0),e=k({});if(!a.current||!h(a.current,r)){let c=[],l=[];for(let d of r)if(typeof d=="string"){let i=d;c.push({key:i}),l.push(i)}else for(let[i,b]of Object.entries(d)){let p=i;c.push({key:p,compare:b}),l.push(p)}y.current=c,S.current=l,a.current=r}let t=y.current,o=S.current,s=()=>{let c=u.get(),l=T.current;if(!(l||t.some(({key:i,compare:b})=>{var x;let p=e.current[i],m=c[i];return p===void 0?!0:(x=b==null?void 0:b(p,m))!=null?x:!Object.is(p,m)})))return n.current;l&&(T.current=!1);for(let{key:i}of t)e.current[i]=c[i];return n.current=j(c,n.current,t),n.current},f=(()=>{let c=u.get();return o.reduce((l,d)=>(l[d]=c[d],l),{})})();return K(c=>u.subscribe(o,c),s,()=>f)}export{v as createStoreState,I as useStoreSelector};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dev-react-microstore",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "A minimal global state manager for React with fine-grained subscriptions.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -5,34 +5,26 @@ type StoreListener = () => void;
5
5
 
6
6
  export function createStoreState<T extends object>(initialState: T) {
7
7
  let state = initialState;
8
-
9
- // Map from key to set of subscribers interested in that key
8
+
10
9
  const keyListeners = new Map<keyof T, Set<StoreListener>>();
11
10
 
12
11
  const get = () => state;
13
12
 
14
13
  const set = (next: Partial<T>) => {
15
- if (next === null || next === undefined || typeof next !== 'object' || Array.isArray(next)) {
16
- console.error(`set() called with invalid value: ${next === null ? 'null' : next === undefined ? 'undefined' : typeof next}`);
17
- return;
18
- }
19
-
20
- let changed = false;
21
14
  const updatedKeys: (keyof T)[] = [];
22
15
 
23
16
  for (const key in next) {
24
- if (Object.prototype.hasOwnProperty.call(next, key)) {
25
- const typedKey = key as keyof T;
26
- if (typedKey in state && !Object.is(state[typedKey], next[typedKey])) {
27
- changed = true;
28
- updatedKeys.push(typedKey);
29
- }
17
+ const typedKey = key as keyof T;
18
+ if (!Object.is(state[typedKey], next[typedKey])) {
19
+ updatedKeys.push(typedKey);
30
20
  }
31
21
  }
32
22
 
33
- if (!changed) return;
23
+ if (updatedKeys.length === 0) return;
34
24
 
35
- state = { ...state, ...next };
25
+ for (const key in next) {
26
+ state[key as keyof T] = next[key as keyof T]!;
27
+ }
36
28
 
37
29
  for (const key of updatedKeys) {
38
30
  keyListeners.get(key)?.forEach(listener => listener());
@@ -89,7 +81,6 @@ type NormalizedSelector<T extends object> = {
89
81
  compare?: CompareFn<T[keyof T]>;
90
82
  };
91
83
 
92
- // Helper functions for useStoreSelector
93
84
  function shallowEqualSelector<T extends object>(
94
85
  a: SelectorInput<T>,
95
86
  b: SelectorInput<T>
@@ -116,12 +107,12 @@ export function useStoreSelector<T extends object, S extends SelectorInput<T>>(
116
107
  store: StoreType<T>,
117
108
  selector: S
118
109
  ): Picked<T, S> {
119
- const lastState = useRef(store.get());
120
110
  const lastSelected = useRef<Partial<T>>({});
121
111
  const prevSelector = useRef<SelectorInput<T> | null>(null);
122
112
  const normalizedRef = useRef<NormalizedSelector<T>[] | null>(null);
123
113
  const keysRef = useRef<(keyof T)[] | null>(null);
124
114
  const isFirstRunRef = useRef(true);
115
+ const lastValues = useRef<Partial<T>>({});
125
116
 
126
117
  if (!prevSelector.current || !shallowEqualSelector(prevSelector.current, selector)) {
127
118
  const normalized: NormalizedSelector<T>[] = [];
@@ -151,14 +142,12 @@ export function useStoreSelector<T extends object, S extends SelectorInput<T>>(
151
142
 
152
143
  const getSnapshot = () => {
153
144
  const current = store.get();
154
- const prev = lastState.current;
155
-
156
145
  const isFirstRun = isFirstRunRef.current;
157
146
 
158
147
  const changed = isFirstRun || normalized.some(({ key, compare }) => {
159
- const prevVal = prev[key];
148
+ const prevVal = lastValues.current[key];
160
149
  const nextVal = current[key];
161
- return compare?.(prevVal, nextVal) ?? !Object.is(prevVal, nextVal);
150
+ return prevVal === undefined ? true : (compare?.(prevVal, nextVal) ?? !Object.is(prevVal, nextVal));
162
151
  });
163
152
 
164
153
  if (!changed) {
@@ -169,7 +158,10 @@ export function useStoreSelector<T extends object, S extends SelectorInput<T>>(
169
158
  isFirstRunRef.current = false;
170
159
  }
171
160
 
172
- lastState.current = current;
161
+ for (const { key } of normalized) {
162
+ lastValues.current[key] = current[key];
163
+ }
164
+
173
165
  lastSelected.current = pickKeys(current, lastSelected.current, normalized);
174
166
  return lastSelected.current as Picked<T, S>;
175
167
  };