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