@yakocloud/state-vocab 3.0.4 → 3.0.6
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/state-vocab.cjs.js +3 -3
- package/dist/state-vocab.es.js +150 -141
- package/dist/types/state.types.d.ts +1 -0
- package/dist/types/store.d.ts +17 -0
- package/package.json +1 -2
package/dist/state-vocab.cjs.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
2
|
-
`),
|
|
3
|
-
`),...i,
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("react"),_=Symbol("state-def"),k=Symbol("state-path"),R=Symbol("state-verbose"),x=Symbol("state-verbose-path"),L=Symbol("state-ssr");function z(e,n,t){if(!n)return e;const i=n.split(".");let o=e;for(const c of i)if(o!==null&&typeof o=="object"&&c in o)o=o[c];else return t;return o===void 0?t:o}function F(e,n,t){const i=n.replace(/\[(\d+)\]/g,".$1").split(".");let o=e;for(let c=0;c<i.length-1;c++){const l=i[c],s=i[c+1];(o[l]===void 0||o[l]===null)&&(o[l]=/^\d+$/.test(s)?[]:{}),o=o[l]}return o[i[i.length-1]]=t,e}function J(e,n=0){let t;return function(...i){t!==void 0&&clearTimeout(t),t=setTimeout(()=>{t=void 0,e.apply(this,i)},n)}}function H(e,n,t=[]){return S.useMemo(()=>J(e,n),t)}function M(e){const n=JSON.stringify(e,null,2).split(`
|
|
2
|
+
`),t=[],i=[];for(const o of n){const c=o.match(/^(\s*)"([^"]+)"(\s*:\s*)(.+)$/);if(c){const[,l,s,p,g]=c;t.push(`${l}%c"${s}"%c${p}%c${g}`),i.push("color: #9cdcfe; font-weight: bold","color: #cccccc","color: #ce9178")}else t.push(`%c${o}`),i.push("color: #cccccc")}console.log(t.join(`
|
|
3
|
+
`),...i,e)}const N=e=>typeof e=="function",K=e=>typeof e=="function",T=e=>typeof e<"u",A=e=>K(e)?e():e;class O{#e;#t;constructor(){this.#e={},this.#t=new Set}subscribe(n){return this.#t.add(n),()=>this.#t.delete(n)}getClientSnapshot(){return this.#e}getServerSnapshot(){return this.#e}get(n){return z(this.#e,n)}set(n,t){const i=z(this.#e,n),o=N(t)?t(i):t,c={...this.#e};F(c,n,o),this.#e=c,this.#t.forEach(l=>l())}}let j;typeof window>"u"&&(j=new AsyncLocalStorage);const W=()=>{const e=j.getStore();if(!e)throw new Error(`${O.name} must be initialized for this request`);return e};let C=null;const G=()=>(C||(C=new O),C),Q=()=>typeof window>"u"?W():G(),D=typeof window>"u",U=D?S.useEffect:S.useLayoutEffect;function X(e={}){return{[_]:!0,[k]:"",[R]:!1,[x]:"",[L]:!1,useState(n){const t=D?void 0:A(e.storage),i=A(e.defaultValue),o=e.bidirectional;n??={};const c=A(n.defaultValue)??i,l=n.bidirectional??o,s=this[k],p=this[R],g=this[x],V=this[L],u=Q(),a=e.serialize??JSON.stringify,b=e.deserialize??JSON.parse,d=(r,h,P)=>{const w=h.getItem(r);w===null?T(P)&&h.setItem(r,a(P)):u.set(r,b(w))},f=H(n.onSet??(()=>{}),n.delayedSet,[]),y=S.useRef(void 0),$=S.useRef(!1);if(!$.current){$.current=!0;let r=u.get(s);T(r)||(r=c,T(r)&&u.set(s,r)),!V&&t&&d(s,t,r)}const E=S.useSyncExternalStore(u.subscribe.bind(u),u.getClientSnapshot.bind(u),u.getServerSnapshot.bind(u));if(p)if(g){const r=z(E,g);r&&M(r)}else M(E);const m=z(E,s,c);y.current=m,U(()=>{!V||!t||d(s,t,m)},[]);const v=S.useEffectEvent(r=>{if(r.key!==s)return;const h=r.newValue,w=(h===null?null:b(h))??c;T(w)&&(u.set(s,w),f(w,y.current))});S.useEffect(()=>{if(l)return window.addEventListener("storage",v),()=>window.removeEventListener("storage",v)},[l]);const I=S.useCallback(r=>{const h=N(r)?r(y.current):r;u.set(s,h),f(h,y.current),t&&t.setItem(s,a(h))},[s,t,f]),B=S.useCallback(()=>{const r=c;if(!T(r)){t?.removeItem(s);return}u.set(s,r),f(r,y.current),t&&t.setItem(s,a(r))},[s,c,t,f]);return[m,I,B]},toString(){return this[k]}}}function q(e,n){const{path:t="",verbose:i,verbosePath:o,ssr:c,cache:l}=n;let s=l.proxy.get(e);s||(s=new Map,l.proxy.set(e,s));const p=s.get(t);if(p)return p;const g=new Proxy(e,{get(V,u){const a=V[u],b=t?`${t}.${String(u)}`:String(u);if(a&&typeof a=="object"&&_ in a){const d=a;let f=l.leaf.get(d);f||(f=new Map,l.leaf.set(d,f));const y=f.get(b);if(y)return y;const $=Reflect.ownKeys(d).filter(v=>typeof d[v]=="function"),E=Object.fromEntries($.map(v=>[v,(...I)=>d[v].call({...d,[k]:b,[R]:i,[x]:o,[L]:c},...I)])),m={...d,...E};return f.set(b,m),m}return a&&typeof a=="object"?q(a,{...n,path:b}):a}});return s.set(t,g),g}function Y(e,n){return q(e,{...n,verbosePath:n?.verbosePath??"",cache:{proxy:new WeakMap,leaf:new WeakMap}})}exports.defineState=X;exports.setupStorage=Y;
|
package/dist/state-vocab.es.js
CHANGED
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
import { useMemo as
|
|
2
|
-
const
|
|
3
|
-
function
|
|
4
|
-
if (!
|
|
5
|
-
return
|
|
6
|
-
const i =
|
|
7
|
-
let o =
|
|
8
|
-
for (const
|
|
9
|
-
if (o !== null && typeof o == "object" &&
|
|
10
|
-
o = o[
|
|
1
|
+
import { useMemo as H, useRef as L, useSyncExternalStore as K, useEffect as N, useLayoutEffect as W, useEffectEvent as G, useCallback as _ } from "react";
|
|
2
|
+
const D = Symbol("state-def"), $ = Symbol("state-path"), P = Symbol("state-verbose"), C = Symbol("state-verbose-path"), R = Symbol("state-ssr");
|
|
3
|
+
function z(e, n, t) {
|
|
4
|
+
if (!n)
|
|
5
|
+
return e;
|
|
6
|
+
const i = n.split(".");
|
|
7
|
+
let o = e;
|
|
8
|
+
for (const c of i)
|
|
9
|
+
if (o !== null && typeof o == "object" && c in o)
|
|
10
|
+
o = o[c];
|
|
11
11
|
else
|
|
12
|
-
return
|
|
13
|
-
return o === void 0 ?
|
|
12
|
+
return t;
|
|
13
|
+
return o === void 0 ? t : o;
|
|
14
14
|
}
|
|
15
|
-
function
|
|
16
|
-
const i =
|
|
17
|
-
let o =
|
|
18
|
-
for (let
|
|
19
|
-
const
|
|
20
|
-
(o[
|
|
15
|
+
function Q(e, n, t) {
|
|
16
|
+
const i = n.replace(/\[(\d+)\]/g, ".$1").split(".");
|
|
17
|
+
let o = e;
|
|
18
|
+
for (let c = 0; c < i.length - 1; c++) {
|
|
19
|
+
const l = i[c], s = i[c + 1];
|
|
20
|
+
(o[l] === void 0 || o[l] === null) && (o[l] = /^\d+$/.test(s) ? [] : {}), o = o[l];
|
|
21
21
|
}
|
|
22
|
-
return o[i[i.length - 1]] =
|
|
22
|
+
return o[i[i.length - 1]] = t, e;
|
|
23
23
|
}
|
|
24
|
-
function
|
|
25
|
-
let
|
|
24
|
+
function U(e, n = 0) {
|
|
25
|
+
let t;
|
|
26
26
|
return function(...i) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
},
|
|
27
|
+
t !== void 0 && clearTimeout(t), t = setTimeout(() => {
|
|
28
|
+
t = void 0, e.apply(this, i);
|
|
29
|
+
}, n);
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
|
-
function
|
|
33
|
-
return
|
|
34
|
-
() =>
|
|
32
|
+
function X(e, n, t = []) {
|
|
33
|
+
return H(
|
|
34
|
+
() => U(e, n),
|
|
35
35
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
|
-
|
|
36
|
+
t
|
|
37
37
|
);
|
|
38
38
|
}
|
|
39
|
-
function
|
|
40
|
-
const
|
|
41
|
-
`),
|
|
42
|
-
for (const o of
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
45
|
-
const [,
|
|
46
|
-
|
|
39
|
+
function M(e) {
|
|
40
|
+
const n = JSON.stringify(e, null, 2).split(`
|
|
41
|
+
`), t = [], i = [];
|
|
42
|
+
for (const o of n) {
|
|
43
|
+
const c = o.match(/^(\s*)"([^"]+)"(\s*:\s*)(.+)$/);
|
|
44
|
+
if (c) {
|
|
45
|
+
const [, l, s, v, y] = c;
|
|
46
|
+
t.push(`${l}%c"${s}"%c${v}%c${y}`), i.push(
|
|
47
47
|
"color: #9cdcfe; font-weight: bold",
|
|
48
48
|
"color: #cccccc",
|
|
49
49
|
"color: #ce9178"
|
|
50
50
|
);
|
|
51
51
|
} else
|
|
52
|
-
|
|
52
|
+
t.push(`%c${o}`), i.push("color: #cccccc");
|
|
53
53
|
}
|
|
54
|
-
console.log(
|
|
55
|
-
`), ...i,
|
|
54
|
+
console.log(t.join(`
|
|
55
|
+
`), ...i, e);
|
|
56
56
|
}
|
|
57
|
-
const
|
|
58
|
-
class
|
|
57
|
+
const O = (e) => typeof e == "function", Y = (e) => typeof e == "function", E = (e) => typeof e < "u", x = (e) => Y(e) ? e() : e;
|
|
58
|
+
class j {
|
|
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(n) {
|
|
65
|
+
return this.#t.add(n), () => this.#t.delete(n);
|
|
66
66
|
}
|
|
67
67
|
getClientSnapshot() {
|
|
68
68
|
return this.#e;
|
|
@@ -70,146 +70,155 @@ class U {
|
|
|
70
70
|
getServerSnapshot() {
|
|
71
71
|
return this.#e;
|
|
72
72
|
}
|
|
73
|
-
get(
|
|
74
|
-
return
|
|
73
|
+
get(n) {
|
|
74
|
+
return z(this.#e, n);
|
|
75
75
|
}
|
|
76
|
-
set(
|
|
77
|
-
const i =
|
|
78
|
-
|
|
76
|
+
set(n, t) {
|
|
77
|
+
const i = z(this.#e, n), o = O(t) ? t(i) : t, c = { ...this.#e };
|
|
78
|
+
Q(c, n, o), this.#e = c, this.#t.forEach((l) => l());
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
81
|
+
let B;
|
|
82
|
+
typeof window > "u" && (B = new AsyncLocalStorage());
|
|
83
|
+
const Z = () => {
|
|
84
|
+
const e = B.getStore();
|
|
85
|
+
if (!e)
|
|
86
|
+
throw new Error(`${j.name} must be initialized for this request`);
|
|
87
|
+
return e;
|
|
88
|
+
};
|
|
89
|
+
let A = null;
|
|
90
|
+
const ee = () => (A || (A = new j()), A), te = () => typeof window > "u" ? Z() : ee(), F = typeof window > "u", ne = F ? N : W;
|
|
91
|
+
function re(e = {}) {
|
|
86
92
|
return {
|
|
87
|
-
[
|
|
93
|
+
[D]: !0,
|
|
88
94
|
// marks this object as a leaf in the router tree
|
|
89
|
-
[
|
|
95
|
+
[$]: "",
|
|
90
96
|
// placeholder; injected at runtime by injectPaths()
|
|
91
|
-
[
|
|
97
|
+
[P]: !1,
|
|
92
98
|
// placeholder
|
|
93
|
-
[
|
|
99
|
+
[C]: "",
|
|
94
100
|
// placeholder
|
|
95
|
-
[
|
|
101
|
+
[R]: !1,
|
|
96
102
|
// placeholder
|
|
97
|
-
useState(
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
const
|
|
101
|
-
|
|
103
|
+
useState(n) {
|
|
104
|
+
const t = F ? void 0 : x(e.storage), i = x(e.defaultValue), o = e.bidirectional;
|
|
105
|
+
n ??= {};
|
|
106
|
+
const c = x(n.defaultValue) ?? i, l = n.bidirectional ?? o, s = this[$], v = this[P], y = this[C], V = this[R], a = te(), u = e.serialize ?? JSON.stringify, g = e.deserialize ?? JSON.parse, d = (r, h, k) => {
|
|
107
|
+
const m = h.getItem(r);
|
|
108
|
+
m === null ? E(k) && h.setItem(r, u(k)) : a.set(r, g(m));
|
|
109
|
+
}, f = X(
|
|
110
|
+
n.onSet ?? (() => {
|
|
102
111
|
}),
|
|
103
|
-
|
|
112
|
+
n.delayedSet,
|
|
104
113
|
[]
|
|
105
|
-
),
|
|
114
|
+
), S = L(void 0), T = L(!1);
|
|
106
115
|
if (!T.current) {
|
|
107
116
|
T.current = !0;
|
|
108
|
-
let
|
|
109
|
-
E(
|
|
117
|
+
let r = a.get(s);
|
|
118
|
+
E(r) || (r = c, E(r) && a.set(s, r)), !V && t && d(s, t, r);
|
|
110
119
|
}
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
120
|
+
const w = K(
|
|
121
|
+
a.subscribe.bind(a),
|
|
122
|
+
a.getClientSnapshot.bind(a),
|
|
123
|
+
a.getServerSnapshot.bind(a)
|
|
115
124
|
);
|
|
116
|
-
if (
|
|
117
|
-
if (
|
|
118
|
-
const
|
|
119
|
-
|
|
125
|
+
if (v)
|
|
126
|
+
if (y) {
|
|
127
|
+
const r = z(w, y);
|
|
128
|
+
r && M(r);
|
|
120
129
|
} else
|
|
121
|
-
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
!
|
|
130
|
+
M(w);
|
|
131
|
+
const p = z(w, s, c);
|
|
132
|
+
S.current = p, ne(() => {
|
|
133
|
+
!V || !t || d(s, t, p);
|
|
125
134
|
}, []);
|
|
126
|
-
const b =
|
|
127
|
-
if (
|
|
135
|
+
const b = G((r) => {
|
|
136
|
+
if (r.key !== s)
|
|
128
137
|
return;
|
|
129
|
-
const
|
|
130
|
-
E(
|
|
138
|
+
const h = r.newValue, m = (h === null ? null : g(h)) ?? c;
|
|
139
|
+
E(m) && (a.set(s, m), f(m, S.current));
|
|
131
140
|
});
|
|
132
|
-
|
|
133
|
-
if (
|
|
141
|
+
N(() => {
|
|
142
|
+
if (l)
|
|
134
143
|
return window.addEventListener("storage", b), () => window.removeEventListener("storage", b);
|
|
135
|
-
}, [
|
|
136
|
-
const
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
}, [
|
|
140
|
-
const
|
|
141
|
-
if (!E(
|
|
142
|
-
|
|
144
|
+
}, [l]);
|
|
145
|
+
const I = _((r) => {
|
|
146
|
+
const h = O(r) ? r(S.current) : r;
|
|
147
|
+
a.set(s, h), f(h, S.current), t && t.setItem(s, u(h));
|
|
148
|
+
}, [s, t, f]), q = _(() => {
|
|
149
|
+
const r = c;
|
|
150
|
+
if (!E(r)) {
|
|
151
|
+
t?.removeItem(s);
|
|
143
152
|
return;
|
|
144
153
|
}
|
|
145
|
-
|
|
146
|
-
}, [
|
|
154
|
+
a.set(s, r), f(r, S.current), t && t.setItem(s, u(r));
|
|
155
|
+
}, [s, c, t, f]);
|
|
147
156
|
return [
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
157
|
+
p,
|
|
158
|
+
I,
|
|
159
|
+
q
|
|
151
160
|
];
|
|
152
161
|
},
|
|
153
162
|
/** Returns the fully qualified job name (dot-separated path). */
|
|
154
163
|
toString() {
|
|
155
|
-
return this[
|
|
164
|
+
return this[$];
|
|
156
165
|
}
|
|
157
166
|
};
|
|
158
167
|
}
|
|
159
|
-
function
|
|
168
|
+
function J(e, n) {
|
|
160
169
|
const {
|
|
161
|
-
path:
|
|
170
|
+
path: t = "",
|
|
162
171
|
verbose: i,
|
|
163
172
|
verbosePath: o,
|
|
164
|
-
ssr:
|
|
165
|
-
cache:
|
|
166
|
-
} =
|
|
167
|
-
let
|
|
168
|
-
|
|
169
|
-
const
|
|
170
|
-
if (
|
|
171
|
-
return
|
|
172
|
-
const
|
|
173
|
-
get(
|
|
174
|
-
const
|
|
175
|
-
if (
|
|
176
|
-
const
|
|
177
|
-
let
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
if (
|
|
181
|
-
return
|
|
182
|
-
const T = Reflect.ownKeys(
|
|
183
|
-
(b) => typeof
|
|
184
|
-
),
|
|
173
|
+
ssr: c,
|
|
174
|
+
cache: l
|
|
175
|
+
} = n;
|
|
176
|
+
let s = l.proxy.get(e);
|
|
177
|
+
s || (s = /* @__PURE__ */ new Map(), l.proxy.set(e, s));
|
|
178
|
+
const v = s.get(t);
|
|
179
|
+
if (v)
|
|
180
|
+
return v;
|
|
181
|
+
const y = new Proxy(e, {
|
|
182
|
+
get(V, a) {
|
|
183
|
+
const u = V[a], g = t ? `${t}.${String(a)}` : String(a);
|
|
184
|
+
if (u && typeof u == "object" && D in u) {
|
|
185
|
+
const d = u;
|
|
186
|
+
let f = l.leaf.get(d);
|
|
187
|
+
f || (f = /* @__PURE__ */ new Map(), l.leaf.set(d, f));
|
|
188
|
+
const S = f.get(g);
|
|
189
|
+
if (S)
|
|
190
|
+
return S;
|
|
191
|
+
const T = Reflect.ownKeys(d).filter(
|
|
192
|
+
(b) => typeof d[b] == "function"
|
|
193
|
+
), w = Object.fromEntries(
|
|
185
194
|
T.map((b) => [
|
|
186
195
|
b,
|
|
187
|
-
(
|
|
196
|
+
(...I) => d[b].call(
|
|
188
197
|
{
|
|
189
|
-
...
|
|
190
|
-
[
|
|
191
|
-
[
|
|
192
|
-
[
|
|
193
|
-
[
|
|
198
|
+
...d,
|
|
199
|
+
[$]: g,
|
|
200
|
+
[P]: i,
|
|
201
|
+
[C]: o,
|
|
202
|
+
[R]: c
|
|
194
203
|
},
|
|
195
|
-
|
|
204
|
+
...I
|
|
196
205
|
)
|
|
197
206
|
])
|
|
198
|
-
),
|
|
199
|
-
return
|
|
207
|
+
), p = { ...d, ...w };
|
|
208
|
+
return f.set(g, p), p;
|
|
200
209
|
}
|
|
201
|
-
return
|
|
202
|
-
...
|
|
210
|
+
return u && typeof u == "object" ? J(u, {
|
|
211
|
+
...n,
|
|
203
212
|
path: g
|
|
204
|
-
}) :
|
|
213
|
+
}) : u;
|
|
205
214
|
}
|
|
206
215
|
});
|
|
207
|
-
return
|
|
216
|
+
return s.set(t, y), y;
|
|
208
217
|
}
|
|
209
|
-
function
|
|
210
|
-
return
|
|
211
|
-
...
|
|
212
|
-
verbosePath:
|
|
218
|
+
function oe(e, n) {
|
|
219
|
+
return J(e, {
|
|
220
|
+
...n,
|
|
221
|
+
verbosePath: n?.verbosePath ?? "",
|
|
213
222
|
cache: {
|
|
214
223
|
proxy: /* @__PURE__ */ new WeakMap(),
|
|
215
224
|
leaf: /* @__PURE__ */ new WeakMap()
|
|
@@ -217,6 +226,6 @@ function ee(t, e) {
|
|
|
217
226
|
});
|
|
218
227
|
}
|
|
219
228
|
export {
|
|
220
|
-
|
|
221
|
-
|
|
229
|
+
re as defineState,
|
|
230
|
+
oe as setupStorage
|
|
222
231
|
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ValueOrTransformer, Vocab } from "./state.types";
|
|
2
|
+
type Listener = () => void;
|
|
3
|
+
/***
|
|
4
|
+
* https://react.dev/reference/react/useSyncExternalStore
|
|
5
|
+
*/
|
|
6
|
+
declare class VocabStore {
|
|
7
|
+
#private;
|
|
8
|
+
constructor();
|
|
9
|
+
subscribe(listener: Listener): () => boolean;
|
|
10
|
+
getClientSnapshot<V>(): Vocab<V>;
|
|
11
|
+
getServerSnapshot<V>(): Vocab<V>;
|
|
12
|
+
get<V>(statePath: string): V | undefined;
|
|
13
|
+
set<V>(statePath: string, value: ValueOrTransformer<V>): void;
|
|
14
|
+
}
|
|
15
|
+
export declare function runWithStateVocab<T>(fn: () => T): T;
|
|
16
|
+
export declare const getVocabStore: () => VocabStore;
|
|
17
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yakocloud/state-vocab",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.6",
|
|
4
4
|
"main": "dist/state-vocab.cjs.js",
|
|
5
5
|
"module": "dist/state-vocab.es.js",
|
|
6
6
|
"types": "dist/types/index.d.ts",
|
|
@@ -50,7 +50,6 @@
|
|
|
50
50
|
"@testing-library/jest-dom": "^6.9.1",
|
|
51
51
|
"@testing-library/react": "^16.3.2",
|
|
52
52
|
"@types/jest": "^30.0.0",
|
|
53
|
-
"@types/node": "^24.10.1",
|
|
54
53
|
"@types/react": "^19.2.5",
|
|
55
54
|
"@types/react-dom": "^19.2.3",
|
|
56
55
|
"@vitejs/plugin-react": "^5.2.0",
|