cogsbox-state 0.5.49 → 0.5.51
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/CogsState.jsx +186 -178
- package/dist/CogsState.jsx.map +1 -1
- package/package.json +1 -1
package/dist/CogsState.jsx
CHANGED
|
@@ -8,12 +8,12 @@ import { getGlobalStore as o, formRefStore as lt } from "./store.js";
|
|
|
8
8
|
import { useCogsConfig as Vt } from "./CogsStateClient.jsx";
|
|
9
9
|
import tt from "./node_modules/uuid/dist/esm-browser/v4.js";
|
|
10
10
|
function dt(t, a) {
|
|
11
|
-
const f = o.getState().getInitialOptions, g = o.getState().setInitialStateOptions,
|
|
12
|
-
return console.log("setAndMergeOptions", t,
|
|
13
|
-
...
|
|
11
|
+
const f = o.getState().getInitialOptions, g = o.getState().setInitialStateOptions, c = f(t) || {};
|
|
12
|
+
return console.log("setAndMergeOptions", t, c, a), g(t, {
|
|
13
|
+
...c,
|
|
14
14
|
...a
|
|
15
15
|
}), {
|
|
16
|
-
...
|
|
16
|
+
...c,
|
|
17
17
|
...a
|
|
18
18
|
};
|
|
19
19
|
}
|
|
@@ -22,15 +22,23 @@ function ut({
|
|
|
22
22
|
options: a,
|
|
23
23
|
initialOptionsPart: f
|
|
24
24
|
}) {
|
|
25
|
-
const g = et(t) || {},
|
|
25
|
+
const g = et(t) || {}, c = f[t] || {}, p = o.getState().setInitialStateOptions, _ = { ...c, ...g };
|
|
26
26
|
let y = !1;
|
|
27
27
|
if (a)
|
|
28
|
-
for (const
|
|
29
|
-
_.hasOwnProperty(
|
|
28
|
+
for (const s in a)
|
|
29
|
+
_.hasOwnProperty(s) ? (console.log(
|
|
30
|
+
"----------------------------------------",
|
|
31
|
+
s,
|
|
32
|
+
a[s]
|
|
33
|
+
), s == "localStorage" && _[s] && (console.log(
|
|
34
|
+
"localStorage needToAdd",
|
|
35
|
+
s,
|
|
36
|
+
a[s]
|
|
37
|
+
), y = !0, _[s] = a[s])) : (y = !0, console.log(
|
|
30
38
|
"setOptions needToAdd",
|
|
31
|
-
|
|
32
|
-
a[
|
|
33
|
-
), _[
|
|
39
|
+
s,
|
|
40
|
+
a[s]
|
|
41
|
+
), _[s] = a[s]);
|
|
34
42
|
return y && p(t, _), _;
|
|
35
43
|
}
|
|
36
44
|
function Wt(t, { formElements: a, validation: f }) {
|
|
@@ -38,47 +46,47 @@ function Wt(t, { formElements: a, validation: f }) {
|
|
|
38
46
|
}
|
|
39
47
|
const qt = (t, a) => {
|
|
40
48
|
let f = t;
|
|
41
|
-
const [g,
|
|
42
|
-
(a?.formElements || a?.validation) && Object.keys(
|
|
43
|
-
|
|
49
|
+
const [g, c] = _t(f);
|
|
50
|
+
(a?.formElements || a?.validation) && Object.keys(c).forEach((y) => {
|
|
51
|
+
c[y] = c[y] || {}, c[y].formElements = {
|
|
44
52
|
...a.formElements,
|
|
45
53
|
// Global defaults first
|
|
46
54
|
...a?.validation,
|
|
47
|
-
...
|
|
55
|
+
...c[y].formElements || {}
|
|
48
56
|
// State-specific overrides
|
|
49
57
|
};
|
|
50
58
|
}), o.getState().setInitialStates(g);
|
|
51
|
-
const p = (y,
|
|
52
|
-
const [w] = Y(
|
|
59
|
+
const p = (y, s) => {
|
|
60
|
+
const [w] = Y(s?.componentId ?? tt()), l = ut({
|
|
53
61
|
stateKey: y,
|
|
54
|
-
options:
|
|
55
|
-
initialOptionsPart:
|
|
62
|
+
options: s,
|
|
63
|
+
initialOptionsPart: c
|
|
56
64
|
});
|
|
57
|
-
|
|
65
|
+
s && Object.keys(s).length > 0 && console.log(
|
|
58
66
|
"useCogsState",
|
|
59
67
|
y,
|
|
60
|
-
u,
|
|
61
68
|
s,
|
|
62
|
-
c
|
|
69
|
+
c,
|
|
70
|
+
l
|
|
63
71
|
);
|
|
64
|
-
const e = o.getState().cogsStateStore[y] || g[y], v =
|
|
72
|
+
const e = o.getState().cogsStateStore[y] || g[y], v = s?.modifyState ? s.modifyState(e) : e, [V, F] = jt(
|
|
65
73
|
v,
|
|
66
74
|
{
|
|
67
75
|
stateKey: y,
|
|
68
|
-
syncUpdate:
|
|
76
|
+
syncUpdate: s?.syncUpdate,
|
|
69
77
|
componentId: w,
|
|
70
|
-
localStorage:
|
|
71
|
-
middleware:
|
|
72
|
-
enabledSync:
|
|
73
|
-
reactiveType:
|
|
74
|
-
reactiveDeps:
|
|
75
|
-
initState:
|
|
78
|
+
localStorage: s?.localStorage,
|
|
79
|
+
middleware: s?.middleware,
|
|
80
|
+
enabledSync: s?.enabledSync,
|
|
81
|
+
reactiveType: s?.reactiveType,
|
|
82
|
+
reactiveDeps: s?.reactiveDeps,
|
|
83
|
+
initState: s?.initState
|
|
76
84
|
}
|
|
77
85
|
);
|
|
78
86
|
return F;
|
|
79
87
|
};
|
|
80
|
-
function _(y,
|
|
81
|
-
ut({ stateKey: y, options:
|
|
88
|
+
function _(y, s) {
|
|
89
|
+
ut({ stateKey: y, options: s, initialOptionsPart: c });
|
|
82
90
|
}
|
|
83
91
|
return { useCogsState: p, setCogsOptions: _ };
|
|
84
92
|
}, {
|
|
@@ -91,7 +99,7 @@ const qt = (t, a) => {
|
|
|
91
99
|
updateInitialStateGlobal: nt,
|
|
92
100
|
addValidationError: At,
|
|
93
101
|
removeValidationError: k,
|
|
94
|
-
setServerSyncActions:
|
|
102
|
+
setServerSyncActions: Tt
|
|
95
103
|
} = o.getState(), St = (t) => {
|
|
96
104
|
if (!t) return null;
|
|
97
105
|
try {
|
|
@@ -100,28 +108,28 @@ const qt = (t, a) => {
|
|
|
100
108
|
} catch (a) {
|
|
101
109
|
return console.error("Error loading from localStorage:", a), null;
|
|
102
110
|
}
|
|
103
|
-
},
|
|
111
|
+
}, Ct = (t, a, f, g) => {
|
|
104
112
|
if (f.log && console.log(
|
|
105
113
|
"saving to localstorage",
|
|
106
114
|
a,
|
|
107
115
|
f.localStorage?.key,
|
|
108
116
|
g
|
|
109
117
|
), f.localStorage?.key && g) {
|
|
110
|
-
const
|
|
118
|
+
const c = {
|
|
111
119
|
state: t,
|
|
112
120
|
lastUpdated: Date.now(),
|
|
113
121
|
lastSyncedWithServer: o.getState().serverSyncLog[a]?.[0]?.timeStamp,
|
|
114
122
|
baseServerState: o.getState().serverState[a]
|
|
115
123
|
}, p = `${g}-${a}-${f.localStorage?.key}`;
|
|
116
|
-
window.localStorage.setItem(p, JSON.stringify(
|
|
124
|
+
window.localStorage.setItem(p, JSON.stringify(c));
|
|
117
125
|
}
|
|
118
|
-
}, Ft = (t, a, f, g,
|
|
126
|
+
}, Ft = (t, a, f, g, c, p) => {
|
|
119
127
|
const _ = {
|
|
120
128
|
initialState: a,
|
|
121
129
|
updaterState: Z(
|
|
122
130
|
t,
|
|
123
131
|
g,
|
|
124
|
-
|
|
132
|
+
c,
|
|
125
133
|
p
|
|
126
134
|
),
|
|
127
135
|
state: f
|
|
@@ -143,64 +151,64 @@ const qt = (t, a) => {
|
|
|
143
151
|
}, zt = (t, a) => {
|
|
144
152
|
const f = o.getState().stateComponents.get(t);
|
|
145
153
|
if (f) {
|
|
146
|
-
const g = `${t}////${a}`,
|
|
147
|
-
|
|
154
|
+
const g = `${t}////${a}`, c = f.components.get(g);
|
|
155
|
+
c && c.forceUpdate();
|
|
148
156
|
}
|
|
149
157
|
};
|
|
150
158
|
function jt(t, {
|
|
151
159
|
stateKey: a,
|
|
152
160
|
serverSync: f,
|
|
153
161
|
localStorage: g,
|
|
154
|
-
formElements:
|
|
162
|
+
formElements: c,
|
|
155
163
|
middleware: p,
|
|
156
164
|
reactiveDeps: _,
|
|
157
165
|
reactiveType: y,
|
|
158
|
-
componentId:
|
|
166
|
+
componentId: s,
|
|
159
167
|
initState: w,
|
|
160
|
-
syncUpdate:
|
|
168
|
+
syncUpdate: l
|
|
161
169
|
} = {}) {
|
|
162
170
|
const [e, v] = Y({}), { sessionId: V } = Vt();
|
|
163
171
|
let F = !a;
|
|
164
|
-
const [
|
|
165
|
-
$.current = et(
|
|
166
|
-
if (
|
|
167
|
-
x(
|
|
172
|
+
const [d] = Y(a ?? tt()), U = o.getState().stateLog[d], P = z(/* @__PURE__ */ new Set()), i = z(s ?? tt()), $ = z(null);
|
|
173
|
+
$.current = et(d), K(() => {
|
|
174
|
+
if (l && l.stateKey === d && l.path?.[0]) {
|
|
175
|
+
x(d, (r) => ({
|
|
168
176
|
...r,
|
|
169
|
-
[
|
|
177
|
+
[l.path[0]]: l.newValue
|
|
170
178
|
}));
|
|
171
|
-
const n = `${
|
|
179
|
+
const n = `${l.stateKey}:${l.path.join(".")}`;
|
|
172
180
|
o.getState().setSyncInfo(n, {
|
|
173
|
-
timeStamp:
|
|
174
|
-
userId:
|
|
181
|
+
timeStamp: l.timeStamp,
|
|
182
|
+
userId: l.userId
|
|
175
183
|
});
|
|
176
184
|
}
|
|
177
|
-
}, [
|
|
178
|
-
dt(
|
|
185
|
+
}, [l]), K(() => {
|
|
186
|
+
dt(d, {
|
|
179
187
|
initState: w
|
|
180
188
|
});
|
|
181
189
|
const n = $.current;
|
|
182
190
|
let r = null;
|
|
183
191
|
n.log && console.log("newoptions", n), n.localStorage?.key && V && (r = St(
|
|
184
|
-
V + "-" +
|
|
192
|
+
V + "-" + d + "-" + n.localStorage?.key
|
|
185
193
|
));
|
|
186
|
-
let
|
|
187
|
-
w?.initialState && (
|
|
188
|
-
l,
|
|
189
|
-
w?.initialState,
|
|
194
|
+
let u = null;
|
|
195
|
+
w?.initialState && (u = w?.initialState, r && r.lastUpdated > (r.lastSyncedWithServer || 0) && (u = r.state), Ft(
|
|
190
196
|
d,
|
|
197
|
+
w?.initialState,
|
|
198
|
+
u,
|
|
191
199
|
R,
|
|
192
200
|
i.current,
|
|
193
201
|
V
|
|
194
|
-
), mt(
|
|
202
|
+
), mt(d), v({}));
|
|
195
203
|
}, [...w?.dependencies || []]), vt(() => {
|
|
196
|
-
F && dt(
|
|
204
|
+
F && dt(d, {
|
|
197
205
|
serverSync: f,
|
|
198
|
-
formElements:
|
|
206
|
+
formElements: c,
|
|
199
207
|
initState: w,
|
|
200
208
|
localStorage: g,
|
|
201
209
|
middleware: p
|
|
202
210
|
});
|
|
203
|
-
const n = `${
|
|
211
|
+
const n = `${d}////${i.current}`, r = o.getState().stateComponents.get(d) || {
|
|
204
212
|
components: /* @__PURE__ */ new Map()
|
|
205
213
|
};
|
|
206
214
|
return r.components.set(n, {
|
|
@@ -209,36 +217,36 @@ function jt(t, {
|
|
|
209
217
|
deps: [],
|
|
210
218
|
depsFunction: _ || void 0,
|
|
211
219
|
reactiveType: y ?? ["component", "deps"]
|
|
212
|
-
}), o.getState().stateComponents.set(
|
|
213
|
-
const
|
|
214
|
-
r && (r.components.delete(
|
|
220
|
+
}), o.getState().stateComponents.set(d, r), v({}), () => {
|
|
221
|
+
const u = `${d}////${i.current}`;
|
|
222
|
+
r && (r.components.delete(u), r.components.size === 0 && o.getState().stateComponents.delete(d));
|
|
215
223
|
};
|
|
216
224
|
}, []);
|
|
217
|
-
const R = (n, r,
|
|
225
|
+
const R = (n, r, u, S) => {
|
|
218
226
|
if (Array.isArray(r)) {
|
|
219
|
-
const m = `${
|
|
227
|
+
const m = `${d}-${r.join(".")}`;
|
|
220
228
|
P.current.add(m);
|
|
221
229
|
}
|
|
222
|
-
x(
|
|
223
|
-
const E = ft(n) ? n(m) : n, O = `${
|
|
230
|
+
x(d, (m) => {
|
|
231
|
+
const E = ft(n) ? n(m) : n, O = `${d}-${r.join(".")}`;
|
|
224
232
|
if (O) {
|
|
225
233
|
let M = !1, I = o.getState().signalDomElements.get(O);
|
|
226
|
-
if ((!I || I.size === 0) && (
|
|
227
|
-
const h = r.slice(0, -1),
|
|
228
|
-
if (Array.isArray(
|
|
234
|
+
if ((!I || I.size === 0) && (u.updateType === "insert" || u.updateType === "cut")) {
|
|
235
|
+
const h = r.slice(0, -1), T = L(E, h);
|
|
236
|
+
if (Array.isArray(T)) {
|
|
229
237
|
M = !0;
|
|
230
|
-
const N = `${
|
|
238
|
+
const N = `${d}-${h.join(".")}`;
|
|
231
239
|
I = o.getState().signalDomElements.get(N);
|
|
232
240
|
}
|
|
233
241
|
}
|
|
234
242
|
if (I) {
|
|
235
243
|
const h = M ? L(E, r.slice(0, -1)) : L(E, r);
|
|
236
|
-
I.forEach(({ parentId:
|
|
237
|
-
const
|
|
238
|
-
`[data-parent-id="${
|
|
244
|
+
I.forEach(({ parentId: T, position: N, effect: D }) => {
|
|
245
|
+
const C = document.querySelector(
|
|
246
|
+
`[data-parent-id="${T}"]`
|
|
239
247
|
);
|
|
240
|
-
if (
|
|
241
|
-
const at = Array.from(
|
|
248
|
+
if (C) {
|
|
249
|
+
const at = Array.from(C.childNodes);
|
|
242
250
|
if (at[N]) {
|
|
243
251
|
const yt = D ? new Function("state", `return (${D})(state)`)(h) : h;
|
|
244
252
|
at[N].textContent = String(yt);
|
|
@@ -247,32 +255,32 @@ function jt(t, {
|
|
|
247
255
|
});
|
|
248
256
|
}
|
|
249
257
|
}
|
|
250
|
-
|
|
258
|
+
u.updateType === "update" && (S || $.current?.validationKey) && r && k(
|
|
251
259
|
(S || $.current?.validationKey) + "." + r.join(".")
|
|
252
260
|
);
|
|
253
261
|
const A = r.slice(0, r.length - 1);
|
|
254
|
-
|
|
262
|
+
u.updateType === "cut" && $.current?.validationKey && k(
|
|
255
263
|
$.current?.validationKey + "." + A.join(".")
|
|
256
|
-
),
|
|
264
|
+
), u.updateType === "insert" && $.current?.validationKey && $t(
|
|
257
265
|
$.current?.validationKey + "." + A.join(".")
|
|
258
266
|
).filter(([I, h]) => {
|
|
259
|
-
let
|
|
260
|
-
if (I == A.join(".") &&
|
|
267
|
+
let T = I?.split(".").length;
|
|
268
|
+
if (I == A.join(".") && T == A.length - 1) {
|
|
261
269
|
let N = I + "." + A;
|
|
262
270
|
k(I), At(N, h);
|
|
263
271
|
}
|
|
264
272
|
});
|
|
265
|
-
const b = L(m, r), j = L(E, r), W =
|
|
273
|
+
const b = L(m, r), j = L(E, r), W = u.updateType === "update" ? r.join(".") : [...r].slice(0, -1).join("."), rt = o.getState().stateComponents.get(d);
|
|
266
274
|
if (rt)
|
|
267
275
|
for (const [M, I] of rt.components.entries()) {
|
|
268
276
|
let h = !1;
|
|
269
|
-
const
|
|
270
|
-
if (!
|
|
271
|
-
if (
|
|
277
|
+
const T = Array.isArray(I.reactiveType) ? I.reactiveType : [I.reactiveType || "component"];
|
|
278
|
+
if (!T.includes("none")) {
|
|
279
|
+
if (T.includes("all")) {
|
|
272
280
|
I.forceUpdate();
|
|
273
281
|
continue;
|
|
274
282
|
}
|
|
275
|
-
if (
|
|
283
|
+
if (T.includes("component") && I.paths && (I.paths.has(W) || I.paths.has("")) && (h = !0), !h && T.includes("deps") && I.depsFunction) {
|
|
276
284
|
const N = I.depsFunction(E);
|
|
277
285
|
typeof N == "boolean" ? N && (h = !0) : G(I.deps, N) || (I.deps = N, h = !0);
|
|
278
286
|
}
|
|
@@ -281,30 +289,30 @@ function jt(t, {
|
|
|
281
289
|
}
|
|
282
290
|
const ot = {
|
|
283
291
|
timeStamp: Date.now(),
|
|
284
|
-
stateKey:
|
|
292
|
+
stateKey: d,
|
|
285
293
|
path: r,
|
|
286
|
-
updateType:
|
|
294
|
+
updateType: u.updateType,
|
|
287
295
|
status: "new",
|
|
288
296
|
oldValue: b,
|
|
289
297
|
newValue: j
|
|
290
298
|
};
|
|
291
|
-
if (ht(
|
|
292
|
-
const h = [...M ?? [], ot].reduce((
|
|
293
|
-
const D = `${N.stateKey}:${JSON.stringify(N.path)}`,
|
|
294
|
-
return
|
|
299
|
+
if (ht(d, (M) => {
|
|
300
|
+
const h = [...M ?? [], ot].reduce((T, N) => {
|
|
301
|
+
const D = `${N.stateKey}:${JSON.stringify(N.path)}`, C = T.get(D);
|
|
302
|
+
return C ? (C.timeStamp = Math.max(C.timeStamp, N.timeStamp), C.newValue = N.newValue, C.oldValue = C.oldValue ?? N.oldValue, C.updateType = N.updateType) : T.set(D, { ...N }), T;
|
|
295
303
|
}, /* @__PURE__ */ new Map());
|
|
296
304
|
return Array.from(h.values());
|
|
297
|
-
}),
|
|
305
|
+
}), Ct(
|
|
298
306
|
E,
|
|
299
|
-
|
|
307
|
+
d,
|
|
300
308
|
$.current,
|
|
301
309
|
V
|
|
302
310
|
), p && p({
|
|
303
311
|
updateLog: U,
|
|
304
312
|
update: ot
|
|
305
313
|
}), $.current?.serverSync) {
|
|
306
|
-
const M = o.getState().serverState[
|
|
307
|
-
|
|
314
|
+
const M = o.getState().serverState[d], I = $.current?.serverSync;
|
|
315
|
+
Tt(d, {
|
|
308
316
|
syncKey: typeof I.syncKey == "string" ? I.syncKey : I.syncKey({ state: E }),
|
|
309
317
|
rollBackState: M,
|
|
310
318
|
actionTimeStamp: Date.now() + (I.debounce ?? 3e3),
|
|
@@ -314,40 +322,40 @@ function jt(t, {
|
|
|
314
322
|
return E;
|
|
315
323
|
});
|
|
316
324
|
};
|
|
317
|
-
o.getState().updaterState[
|
|
318
|
-
|
|
325
|
+
o.getState().updaterState[d] || (B(
|
|
326
|
+
d,
|
|
319
327
|
Z(
|
|
320
|
-
|
|
328
|
+
d,
|
|
321
329
|
R,
|
|
322
330
|
i.current,
|
|
323
331
|
V
|
|
324
332
|
)
|
|
325
|
-
), o.getState().cogsStateStore[
|
|
333
|
+
), o.getState().cogsStateStore[d] || x(d, t), o.getState().initialStateGlobal[d] || nt(d, t));
|
|
326
334
|
const Q = It(() => Z(
|
|
327
|
-
|
|
335
|
+
d,
|
|
328
336
|
R,
|
|
329
337
|
i.current,
|
|
330
338
|
V
|
|
331
|
-
), [
|
|
332
|
-
return [gt(
|
|
339
|
+
), [d]);
|
|
340
|
+
return [gt(d), Q];
|
|
333
341
|
}
|
|
334
342
|
function Z(t, a, f, g) {
|
|
335
|
-
const
|
|
343
|
+
const c = /* @__PURE__ */ new Map();
|
|
336
344
|
let p = 0;
|
|
337
|
-
const _ = (
|
|
338
|
-
const e =
|
|
339
|
-
for (const [v] of
|
|
340
|
-
(v === e || v.startsWith(e + ".")) &&
|
|
345
|
+
const _ = (l) => {
|
|
346
|
+
const e = l.join(".");
|
|
347
|
+
for (const [v] of c)
|
|
348
|
+
(v === e || v.startsWith(e + ".")) && c.delete(v);
|
|
341
349
|
p++;
|
|
342
|
-
}, y = /* @__PURE__ */ new Map(),
|
|
343
|
-
removeValidation: (
|
|
344
|
-
|
|
350
|
+
}, y = /* @__PURE__ */ new Map(), s = {
|
|
351
|
+
removeValidation: (l) => {
|
|
352
|
+
l?.validationKey && k(l.validationKey);
|
|
345
353
|
},
|
|
346
|
-
revertToInitialState: (
|
|
354
|
+
revertToInitialState: (l) => {
|
|
347
355
|
const e = o.getState().getInitialOptions(t)?.validation;
|
|
348
|
-
e?.key && k(e?.key),
|
|
356
|
+
e?.key && k(e?.key), l?.validationKey && k(l.validationKey);
|
|
349
357
|
const v = o.getState().initialStateGlobal[t];
|
|
350
|
-
|
|
358
|
+
c.clear(), p++;
|
|
351
359
|
const V = w(v, []);
|
|
352
360
|
J(() => {
|
|
353
361
|
B(t, V), x(t, v);
|
|
@@ -355,14 +363,14 @@ function Z(t, a, f, g) {
|
|
|
355
363
|
F && F.components.forEach((U) => {
|
|
356
364
|
U.forceUpdate();
|
|
357
365
|
});
|
|
358
|
-
const
|
|
359
|
-
|
|
360
|
-
|
|
366
|
+
const d = et(t);
|
|
367
|
+
d?.localStorage?.key && localStorage.removeItem(
|
|
368
|
+
d?.initState ? g + "-" + t + "-" + d?.localStorage?.key : t
|
|
361
369
|
), localStorage.removeItem(t);
|
|
362
370
|
});
|
|
363
371
|
},
|
|
364
|
-
updateInitialState: (
|
|
365
|
-
|
|
372
|
+
updateInitialState: (l) => {
|
|
373
|
+
c.clear(), p++;
|
|
366
374
|
const e = Z(
|
|
367
375
|
t,
|
|
368
376
|
a,
|
|
@@ -370,7 +378,7 @@ function Z(t, a, f, g) {
|
|
|
370
378
|
g
|
|
371
379
|
);
|
|
372
380
|
return J(() => {
|
|
373
|
-
nt(t,
|
|
381
|
+
nt(t, l), B(t, e), x(t, l);
|
|
374
382
|
const v = o.getState().stateComponents.get(t);
|
|
375
383
|
v && v.components.forEach((V) => {
|
|
376
384
|
V.forceUpdate();
|
|
@@ -383,28 +391,28 @@ function Z(t, a, f, g) {
|
|
|
383
391
|
_serverState: o.getState().serverState[t],
|
|
384
392
|
_isLoading: o.getState().isLoadingGlobal[t],
|
|
385
393
|
_isServerSynced: () => {
|
|
386
|
-
const
|
|
387
|
-
return !!(
|
|
394
|
+
const l = o.getState().serverState[t];
|
|
395
|
+
return !!(l && G(l, gt(t)));
|
|
388
396
|
}
|
|
389
397
|
};
|
|
390
|
-
function w(
|
|
398
|
+
function w(l, e = [], v) {
|
|
391
399
|
const V = e.map(String).join(".");
|
|
392
|
-
|
|
400
|
+
c.get(V);
|
|
393
401
|
const F = function() {
|
|
394
402
|
return o().getNestedState(t, e);
|
|
395
403
|
};
|
|
396
|
-
Object.keys(
|
|
397
|
-
F[P] =
|
|
404
|
+
Object.keys(s).forEach((P) => {
|
|
405
|
+
F[P] = s[P];
|
|
398
406
|
});
|
|
399
|
-
const
|
|
407
|
+
const d = {
|
|
400
408
|
apply(P, i, $) {
|
|
401
409
|
return o().getNestedState(t, e);
|
|
402
410
|
},
|
|
403
411
|
get(P, i) {
|
|
404
412
|
if (i !== "then" && !i.startsWith("$") && i !== "stateMapNoRender") {
|
|
405
|
-
const n = e.join("."), r = `${t}////${f}`,
|
|
406
|
-
if (
|
|
407
|
-
const S =
|
|
413
|
+
const n = e.join("."), r = `${t}////${f}`, u = o.getState().stateComponents.get(t);
|
|
414
|
+
if (u) {
|
|
415
|
+
const S = u.components.get(r);
|
|
408
416
|
S && (e.length > 0 || i === "get") && S.paths.add(n);
|
|
409
417
|
}
|
|
410
418
|
}
|
|
@@ -415,13 +423,13 @@ function Z(t, a, f, g) {
|
|
|
415
423
|
throw new Error("Validation key not found");
|
|
416
424
|
return o.getState().getValidationErrors(n.key + "." + e.join("."));
|
|
417
425
|
};
|
|
418
|
-
if (Array.isArray(
|
|
426
|
+
if (Array.isArray(l)) {
|
|
419
427
|
if (i === "getSelected")
|
|
420
428
|
return () => {
|
|
421
429
|
const n = y.get(e.join("."));
|
|
422
430
|
if (n !== void 0)
|
|
423
431
|
return w(
|
|
424
|
-
|
|
432
|
+
l[n],
|
|
425
433
|
[...e, n.toString()],
|
|
426
434
|
v
|
|
427
435
|
);
|
|
@@ -430,8 +438,8 @@ function Z(t, a, f, g) {
|
|
|
430
438
|
return (n) => {
|
|
431
439
|
const r = v?.filtered?.some(
|
|
432
440
|
(S) => S.join(".") === e.join(".")
|
|
433
|
-
),
|
|
434
|
-
return i !== "stateMapNoRender" && (
|
|
441
|
+
), u = r ? l : o.getState().getNestedState(t, e);
|
|
442
|
+
return i !== "stateMapNoRender" && (c.clear(), p++), u.map((S, m) => {
|
|
435
443
|
const E = r && S.__origIndex ? S.__origIndex : m, O = w(
|
|
436
444
|
S,
|
|
437
445
|
[...e, E.toString()],
|
|
@@ -441,8 +449,8 @@ function Z(t, a, f, g) {
|
|
|
441
449
|
S,
|
|
442
450
|
O,
|
|
443
451
|
m,
|
|
444
|
-
|
|
445
|
-
w(
|
|
452
|
+
l,
|
|
453
|
+
w(l, e, v)
|
|
446
454
|
);
|
|
447
455
|
});
|
|
448
456
|
};
|
|
@@ -458,11 +466,11 @@ function Z(t, a, f, g) {
|
|
|
458
466
|
});
|
|
459
467
|
if (i === "stateFlattenOn")
|
|
460
468
|
return (n) => {
|
|
461
|
-
const
|
|
469
|
+
const u = v?.filtered?.some(
|
|
462
470
|
(m) => m.join(".") === e.join(".")
|
|
463
|
-
) ?
|
|
464
|
-
|
|
465
|
-
const S =
|
|
471
|
+
) ? l : o.getState().getNestedState(t, e);
|
|
472
|
+
c.clear(), p++;
|
|
473
|
+
const S = u.flatMap(
|
|
466
474
|
(m, E) => m[n] ?? []
|
|
467
475
|
);
|
|
468
476
|
return w(
|
|
@@ -473,16 +481,16 @@ function Z(t, a, f, g) {
|
|
|
473
481
|
};
|
|
474
482
|
if (i === "findWith")
|
|
475
483
|
return (n, r) => {
|
|
476
|
-
const
|
|
484
|
+
const u = l.findIndex(
|
|
477
485
|
(E) => E[n] === r
|
|
478
486
|
);
|
|
479
|
-
if (
|
|
480
|
-
const S =
|
|
481
|
-
return
|
|
487
|
+
if (u === -1) return;
|
|
488
|
+
const S = l[u], m = [...e, u.toString()];
|
|
489
|
+
return c.clear(), p++, c.clear(), p++, w(S, m);
|
|
482
490
|
};
|
|
483
491
|
if (i === "index")
|
|
484
492
|
return (n) => {
|
|
485
|
-
const r =
|
|
493
|
+
const r = l[n];
|
|
486
494
|
return w(r, [...e, n.toString()]);
|
|
487
495
|
};
|
|
488
496
|
if (i === "insert")
|
|
@@ -491,7 +499,7 @@ function Z(t, a, f, g) {
|
|
|
491
499
|
[]
|
|
492
500
|
));
|
|
493
501
|
if (i === "uniqueInsert")
|
|
494
|
-
return (n, r,
|
|
502
|
+
return (n, r, u) => {
|
|
495
503
|
const S = o.getState().getNestedState(t, e), m = ft(n) ? n(S) : n;
|
|
496
504
|
let E = null;
|
|
497
505
|
if (!S.some((A) => {
|
|
@@ -505,8 +513,8 @@ function Z(t, a, f, g) {
|
|
|
505
513
|
return b && (E = A), b;
|
|
506
514
|
}))
|
|
507
515
|
_(e), st(a, m, e, t);
|
|
508
|
-
else if (
|
|
509
|
-
const A =
|
|
516
|
+
else if (u && E) {
|
|
517
|
+
const A = u(E), b = S.map(
|
|
510
518
|
(j) => G(j, E) ? A : j
|
|
511
519
|
);
|
|
512
520
|
_(e), q(a, b, e);
|
|
@@ -518,15 +526,15 @@ function Z(t, a, f, g) {
|
|
|
518
526
|
};
|
|
519
527
|
if (i === "stateFilter")
|
|
520
528
|
return (n) => {
|
|
521
|
-
const r =
|
|
529
|
+
const r = l.map((m, E) => ({
|
|
522
530
|
...m,
|
|
523
531
|
__origIndex: E.toString()
|
|
524
|
-
})),
|
|
532
|
+
})), u = [], S = [];
|
|
525
533
|
for (let m = 0; m < r.length; m++)
|
|
526
|
-
n(r[m], m) && (
|
|
527
|
-
return
|
|
534
|
+
n(r[m], m) && (u.push(m), S.push(r[m]));
|
|
535
|
+
return c.clear(), p++, w(S, e, {
|
|
528
536
|
filtered: [...v?.filtered || [], e],
|
|
529
|
-
validIndices:
|
|
537
|
+
validIndices: u
|
|
530
538
|
// Always pass validIndices, even if empty
|
|
531
539
|
});
|
|
532
540
|
};
|
|
@@ -566,15 +574,15 @@ function Z(t, a, f, g) {
|
|
|
566
574
|
return o.getState().getSyncInfo(n);
|
|
567
575
|
}
|
|
568
576
|
if (i === "_selected") {
|
|
569
|
-
const n = e.slice(0, -1), r = n.join("."),
|
|
570
|
-
return Array.isArray(
|
|
577
|
+
const n = e.slice(0, -1), r = n.join("."), u = o.getState().getNestedState(t, n);
|
|
578
|
+
return Array.isArray(u) ? Number(e[e.length - 1]) === y.get(r) : void 0;
|
|
571
579
|
}
|
|
572
580
|
if (i == "getLocalStorage")
|
|
573
581
|
return (n) => St(g + "-" + t + "-" + n);
|
|
574
582
|
if (i === "setSelected")
|
|
575
583
|
return (n) => {
|
|
576
|
-
const r = e.slice(0, -1),
|
|
577
|
-
n ? y.set(S,
|
|
584
|
+
const r = e.slice(0, -1), u = Number(e[e.length - 1]), S = r.join(".");
|
|
585
|
+
n ? y.set(S, u) : y.delete(S);
|
|
578
586
|
const m = o.getState().getNestedState(t, [...r]);
|
|
579
587
|
q(a, m, r), _(r);
|
|
580
588
|
};
|
|
@@ -587,13 +595,13 @@ function Z(t, a, f, g) {
|
|
|
587
595
|
if (!n?.key)
|
|
588
596
|
throw new Error("Validation key not found");
|
|
589
597
|
k(n.key);
|
|
590
|
-
const
|
|
598
|
+
const u = o.getState().cogsStateStore[t];
|
|
591
599
|
try {
|
|
592
600
|
const S = o.getState().getValidationErrors(n.key);
|
|
593
601
|
S && S.length > 0 && S.forEach(([E]) => {
|
|
594
602
|
E && E.startsWith(n.key) && k(E);
|
|
595
603
|
});
|
|
596
|
-
const m = n.zodSchema.safeParse(
|
|
604
|
+
const m = n.zodSchema.safeParse(u);
|
|
597
605
|
return m.success ? !0 : (m.error.errors.forEach((O) => {
|
|
598
606
|
const A = O.path, b = O.message, j = [n.key, ...A].join(".");
|
|
599
607
|
r(j, b);
|
|
@@ -614,9 +622,9 @@ function Z(t, a, f, g) {
|
|
|
614
622
|
if (i === "_isLoading")
|
|
615
623
|
return o.getState().isLoadingGlobal[t];
|
|
616
624
|
if (i === "revertToInitialState")
|
|
617
|
-
return
|
|
618
|
-
if (i === "updateInitialState") return
|
|
619
|
-
if (i === "removeValidation") return
|
|
625
|
+
return s.revertToInitialState;
|
|
626
|
+
if (i === "updateInitialState") return s.updateInitialState;
|
|
627
|
+
if (i === "removeValidation") return s.removeValidation;
|
|
620
628
|
}
|
|
621
629
|
if (i === "getFormRef")
|
|
622
630
|
return () => lt.getState().getFormRef(t + "." + e.join("."));
|
|
@@ -637,19 +645,19 @@ function Z(t, a, f, g) {
|
|
|
637
645
|
);
|
|
638
646
|
if (i === "_stateKey") return t;
|
|
639
647
|
if (i === "_path") return e;
|
|
640
|
-
if (i === "_isServerSynced") return
|
|
648
|
+
if (i === "_isServerSynced") return s._isServerSynced;
|
|
641
649
|
if (i === "update")
|
|
642
650
|
return (n, r) => {
|
|
643
651
|
if (r?.debounce)
|
|
644
652
|
pt(() => {
|
|
645
653
|
q(a, n, e, "");
|
|
646
|
-
const
|
|
647
|
-
r?.afterUpdate && r.afterUpdate(
|
|
654
|
+
const u = o.getState().getNestedState(t, e);
|
|
655
|
+
r?.afterUpdate && r.afterUpdate(u);
|
|
648
656
|
}, r.debounce);
|
|
649
657
|
else {
|
|
650
658
|
q(a, n, e, "");
|
|
651
|
-
const
|
|
652
|
-
r?.afterUpdate && r.afterUpdate(
|
|
659
|
+
const u = o.getState().getNestedState(t, e);
|
|
660
|
+
r?.afterUpdate && r.afterUpdate(u);
|
|
653
661
|
}
|
|
654
662
|
_(e);
|
|
655
663
|
};
|
|
@@ -667,8 +675,8 @@ function Z(t, a, f, g) {
|
|
|
667
675
|
const R = [...e, i], Q = o.getState().getNestedState(t, R);
|
|
668
676
|
return w(Q, R, v);
|
|
669
677
|
}
|
|
670
|
-
}, U = new Proxy(F,
|
|
671
|
-
return
|
|
678
|
+
}, U = new Proxy(F, d);
|
|
679
|
+
return c.set(V, {
|
|
672
680
|
proxy: U,
|
|
673
681
|
stateVersion: p
|
|
674
682
|
}), U;
|
|
@@ -689,7 +697,7 @@ function Ot({
|
|
|
689
697
|
f,
|
|
690
698
|
t._path
|
|
691
699
|
).stateMapNoRender(
|
|
692
|
-
(
|
|
700
|
+
(c, p, _, y, s) => t._mapFn(c, p, _, y, s)
|
|
693
701
|
) : null;
|
|
694
702
|
}
|
|
695
703
|
function bt({
|
|
@@ -699,9 +707,9 @@ function bt({
|
|
|
699
707
|
return K(() => {
|
|
700
708
|
const g = a.current;
|
|
701
709
|
if (!g || !g.parentElement) return;
|
|
702
|
-
const
|
|
703
|
-
let y =
|
|
704
|
-
y || (y = `parent-${crypto.randomUUID()}`,
|
|
710
|
+
const c = g.parentElement, _ = Array.from(c.childNodes).indexOf(g);
|
|
711
|
+
let y = c.getAttribute("data-parent-id");
|
|
712
|
+
y || (y = `parent-${crypto.randomUUID()}`, c.setAttribute("data-parent-id", y));
|
|
705
713
|
const w = {
|
|
706
714
|
instanceId: `instance-${crypto.randomUUID()}`,
|
|
707
715
|
parentId: y,
|
|
@@ -709,19 +717,19 @@ function bt({
|
|
|
709
717
|
effect: t._effect
|
|
710
718
|
};
|
|
711
719
|
o.getState().addSignalElement(f, w);
|
|
712
|
-
const
|
|
720
|
+
const l = o.getState().getNestedState(t._stateKey, t._path);
|
|
713
721
|
let e;
|
|
714
722
|
if (t._effect)
|
|
715
723
|
try {
|
|
716
724
|
e = new Function(
|
|
717
725
|
"state",
|
|
718
726
|
`return (${t._effect})(state)`
|
|
719
|
-
)(
|
|
727
|
+
)(l);
|
|
720
728
|
} catch (V) {
|
|
721
|
-
console.error("Error evaluating effect function during mount:", V), e =
|
|
729
|
+
console.error("Error evaluating effect function during mount:", V), e = l;
|
|
722
730
|
}
|
|
723
731
|
else
|
|
724
|
-
e =
|
|
732
|
+
e = l;
|
|
725
733
|
e !== null && typeof e == "object" && (e = JSON.stringify(e));
|
|
726
734
|
const v = document.createTextNode(String(e));
|
|
727
735
|
g.replaceWith(v);
|
package/dist/CogsState.jsx.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n createElement,\r\n startTransition,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport {\r\n debounce,\r\n getNestedValue,\r\n isFunction,\r\n updateNestedProperty,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { boolean, ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => void;\r\n\r\ntype CutFunctionType = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => void;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {}) & {\r\n [K in keyof (any extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => void;\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n log?: boolean;\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: { key: string | ((state: T) => string) };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n initState?: {\r\n ctx?: Record<string, any>;\r\n initialState: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n };\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n mutation: UseMutationResult<any, unknown, any, unknown>;\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n console.log(\"setAndMergeOptions\", stateKey, initialOptions, newOptions);\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n\r\n return {\r\n ...initialOptions,\r\n ...newOptions,\r\n };\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n\r\n console.log(\r\n \"setOptions needToAdd\",\r\n key,\r\n options[key as keyof typeof options]\r\n );\r\n\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (key == \"localStorage\" && mergedOptions[key]) {\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n }\r\n }\r\n }\r\n }\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n\r\n return mergedOptions;\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (opt?.formElements || opt?.validation) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n initialOptionsPart[key].formElements = {\r\n ...opt.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n const merged = setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n if (options && Object.keys(options).length > 0) {\r\n console.log(\r\n \"useCogsState\",\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n merged\r\n );\r\n }\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initState: options?.initState,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions.log) {\r\n console.log(\r\n \"saving to localstorage\",\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n if (currentInitialOptions.localStorage?.key && sessionId) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = `${sessionId}-${thisKey}-${currentInitialOptions.localStorage?.key}`;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n startTransition(() => {\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n });\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n updates.add(() => component.forceUpdate());\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n startTransition(() => {\r\n updates.forEach((update) => update());\r\n });\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initState,\r\n syncUpdate,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n\r\n useEffect(() => {\r\n setAndMergeOptions(thisKey as string, {\r\n initState,\r\n });\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n if (options.log) {\r\n console.log(\"newoptions\", options);\r\n }\r\n\r\n if (options.localStorage?.key && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + options.localStorage?.key\r\n );\r\n }\r\n\r\n let newState = null;\r\n if (initState?.initialState) {\r\n newState = initState?.initialState;\r\n\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n }\r\n }\r\n updateGlobalState(\r\n thisKey,\r\n initState?.initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n notifyComponents(thisKey);\r\n forceUpdate({});\r\n }\r\n }, [...(initState?.dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n\r\n if (stateEntry) {\r\n for (const [key, component] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes.includes(\"none\")) {\r\n continue;\r\n }\r\n\r\n // Force update if \"all\" is specified\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n\r\n continue;\r\n }\r\n\r\n // Check component-level path reactivity\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths &&\r\n (component.paths.has(pathToCheck) || component.paths.has(\"\"))\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n\r\n // Check dependency-based reactivity\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) {\r\n shouldUpdate = true;\r\n }\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: \"new\" as const,\r\n oldValue,\r\n newValue,\r\n } satisfies UpdateTypeDetail;\r\n\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n\r\n // Aggregate the updates by stateKey and path\r\n const aggregatedLogs = logs.reduce((acc, log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = acc.get(uniqueKey);\r\n\r\n if (existing) {\r\n // Update the existing entry with the most recent details\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue; // Overwrite with the latest value\r\n existing.oldValue = existing.oldValue ?? log.oldValue; // Retain the initial oldValue\r\n existing.updateType = log.updateType; // Update to the most recent type\r\n } else {\r\n // Add the log if no existing match is found\r\n acc.set(uniqueKey, { ...(log as any) });\r\n }\r\n\r\n return acc;\r\n }, new Map<string, typeof newUpdate>());\r\n\r\n // Convert the aggregated map back to an array\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (middleware) {\r\n middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n if (latestInitialOptionsRef.current?.serverSync) {\r\n const serverStateStore = getGlobalStore.getState().serverState[thisKey];\r\n const serverSync = latestInitialOptionsRef.current?.serverSync;\r\n setServerSyncActions(thisKey, {\r\n syncKey:\r\n typeof serverSync.syncKey == \"string\"\r\n ? serverSync.syncKey\r\n : serverSync.syncKey({ state: payload }),\r\n rollBackState: serverStateStore,\r\n actionTimeStamp: Date.now() + (serverSync.debounce ?? 3000),\r\n status: \"waiting\",\r\n });\r\n }\r\n\r\n return payload;\r\n });\r\n };\r\n if (!getGlobalStore.getState().updaterState[thisKey]) {\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const selectedIndexMap = new Map<string, number>();\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n\r\n startTransition(() => {\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n if (initalOptionsGet?.localStorage?.key) {\r\n localStorage.removeItem(\r\n initalOptionsGet?.initState\r\n ? sessionId +\r\n \"-\" +\r\n stateKey +\r\n \"-\" +\r\n initalOptionsGet?.localStorage?.key\r\n : stateKey\r\n );\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // Copy properties from baseObj to the function with type assertion\r\n Object.keys(baseObj).forEach((key) => {\r\n (baseFunction as any)[key] = (baseObj as any)[key];\r\n });\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = selectedIndexMap.get(path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\r\n (obj: any) => obj[thisKey] === thisValue\r\n );\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // ADDED: Clear cache for find operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n []\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Always include validIndices, even if it's an empty array\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: validIndices, // Always pass validIndices, even if empty\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return currentIndex === selectedIndexMap.get(parentKey);\r\n }\r\n return undefined;\r\n }\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n if (value) {\r\n selectedIndexMap.set(parentKey, thisIndex);\r\n } else {\r\n // Optional: clear selection if false\r\n selectedIndexMap.delete(parentKey);\r\n }\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // ADDED: Invalidate cache for parent path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","merged","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","startTransition","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","initState","syncUpdate","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","isFunction","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","pathToCheck","shouldUpdate","reactiveTypes","depsResult","isDeepEqual","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","selectedIndexMap","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","newUpdaterState","field","serverState","currentState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","selectedIndex","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","item","isMatch","updatedItem","updatedArray","updateFn","cutFunc","newVal","i","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","value","nested","thisObject","existingErrors","errorPath","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n createElement,\r\n startTransition,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport {\r\n debounce,\r\n getNestedValue,\r\n isFunction,\r\n updateNestedProperty,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { boolean, ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => void;\r\n\r\ntype CutFunctionType = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => void;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {}) & {\r\n [K in keyof (any extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => void;\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n log?: boolean;\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: { key: string | ((state: T) => string) };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n initState?: {\r\n ctx?: Record<string, any>;\r\n initialState: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n };\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n mutation: UseMutationResult<any, unknown, any, unknown>;\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n console.log(\"setAndMergeOptions\", stateKey, initialOptions, newOptions);\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n\r\n return {\r\n ...initialOptions,\r\n ...newOptions,\r\n };\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n\r\n console.log(\r\n \"setOptions needToAdd\",\r\n key,\r\n options[key as keyof typeof options]\r\n );\r\n\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n console.log(\r\n \"----------------------------------------\",\r\n key,\r\n options[key as keyof typeof options]\r\n );\r\n if (key == \"localStorage\" && mergedOptions[key]) {\r\n console.log(\r\n \"localStorage needToAdd\",\r\n key,\r\n options[key as keyof typeof options]\r\n );\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n }\r\n }\r\n }\r\n }\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n\r\n return mergedOptions;\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (opt?.formElements || opt?.validation) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n initialOptionsPart[key].formElements = {\r\n ...opt.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n const merged = setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n if (options && Object.keys(options).length > 0) {\r\n console.log(\r\n \"useCogsState\",\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n merged\r\n );\r\n }\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initState: options?.initState,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions.log) {\r\n console.log(\r\n \"saving to localstorage\",\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n if (currentInitialOptions.localStorage?.key && sessionId) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = `${sessionId}-${thisKey}-${currentInitialOptions.localStorage?.key}`;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n startTransition(() => {\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n });\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n updates.add(() => component.forceUpdate());\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n startTransition(() => {\r\n updates.forEach((update) => update());\r\n });\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initState,\r\n syncUpdate,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n\r\n useEffect(() => {\r\n setAndMergeOptions(thisKey as string, {\r\n initState,\r\n });\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n if (options.log) {\r\n console.log(\"newoptions\", options);\r\n }\r\n\r\n if (options.localStorage?.key && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + options.localStorage?.key\r\n );\r\n }\r\n\r\n let newState = null;\r\n if (initState?.initialState) {\r\n newState = initState?.initialState;\r\n\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n }\r\n }\r\n updateGlobalState(\r\n thisKey,\r\n initState?.initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n notifyComponents(thisKey);\r\n forceUpdate({});\r\n }\r\n }, [...(initState?.dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n\r\n if (stateEntry) {\r\n for (const [key, component] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes.includes(\"none\")) {\r\n continue;\r\n }\r\n\r\n // Force update if \"all\" is specified\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n\r\n continue;\r\n }\r\n\r\n // Check component-level path reactivity\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths &&\r\n (component.paths.has(pathToCheck) || component.paths.has(\"\"))\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n\r\n // Check dependency-based reactivity\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) {\r\n shouldUpdate = true;\r\n }\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: \"new\" as const,\r\n oldValue,\r\n newValue,\r\n } satisfies UpdateTypeDetail;\r\n\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n\r\n // Aggregate the updates by stateKey and path\r\n const aggregatedLogs = logs.reduce((acc, log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = acc.get(uniqueKey);\r\n\r\n if (existing) {\r\n // Update the existing entry with the most recent details\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue; // Overwrite with the latest value\r\n existing.oldValue = existing.oldValue ?? log.oldValue; // Retain the initial oldValue\r\n existing.updateType = log.updateType; // Update to the most recent type\r\n } else {\r\n // Add the log if no existing match is found\r\n acc.set(uniqueKey, { ...(log as any) });\r\n }\r\n\r\n return acc;\r\n }, new Map<string, typeof newUpdate>());\r\n\r\n // Convert the aggregated map back to an array\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (middleware) {\r\n middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n if (latestInitialOptionsRef.current?.serverSync) {\r\n const serverStateStore = getGlobalStore.getState().serverState[thisKey];\r\n const serverSync = latestInitialOptionsRef.current?.serverSync;\r\n setServerSyncActions(thisKey, {\r\n syncKey:\r\n typeof serverSync.syncKey == \"string\"\r\n ? serverSync.syncKey\r\n : serverSync.syncKey({ state: payload }),\r\n rollBackState: serverStateStore,\r\n actionTimeStamp: Date.now() + (serverSync.debounce ?? 3000),\r\n status: \"waiting\",\r\n });\r\n }\r\n\r\n return payload;\r\n });\r\n };\r\n if (!getGlobalStore.getState().updaterState[thisKey]) {\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const selectedIndexMap = new Map<string, number>();\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n\r\n startTransition(() => {\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n if (initalOptionsGet?.localStorage?.key) {\r\n localStorage.removeItem(\r\n initalOptionsGet?.initState\r\n ? sessionId +\r\n \"-\" +\r\n stateKey +\r\n \"-\" +\r\n initalOptionsGet?.localStorage?.key\r\n : stateKey\r\n );\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // Copy properties from baseObj to the function with type assertion\r\n Object.keys(baseObj).forEach((key) => {\r\n (baseFunction as any)[key] = (baseObj as any)[key];\r\n });\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = selectedIndexMap.get(path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\r\n (obj: any) => obj[thisKey] === thisValue\r\n );\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // ADDED: Clear cache for find operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n []\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Always include validIndices, even if it's an empty array\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: validIndices, // Always pass validIndices, even if empty\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return currentIndex === selectedIndexMap.get(parentKey);\r\n }\r\n return undefined;\r\n }\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n if (value) {\r\n selectedIndexMap.set(parentKey, thisIndex);\r\n } else {\r\n // Optional: clear selection if false\r\n selectedIndexMap.delete(parentKey);\r\n }\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // ADDED: Invalidate cache for parent path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","merged","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","startTransition","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","initState","syncUpdate","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","isFunction","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","pathToCheck","shouldUpdate","reactiveTypes","depsResult","isDeepEqual","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","selectedIndexMap","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","newUpdaterState","field","serverState","currentState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","selectedIndex","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","item","isMatch","updatedItem","updatedArray","updateFn","cutFunc","newVal","i","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","value","nested","thisObject","existingErrors","errorPath","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":";;;;;;;;;AA+XA,SAASA,GAAmBC,GAAkBC,GAA8B;AACpEC,QAAAA,IAAoBC,EAAe,SAAA,EAAW,mBAC9CC,IACJD,EAAe,SAAA,EAAW,wBAEtBE,IAAiBH,EAAkBF,CAAkB,KAAK,CAAC;AACjE,iBAAQ,IAAI,sBAAsBA,GAAUK,GAAgBJ,CAAU,GACtEG,EAAuBJ,GAAoB;AAAA,IACzC,GAAGK;AAAA,IACH,GAAGJ;AAAA,EAAA,CACJ,GAEM;AAAA,IACL,GAAGI;AAAA,IACH,GAAGJ;AAAA,EACL;AACF;AAEA,SAASK,GAA0B;AAAA,EACjC,UAAAN;AAAA,EACA,SAAAO;AAAA,EACA,oBAAAC;AACF,GAIG;AACD,QAAMH,IAAiBH,GAAkBF,CAAkB,KAAK,CAAC,GAC3DS,IAA0BD,EAAmBR,CAAkB,KAAK,CAAC,GACrEI,IACJD,EAAe,SAAA,EAAW,wBACtBO,IAAgB,EAAE,GAAGD,GAAyB,GAAGJ,EAAe;AAEtE,MAAIM,IAAY;AAChB,MAAIJ;AACF,eAAWK,KAAOL;AAChB,MAAKG,EAAc,eAAeE,CAAG,KAW3B,QAAA;AAAA,QACN;AAAA,QACAA;AAAA,QACAL,EAAQK,CAA2B;AAAA,MACrC,GACIA,KAAO,kBAAkBF,EAAcE,CAAG,MACpC,QAAA;AAAA,QACN;AAAA,QACAA;AAAA,QACAL,EAAQK,CAA2B;AAAA,MACrC,GACYD,IAAA,IACED,EAAAE,CAAG,IAAIL,EAAQK,CAA2B,OAtB9CD,IAAA,IAEJ,QAAA;AAAA,QACN;AAAA,QACAC;AAAA,QACAL,EAAQK,CAA2B;AAAA,MACrC,GAEcF,EAAAE,CAAG,IAAIL,EAAQK,CAA2B;AAmB9D,SAAID,KACFP,EAAuBJ,GAAoBU,CAAa,GAGnDA;AACT;AACO,SAASG,GACdC,GACA,EAAE,cAAAC,GAAc,YAAAC,KAChB;AACO,SAAA,EAAE,cAAAF,GAA4B,cAAAC,GAAc,YAAAC,EAAW;AAChE;AAEa,MAAAC,KAAkB,CAC7BH,GACAI,MACG;AACH,MAAIC,IAAkBL;AAGtB,QAAM,CAACM,GAAWZ,CAAkB,IAClCa,GAA0BF,CAAe;AAGvC,GAAAD,GAAK,gBAAgBA,GAAK,eAC5B,OAAO,KAAKV,CAAkB,EAAE,QAAQ,CAACI,MAAQ;AAE/C,IAAAJ,EAAmBI,CAAG,IAAIJ,EAAmBI,CAAG,KAAK,CAAC,GAEnCJ,EAAAI,CAAG,EAAE,eAAe;AAAA,MACrC,GAAGM,EAAI;AAAA;AAAA,MACP,GAAGA,GAAK;AAAA,MACR,GAAIV,EAAmBI,CAAG,EAAE,gBAAgB,CAAA;AAAA;AAAA,IAC9C;AAAA,EAAA,CACD,GAGYT,EAAA,SAAA,EAAW,iBAAiBiB,CAAS;AAG9C,QAAAE,IAAe,CACnBtB,GACAO,MACG;AACH,UAAM,CAACgB,CAAW,IAAIC,EAASjB,GAAS,eAAekB,IAAQ,GACzDC,IAASpB,GAAW;AAAA,MACxB,UAAAN;AAAA,MACA,SAAAO;AAAA,MACA,oBAAAC;AAAA,IAAA,CACD;AACD,IAAID,KAAW,OAAO,KAAKA,CAAO,EAAE,SAAS,KACnC,QAAA;AAAA,MACN;AAAA,MACAP;AAAA,MACAO;AAAA,MACAC;AAAA,MACAkB;AAAA,IACF;AAEI,UAAAC,IACJxB,EAAe,SAAS,EAAE,eAAeH,CAAkB,KAC3DoB,EAAUpB,CAAkB,GACxB4B,IAAerB,GAAS,cAC1BA,EAAQ,YAAYoB,CAAQ,IAC5BA,GAEE,CAACE,GAAOC,CAAO,IAAIC;AAAA,MACvBH;AAAA,MACA;AAAA,QACE,UAAA5B;AAAA,QACA,YAAYO,GAAS;AAAA,QACrB,aAAAgB;AAAA,QACA,cAAchB,GAAS;AAAA,QACvB,YAAYA,GAAS;AAAA,QACrB,aAAaA,GAAS;AAAA,QACtB,cAAcA,GAAS;AAAA,QACvB,cAAcA,GAAS;AAAA,QACvB,WAAWA,GAAS;AAAA,MAAA;AAAA,IAExB;AAEO,WAAAuB;AAAA,EACT;AAES,WAAAE,EACPhC,GACAO,GACA;AACA,IAAAD,GAAW,EAAE,UAAAN,GAAU,SAAAO,GAAS,oBAAAC,EAAA,CAAoB;AAAA,EAAA;AAG/C,SAAA,EAAE,cAAAc,GAAc,gBAAAU,EAAe;AACxC,GAEM;AAAA,EACJ,iBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,mBAAAhC;AAAA,EACA,aAAAiC;AAAA,EACA,qBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,sBAAAC;AACF,IAAItC,EAAe,SAAS,GAEtBuC,KAAuB,CAACC,MAA4B;AACpD,MAAA,CAACA,EAAwB,QAAA;AAEzB,MAAA;AACF,UAAMC,IAAa,OAAO,aAAa,QAAQD,CAAe;AAC1D,WAACC,IAEc,KAAK,MAAMA,CAAU,IAFhB;AAAA,WAKjBC,GAAO;AACN,mBAAA,MAAM,oCAAoCA,CAAK,GAChD;AAAA,EAAA;AAEX,GAEMC,KAAqB,CACzBjB,GACAkB,GACAC,GACAC,MACG;AASC,MARAD,EAAsB,OAChB,QAAA;AAAA,IACN;AAAA,IACAD;AAAA,IACAC,EAAsB,cAAc;AAAA,IACpCC;AAAA,EACF,GAEED,EAAsB,cAAc,OAAOC,GAAW;AACxD,UAAMC,IAA4B;AAAA,MAChC,OAAArB;AAAA,MACA,aAAa,KAAK,IAAI;AAAA,MACtB,sBACE1B,EAAe,SAAS,EAAE,cAAc4C,CAAO,IAAI,CAAC,GAAG;AAAA,MACzD,iBAAiB5C,EAAe,SAAS,EAAE,YAAY4C,CAAO;AAAA,IAChE,GAEMI,IAAa,GAAGF,CAAS,IAAIF,CAAO,IAAIC,EAAsB,cAAc,GAAG;AAErF,WAAO,aAAa,QAAQG,GAAY,KAAK,UAAUD,CAAI,CAAC;AAAA,EAAA;AAEhE,GASME,KAAoB,CACxBL,GACAjC,GACAuC,GACAC,GACA/B,GACA0B,MACG;AAEH,QAAMM,IAAU;AAAA,IACd,cAAAzC;AAAA,IACA,cAAc0C;AAAA,MACZT;AAAA,MACAO;AAAA,MACA/B;AAAA,MACA0B;AAAA,IACF;AAAA,IACA,OAAOI;AAAA,EACT;AAEA,EAAAI,EAAgB,MAAM;AACK,IAAAnB,GAAAS,GAASQ,EAAQ,YAAY,GACtCtB,EAAAc,GAASQ,EAAQ,YAAY,GACpCrB,EAAAa,GAASQ,EAAQ,KAAK;AAAA,EAAA,CAChC;AACH,GAEMG,KAAmB,CAACX,MAAoB;AAC5C,QAAMY,IAAaxD,EAAe,SAAW,EAAA,gBAAgB,IAAI4C,CAAO;AACxE,MAAI,CAACY,EAAY;AAGX,QAAAJ,wBAAc,IAAgB;AACzB,EAAAI,EAAA,WAAW,QAAQ,CAACC,MAAc;AAC3C,IAAAL,EAAQ,IAAI,MAAMK,EAAU,YAAA,CAAa;AAAA,EAAA,CAC1C,GAGD,eAAe,MAAM;AACnB,IAAAH,EAAgB,MAAM;AACpB,MAAAF,EAAQ,QAAQ,CAACM,MAAWA,EAAA,CAAQ;AAAA,IAAA,CACrC;AAAA,EAAA,CACF;AACH,GAEaC,KAAkB,CAAC9D,GAAkBuB,MAAwB;AACxE,QAAMoC,IAAaxD,EAAe,SAAW,EAAA,gBAAgB,IAAIH,CAAQ;AACzE,MAAI2D,GAAY;AACd,UAAMI,IAAkB,GAAG/D,CAAQ,OAAOuB,CAAW,IAC/CqC,IAAYD,EAAW,WAAW,IAAII,CAAe;AAE3D,IAAIH,KAGFA,EAAU,YAAY;AAAA,EACxB;AAEJ;AAEO,SAAS7B,GACdiC,GACA;AAAA,EACE,UAAAhE;AAAA,EACA,YAAAiE;AAAA,EACA,cAAAC;AAAAA,EACA,cAAAnD;AAAA,EACA,YAAAoD;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAA9C;AAAA,EACA,WAAA+C;AAAA,EACA,YAAAC;AACF,IAGgC,IAChC;AACA,QAAM,CAACC,GAAeC,CAAW,IAAIjD,EAAS,CAAA,CAAE,GAC1C,EAAE,WAAAyB,EAAU,IAAIyB,GAAc;AAEhC,MAAAC,IAAa,CAAA3E;AACjB,QAAM,CAAC+C,CAAO,IAAIvB,EAASxB,KAAYyB,IAAQ,GACzCmD,IAAWzE,EAAe,SAAS,EAAE,SAAS4C,CAAO,GACrD8B,IAAsBC,EAAW,oBAAA,KAAa,GAC9CC,IAAiBD,EAAOvD,KAAeE,GAAA,CAAQ,GAC/CuD,IAA0BF,EAAY,IAAI;AACxB,EAAAE,EAAA,UAAU9E,GAAkB6C,CAAiB,GAErEkC,EAAU,MAAM;AACd,QAAIV,KAAcA,EAAW,aAAaxB,KAAWwB,EAAW,OAAO,CAAC,GAAG;AAEhE,MAAArC,EAAAa,GAAS,CAACmC,OAAoB;AAAA,QACrC,GAAGA;AAAA,QACH,CAACX,EAAW,KAAM,CAAC,CAAE,GAAGA,EAAW;AAAA,MAAA,EACnC;AAGI,YAAAY,IAAU,GAAGZ,EAAW,QAAQ,IAAIA,EAAW,KAAK,KAAK,GAAG,CAAC;AACpD,MAAApE,EAAA,SAAA,EAAW,YAAYgF,GAAS;AAAA,QAC7C,WAAWZ,EAAW;AAAA,QACtB,QAAQA,EAAW;AAAA,MAAA,CACpB;AAAA,IAAA;AAAA,EACH,GACC,CAACA,CAAU,CAAC,GAEfU,EAAU,MAAM;AACd,IAAAlF,GAAmBgD,GAAmB;AAAA,MACpC,WAAAuB;AAAA,IAAA,CACD;AACD,UAAM/D,IAAUyE,EAAwB;AACxC,QAAII,IAAY;AAChB,IAAI7E,EAAQ,OACF,QAAA,IAAI,cAAcA,CAAO,GAG/BA,EAAQ,cAAc,OAAO0C,MACnBmC,IAAA1C;AAAA,MACVO,IAAY,MAAMF,IAAU,MAAMxC,EAAQ,cAAc;AAAA,IAC1D;AAGF,QAAI8C,IAAW;AACf,IAAIiB,GAAW,iBACbjB,IAAWiB,GAAW,cAElBc,KACEA,EAAU,eAAeA,EAAU,wBAAwB,OAC7D/B,IAAW+B,EAAU,QAGzBhC;AAAA,MACEL;AAAA,MACAuB,GAAW;AAAA,MACXjB;AAAA,MACAC;AAAA,MACAyB,EAAe;AAAA,MACf9B;AAAA,IACF,GAEAS,GAAiBX,CAAO,GACxB0B,EAAY,CAAA,CAAE;AAAA,KAEf,CAAC,GAAIH,GAAW,gBAAgB,CAAG,CAAA,CAAC,GAEvCe,GAAgB,MAAM;AACpB,IAAIV,KACF5E,GAAmBgD,GAAmB;AAAA,MACpC,YAAAkB;AAAA,MACA,cAAAlD;AAAA,MACA,WAAAuD;AAAA,MACA,cAAAJ;AAAAA,MACA,YAAAC;AAAA,IAAA,CACD;AAGH,UAAMmB,IAAU,GAAGvC,CAAO,OAAOgC,EAAe,OAAO,IACjDpB,IAAaxD,EAChB,SAAA,EACA,gBAAgB,IAAI4C,CAAO,KAAK;AAAA,MACjC,gCAAgB,IAAI;AAAA,IACtB;AAEW,WAAAY,EAAA,WAAW,IAAI2B,GAAS;AAAA,MACjC,aAAa,MAAMb,EAAY,EAAE;AAAA,MACjC,2BAAW,IAAI;AAAA,MACf,MAAM,CAAC;AAAA,MACP,cAAcL,KAAgB;AAAA,MAC9B,cAAcC,KAAgB,CAAC,aAAa,MAAM;AAAA,IAAA,CACnD,GAEDlE,EAAe,SAAS,EAAE,gBAAgB,IAAI4C,GAASY,CAAU,GAEjEc,EAAY,CAAA,CAAE,GACP,MAAM;AACX,YAAMa,IAAU,GAAGvC,CAAO,OAAOgC,EAAe,OAAO;AAEvD,MAAIpB,MACSA,EAAA,WAAW,OAAO2B,CAAO,GAChC3B,EAAW,WAAW,SAAS,KACjCxD,EAAe,SAAS,EAAE,gBAAgB,OAAO4C,CAAO;AAAA,IAG9D;AAAA,EACF,GAAG,EAAE;AAEL,QAAMO,IAAoB,CACxBiC,GAGAC,GACAC,GACAC,MACG;AACC,QAAA,MAAM,QAAQF,CAAI,GAAG;AACvB,YAAMG,IAAU,GAAG5C,CAAO,IAAIyC,EAAK,KAAK,GAAG,CAAC;AACxB,MAAAX,EAAA,QAAQ,IAAIc,CAAO;AAAA,IAAA;AAEhC,IAAAzD,EAAAa,GAAS,CAAC6C,MAA4B;AAC7C,YAAMC,IAAUC,GAAyBP,CAAkB,IACvDA,EAAmBK,CAAyB,IAC5CL,GAEEQ,IAAW,GAAGhD,CAAO,IAAIyC,EAAK,KAAK,GAAG,CAAC;AAC7C,UAAIO,GAAU;AACZ,YAAIC,IAAmB,IACnBC,IAAW9F,EACZ,SACA,EAAA,kBAAkB,IAAI4F,CAAQ;AAG9B,aAAA,CAACE,KAAYA,EAAS,SAAS,OAC/BR,EAAU,eAAe,YAAYA,EAAU,eAAe,QAC/D;AAEA,gBAAMS,IAAYV,EAAK,MAAM,GAAG,EAAE,GAC5BW,IAAaC,EAAeP,GAASK,CAAS;AAEhD,cAAA,MAAM,QAAQC,CAAU,GAAG;AACV,YAAAH,IAAA;AACnB,kBAAMK,IAAgB,GAAGtD,CAAO,IAAImD,EAAU,KAAK,GAAG,CAAC;AACvD,YAAAD,IAAW9F,EACR,SAAA,EACA,kBAAkB,IAAIkG,CAAa;AAAA,UAAA;AAAA,QACxC;AAGF,YAAIJ,GAAU;AACZ,gBAAMK,IAAWN,IACbI,EAAeP,GAASL,EAAK,MAAM,GAAG,EAAE,CAAC,IACzCY,EAAeP,GAASL,CAAI;AAChC,UAAAS,EAAS,QAAQ,CAAC,EAAE,UAAAM,GAAU,UAAAC,GAAU,QAAAC,QAAa;AACnD,kBAAMC,IAAS,SAAS;AAAA,cACtB,oBAAoBH,CAAQ;AAAA,YAC9B;AACA,gBAAIG,GAAQ;AACV,oBAAMC,KAAa,MAAM,KAAKD,EAAO,UAAU;AAC3C,kBAAAC,GAAWH,CAAQ,GAAG;AAClB,sBAAAI,KAAeH,IACjB,IAAI,SAAS,SAAS,WAAWA,CAAM,UAAU,EAAEH,CAAQ,IAC3DA;AACJ,gBAAAK,GAAWH,CAAQ,EAAE,cAAc,OAAOI,EAAY;AAAA,cAAA;AAAA,YACxD;AAAA,UACF,CACD;AAAA,QAAA;AAAA,MACH;AAEF,MACEnB,EAAU,eAAe,aACxBC,KAAiBV,EAAwB,SAAS,kBACnDQ,KAEAhD;AAAA,SACGkD,KAAiBV,EAAwB,SAAS,iBACjD,MACAQ,EAAK,KAAK,GAAG;AAAA,MACjB;AAEF,YAAMqB,IAAoBrB,EAAK,MAAM,GAAGA,EAAK,SAAS,CAAC;AACvD,MACEC,EAAU,eAAe,SACzBT,EAAwB,SAAS,iBAEjCxC;AAAA,QACEwC,EAAwB,SAAS,gBAC/B,MACA6B,EAAkB,KAAK,GAAG;AAAA,MAC9B,GAGApB,EAAU,eAAe,YACzBT,EAAwB,SAAS,iBAEb5C;AAAA,QAClB4C,EAAwB,SAAS,gBAC/B,MACA6B,EAAkB,KAAK,GAAG;AAAA,MAC9B,EAIc,OAAO,CAAC,CAACC,GAAGC,CAAC,MAAM;AAC/B,YAAIC,IAASF,GAAG,MAAM,GAAG,EAAE;AAGzB,YAAAA,KAAKD,EAAkB,KAAK,GAAG,KAC/BG,KAAUH,EAAkB,SAAS,GACrC;AAEI,cAAAI,IAASH,IAAI,MAAMD;AACvB,UAAArE,EAAsBsE,CAAE,GACxBvE,GAAmB0E,GAAQF,CAAE;AAAA,QAAA;AAAA,MAC/B,CACD;AAGG,YAAAG,IAAWd,EAAeR,GAAWJ,CAAI,GACzCc,IAAWF,EAAeP,GAASL,CAAI,GACvC2B,IACJ1B,EAAU,eAAe,WACrBD,EAAK,KAAK,GAAG,IACb,CAAC,GAAGA,CAAI,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,GAC/B7B,KAAaxD,EAAe,SAAW,EAAA,gBAAgB,IAAI4C,CAAO;AAExE,UAAIY;AACF,mBAAW,CAAC/C,GAAKgD,CAAS,KAAKD,GAAW,WAAW,WAAW;AAC9D,cAAIyD,IAAe;AACb,gBAAAC,IAAgB,MAAM,QAAQzD,EAAU,YAAY,IACtDA,EAAU,eACV,CAACA,EAAU,gBAAgB,WAAW;AAGtC,cAAA,CAAAyD,EAAc,SAAS,MAAM,GAK7B;AAAA,gBAAAA,EAAc,SAAS,KAAK,GAAG;AACjC,cAAAzD,EAAU,YAAY;AAEtB;AAAA,YAAA;AAcF,gBAVIyD,EAAc,SAAS,WAAW,KAElCzD,EAAU,UACTA,EAAU,MAAM,IAAIuD,CAAW,KAAKvD,EAAU,MAAM,IAAI,EAAE,OAE5CwD,IAAA,KAKf,CAACA,KAAgBC,EAAc,SAAS,MAAM,KAC5CzD,EAAU,cAAc;AACpB,oBAAA0D,IAAa1D,EAAU,aAAaiC,CAAO;AAE7C,cAAA,OAAOyB,KAAe,YACpBA,MACaF,IAAA,MAEPG,EAAY3D,EAAU,MAAM0D,CAAU,MAChD1D,EAAU,OAAO0D,GACFF,IAAA;AAAA,YACjB;AAIJ,YAAIA,KACFxD,EAAU,YAAY;AAAA;AAAA,QACxB;AAKJ,YAAM4D,KAAY;AAAA,QAChB,WAHgB,KAAK,IAAI;AAAA,QAIzB,UAAUzE;AAAA,QACV,MAAAyC;AAAA,QACA,YAAYC,EAAU;AAAA,QACtB,QAAQ;AAAA,QACR,UAAAyB;AAAA,QACA,UAAAZ;AAAA,MACF;AAyCI,UAvCQjE,GAAAU,GAAS,CAAC0E,MAAa;AAIjC,cAAMC,IAHO,CAAC,GAAID,KAAY,CAAA,GAAKD,EAAS,EAGhB,OAAO,CAACG,GAAKC,MAAQ;AACzC,gBAAAC,IAAY,GAAGD,EAAI,QAAQ,IAAI,KAAK,UAAUA,EAAI,IAAI,CAAC,IACvDE,IAAWH,EAAI,IAAIE,CAAS;AAElC,iBAAIC,KAEFA,EAAS,YAAY,KAAK,IAAIA,EAAS,WAAWF,EAAI,SAAS,GAC/DE,EAAS,WAAWF,EAAI,UACfE,EAAA,WAAWA,EAAS,YAAYF,EAAI,UAC7CE,EAAS,aAAaF,EAAI,cAG1BD,EAAI,IAAIE,GAAW,EAAE,GAAID,GAAa,GAGjCD;AAAA,QAAA,GACF,oBAAA,IAAA,CAA+B;AAGtC,eAAO,MAAM,KAAKD,EAAe,OAAA,CAAQ;AAAA,MAAA,CAC1C,GAED5E;AAAA,QACE+C;AAAA,QACA9C;AAAA,QACAiC,EAAwB;AAAA,QACxB/B;AAAA,MACF,GAEIkB,KACSA,EAAA;AAAA,QACT,WAAWS;AAAA,QACX,QAAQ4C;AAAA,MAAA,CACT,GAECxC,EAAwB,SAAS,YAAY;AAC/C,cAAM+C,IAAmB5H,EAAe,SAAS,EAAE,YAAY4C,CAAO,GAChEkB,IAAae,EAAwB,SAAS;AACpD,QAAAvC,GAAqBM,GAAS;AAAA,UAC5B,SACE,OAAOkB,EAAW,WAAW,WACzBA,EAAW,UACXA,EAAW,QAAQ,EAAE,OAAO4B,EAAA,CAAS;AAAA,UAC3C,eAAekC;AAAA,UACf,iBAAiB,KAAK,IAAI,KAAK9D,EAAW,YAAY;AAAA,UACtD,QAAQ;AAAA,QAAA,CACT;AAAA,MAAA;AAGI,aAAA4B;AAAA,IAAA,CACR;AAAA,EACH;AACA,EAAK1F,EAAe,SAAW,EAAA,aAAa4C,CAAO,MACjDd;AAAA,IACEc;AAAA,IACAS;AAAA,MACET;AAAA,MACAO;AAAA,MACAyB,EAAe;AAAA,MACf9B;AAAA,IAAA;AAAA,EAEJ,GACK9C,EAAe,SAAW,EAAA,eAAe4C,CAAO,KACnDb,EAASa,GAASiB,CAAW,GAE1B7D,EAAe,SAAW,EAAA,mBAAmB4C,CAAO,KACvDT,GAAyBS,GAASiB,CAAW;AAI3C,QAAAgE,IAAeC,GAAQ,MAEpBzE;AAAA,IACLT;AAAA,IACAO;AAAA,IACAyB,EAAe;AAAA,IACf9B;AAAA,EACF,GACC,CAACF,CAAO,CAAC;AAEZ,SAAO,CAACZ,GAAYY,CAAO,GAAGiF,CAAY;AAI5C;AAEA,SAASxE,EACPxD,GACAsD,GACA/B,GACA0B,GACgB;AAMV,QAAAiF,wBAAiB,IAAwB;AAC/C,MAAIC,IAAe;AAGb,QAAAC,IAAsB,CAAC5C,MAAmB;AACxC,UAAAG,IAAUH,EAAK,KAAK,GAAG;AAClB,eAAA,CAAC5E,CAAG,KAAKsH;AAClB,OAAItH,MAAQ+E,KAAW/E,EAAI,WAAW+E,IAAU,GAAG,MACjDuC,EAAW,OAAOtH,CAAG;AAGzB,IAAAuH;AAAA,EACF,GAEME,wBAAuB,IAAoB,GAE3CC,IAAU;AAAA,IACd,kBAAkB,CAACC,MAAqC;AACtD,MAAIA,GAAK,iBACP/F,EAAsB+F,EAAI,aAAa;AAAA,IAE3C;AAAA,IAEA,sBAAsB,CAACA,MAAqC;AAC1D,YAAMC,IAAOrI,EACV,SACA,EAAA,kBAAkBH,CAAQ,GAAG;AAChC,MAAIwI,GAAM,OACRhG,EAAsBgG,GAAM,GAAG,GAG7BD,GAAK,iBACP/F,EAAsB+F,EAAI,aAAa;AAGzC,YAAMzH,IACJX,EAAe,SAAS,EAAE,mBAAmBH,CAAQ;AAGvD,MAAAkI,EAAW,MAAM,GACjBC;AAEA,YAAMM,IAAWC,EAAkB5H,GAAc,EAAE;AAEnD,MAAA2C,EAAgB,MAAM;AACpB,QAAAxB,EAAgBjC,GAAUyI,CAAQ,GAClCvG,EAASlC,GAAUc,CAAY;AAC/B,cAAM6C,IAAaxD,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAC/B,QAAI2D,KACSA,EAAA,WAAW,QAAQ,CAACC,MAAc;AAC3C,UAAAA,EAAU,YAAY;AAAA,QAAA,CACvB;AAEG,cAAA+E,IAAmBzI,GAAkBF,CAAkB;AACzD,QAAA2I,GAAkB,cAAc,OACrB,aAAA;AAAA,UACXA,GAAkB,YACd1F,IACE,MACAjD,IACA,MACA2I,GAAkB,cAAc,MAClC3I;AAAA,QACN,GAEF,aAAa,WAAWA,CAAQ;AAAA,MAAA,CACjC;AAAA,IACH;AAAA,IACA,oBAAoB,CAACqD,MAAgB;AAEnC,MAAA6E,EAAW,MAAM,GACjBC;AAEA,YAAMS,IAAkBpF;AAAA,QACtBxD;AAAA,QACAsD;AAAA,QACA/B;AAAA,QACA0B;AAAA,MACF;AACA,aAAAQ,EAAgB,MAAM;AACpB,QAAAnB,GAAyBtC,GAAUqD,CAAQ,GAC3CpB,EAAgBjC,GAAU4I,CAAe,GACzC1G,EAASlC,GAAUqD,CAAQ;AAC3B,cAAMM,IAAaxD,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAC/B,QAAI2D,KACSA,EAAA,WAAW,QAAQ,CAACC,MAAc;AAC3C,UAAAA,EAAU,YAAY;AAAA,QAAA,CACvB,GAEH,aAAa,WAAW5D,CAAQ;AAAA,MAAA,CACjC,GACM;AAAA,QACL,SAAS,CAAC6I,MAAmBD,EAAgB,MAAMC,CAAK;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,eAAe1I,EAAe,WAAW,mBAAmBH,CAAQ;AAAA,IACpE,cAAcG,EAAe,WAAW,YAAYH,CAAQ;AAAA,IAC5D,YAAYG,EAAe,WAAW,gBAAgBH,CAAQ;AAAA,IAC9D,iBAAiB,MAAM;AACrB,YAAM8I,IAAc3I,EAAe,SAAS,EAAE,YAAYH,CAAQ;AAC3D,aAAA,GACL8I,KAAevB,EAAYuB,GAAa3G,GAAYnC,CAAQ,CAAC;AAAA,IAC/D;AAAA,EAEJ;AAEA,WAAS0I,EACPK,GACAvD,IAAiB,CAAA,GACjBwD,GACK;AACL,UAAMC,IAAWzD,EAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAGtB,IAAA0C,EAAW,IAAIe,CAAQ;AAU3C,UAAMC,IAAe,WAAY;AAC/B,aAAO/I,EAAe,EAAE,eAAeH,GAAUwF,CAAI;AAAA,IACvD;AAGA,WAAO,KAAK8C,CAAO,EAAE,QAAQ,CAAC1H,MAAQ;AACnC,MAAAsI,EAAqBtI,CAAG,IAAK0H,EAAgB1H,CAAG;AAAA,IAAA,CAClD;AAED,UAAMuI,IAAU;AAAA,MACd,MAAMC,GAAaC,GAAcC,GAAa;AAC5C,eAAOnJ,EAAe,EAAE,eAAeH,GAAUwF,CAAI;AAAA,MACvD;AAAA,MAEA,IAAI4D,GAAaG,GAAc;AAE3B,YAAAA,MAAS,UACT,CAACA,EAAK,WAAW,GAAG,KACpBA,MAAS,oBACT;AACM,gBAAAC,IAAchE,EAAK,KAAK,GAAG,GAC3BzB,IAAkB,GAAG/D,CAAQ,OAAOuB,CAAW,IAE/CoC,IAAaxD,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAE/B,cAAI2D,GAAY;AACd,kBAAMC,IAAYD,EAAW,WAAW,IAAII,CAAe;AAE3D,YAAIH,MAEE4B,EAAK,SAAS,KAAK+D,MAAS,UACpB3F,EAAA,MAAM,IAAI4F,CAAW;AAAA,UAGnC;AAAA,QACF;AAEF,YAAID,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMf,IAAOrI,EACV,SACA,EAAA,kBAAkBH,CAAQ,GAAG;AAE5B,gBAAA,CAACwI,GAAM;AACH,oBAAA,IAAI,MAAM,0BAA0B;AAMrC,mBAJQrI,EACZ,SAAA,EACA,oBAAoBqI,EAAK,MAAM,MAAMhD,EAAK,KAAK,GAAG,CAAC;AAAA,UAGxD;AAEE,YAAA,MAAM,QAAQuD,CAAY,GAAG;AAC/B,cAAIQ,MAAS;AACX,mBAAO,MAAM;AACX,oBAAME,IAAgBpB,EAAiB,IAAI7C,EAAK,KAAK,GAAG,CAAC;AACrD,kBAAAiE,MAAkB;AACf,uBAAAf;AAAA,kBACLK,EAAaU,CAAa;AAAA,kBAC1B,CAAC,GAAGjE,GAAMiE,EAAc,UAAU;AAAA,kBAClCT;AAAA,gBACF;AAAA,YACF;AAGE,cAAAO,MAAS,cAAcA,MAAS;AAClC,mBAAO,CACLG,MAOG;AACG,oBAAAC,IAAaX,GAAM,UAAU;AAAA,gBACjC,CAACY,MAAMA,EAAE,KAAK,GAAG,MAAMpE,EAAK,KAAK,GAAG;AAAA,cACtC,GACMqE,IAAaF,IACfZ,IACA5I,EAAe,WAAW,eAAeH,GAAUwF,CAAI;AAE3D,qBAAI+D,MAAS,uBACXrB,EAAW,MAAM,GACjBC,MAGK0B,EAAW,IAAI,CAACC,GAAUC,MAAkB;AACjD,sBAAMC,IACJL,KAAcG,EAAI,cAAcA,EAAI,cAAcC,GAC9CE,IAAevB;AAAA,kBACnBoB;AAAA,kBACA,CAAC,GAAGtE,GAAMwE,EAAU,UAAU;AAAA,kBAC9BhB;AAAA,gBACF;AACO,uBAAAU;AAAA,kBACLI;AAAA,kBACAG;AAAA,kBACAF;AAAA,kBACAhB;AAAA,kBACAL,EAAkBK,GAAqBvD,GAAMwD,CAAI;AAAA,gBACnD;AAAA,cAAA,CACD;AAAA,YACH;AAEF,cAAIO,MAAS;AACX,mBAAO,CACLG,MAQOQ,EAAcC,IAAmB;AAAA,cACtC,OAAO;AAAA,gBACL,WAAWnK;AAAA,gBACX,OAAOwF;AAAA,gBACP,QAAQkE;AAAA;AAAA,cACV;AAAA,cAEA,mBAAAhB;AAAA,YAAA,CACD;AAGL,cAAIa,MAAS;AACX,mBAAO,CAACa,MAAsB;AAItB,oBAAAP,IAHab,GAAM,UAAU;AAAA,gBACjC,CAACY,MAAMA,EAAE,KAAK,GAAG,MAAMpE,EAAK,KAAK,GAAG;AAAA,cACtC,IAEIuD,IACA5I,EAAe,WAAW,eAAeH,GAAUwF,CAAI;AAG3D,cAAA0C,EAAW,MAAM,GACjBC;AAEA,oBAAMkC,IAAmBR,EAAW;AAAA,gBAClC,CAACC,GAAUC,MACFD,EAAIM,CAAS,KAAK,CAAC;AAAA,cAE9B;AAEO,qBAAA1B;AAAA,gBACL2B;AAAA,gBACA,CAAC,GAAG7E,GAAM,OAAO4E,CAAS;AAAA,gBAC1BpB;AAAA,cACF;AAAA,YACF;AAGF,cAAIO,MAAS;AACJ,mBAAA,CACLxG,GACAuH,MACG;AACH,oBAAMC,IAAaxB,EAAa;AAAA,gBAC9B,CAACR,MAAaA,EAAIxF,CAAO,MAAMuH;AAAA,cACjC;AACI,kBAAAC,MAAe,GAAW;AACxB,oBAAAC,IAAazB,EAAawB,CAAU,GACpCE,IAAU,CAAC,GAAGjF,GAAM+E,EAAW,UAAU;AAO/C,qBAAArC,EAAW,MAAM,GACjBC,KAGAD,EAAW,MAAM,GACjBC,KAEOO,EAAkB8B,GAAYC,CAAO;AAAA,YAC9C;AAGF,cAAIlB,MAAS;AACX,mBAAO,CAACQ,MAAkB;AAClB,oBAAAW,IAAa3B,EAAagB,CAAK;AAC9B,qBAAArB,EAAkBgC,GAAY,CAAC,GAAGlF,GAAMuE,EAAM,SAAA,CAAU,CAAC;AAAA,YAClE;AAGF,cAAIR,MAAS;AACX,mBAAO,CAAC1D,OAENuC,EAAoB5C,CAAI,GACfmF,GAAArH,GAAmBuC,GAASL,GAAMxF,CAAQ,GAC5C0I;AAAA,cACLvI,EAAe,SAAA,EAAW,eAAeH,CAAQ;AAAA,cACjD,CAAA;AAAA,YACF;AAIJ,cAAIuJ,MAAS;AACJ,mBAAA,CACL1D,GACA+E,GACAC,MACG;AACH,oBAAMC,IAAe3K,EAClB,SACA,EAAA,eAAeH,GAAUwF,CAAI,GAC1Bc,IAAWR,GAAcD,CAAO,IAClCA,EAAQiF,CAAmB,IAC1BjF;AAEL,kBAAIkF,IAAmB;AAkBvB,kBAjBiB,CAACD,EAAa,KAAK,CAACE,MAAS;AAC5C,oBAAIJ,GAAQ;AACV,wBAAMK,IAAUL,EAAO;AAAA,oBAAM,CAAC/B,MAC5BtB,EAAYyD,EAAKnC,CAAK,GAAGvC,EAASuC,CAAK,CAAC;AAAA,kBAC1C;AACA,yBAAIoC,MACYF,IAAAC,IAETC;AAAAA,gBAAA;AAEH,sBAAAA,IAAU1D,EAAYyD,GAAM1E,CAAQ;AAC1C,uBAAI2E,MACYF,IAAAC,IAETC;AAAA,cAAA,CACR;AAGC,gBAAA7C,EAAoB5C,CAAI,GACfmF,GAAArH,GAAmBgD,GAAUd,GAAMxF,CAAQ;AAAA,uBAC3C6K,KAAWE,GAAa;AAC3B,sBAAAG,IAAcL,EAAQE,CAAW,GACjCI,IAAeL,EAAa;AAAA,kBAAI,CAACE,MACrCzD,EAAYyD,GAAMD,CAAW,IAAIG,IAAcF;AAAA,gBACjD;AACA,gBAAA5C,EAAoB5C,CAAI,GACf4F,EAAA9H,GAAmB6H,GAAqB3F,CAAI;AAAA,cAAA;AAAA,YAEzD;AAGF,cAAI+D,MAAS;AACJ,mBAAA,CAACQ,GAAexJ,MAAwC;AAC7D,cAAIA,GAAS,gBAEb6H,EAAoB5C,CAAI,GAChB6F,GAAA/H,GAAmBkC,GAAMxF,GAAU+J,CAAK;AAAA,YAClD;AAGF,cAAIR,MAAS;AACX,mBAAO,CACLG,MAIG;AACH,oBAAM4B,IAASvC,EAAa,IAAI,CAAChC,GAAQwE,OAAe;AAAA,gBACtD,GAAGxE;AAAA,gBACH,aAAawE,EAAE,SAAS;AAAA,cAAA,EACxB,GAEIC,IAAyB,CAAC,GAC1BC,IAA6C,CAAC;AAEpD,uBAASF,IAAI,GAAGA,IAAID,EAAO,QAAQC;AACjC,gBAAI7B,EAAW4B,EAAOC,CAAC,GAAGA,CAAC,MACzBC,EAAa,KAAKD,CAAC,GACLE,EAAA,KAAKH,EAAOC,CAAC,CAAC;AAKhC,qBAAArD,EAAW,MAAM,GACjBC,KAGOO,EAAkB+C,GAAsBjG,GAAM;AAAA,gBACnD,UAAU,CAAC,GAAIwD,GAAM,YAAY,CAAA,GAAKxD,CAAI;AAAA,gBAC1C,cAAAgG;AAAA;AAAA,cAAA,CACD;AAAA,YACH;AAAA,QACF;AAEF,cAAME,IAAkBlG,EAAKA,EAAK,SAAS,CAAC;AAC5C,YAAI,CAAC,MAAM,OAAOkG,CAAe,CAAC,GAAG;AACnC,gBAAMC,IAAanG,EAAK,MAAM,GAAG,EAAE,GAC7BoG,IAAczL,EACjB,SACA,EAAA,eAAeH,GAAU2L,CAAU;AAEtC,cAAI,MAAM,QAAQC,CAAW,KAAKrC,MAAS;AACzC,mBAAO,MACL8B;AAAA,cACE/H;AAAA,cACAqI;AAAA,cACA3L;AAAA,cACA,OAAO0L,CAAe;AAAA,YACxB;AAAA,QACJ;AAGF,YAAInC,MAAS;AACX,iBAAO,MAAMpJ,EAAe,SAAA,EAAW,eAAeH,GAAUwF,CAAI;AAEtE,YAAI+D,MAAS;AACJ,iBAAA,CAACsC,MACNC,EAAY;AAAA,YACV,WAAW9L;AAAA,YACX,OAAOwF;AAAA,YACP,SAASqG,EAAG,SAAS;AAAA,UAAA,CACtB;AAGL,YAAItC,MAAS;AACJ,iBAAA,CAACsC,MACNC,EAAY;AAAA,YACV,WAAW9L;AAAA,YACX,OAAOwF;AAAA,YACP,SAASqG,EAAG,SAAS;AAAA,UAAA,CACtB;AAGL,YAAItC,MAAS;AACX,iBAAO,MACLuC,EAAY;AAAA,YACV,WAAW9L;AAAA,YACX,OAAOwF;AAAA,UAAA,CACR;AAEL,YAAI+D,MAAS,cAAc;AACzB,gBAAMpE,IAAU,GAAGnF,CAAQ,IAAIwF,EAAK,KAAK,GAAG,CAAC;AAC7C,iBAAOrF,EAAe,WAAW,YAAYgF,CAAO;AAAA,QAAA;AAGtD,YAAIoE,MAAS,aAAa;AACxB,gBAAMoC,IAAanG,EAAK,MAAM,GAAG,EAAE,GAC7BuG,IAAYJ,EAAW,KAAK,GAAG,GAC/BjF,IAASvG,EACZ,SACA,EAAA,eAAeH,GAAU2L,CAAU;AAClC,iBAAA,MAAM,QAAQjF,CAAM,IACD,OAAOlB,EAAKA,EAAK,SAAS,CAAC,CAAC,MACzB6C,EAAiB,IAAI0D,CAAS,IAEjD;AAAA,QAAA;AAET,YAAIxC,KAAQ;AACV,iBAAO,CAAC3I,MACN8B,GAAqBO,IAAY,MAAMjD,IAAW,MAAMY,CAAG;AAG/D,YAAI2I,MAAS;AACX,iBAAO,CAACyC,MAAmB;AACzB,kBAAML,IAAanG,EAAK,MAAM,GAAG,EAAE,GAC7BwE,IAAY,OAAOxE,EAAKA,EAAK,SAAS,CAAC,CAAC,GACxCuG,IAAYJ,EAAW,KAAK,GAAG;AACrC,YAAIK,IACe3D,EAAA,IAAI0D,GAAW/B,CAAS,IAGzC3B,EAAiB,OAAO0D,CAAS;AAE7B,kBAAAE,IAAS9L,EACZ,SAAS,EACT,eAAeH,GAAU,CAAC,GAAG2L,CAAU,CAAC;AAClC,YAAAP,EAAA9H,GAAmB2I,GAAQN,CAAU,GAG9CvD,EAAoBuD,CAAU;AAAA,UAChC;AAGE,YAAAnG,EAAK,UAAU,GAAG;AACpB,cAAI+D,MAAS;AACX,mBAAO,MAAM;AACX,oBAAMf,IAAOrI,EACV,SACA,EAAA,kBAAkBH,CAAQ,GAAG,YAC1BuC,IACJpC,EAAe,SAAA,EAAW;AAExB,kBAAA,CAACqI,GAAM;AACH,sBAAA,IAAI,MAAM,sBAAsB;AAGpC,kBAAA,CAACA,GAAM;AACH,sBAAA,IAAI,MAAM,0BAA0B;AAE5C,cAAAhG,EAAsBgG,EAAK,GAAG;AAC9B,oBAAM0D,IACJ/L,EAAe,SAAS,EAAE,eAAeH,CAAQ;AAE/C,kBAAA;AAGF,sBAAMmM,IAAiBhM,EACpB,SACA,EAAA,oBAAoBqI,EAAK,GAAG;AAC3B,gBAAA2D,KAAkBA,EAAe,SAAS,KAC5CA,EAAe,QAAQ,CAAC,CAACC,CAAS,MAAM;AACtC,kBAAIA,KAAaA,EAAU,WAAW5D,EAAK,GAAI,KAC7ChG,EAAsB4J,CAAS;AAAA,gBACjC,CACD;AAIH,sBAAMC,IAAS7D,EAAK,UAAU,UAAU0D,CAAU;AAE9C,uBAACG,EAAO,UAqBL,MAnBaA,EAAO,MAAM,OAErB,QAAQ,CAACxJ,MAAU;AAC3B,wBAAMuJ,IAAYvJ,EAAM,MAClByJ,IAAezJ,EAAM,SAIrB0J,IAAgB,CAAC/D,EAAK,KAAK,GAAG4D,CAAS,EAAE,KAAK,GAAG;AAGvD7J,kBAAAA,EAAmBgK,GAAeD,CAAY;AAAA,gBAAA,CAC/C,GAED5I,GAAiB1D,CAAQ,GAElB;AAAA,uBAIF6C,GAAO;AACN,+BAAA,MAAM,gCAAgCA,CAAK,GAC5C;AAAA,cAAA;AAAA,YAEX;AAEE,cAAA0G,MAAS,eAAuB,QAAAhI;AACpC,cAAIgI,MAAS;AACX,mBAAO,MAAMpJ,EAAiB,EAAA,gBAAgB,IAAIH,CAAQ;AAE5D,cAAIuJ,MAAS;AACX,mBAAO,MACEiD,GAAa,WAAW,sBAAsBxM,CAAQ;AAIjE,cAAIuJ,MAAS;AACX,mBAAOpJ,EAAe,WAAW,mBAAmBH,CAAQ;AAC9D,cAAIuJ,MAAS;AACX,mBAAOpJ,EAAe,WAAW,YAAYH,CAAQ;AACvD,cAAIuJ,MAAS;AACX,mBAAOpJ,EAAe,WAAW,gBAAgBH,CAAQ;AAC3D,cAAIuJ,MAAS;AACX,mBAAOjB,EAAQ;AACb,cAAAiB,MAAS,qBAAsB,QAAOjB,EAAQ;AAC9C,cAAAiB,MAAS,mBAAoB,QAAOjB,EAAQ;AAAA,QAAA;AAElD,YAAIiB,MAAS;AACX,iBAAO,MACEiD,GACJ,SACA,EAAA,WAAWxM,IAAW,MAAMwF,EAAK,KAAK,GAAG,CAAC;AAIjD,YAAI+D,MAAS;AACX,iBAAO,CAAC;AAAA,YACN,UAAAkD;AAAA,YACA,aAAAC;AAAA,UAAA,MAKA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,UACEF,IAAc,EAAE,YAAY,EAAE,SAAS,SAAS;AAAA,cAElD,MAAAlH;AAAA,cACA,eACErF,EAAe,WAAW,kBAAkBH,CAAQ,GAChD,YAAY,OAAO;AAAA,cAEzB,UAAAA;AAAA,cACA,cAAcgJ,GAAM;AAAA,cAEnB,UAAAyD;AAAA,YAAA;AAAA,UACH;AAIA,YAAAlD,MAAS,YAAoB,QAAAvJ;AAC7B,YAAAuJ,MAAS,QAAgB,QAAA/D;AACzB,YAAA+D,MAAS,kBAAmB,QAAOjB,EAAQ;AAE/C,YAAIiB,MAAS;AACJ,iBAAA,CAAC1D,GAAuBgH,MAAyB;AAEtD,gBAAIA,GAAM;AACR,cAAAC,GAAS,MAAM;AACJ,gBAAA1B,EAAA9H,GAAmBuC,GAASL,GAAM,EAAE;AAC7C,sBAAMc,IAAWnG,EACd,SACA,EAAA,eAAeH,GAAUwF,CAAI;AAChC,gBAAIqH,GAAM,eAAkBA,EAAA,YAAYvG,CAAQ;AAAA,cAAA,GAC/CuG,EAAK,QAAQ;AAAA,iBACX;AACI,cAAAzB,EAAA9H,GAAmBuC,GAASL,GAAM,EAAE;AAC7C,oBAAMc,IAAWnG,EACd,SACA,EAAA,eAAeH,GAAUwF,CAAI;AAChC,cAAIqH,GAAM,eAAkBA,EAAA,YAAYvG,CAAQ;AAAA,YAAA;AAElD,YAAA8B,EAAoB5C,CAAI;AAAA,UAC1B;AAGF,YAAI+D,MAAS;AACJ,iBAAA,CAACwD,GAAuBC,MAE3B,gBAAAL;AAAA,YAACM;AAAA,YAAA;AAAA,cACC,UAAU3J;AAAA,cACV,UAAAtD;AAAA,cACA,MAAAwF;AAAA,cACA,OAAAuH;AAAA,cACA,UAAAC;AAAA,YAAA;AAAA,UACF;AAKN,cAAME,IAAW,CAAC,GAAG1H,GAAM+D,CAAI,GACzB4D,IAAYhN,EACf,SACA,EAAA,eAAeH,GAAUkN,CAAQ;AAC7B,eAAAxE,EAAkByE,GAAWD,GAAUlE,CAAI;AAAA,MAAA;AAAA,IAEtD,GAEMoE,IAAgB,IAAI,MAAMlE,GAAcC,CAAO;AAErD,WAAAjB,EAAW,IAAIe,GAAU;AAAA,MACvB,OAAOmE;AAAA,MACP,cAAAjF;AAAA,IAAA,CACD,GAEMiF;AAAA,EAAA;AAGF,SAAA1E;AAAA,IACLvI,EAAe,SAAS,EAAE,eAAeH,GAAU,CAAE,CAAA;AAAA,EACvD;AACF;AAEO,SAAS8L,EAAYuB,GAIzB;AACD,SAAOnD,EAAcoD,IAAgB,EAAE,OAAAD,GAAO;AAChD;AAEA,SAASlD,GAAkB;AAAA,EACzB,OAAAkD;AAAA,EAEA,mBAAA3E;AACF,GAkBG;AACD,QAAMsD,IAAQ7L,IAAiB,eAAekN,EAAM,WAAWA,EAAM,KAAK;AAE1E,SAAK,MAAM,QAAQrB,CAAK,IAGJtD;AAAA,IAClBsD;AAAA,IACAqB,EAAM;AAAA,EACR,EAEmB;AAAA,IACjB,CAACrC,GAAMuC,GAAQxD,GAAOiC,GAAOwB,MAEpBH,EAAM,OAAOrC,GAAMuC,GAAQxD,GAAOiC,GAAOwB,CAAW;AAAA,EAE/D,IAZS;AAaX;AACA,SAASF,GAAe;AAAA,EACtB,OAAAD;AACF,GAMG;AACK,QAAAI,IAAa3I,EAAwB,IAAI,GACzCiB,IAAW,GAAGsH,EAAM,SAAS,IAAIA,EAAM,MAAM,KAAK,GAAG,CAAC;AAE5D,SAAApI,EAAU,MAAM;AACd,UAAMyI,IAAUD,EAAW;AAC3B,QAAI,CAACC,KAAW,CAACA,EAAQ,cAAe;AAExC,UAAMC,IAAgBD,EAAQ,eAExBlH,IADa,MAAM,KAAKmH,EAAc,UAAU,EAC1B,QAAQD,CAAO;AAEvC,QAAAnH,IAAWoH,EAAc,aAAa,gBAAgB;AAC1D,IAAKpH,MACQA,IAAA,UAAU,OAAO,WAAY,CAAA,IAC1BoH,EAAA,aAAa,kBAAkBpH,CAAQ;AAIvD,UAAMqH,IAAc;AAAA,MAClB,YAFiB,YAAY,OAAO,WAAY,CAAA;AAAA,MAGhD,UAAArH;AAAA,MACA,UAAAC;AAAA,MACA,QAAQ6G,EAAM;AAAA,IAChB;AAEA,IAAAlN,EAAe,SAAS,EAAE,iBAAiB4F,GAAU6H,CAAW;AAG1D,UAAA5B,IAAQ7L,EACX,SAAS,EACT,eAAekN,EAAM,WAAWA,EAAM,KAAK;AAE1C,QAAAzG;AACJ,QAAIyG,EAAM;AACJ,UAAA;AACF,QAAAzG,IAAe,IAAI;AAAA,UACjB;AAAA,UACA,WAAWyG,EAAM,OAAO;AAAA,UACxBrB,CAAK;AAAA,eACA6B,GAAK;AACJ,gBAAA,MAAM,kDAAkDA,CAAG,GACpDjH,IAAAoF;AAAA,MAAA;AAAA;AAGF,MAAApF,IAAAoF;AAGjB,IAAIpF,MAAiB,QAAQ,OAAOA,KAAiB,aACpCA,IAAA,KAAK,UAAUA,CAAY;AAG5C,UAAMkH,IAAW,SAAS,eAAe,OAAOlH,CAAY,CAAC;AAC7D,IAAA8G,EAAQ,YAAYI,CAAQ;AAAA,EAAA,GAC3B,CAACT,EAAM,WAAWA,EAAM,MAAM,KAAK,GAAG,GAAGA,EAAM,OAAO,CAAC,GAEnDnD,EAAc,QAAQ;AAAA,IAC3B,KAAKuD;AAAA,IACL,OAAO,EAAE,SAAS,OAAO;AAAA,IACzB,kBAAkB1H;AAAA,EAAA,CACnB;AACH;AACO,SAASgI,GAAiBV,GAG9B;AACD,QAAMrB,IAAQgC;AAAA,IACZ,CAACC,MAAW;AACJ,YAAAtK,IAAaxD,EAChB,SAAS,EACT,gBAAgB,IAAIkN,EAAM,SAAS,KAAK;AAAA,QACzC,gCAAgB,IAAI;AAAA,MACtB;AACW,aAAA1J,EAAA,WAAW,IAAI0J,EAAM,WAAW;AAAA,QACzC,aAAaY;AAAA,QACb,2BAAW,IAAI,CAACZ,EAAM,MAAM,KAAK,GAAG,CAAC,CAAC;AAAA,MAAA,CACvC,GACM,MAAM1J,EAAW,WAAW,OAAO0J,EAAM,SAAS;AAAA,IAC3D;AAAA,IACA,MAAMlN,EAAe,WAAW,eAAekN,EAAM,WAAWA,EAAM,KAAK;AAAA,EAC7E;AACA,SAAOnD,EAAc,QAAQ,CAAI,GAAA,OAAO8B,CAAK,CAAC;AAChD;"}
|