@yakocloud/state-vocab 3.0.1 → 3.0.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/README.md CHANGED
@@ -188,6 +188,7 @@ Wraps a nested object of `defineState()` nodes and injects dot-separated paths i
188
188
  | Option | Type | Description | Default |
189
189
  |---|---|---|---|
190
190
  | `verbose` | `boolean \| undefined` | Log current state to the browser console on every change | `false` |
191
+ | `ssr` | `boolean \| undefined` | Defer storage reads until after hydration (Next.js / SSR) | `false` |
191
192
 
192
193
  ```ts
193
194
  const storage = setupStorage({
@@ -207,6 +208,25 @@ Enable verbose logging during development:
207
208
  const storage = setupStorage({ ... }, { verbose: true })
208
209
  ```
209
210
 
211
+ ### SSR / Next.js
212
+
213
+ When using localStorage or sessionStorage in a Next.js app, the server renders with `defaultValue` while the client reads the persisted value — causing a hydration mismatch. Pass `ssr: true` to fix this:
214
+
215
+ ```ts
216
+ // lib/storage.ts
217
+ const storage = setupStorage({
218
+ preference: {
219
+ theme: defineState<Theme>({ storage: localStorage, defaultValue: 'Dark' }),
220
+ },
221
+ }, { ssr: true })
222
+ ```
223
+
224
+ With `ssr: true`:
225
+ - **Server & first client render** — always use `defaultValue`, storage is not read
226
+ - **After hydration** — `useLayoutEffect` fires synchronously before paint, reads storage and updates state
227
+
228
+ This guarantees the server and client produce identical markup, and the value from storage is applied without a visible flash.
229
+
210
230
  ## `useState` Hook
211
231
 
212
232
  Each state node exposes a `.useState()` method that works like React's built-in `useState` but adds persistence and callbacks.
@@ -389,6 +409,7 @@ createRoot(document.getElementById('root')!).render(<Page />)
389
409
  | Option | Type | Default |
390
410
  |---|---|---|
391
411
  | `verbose` | `boolean \| undefined` | `false` |
412
+ | `ssr` | `boolean \| undefined` | `false` |
392
413
 
393
414
  Returns a proxied copy of `tree` with paths injected into all leaf nodes.
394
415
 
@@ -1,3 +1,3 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("react"),M=Symbol("state-def"),w=Symbol("state-path"),$=Symbol("state-verbose");function z(e,t,s){if(!t)return e;const r=t.split(".");let n=e;for(const o of r)if(n!==null&&typeof n=="object"&&o in n)n=n[o];else return s;return n===void 0?s:n}function N(e,t,s){const r=t.replace(/\[(\d+)\]/g,".$1").split(".");let n=e;for(let o=0;o<r.length-1;o++){const a=r[o],g=r[o+1];(n[a]===void 0||n[a]===null)&&(n[a]=/^\d+$/.test(g)?[]:{}),n=n[a]}return n[r[r.length-1]]=s,e}function j(e,t=0){let s;return function(...r){s!==void 0&&clearTimeout(s),s=setTimeout(()=>{s=void 0,e.apply(this,r)},t)}}function A(e,t,s=[]){return S.useMemo(()=>j(e,t),s)}function D(e){const t=JSON.stringify(e,null,2).split(`
2
- `),s=[],r=[];for(const n of t){const o=n.match(/^(\s*)"([^"]+)"(\s*:\s*)(.+)$/);if(o){const[,a,g,u,l]=o;s.push(`${a}%c"${g}"%c${u}%c${l}`),r.push("color: #9cdcfe; font-weight: bold","color: #cccccc","color: #ce9178")}else s.push(`%c${n}`),r.push("color: #cccccc")}console.log(s.join(`
3
- `),...r,e)}const P=e=>typeof e=="function",O=e=>typeof e=="function",p=e=>typeof e<"u",k=e=>O(e)?e():e;class F{#e;#t;constructor(){this.#e={},this.#t=new Set}subscribe(t){return this.#t.add(t),()=>this.#t.delete(t)}getClientSnapshot(){return this.#e}getServerSnapshot(){return this.#e}set(t,s){const r=z(this.#e,t),n=P(s)?s(r):s,o={...this.#e};N(o,t,n),this.#e=o,this.#t.forEach(a=>a())}}function J(e={}){const t=new F;return{[M]:!0,[w]:"",[$]:!1,useState(s){const r=k(e.storage),n=e.serialize??JSON.stringify,o=e.deserialize??JSON.parse,a=k(e.defaultValue),g=e.bidirectional;s??={};const u=k(s.defaultValue)??a,l=s.bidirectional??g,f=A(s.onSet??(()=>{}),s.delayedSet,[]),c=this[w],y=this[$],h=S.useRef(void 0),m=S.useRef(!1);if(!m.current){m.current=!0;let i=z(t.getServerSnapshot(),c);if(!p(i)){if(i=u,r){const d=r.getItem(c);d===null?p(i)&&r.setItem(c,n(i)):i=o(d)}p(i)&&t.set(c,i)}}const V=S.useSyncExternalStore(t.subscribe.bind(t),()=>t.getClientSnapshot(),()=>t.getServerSnapshot());y&&D(V);const v=z(V,c);h.current=v;const b=S.useEffectEvent(i=>{if(i.key!==c)return;const d=i.newValue,T=(d===null?null:o(d))??u;p(T)&&(t.set(c,T),f(T,h.current))});S.useEffect(()=>{if(l)return window.addEventListener("storage",b),()=>window.removeEventListener("storage",b)},[l]);const E=S.useCallback(i=>{const d=P(i)?i(h.current):i;t.set(c,d),f(d,h.current),r&&r.setItem(c,n(d))},[c,r,n,f]),x=S.useCallback(()=>{const i=u;if(!p(i)){r?.removeItem(c);return}t.set(c,i),f(i,h.current),r&&r.setItem(c,n(i))},[c,u,r,n,f]);return[v,E,x]},toString(){return this[w]}}}const C=new WeakMap,I=new WeakMap;function R(e,t){t??={};const{path:s="",verbose:r}=t;let n=C.get(e);n||(n=new Map,C.set(e,n));const o=n.get(s);if(o)return o;const a=new Proxy(e,{get(g,u){const l=g[u],f=s?`${s}.${String(u)}`:String(u);if(l&&typeof l=="object"&&M in l){const c=l;let y=I.get(c);y||(y=new Map,I.set(c,y));const h=y.get(f);if(h)return h;const m=Reflect.ownKeys(c).filter(b=>typeof c[b]=="function"),V=Object.fromEntries(m.map(b=>[b,(...E)=>c[b].call({...c,[w]:f,[$]:r},...E)])),v={...c,...V};return y.set(f,v),v}return l&&typeof l=="object"?R(l,{path:f,verbose:r}):l}});return n.set(s,a),a}function L(e,t){return R(e,t)}exports.defineState=J;exports.setupStorage=L;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react"),R=Symbol("state-def"),T=Symbol("state-path"),z=Symbol("state-verbose"),x=Symbol("state-ssr");function C(t,e,s){if(!e)return t;const o=e.split(".");let c=t;for(const r of o)if(c!==null&&typeof c=="object"&&r in c)c=c[r];else return s;return c===void 0?s:c}function j(t,e,s){const o=e.replace(/\[(\d+)\]/g,".$1").split(".");let c=t;for(let r=0;r<o.length-1;r++){const n=o[r],a=o[r+1];(c[n]===void 0||c[n]===null)&&(c[n]=/^\d+$/.test(a)?[]:{}),c=c[n]}return c[o[o.length-1]]=s,t}function D(t,e=0){let s;return function(...o){s!==void 0&&clearTimeout(s),s=setTimeout(()=>{s=void 0,t.apply(this,o)},e)}}function O(t,e,s=[]){return f.useMemo(()=>D(t,e),s)}function P(t){const e=JSON.stringify(t,null,2).split(`
2
+ `),s=[],o=[];for(const c of e){const r=c.match(/^(\s*)"([^"]+)"(\s*:\s*)(.+)$/);if(r){const[,n,a,d,h]=r;s.push(`${n}%c"${a}"%c${d}%c${h}`),o.push("color: #9cdcfe; font-weight: bold","color: #cccccc","color: #ce9178")}else s.push(`%c${c}`),o.push("color: #cccccc")}console.log(s.join(`
3
+ `),...o,t)}const M=t=>typeof t=="function",_=t=>typeof t=="function",E=t=>typeof t<"u",$=t=>_(t)?t():t,A=typeof window>"u",F=A?f.useEffect:f.useLayoutEffect;class J{#e;#t;constructor(){this.#e={},this.#t=new Set}subscribe(e){return this.#t.add(e),()=>this.#t.delete(e)}getClientSnapshot(){return this.#e}getServerSnapshot(){return this.#e}get(e){return C(this.#e,e)}set(e,s){const o=C(this.#e,e),c=M(s)?s(o):s,r={...this.#e};j(r,e,c),this.#e=r,this.#t.forEach(n=>n())}}function B(t={}){const e=new J,s=t.serialize??JSON.stringify,o=t.deserialize??JSON.parse,c=(r,n,a)=>{const d=n.getItem(r);d===null?E(a)&&n.setItem(r,s(a)):e.set(r,o(d))};return{[R]:!0,[T]:"",[z]:!1,[x]:!1,useState(r){const n=A?void 0:$(t.storage),a=$(t.defaultValue),d=t.bidirectional;r??={};const h=$(r.defaultValue)??a,p=r.bidirectional??d,u=O(r.onSet??(()=>{}),r.delayedSet,[]),i=this[T],S=this[z],y=this[x],g=f.useRef(void 0),w=f.useRef(!1);if(!w.current){w.current=!0;let l=e.get(i);E(l)||(l=h,E(l)&&e.set(i,l)),!y&&n&&c(i,n,l)}const V=f.useSyncExternalStore(e.subscribe.bind(e),e.getClientSnapshot.bind(e),e.getServerSnapshot.bind(e));S&&P(V);const v=C(V,i,h);g.current=v,F(()=>{!y||!n||c(i,n,v)},[]);const b=f.useEffectEvent(l=>{if(l.key!==i)return;const m=l.newValue,I=(m===null?null:o(m))??h;E(I)&&(e.set(i,I),u(I,g.current))});f.useEffect(()=>{if(p)return window.addEventListener("storage",b),()=>window.removeEventListener("storage",b)},[p]);const k=f.useCallback(l=>{const m=M(l)?l(g.current):l;e.set(i,m),u(m,g.current),n&&n.setItem(i,s(m))},[i,n,s,u]),N=f.useCallback(()=>{const l=h;if(!E(l)){n?.removeItem(i);return}e.set(i,l),u(l,g.current),n&&n.setItem(i,s(l))},[i,h,n,s,u]);return[v,k,N]},toString(){return this[T]}}}function L(t,e){const{path:s="",verbose:o,ssr:c,cache:r}=e;let n=r.proxy.get(t);n||(n=new Map,r.proxy.set(t,n));const a=n.get(s);if(a)return a;const d=new Proxy(t,{get(h,p){const u=h[p],i=s?`${s}.${String(p)}`:String(p);if(u&&typeof u=="object"&&R in u){const S=u;let y=r.leaf.get(S);y||(y=new Map,r.leaf.set(S,y));const g=y.get(i);if(g)return g;const w=Reflect.ownKeys(S).filter(b=>typeof S[b]=="function"),V=Object.fromEntries(w.map(b=>[b,(...k)=>S[b].call({...S,[T]:i,[z]:o,[x]:c},...k)])),v={...S,...V};return y.set(i,v),v}return u&&typeof u=="object"?L(u,{...e,path:i}):u}});return n.set(s,d),d}function K(t,e){return L(t,{...e,cache:{proxy:new WeakMap,leaf:new WeakMap}})}exports.defineState=B;exports.setupStorage=K;
@@ -1,68 +1,68 @@
1
- import { useMemo as A, useRef as z, useSyncExternalStore as D, useEffectEvent as j, useEffect as F, useCallback as I } from "react";
2
- const M = Symbol("state-def"), V = Symbol("state-path"), $ = Symbol("state-verbose");
3
- function k(e, t, s) {
4
- if (!t)
5
- return e;
6
- const r = t.split(".");
7
- let n = e;
8
- for (const o of r)
9
- if (n !== null && typeof n == "object" && o in n)
10
- n = n[o];
1
+ import { useMemo as j, useRef as C, useSyncExternalStore as F, useEffect as A, useLayoutEffect as J, useEffectEvent as O, useCallback as R } from "react";
2
+ const L = Symbol("state-def"), V = Symbol("state-path"), k = Symbol("state-verbose"), z = Symbol("state-ssr");
3
+ function x(t, e, n) {
4
+ if (!e)
5
+ return t;
6
+ const o = e.split(".");
7
+ let c = t;
8
+ for (const r of o)
9
+ if (c !== null && typeof c == "object" && r in c)
10
+ c = c[r];
11
11
  else
12
- return s;
13
- return n === void 0 ? s : n;
12
+ return n;
13
+ return c === void 0 ? n : c;
14
14
  }
15
- function J(e, t, s) {
16
- const r = t.replace(/\[(\d+)\]/g, ".$1").split(".");
17
- let n = e;
18
- for (let o = 0; o < r.length - 1; o++) {
19
- const l = r[o], S = r[o + 1];
20
- (n[l] === void 0 || n[l] === null) && (n[l] = /^\d+$/.test(S) ? [] : {}), n = n[l];
15
+ function P(t, e, n) {
16
+ const o = e.replace(/\[(\d+)\]/g, ".$1").split(".");
17
+ let c = t;
18
+ for (let r = 0; r < o.length - 1; r++) {
19
+ const s = o[r], a = o[r + 1];
20
+ (c[s] === void 0 || c[s] === null) && (c[s] = /^\d+$/.test(a) ? [] : {}), c = c[s];
21
21
  }
22
- return n[r[r.length - 1]] = s, e;
22
+ return c[o[o.length - 1]] = n, t;
23
23
  }
24
- function L(e, t = 0) {
25
- let s;
26
- return function(...r) {
27
- s !== void 0 && clearTimeout(s), s = setTimeout(() => {
28
- s = void 0, e.apply(this, r);
29
- }, t);
24
+ function B(t, e = 0) {
25
+ let n;
26
+ return function(...o) {
27
+ n !== void 0 && clearTimeout(n), n = setTimeout(() => {
28
+ n = void 0, t.apply(this, o);
29
+ }, e);
30
30
  };
31
31
  }
32
- function O(e, t, s = []) {
33
- return A(
34
- () => L(e, t),
32
+ function K(t, e, n = []) {
33
+ return j(
34
+ () => B(t, e),
35
35
  // eslint-disable-next-line react-hooks/exhaustive-deps
36
- s
36
+ n
37
37
  );
38
38
  }
39
- function _(e) {
40
- const t = JSON.stringify(e, null, 2).split(`
41
- `), s = [], r = [];
42
- for (const n of t) {
43
- const o = n.match(/^(\s*)"([^"]+)"(\s*:\s*)(.+)$/);
44
- if (o) {
45
- const [, l, S, u, a] = o;
46
- s.push(`${l}%c"${S}"%c${u}%c${a}`), r.push(
39
+ function W(t) {
40
+ const e = JSON.stringify(t, null, 2).split(`
41
+ `), n = [], o = [];
42
+ for (const c of e) {
43
+ const r = c.match(/^(\s*)"([^"]+)"(\s*:\s*)(.+)$/);
44
+ if (r) {
45
+ const [, s, a, f, d] = r;
46
+ n.push(`${s}%c"${a}"%c${f}%c${d}`), o.push(
47
47
  "color: #9cdcfe; font-weight: bold",
48
48
  "color: #cccccc",
49
49
  "color: #ce9178"
50
50
  );
51
51
  } else
52
- s.push(`%c${n}`), r.push("color: #cccccc");
52
+ n.push(`%c${c}`), o.push("color: #cccccc");
53
53
  }
54
- console.log(s.join(`
55
- `), ...r, e);
54
+ console.log(n.join(`
55
+ `), ...o, t);
56
56
  }
57
- const N = (e) => typeof e == "function", B = (e) => typeof e == "function", v = (e) => typeof e < "u", T = (e) => B(e) ? e() : e;
58
- class K {
57
+ const M = (t) => typeof t == "function", H = (t) => typeof t == "function", m = (t) => typeof t < "u", $ = (t) => H(t) ? t() : t, N = typeof window > "u", q = N ? A : J;
58
+ class G {
59
59
  #e;
60
60
  #t;
61
61
  constructor() {
62
62
  this.#e = {}, this.#t = /* @__PURE__ */ new Set();
63
63
  }
64
- subscribe(t) {
65
- return this.#t.add(t), () => this.#t.delete(t);
64
+ subscribe(e) {
65
+ return this.#t.add(e), () => this.#t.delete(e);
66
66
  }
67
67
  getClientSnapshot() {
68
68
  return this.#e;
@@ -70,84 +70,88 @@ class K {
70
70
  getServerSnapshot() {
71
71
  return this.#e;
72
72
  }
73
- set(t, s) {
74
- const r = k(this.#e, t), n = N(s) ? s(r) : s, o = { ...this.#e };
75
- J(o, t, n), this.#e = o, this.#t.forEach((l) => l());
73
+ get(e) {
74
+ return x(this.#e, e);
75
+ }
76
+ set(e, n) {
77
+ const o = x(this.#e, e), c = M(n) ? n(o) : n, r = { ...this.#e };
78
+ P(r, e, c), this.#e = r, this.#t.forEach((s) => s());
76
79
  }
77
80
  }
78
- function q(e = {}) {
79
- const t = new K();
81
+ function X(t = {}) {
82
+ const e = new G(), n = t.serialize ?? JSON.stringify, o = t.deserialize ?? JSON.parse, c = (r, s, a) => {
83
+ const f = s.getItem(r);
84
+ f === null ? m(a) && s.setItem(r, n(a)) : e.set(r, o(f));
85
+ };
80
86
  return {
81
- [M]: !0,
87
+ [L]: !0,
82
88
  // marks this object as a leaf in the router tree
83
89
  [V]: "",
84
90
  // placeholder; injected at runtime by injectPaths()
85
- [$]: !1,
91
+ [k]: !1,
92
+ // placeholder
93
+ [z]: !1,
86
94
  // placeholder
87
- useState(s) {
88
- const r = T(e.storage), n = e.serialize ?? JSON.stringify, o = e.deserialize ?? JSON.parse, l = T(e.defaultValue), S = e.bidirectional;
89
- s ??= {};
90
- const u = T(s.defaultValue) ?? l, a = s.bidirectional ?? S, f = O(
91
- s.onSet ?? (() => {
95
+ useState(r) {
96
+ const s = N ? void 0 : $(t.storage), a = $(t.defaultValue), f = t.bidirectional;
97
+ r ??= {};
98
+ const d = $(r.defaultValue) ?? a, p = r.bidirectional ?? f, u = K(
99
+ r.onSet ?? (() => {
92
100
  }),
93
- s.delayedSet,
101
+ r.delayedSet,
94
102
  []
95
- ), c = this[V], g = this[$], h = z(void 0), b = z(!1);
96
- if (!b.current) {
97
- b.current = !0;
98
- let i = k(t.getServerSnapshot(), c);
99
- if (!v(i)) {
100
- if (i = u, r) {
101
- const d = r.getItem(c);
102
- d === null ? v(i) && r.setItem(c, n(i)) : i = o(d);
103
- }
104
- v(i) && t.set(c, i);
105
- }
103
+ ), i = this[V], h = this[k], y = this[z], S = C(void 0), E = C(!1);
104
+ if (!E.current) {
105
+ E.current = !0;
106
+ let l = e.get(i);
107
+ m(l) || (l = d, m(l) && e.set(i, l)), !y && s && c(i, s, l);
106
108
  }
107
- const m = D(
108
- t.subscribe.bind(t),
109
- () => t.getClientSnapshot(),
110
- () => t.getServerSnapshot()
109
+ const w = F(
110
+ e.subscribe.bind(e),
111
+ e.getClientSnapshot.bind(e),
112
+ e.getServerSnapshot.bind(e)
111
113
  );
112
- g && _(m);
113
- const p = k(m, c);
114
- h.current = p;
115
- const y = j((i) => {
116
- if (i.key !== c)
114
+ h && W(w);
115
+ const b = x(w, i, d);
116
+ S.current = b, q(() => {
117
+ !y || !s || c(i, s, b);
118
+ }, []);
119
+ const g = O((l) => {
120
+ if (l.key !== i)
117
121
  return;
118
- const d = i.newValue, E = (d === null ? null : o(d)) ?? u;
119
- v(E) && (t.set(c, E), f(E, h.current));
122
+ const v = l.newValue, I = (v === null ? null : o(v)) ?? d;
123
+ m(I) && (e.set(i, I), u(I, S.current));
120
124
  });
121
- F(() => {
122
- if (a)
123
- return window.addEventListener("storage", y), () => window.removeEventListener("storage", y);
124
- }, [a]);
125
- const w = I((i) => {
126
- const d = N(i) ? i(h.current) : i;
127
- t.set(c, d), f(d, h.current), r && r.setItem(c, n(d));
125
+ A(() => {
126
+ if (p)
127
+ return window.addEventListener("storage", g), () => window.removeEventListener("storage", g);
128
+ }, [p]);
129
+ const T = R((l) => {
130
+ const v = M(l) ? l(S.current) : l;
131
+ e.set(i, v), u(v, S.current), s && s.setItem(i, n(v));
128
132
  }, [
129
- c,
130
- r,
133
+ i,
134
+ s,
131
135
  n,
132
- f
133
- ]), R = I(() => {
134
- const i = u;
135
- if (!v(i)) {
136
- r?.removeItem(c);
136
+ u
137
+ ]), _ = R(() => {
138
+ const l = d;
139
+ if (!m(l)) {
140
+ s?.removeItem(i);
137
141
  return;
138
142
  }
139
- t.set(c, i), f(i, h.current), r && r.setItem(c, n(i));
143
+ e.set(i, l), u(l, S.current), s && s.setItem(i, n(l));
140
144
  }, [
141
- c,
142
- u,
143
- r,
145
+ i,
146
+ d,
147
+ s,
144
148
  n,
145
- f
149
+ u
146
150
  ]);
147
151
  return [
148
- p,
149
- w,
150
- R
152
+ b,
153
+ T,
154
+ _
151
155
  ];
152
156
  },
153
157
  /** Returns the fully qualified job name (dot-separated path). */
@@ -156,57 +160,64 @@ function q(e = {}) {
156
160
  }
157
161
  };
158
162
  }
159
- const C = /* @__PURE__ */ new WeakMap(), x = /* @__PURE__ */ new WeakMap();
160
- function P(e, t) {
161
- t ??= {};
163
+ function D(t, e) {
162
164
  const {
163
- path: s = "",
164
- verbose: r
165
- } = t;
166
- let n = C.get(e);
167
- n || (n = /* @__PURE__ */ new Map(), C.set(e, n));
168
- const o = n.get(s);
169
- if (o)
170
- return o;
171
- const l = new Proxy(e, {
172
- get(S, u) {
173
- const a = S[u], f = s ? `${s}.${String(u)}` : String(u);
174
- if (a && typeof a == "object" && M in a) {
175
- const c = a;
176
- let g = x.get(c);
177
- g || (g = /* @__PURE__ */ new Map(), x.set(c, g));
178
- const h = g.get(f);
179
- if (h)
180
- return h;
181
- const b = Reflect.ownKeys(c).filter(
182
- (y) => typeof c[y] == "function"
183
- ), m = Object.fromEntries(
184
- b.map((y) => [
185
- y,
186
- (...w) => c[y].call(
165
+ path: n = "",
166
+ verbose: o,
167
+ ssr: c,
168
+ cache: r
169
+ } = e;
170
+ let s = r.proxy.get(t);
171
+ s || (s = /* @__PURE__ */ new Map(), r.proxy.set(t, s));
172
+ const a = s.get(n);
173
+ if (a)
174
+ return a;
175
+ const f = new Proxy(t, {
176
+ get(d, p) {
177
+ const u = d[p], i = n ? `${n}.${String(p)}` : String(p);
178
+ if (u && typeof u == "object" && L in u) {
179
+ const h = u;
180
+ let y = r.leaf.get(h);
181
+ y || (y = /* @__PURE__ */ new Map(), r.leaf.set(h, y));
182
+ const S = y.get(i);
183
+ if (S)
184
+ return S;
185
+ const E = Reflect.ownKeys(h).filter(
186
+ (g) => typeof h[g] == "function"
187
+ ), w = Object.fromEntries(
188
+ E.map((g) => [
189
+ g,
190
+ (...T) => h[g].call(
187
191
  {
188
- ...c,
189
- [V]: f,
190
- [$]: r
192
+ ...h,
193
+ [V]: i,
194
+ [k]: o,
195
+ [z]: c
191
196
  },
192
- ...w
197
+ ...T
193
198
  )
194
199
  ])
195
- ), p = { ...c, ...m };
196
- return g.set(f, p), p;
200
+ ), b = { ...h, ...w };
201
+ return y.set(i, b), b;
197
202
  }
198
- return a && typeof a == "object" ? P(a, {
199
- path: f,
200
- verbose: r
201
- }) : a;
203
+ return u && typeof u == "object" ? D(u, {
204
+ ...e,
205
+ path: i
206
+ }) : u;
202
207
  }
203
208
  });
204
- return n.set(s, l), l;
209
+ return s.set(n, f), f;
205
210
  }
206
- function G(e, t) {
207
- return P(e, t);
211
+ function Y(t, e) {
212
+ return D(t, {
213
+ ...e,
214
+ cache: {
215
+ proxy: /* @__PURE__ */ new WeakMap(),
216
+ leaf: /* @__PURE__ */ new WeakMap()
217
+ }
218
+ });
208
219
  }
209
220
  export {
210
- q as defineState,
211
- G as setupStorage
221
+ X as defineState,
222
+ Y as setupStorage
212
223
  };
@@ -1,3 +1,4 @@
1
1
  export declare const STATE_DEFINITION: unique symbol;
2
2
  export declare const STATE_PATH: unique symbol;
3
3
  export declare const STATE_VERBOSE: unique symbol;
4
+ export declare const STATE_SSR: unique symbol;
@@ -1,2 +1,2 @@
1
1
  export declare const toLocalDatetimeString: (date: Date | null) => string;
2
- export declare const toDateString: (date: Date | null) => string | undefined;
2
+ export declare const toDateString: (date: Date | null) => string;
@@ -1,6 +1,7 @@
1
1
  type InjectPathsOptions = {
2
2
  path: string;
3
3
  verbose: boolean;
4
+ ssr: boolean;
4
5
  };
5
6
  export declare function setupStorage<T extends object>(native: T, options?: Partial<Omit<InjectPathsOptions, "path">>): T;
6
7
  export {};
@@ -1,4 +1,4 @@
1
- import { STATE_DEFINITION, STATE_PATH, STATE_VERBOSE } from "./constants";
1
+ import { STATE_DEFINITION, STATE_PATH, STATE_SSR, STATE_VERBOSE } from "./constants";
2
2
  import type { Deserialize, Serialize, ValueOrFactory, ValueOrTransformer } from "./state.types";
3
3
  export declare function defineState<D>(definitionOptions?: {
4
4
  storage?: ValueOrFactory<Storage>;
@@ -10,9 +10,11 @@ export declare function defineState<D>(definitionOptions?: {
10
10
  [STATE_DEFINITION]: boolean;
11
11
  [STATE_PATH]: string;
12
12
  [STATE_VERBOSE]: boolean;
13
+ [STATE_SSR]: boolean;
13
14
  useState(this: {
14
15
  [STATE_PATH]: string;
15
16
  [STATE_VERBOSE]: boolean;
17
+ [STATE_SSR]: boolean;
16
18
  }, options?: {
17
19
  defaultValue?: ValueOrFactory<D>;
18
20
  delayedSet?: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yakocloud/state-vocab",
3
- "version": "3.0.1",
3
+ "version": "3.0.2",
4
4
  "main": "dist/state-vocab.cjs.js",
5
5
  "module": "dist/state-vocab.es.js",
6
6
  "types": "dist/types/index.d.ts",