cogsbox-state 0.5.142 → 0.5.144
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.d.ts +2 -1
- package/dist/CogsState.jsx +126 -130
- package/dist/CogsState.jsx.map +1 -1
- package/package.json +1 -1
package/dist/CogsState.d.ts
CHANGED
|
@@ -110,6 +110,7 @@ export type EndType<T, IsArrayElement = false> = {
|
|
|
110
110
|
setSelected: (value: boolean) => void;
|
|
111
111
|
getFormRef: () => React.RefObject<any> | undefined;
|
|
112
112
|
removeStorage: () => void;
|
|
113
|
+
sync: () => void;
|
|
113
114
|
validationWrapper: ({ children, hideMessage, }: {
|
|
114
115
|
children: React.ReactNode;
|
|
115
116
|
hideMessage?: boolean;
|
|
@@ -118,7 +119,7 @@ export type EndType<T, IsArrayElement = false> = {
|
|
|
118
119
|
} & (IsArrayElement extends true ? {
|
|
119
120
|
cut: () => void;
|
|
120
121
|
} : {}) & {
|
|
121
|
-
[
|
|
122
|
+
[k: string]: never;
|
|
122
123
|
};
|
|
123
124
|
export type StateObject<T> = (T extends any[] ? ArrayEndType<T> : T extends Record<string, unknown> | object ? {
|
|
124
125
|
[K in keyof T]-?: StateObject<T[K]>;
|
package/dist/CogsState.jsx
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as ut } from "react/jsx-runtime";
|
|
3
|
-
import { useState as
|
|
4
|
-
import { transformStateFunc as
|
|
5
|
-
import { pushFunc as
|
|
3
|
+
import { useState as rt, useRef as Y, useEffect as at, useLayoutEffect as _t, useMemo as ht, createElement as K, useSyncExternalStore as Nt, startTransition as wt } from "react";
|
|
4
|
+
import { transformStateFunc as $t, isFunction as q, isDeepEqual as O, getDifferences as gt, getNestedValue as W, debounce as At } from "./utility.js";
|
|
5
|
+
import { pushFunc as et, updateFn as Z, cutFunc as H, ValidationWrapper as Tt, FormControlComponent as Vt } from "./Functions.jsx";
|
|
6
6
|
import "zod";
|
|
7
7
|
import { getGlobalStore as r, formRefStore as ft } from "./store.js";
|
|
8
|
-
import { useCogsConfig as
|
|
9
|
-
import
|
|
8
|
+
import { useCogsConfig as bt } from "./CogsStateClient.jsx";
|
|
9
|
+
import ot from "./node_modules/uuid/dist/esm-browser/v4.js";
|
|
10
10
|
function St(t, i) {
|
|
11
11
|
const v = r.getState().getInitialOptions, S = r.getState().setInitialStateOptions, u = v(t) || {};
|
|
12
12
|
S(t, {
|
|
@@ -24,15 +24,15 @@ function mt({
|
|
|
24
24
|
if (i)
|
|
25
25
|
for (const s in i)
|
|
26
26
|
E.hasOwnProperty(s) ? (s == "localStorage" && i[s] && E[s].key !== i[s]?.key && (m = !0, E[s] = i[s]), s == "initialState" && i[s] && E[s] !== i[s] && // Different references
|
|
27
|
-
!
|
|
27
|
+
!O(E[s], i[s]) && (m = !0, E[s] = i[s])) : (m = !0, E[s] = i[s]);
|
|
28
28
|
m && h(t, E);
|
|
29
29
|
}
|
|
30
|
-
function
|
|
30
|
+
function Jt(t, { formElements: i, validation: v }) {
|
|
31
31
|
return { initialState: t, formElements: i, validation: v };
|
|
32
32
|
}
|
|
33
|
-
const
|
|
33
|
+
const Zt = (t, i) => {
|
|
34
34
|
let v = t;
|
|
35
|
-
const [S, u] =
|
|
35
|
+
const [S, u] = $t(v);
|
|
36
36
|
(Object.keys(u).length > 0 || i && Object.keys(i).length > 0) && Object.keys(u).forEach((m) => {
|
|
37
37
|
u[m] = u[m] || {}, u[m].formElements = {
|
|
38
38
|
...i?.formElements,
|
|
@@ -43,10 +43,10 @@ const Ht = (t, i) => {
|
|
|
43
43
|
}, J(m) || r.getState().setInitialStateOptions(m, u[m]);
|
|
44
44
|
}), r.getState().setInitialStates(S), r.getState().setCreatedState(S);
|
|
45
45
|
const h = (m, s) => {
|
|
46
|
-
const [f] =
|
|
46
|
+
const [f] = rt(s?.componentId ?? ot());
|
|
47
47
|
if (s && typeof s.initialState < "u" && q(s.initialState)) {
|
|
48
|
-
const
|
|
49
|
-
|
|
48
|
+
const C = r.getState().cogsStateStore[m] || S[m], F = s.initialState(
|
|
49
|
+
C
|
|
50
50
|
);
|
|
51
51
|
s = {
|
|
52
52
|
...s,
|
|
@@ -58,7 +58,7 @@ const Ht = (t, i) => {
|
|
|
58
58
|
options: s,
|
|
59
59
|
initialOptionsPart: u
|
|
60
60
|
});
|
|
61
|
-
const e = r.getState().cogsStateStore[m] || S[m], y = s?.modifyState ? s.modifyState(e) : e, [P, T] =
|
|
61
|
+
const e = r.getState().cogsStateStore[m] || S[m], y = s?.modifyState ? s.modifyState(e) : e, [P, T] = Ot(
|
|
62
62
|
y,
|
|
63
63
|
{
|
|
64
64
|
stateKey: m,
|
|
@@ -76,7 +76,7 @@ const Ht = (t, i) => {
|
|
|
76
76
|
return T;
|
|
77
77
|
};
|
|
78
78
|
function E(m, s) {
|
|
79
|
-
mt({ stateKey: m, options: s, initialOptionsPart: u }),
|
|
79
|
+
mt({ stateKey: m, options: s, initialOptionsPart: u }), st(m);
|
|
80
80
|
}
|
|
81
81
|
return { useCogsState: h, setCogsOptions: E };
|
|
82
82
|
}, {
|
|
@@ -84,12 +84,12 @@ const Ht = (t, i) => {
|
|
|
84
84
|
setState: z,
|
|
85
85
|
getInitialOptions: J,
|
|
86
86
|
getKeyState: yt,
|
|
87
|
-
getValidationErrors:
|
|
88
|
-
setStateLog:
|
|
89
|
-
updateInitialStateGlobal:
|
|
90
|
-
addValidationError:
|
|
87
|
+
getValidationErrors: kt,
|
|
88
|
+
setStateLog: Ct,
|
|
89
|
+
updateInitialStateGlobal: it,
|
|
90
|
+
addValidationError: xt,
|
|
91
91
|
removeValidationError: L,
|
|
92
|
-
setServerSyncActions:
|
|
92
|
+
setServerSyncActions: Pt
|
|
93
93
|
} = r.getState(), vt = (t) => {
|
|
94
94
|
if (!t) return null;
|
|
95
95
|
try {
|
|
@@ -126,8 +126,8 @@ const Ht = (t, i) => {
|
|
|
126
126
|
),
|
|
127
127
|
state: v
|
|
128
128
|
};
|
|
129
|
-
|
|
130
|
-
},
|
|
129
|
+
it(t, E.initialState), X(t, E.updaterState), z(t, E.state);
|
|
130
|
+
}, st = (t) => {
|
|
131
131
|
const i = r.getState().stateComponents.get(t);
|
|
132
132
|
if (!i) return;
|
|
133
133
|
const v = /* @__PURE__ */ new Set();
|
|
@@ -136,7 +136,7 @@ const Ht = (t, i) => {
|
|
|
136
136
|
}), queueMicrotask(() => {
|
|
137
137
|
v.forEach((S) => S());
|
|
138
138
|
});
|
|
139
|
-
},
|
|
139
|
+
}, Ht = (t, i) => {
|
|
140
140
|
const v = r.getState().stateComponents.get(t);
|
|
141
141
|
if (v) {
|
|
142
142
|
const S = `${t}////${i}`, u = v.components.get(S);
|
|
@@ -145,7 +145,7 @@ const Ht = (t, i) => {
|
|
|
145
145
|
u && u.forceUpdate();
|
|
146
146
|
}
|
|
147
147
|
};
|
|
148
|
-
function
|
|
148
|
+
function Ot(t, {
|
|
149
149
|
stateKey: i,
|
|
150
150
|
serverSync: v,
|
|
151
151
|
localStorage: S,
|
|
@@ -158,10 +158,10 @@ function Ft(t, {
|
|
|
158
158
|
syncUpdate: e,
|
|
159
159
|
dependencies: y
|
|
160
160
|
} = {}) {
|
|
161
|
-
const [P, T] =
|
|
161
|
+
const [P, T] = rt({}), { sessionId: C } = bt();
|
|
162
162
|
let F = !i;
|
|
163
|
-
const [g] =
|
|
164
|
-
|
|
163
|
+
const [g] = rt(i ?? ot()), c = r.getState().stateLog[g], B = Y(/* @__PURE__ */ new Set()), U = Y(s ?? ot()), b = Y(null);
|
|
164
|
+
b.current = J(g), at(() => {
|
|
165
165
|
if (e && e.stateKey === g && e.path?.[0]) {
|
|
166
166
|
z(g, (a) => ({
|
|
167
167
|
...a,
|
|
@@ -173,24 +173,24 @@ function Ft(t, {
|
|
|
173
173
|
userId: e.userId
|
|
174
174
|
});
|
|
175
175
|
}
|
|
176
|
-
}, [e]),
|
|
176
|
+
}, [e]), at(() => {
|
|
177
177
|
if (f) {
|
|
178
178
|
St(g, {
|
|
179
179
|
initialState: f
|
|
180
180
|
});
|
|
181
|
-
const d =
|
|
181
|
+
const d = b.current;
|
|
182
182
|
let a = null;
|
|
183
183
|
const l = q(d?.localStorage?.key) ? d?.localStorage?.key(f) : d?.localStorage?.key;
|
|
184
|
-
l &&
|
|
185
|
-
|
|
184
|
+
l && C && (a = vt(
|
|
185
|
+
C + "-" + g + "-" + l
|
|
186
186
|
));
|
|
187
187
|
const I = r.getState().initialStateGlobal[g];
|
|
188
188
|
if (console.log(
|
|
189
189
|
"currentGloballyStoredInitialState",
|
|
190
190
|
I,
|
|
191
191
|
f,
|
|
192
|
-
|
|
193
|
-
), I && !
|
|
192
|
+
O(I, f)
|
|
193
|
+
), I && !O(I, f) || !I) {
|
|
194
194
|
let w = f;
|
|
195
195
|
a && a.lastUpdated > (a.lastSyncedWithServer || 0) && (w = a.state, d?.localStorage?.onChange && d?.localStorage?.onChange(w)), pt(
|
|
196
196
|
g,
|
|
@@ -198,11 +198,11 @@ function Ft(t, {
|
|
|
198
198
|
w,
|
|
199
199
|
n,
|
|
200
200
|
U.current,
|
|
201
|
-
|
|
202
|
-
),
|
|
201
|
+
C
|
|
202
|
+
), st(g), (Array.isArray(m) ? m : [m || "component"]).includes("none") || T({});
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
|
-
}, [f, ...y || []]),
|
|
205
|
+
}, [f, ...y || []]), _t(() => {
|
|
206
206
|
F && St(g, {
|
|
207
207
|
serverSync: v,
|
|
208
208
|
formElements: u,
|
|
@@ -232,12 +232,12 @@ function Ft(t, {
|
|
|
232
232
|
z(g, (w) => {
|
|
233
233
|
const N = q(d) ? d(w) : d, G = gt(w, N);
|
|
234
234
|
new Set(G);
|
|
235
|
-
const
|
|
236
|
-
if (
|
|
237
|
-
let R = !1, $ = r.getState().signalDomElements.get(
|
|
235
|
+
const j = `${g}-${a.join(".")}`;
|
|
236
|
+
if (j) {
|
|
237
|
+
let R = !1, $ = r.getState().signalDomElements.get(j);
|
|
238
238
|
if ((!$ || $.size === 0) && (l.updateType === "insert" || l.updateType === "cut")) {
|
|
239
|
-
const x = a.slice(0, -1),
|
|
240
|
-
if (Array.isArray(
|
|
239
|
+
const x = a.slice(0, -1), p = W(N, x);
|
|
240
|
+
if (Array.isArray(p)) {
|
|
241
241
|
R = !0;
|
|
242
242
|
const _ = `${g}-${x.join(".")}`;
|
|
243
243
|
$ = r.getState().signalDomElements.get(_);
|
|
@@ -245,48 +245,44 @@ function Ft(t, {
|
|
|
245
245
|
}
|
|
246
246
|
if ($) {
|
|
247
247
|
const x = R ? W(N, a.slice(0, -1)) : W(N, a);
|
|
248
|
-
$.forEach(({ parentId:
|
|
248
|
+
$.forEach(({ parentId: p, position: _, effect: V }) => {
|
|
249
249
|
const A = document.querySelector(
|
|
250
|
-
`[data-parent-id="${
|
|
250
|
+
`[data-parent-id="${p}"]`
|
|
251
251
|
);
|
|
252
252
|
if (A) {
|
|
253
253
|
const M = Array.from(A.childNodes);
|
|
254
254
|
if (M[_]) {
|
|
255
|
-
const
|
|
256
|
-
M[_].textContent = String(
|
|
255
|
+
const k = V ? new Function("state", `return (${V})(state)`)(x) : x;
|
|
256
|
+
M[_].textContent = String(k);
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
259
|
});
|
|
260
260
|
}
|
|
261
261
|
}
|
|
262
|
-
l.updateType === "update" && (I ||
|
|
263
|
-
(I ||
|
|
262
|
+
l.updateType === "update" && (I || b.current?.validationKey) && a && L(
|
|
263
|
+
(I || b.current?.validationKey) + "." + a.join(".")
|
|
264
264
|
);
|
|
265
265
|
const D = a.slice(0, a.length - 1);
|
|
266
|
-
l.updateType === "cut" &&
|
|
267
|
-
|
|
268
|
-
), l.updateType === "insert" &&
|
|
269
|
-
|
|
266
|
+
l.updateType === "cut" && b.current?.validationKey && L(
|
|
267
|
+
b.current?.validationKey + "." + D.join(".")
|
|
268
|
+
), l.updateType === "insert" && b.current?.validationKey && kt(
|
|
269
|
+
b.current?.validationKey + "." + D.join(".")
|
|
270
270
|
).filter(([$, x]) => {
|
|
271
|
-
let
|
|
272
|
-
if ($ == D.join(".") &&
|
|
271
|
+
let p = $?.split(".").length;
|
|
272
|
+
if ($ == D.join(".") && p == D.length - 1) {
|
|
273
273
|
let _ = $ + "." + D;
|
|
274
|
-
L($),
|
|
274
|
+
L($), xt(_, x);
|
|
275
275
|
}
|
|
276
276
|
});
|
|
277
|
-
const It = W(w, a), Et = W(N, a)
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
l,
|
|
282
|
-
_t ?? "NONE",
|
|
283
|
-
tt
|
|
284
|
-
), tt) {
|
|
277
|
+
const It = W(w, a), Et = W(N, a);
|
|
278
|
+
l.updateType === "update" ? a.join(".") : [...a].slice(0, -1).join(".");
|
|
279
|
+
const ct = r.getState().stateComponents.get(g);
|
|
280
|
+
if (ct) {
|
|
285
281
|
const R = gt(w, N), $ = new Set(R), x = l.updateType === "update" ? a.join(".") : a.slice(0, -1).join(".") || "";
|
|
286
282
|
for (const [
|
|
287
|
-
|
|
283
|
+
p,
|
|
288
284
|
_
|
|
289
|
-
] of
|
|
285
|
+
] of ct.components.entries()) {
|
|
290
286
|
let V = !1;
|
|
291
287
|
const A = Array.isArray(_.reactiveType) ? _.reactiveType : [_.reactiveType || "component"];
|
|
292
288
|
if (!A.includes("none")) {
|
|
@@ -296,36 +292,36 @@ function Ft(t, {
|
|
|
296
292
|
}
|
|
297
293
|
if (A.includes("component") && ((_.paths.has(x) || _.paths.has("")) && (V = !0), !V))
|
|
298
294
|
for (const M of $) {
|
|
299
|
-
let
|
|
295
|
+
let k = M;
|
|
300
296
|
for (; ; ) {
|
|
301
|
-
if (_.paths.has(
|
|
297
|
+
if (_.paths.has(k)) {
|
|
302
298
|
V = !0;
|
|
303
299
|
break;
|
|
304
300
|
}
|
|
305
|
-
const
|
|
306
|
-
if (
|
|
307
|
-
const dt =
|
|
301
|
+
const tt = k.lastIndexOf(".");
|
|
302
|
+
if (tt !== -1) {
|
|
303
|
+
const dt = k.substring(
|
|
308
304
|
0,
|
|
309
|
-
|
|
305
|
+
tt
|
|
310
306
|
);
|
|
311
307
|
if (!isNaN(
|
|
312
|
-
Number(
|
|
308
|
+
Number(k.substring(tt + 1))
|
|
313
309
|
) && _.paths.has(dt)) {
|
|
314
310
|
V = !0;
|
|
315
311
|
break;
|
|
316
312
|
}
|
|
317
|
-
|
|
313
|
+
k = dt;
|
|
318
314
|
} else
|
|
319
|
-
|
|
320
|
-
if (
|
|
315
|
+
k = "";
|
|
316
|
+
if (k === "")
|
|
321
317
|
break;
|
|
322
318
|
}
|
|
323
319
|
if (V) break;
|
|
324
320
|
}
|
|
325
321
|
if (!V && A.includes("deps") && _.depsFunction) {
|
|
326
322
|
const M = _.depsFunction(N);
|
|
327
|
-
let
|
|
328
|
-
typeof M == "boolean" ? M && (
|
|
323
|
+
let k = !1;
|
|
324
|
+
typeof M == "boolean" ? M && (k = !0) : O(_.deps, M) || (_.deps = M, k = !0), k && (V = !0);
|
|
329
325
|
}
|
|
330
326
|
V && _.forceUpdate();
|
|
331
327
|
}
|
|
@@ -340,23 +336,23 @@ function Ft(t, {
|
|
|
340
336
|
oldValue: It,
|
|
341
337
|
newValue: Et
|
|
342
338
|
};
|
|
343
|
-
if (
|
|
344
|
-
const x = [...R ?? [], lt].reduce((
|
|
345
|
-
const V = `${_.stateKey}:${JSON.stringify(_.path)}`, A =
|
|
346
|
-
return A ? (A.timeStamp = Math.max(A.timeStamp, _.timeStamp), A.newValue = _.newValue, A.oldValue = A.oldValue ?? _.oldValue, A.updateType = _.updateType) :
|
|
339
|
+
if (Ct(g, (R) => {
|
|
340
|
+
const x = [...R ?? [], lt].reduce((p, _) => {
|
|
341
|
+
const V = `${_.stateKey}:${JSON.stringify(_.path)}`, A = p.get(V);
|
|
342
|
+
return A ? (A.timeStamp = Math.max(A.timeStamp, _.timeStamp), A.newValue = _.newValue, A.oldValue = A.oldValue ?? _.oldValue, A.updateType = _.updateType) : p.set(V, { ..._ }), p;
|
|
347
343
|
}, /* @__PURE__ */ new Map());
|
|
348
344
|
return Array.from(x.values());
|
|
349
345
|
}), jt(
|
|
350
346
|
N,
|
|
351
347
|
g,
|
|
352
|
-
|
|
353
|
-
|
|
348
|
+
b.current,
|
|
349
|
+
C
|
|
354
350
|
), h && h({
|
|
355
351
|
updateLog: c,
|
|
356
352
|
update: lt
|
|
357
|
-
}),
|
|
358
|
-
const R = r.getState().serverState[g], $ =
|
|
359
|
-
|
|
353
|
+
}), b.current?.serverSync) {
|
|
354
|
+
const R = r.getState().serverState[g], $ = b.current?.serverSync;
|
|
355
|
+
Pt(g, {
|
|
360
356
|
syncKey: typeof $.syncKey == "string" ? $.syncKey : $.syncKey({ state: N }),
|
|
361
357
|
rollBackState: R,
|
|
362
358
|
actionTimeStamp: Date.now() + ($.debounce ?? 3e3),
|
|
@@ -372,14 +368,14 @@ function Ft(t, {
|
|
|
372
368
|
g,
|
|
373
369
|
n,
|
|
374
370
|
U.current,
|
|
375
|
-
|
|
371
|
+
C
|
|
376
372
|
)
|
|
377
|
-
), r.getState().cogsStateStore[g] || z(g, t), r.getState().initialStateGlobal[g] ||
|
|
378
|
-
const o =
|
|
373
|
+
), r.getState().cogsStateStore[g] || z(g, t), r.getState().initialStateGlobal[g] || it(g, t));
|
|
374
|
+
const o = ht(() => Q(
|
|
379
375
|
g,
|
|
380
376
|
n,
|
|
381
377
|
U.current,
|
|
382
|
-
|
|
378
|
+
C
|
|
383
379
|
), [g]);
|
|
384
380
|
return [yt(g), o];
|
|
385
381
|
}
|
|
@@ -400,7 +396,7 @@ function Q(t, i, v, S) {
|
|
|
400
396
|
e?.key && L(e?.key), f?.validationKey && L(f.validationKey);
|
|
401
397
|
const y = r.getState().initialStateGlobal[t];
|
|
402
398
|
r.getState().clearSelectedIndexesForState(t), u.clear(), h++;
|
|
403
|
-
const P = s(y, []), T = J(t),
|
|
399
|
+
const P = s(y, []), T = J(t), C = q(T?.localStorage?.key) ? T?.localStorage?.key(y) : T?.localStorage?.key, F = `${S}-${t}-${C}`;
|
|
404
400
|
F && localStorage.removeItem(F), X(t, P), z(t, y);
|
|
405
401
|
const g = r.getState().stateComponents.get(t);
|
|
406
402
|
return g && g.components.forEach((c) => {
|
|
@@ -415,8 +411,8 @@ function Q(t, i, v, S) {
|
|
|
415
411
|
v,
|
|
416
412
|
S
|
|
417
413
|
);
|
|
418
|
-
return
|
|
419
|
-
|
|
414
|
+
return wt(() => {
|
|
415
|
+
it(t, f), X(t, e), z(t, f);
|
|
420
416
|
const y = r.getState().stateComponents.get(t);
|
|
421
417
|
y && y.components.forEach((P) => {
|
|
422
418
|
P.forceUpdate();
|
|
@@ -430,7 +426,7 @@ function Q(t, i, v, S) {
|
|
|
430
426
|
_isLoading: r.getState().isLoadingGlobal[t],
|
|
431
427
|
_isServerSynced: () => {
|
|
432
428
|
const f = r.getState().serverState[t];
|
|
433
|
-
return !!(f &&
|
|
429
|
+
return !!(f && O(f, yt(t)));
|
|
434
430
|
}
|
|
435
431
|
};
|
|
436
432
|
function s(f, e = [], y) {
|
|
@@ -442,7 +438,7 @@ function Q(t, i, v, S) {
|
|
|
442
438
|
Object.keys(m).forEach((g) => {
|
|
443
439
|
T[g] = m[g];
|
|
444
440
|
});
|
|
445
|
-
const
|
|
441
|
+
const C = {
|
|
446
442
|
apply(g, c, B) {
|
|
447
443
|
return console.log(
|
|
448
444
|
`PROXY APPLY TRAP HIT: stateKey=${t}, path=${e.join(".")}`
|
|
@@ -464,7 +460,7 @@ function Q(t, i, v, S) {
|
|
|
464
460
|
const d = r.getState().getNestedState(t, []), a = n?.validation?.key;
|
|
465
461
|
try {
|
|
466
462
|
const l = await o.action(d);
|
|
467
|
-
if (l && !l.success && l.validation_errors && a) {
|
|
463
|
+
if (console.log("response", l), l && !l.success && l.validation_errors && a) {
|
|
468
464
|
r.getState().removeValidationError(a), l.validation_errors.forEach((w) => {
|
|
469
465
|
const N = [a, ...w.path].join(".");
|
|
470
466
|
r.getState().addValidationError(N, w.message);
|
|
@@ -481,7 +477,7 @@ function Q(t, i, v, S) {
|
|
|
481
477
|
};
|
|
482
478
|
if (c === "_status") {
|
|
483
479
|
const n = r.getState().getNestedState(t, e), o = r.getState().initialStateGlobal[t], d = W(o, e);
|
|
484
|
-
return
|
|
480
|
+
return O(n, d) ? "fresh" : "stale";
|
|
485
481
|
}
|
|
486
482
|
if (c === "getStatus")
|
|
487
483
|
return function() {
|
|
@@ -489,7 +485,7 @@ function Q(t, i, v, S) {
|
|
|
489
485
|
t,
|
|
490
486
|
e
|
|
491
487
|
), o = r.getState().initialStateGlobal[t], d = W(o, e);
|
|
492
|
-
return
|
|
488
|
+
return O(n, d) ? "fresh" : "stale";
|
|
493
489
|
};
|
|
494
490
|
if (c === "removeStorage")
|
|
495
491
|
return () => {
|
|
@@ -550,7 +546,7 @@ function Q(t, i, v, S) {
|
|
|
550
546
|
});
|
|
551
547
|
};
|
|
552
548
|
if (c === "$stateMap")
|
|
553
|
-
return (n) => K(
|
|
549
|
+
return (n) => K(Ft, {
|
|
554
550
|
proxy: {
|
|
555
551
|
_stateKey: t,
|
|
556
552
|
_path: e,
|
|
@@ -594,7 +590,7 @@ function Q(t, i, v, S) {
|
|
|
594
590
|
return s(d, a);
|
|
595
591
|
};
|
|
596
592
|
if (c === "insert")
|
|
597
|
-
return (n) => (E(e),
|
|
593
|
+
return (n) => (E(e), et(i, n, e, t), s(
|
|
598
594
|
r.getState().getNestedState(t, e),
|
|
599
595
|
e
|
|
600
596
|
));
|
|
@@ -604,18 +600,18 @@ function Q(t, i, v, S) {
|
|
|
604
600
|
let I = null;
|
|
605
601
|
if (!a.some((N) => {
|
|
606
602
|
if (o) {
|
|
607
|
-
const
|
|
608
|
-
(D) =>
|
|
603
|
+
const j = o.every(
|
|
604
|
+
(D) => O(N[D], l[D])
|
|
609
605
|
);
|
|
610
|
-
return
|
|
606
|
+
return j && (I = N), j;
|
|
611
607
|
}
|
|
612
|
-
const G =
|
|
608
|
+
const G = O(N, l);
|
|
613
609
|
return G && (I = N), G;
|
|
614
610
|
}))
|
|
615
|
-
E(e),
|
|
611
|
+
E(e), et(i, l, e, t);
|
|
616
612
|
else if (d && I) {
|
|
617
613
|
const N = d(I), G = a.map(
|
|
618
|
-
(
|
|
614
|
+
(j) => O(j, I) ? N : j
|
|
619
615
|
);
|
|
620
616
|
E(e), Z(i, G, e);
|
|
621
617
|
}
|
|
@@ -632,7 +628,7 @@ function Q(t, i, v, S) {
|
|
|
632
628
|
if (c === "toggleByValue")
|
|
633
629
|
return (n) => {
|
|
634
630
|
const o = f.findIndex((d) => d === n);
|
|
635
|
-
o > -1 ? H(i, e, t, o) :
|
|
631
|
+
o > -1 ? H(i, e, t, o) : et(i, n, e, t);
|
|
636
632
|
};
|
|
637
633
|
if (c === "stateFilter")
|
|
638
634
|
return (n) => {
|
|
@@ -663,19 +659,19 @@ function Q(t, i, v, S) {
|
|
|
663
659
|
if (c === "get")
|
|
664
660
|
return () => r.getState().getNestedState(t, e);
|
|
665
661
|
if (c === "$derive")
|
|
666
|
-
return (n) =>
|
|
662
|
+
return (n) => nt({
|
|
667
663
|
_stateKey: t,
|
|
668
664
|
_path: e,
|
|
669
665
|
_effect: n.toString()
|
|
670
666
|
});
|
|
671
667
|
if (c === "$derive")
|
|
672
|
-
return (n) =>
|
|
668
|
+
return (n) => nt({
|
|
673
669
|
_stateKey: t,
|
|
674
670
|
_path: e,
|
|
675
671
|
_effect: n.toString()
|
|
676
672
|
});
|
|
677
673
|
if (c === "$get")
|
|
678
|
-
return () =>
|
|
674
|
+
return () => nt({
|
|
679
675
|
_stateKey: t,
|
|
680
676
|
_path: e
|
|
681
677
|
});
|
|
@@ -713,9 +709,9 @@ function Q(t, i, v, S) {
|
|
|
713
709
|
});
|
|
714
710
|
const l = n.zodSchema.safeParse(d);
|
|
715
711
|
return l.success ? !0 : (l.error.errors.forEach((w) => {
|
|
716
|
-
const N = w.path, G = w.message,
|
|
717
|
-
o(
|
|
718
|
-
}),
|
|
712
|
+
const N = w.path, G = w.message, j = [n.key, ...N].join(".");
|
|
713
|
+
o(j, G);
|
|
714
|
+
}), st(t), !1);
|
|
719
715
|
} catch (a) {
|
|
720
716
|
return console.error("Zod schema validation failed", a), !1;
|
|
721
717
|
}
|
|
@@ -743,7 +739,7 @@ function Q(t, i, v, S) {
|
|
|
743
739
|
children: n,
|
|
744
740
|
hideMessage: o
|
|
745
741
|
}) => /* @__PURE__ */ ut(
|
|
746
|
-
|
|
742
|
+
Tt,
|
|
747
743
|
{
|
|
748
744
|
formOpts: o ? { validation: { message: "" } } : void 0,
|
|
749
745
|
path: e,
|
|
@@ -759,7 +755,7 @@ function Q(t, i, v, S) {
|
|
|
759
755
|
if (c === "update")
|
|
760
756
|
return (n, o) => {
|
|
761
757
|
if (o?.debounce)
|
|
762
|
-
|
|
758
|
+
At(() => {
|
|
763
759
|
Z(i, n, e, "");
|
|
764
760
|
const d = r.getState().getNestedState(t, e);
|
|
765
761
|
o?.afterUpdate && o.afterUpdate(d);
|
|
@@ -773,7 +769,7 @@ function Q(t, i, v, S) {
|
|
|
773
769
|
};
|
|
774
770
|
if (c === "formElement")
|
|
775
771
|
return (n, o) => /* @__PURE__ */ ut(
|
|
776
|
-
|
|
772
|
+
Vt,
|
|
777
773
|
{
|
|
778
774
|
setState: i,
|
|
779
775
|
stateKey: t,
|
|
@@ -782,10 +778,10 @@ function Q(t, i, v, S) {
|
|
|
782
778
|
formOpts: o
|
|
783
779
|
}
|
|
784
780
|
);
|
|
785
|
-
const U = [...e, c],
|
|
786
|
-
return s(
|
|
781
|
+
const U = [...e, c], b = r.getState().getNestedState(t, U);
|
|
782
|
+
return s(b, U, y);
|
|
787
783
|
}
|
|
788
|
-
}, F = new Proxy(T,
|
|
784
|
+
}, F = new Proxy(T, C);
|
|
789
785
|
return u.set(P, {
|
|
790
786
|
proxy: F,
|
|
791
787
|
stateVersion: h
|
|
@@ -795,10 +791,10 @@ function Q(t, i, v, S) {
|
|
|
795
791
|
r.getState().getNestedState(t, [])
|
|
796
792
|
);
|
|
797
793
|
}
|
|
798
|
-
function
|
|
799
|
-
return K(
|
|
794
|
+
function nt(t) {
|
|
795
|
+
return K(Rt, { proxy: t });
|
|
800
796
|
}
|
|
801
|
-
function
|
|
797
|
+
function Ft({
|
|
802
798
|
proxy: t,
|
|
803
799
|
rebuildStateShape: i
|
|
804
800
|
}) {
|
|
@@ -810,11 +806,11 @@ function Rt({
|
|
|
810
806
|
(u, h, E, m, s) => t._mapFn(u, h, E, m, s)
|
|
811
807
|
) : null;
|
|
812
808
|
}
|
|
813
|
-
function
|
|
809
|
+
function Rt({
|
|
814
810
|
proxy: t
|
|
815
811
|
}) {
|
|
816
812
|
const i = Y(null), v = `${t._stateKey}-${t._path.join(".")}`;
|
|
817
|
-
return
|
|
813
|
+
return at(() => {
|
|
818
814
|
const S = i.current;
|
|
819
815
|
if (!S || !S.parentElement) return;
|
|
820
816
|
const u = S.parentElement, E = Array.from(u.childNodes).indexOf(S);
|
|
@@ -849,8 +845,8 @@ function Mt({
|
|
|
849
845
|
"data-signal-id": v
|
|
850
846
|
});
|
|
851
847
|
}
|
|
852
|
-
function
|
|
853
|
-
const i =
|
|
848
|
+
function Yt(t) {
|
|
849
|
+
const i = Nt(
|
|
854
850
|
(v) => {
|
|
855
851
|
const S = r.getState().stateComponents.get(t._stateKey) || {
|
|
856
852
|
components: /* @__PURE__ */ new Map()
|
|
@@ -865,11 +861,11 @@ function Xt(t) {
|
|
|
865
861
|
return K("text", {}, String(i));
|
|
866
862
|
}
|
|
867
863
|
export {
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
864
|
+
nt as $cogsSignal,
|
|
865
|
+
Yt as $cogsSignalStore,
|
|
866
|
+
Jt as addStateOptions,
|
|
867
|
+
Zt as createCogsState,
|
|
868
|
+
Ht as notifyComponent,
|
|
869
|
+
Ot as useCogsStateFn
|
|
874
870
|
};
|
|
875
871
|
//# sourceMappingURL=CogsState.jsx.map
|
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 getDifferences,\r\n getNestedValue,\r\n isFunction,\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 { 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, T> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => StateObject<T>;\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>, TShape>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType;\r\n cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: InferArrayElement<TShape>,\r\n b: InferArrayElement<TShape>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n\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 getSelectedIndex: () => number;\r\n last: () => 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 getStatus: () => \"fresh\" | \"stale\";\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 removeStorage: () => void;\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 }) => T;\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 sync?: {\r\n action: (state: T) => Promise<{\r\n success: boolean;\r\n data?: any;\r\n error?: any;\r\n validation_errors?: Array<{\r\n path: string[];\r\n message: string;\r\n }>;\r\n }>;\r\n onSuccess?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n };\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?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\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 initialState?: T | ((state: T) => T);\r\n dependencies?: any[]; // Just like useEffect dependencies\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\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\n// Fix for the setOptions function\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 mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == \"localStorage\" &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n if (\r\n key == \"initialState\" &&\r\n options[key] &&\r\n mergedOptions[key] !== options[key] && // Different references\r\n !isDeepEqual(mergedOptions[key], options[key]) // And different values\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\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 (\r\n Object.keys(initialOptionsPart).length > 0 ||\r\n (opt && Object.keys(opt).length > 0)\r\n ) {\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 const existingOptions = getInitialOptions(key);\r\n\r\n if (!existingOptions) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions(key, initialOptionsPart[key]);\r\n }\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n getGlobalStore.getState().setCreatedState(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\r\n if (\r\n options &&\r\n typeof options.initialState !== \"undefined\" &&\r\n isFunction(options.initialState)\r\n ) {\r\n const currentStateFromStore =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n\r\n const resolvedInitialValue = (options.initialState as Function)(\r\n currentStateFromStore\r\n );\r\n\r\n options = {\r\n ...options,\r\n initialState: resolvedInitialValue,\r\n };\r\n }\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\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 initialState: options?.initialState as any,\r\n dependencies: options?.dependencies,\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 notifyComponents(stateKey as string);\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 const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n if (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}-${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 updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\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 const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n if (!reactiveTypes?.includes(\"none\")) {\r\n updates.add(() => component.forceUpdate());\r\n }\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\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 const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes?.includes(\"none\")) {\r\n return;\r\n }\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 initialState,\r\n syncUpdate,\r\n dependencies,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n initialState?: TStateObject;\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 useEffect(() => {\r\n if (initialState) {\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n\r\n // Handle localStorage properly\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localkey\r\n );\r\n }\r\n\r\n const currentGloballyStoredInitialState =\r\n getGlobalStore.getState().initialStateGlobal[thisKey];\r\n console.log(\r\n \"currentGloballyStoredInitialState\",\r\n currentGloballyStoredInitialState,\r\n initialState,\r\n isDeepEqual(currentGloballyStoredInitialState, initialState)\r\n );\r\n // Only update if the deep contents have actually changed\r\n if (\r\n (currentGloballyStoredInitialState &&\r\n !isDeepEqual(currentGloballyStoredInitialState, initialState)) ||\r\n !currentGloballyStoredInitialState\r\n ) {\r\n let newState = initialState;\r\n\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n if (options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n }\r\n }\r\n\r\n updateGlobalState(\r\n thisKey,\r\n initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n notifyComponents(thisKey);\r\n\r\n const reactiveTypes = Array.isArray(reactiveType)\r\n ? reactiveType\r\n : [reactiveType || \"component\"];\r\n\r\n if (!reactiveTypes.includes(\"none\")) {\r\n forceUpdate({});\r\n }\r\n }\r\n }\r\n }, [initialState, ...(dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initialState,\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 const changedPaths = getDifferences(prevValue, payload); // Returns array of path strings like \"a.b.c\"\r\n const changedPathsSet = new Set(changedPaths); // For efficient lookup\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 console.log(\r\n \"pathetocaheck.............................\",\r\n path,\r\n updateObj,\r\n pathToCheck ?? \"NONE\",\r\n stateEntry\r\n );\r\n if (stateEntry) {\r\n const changedPaths = getDifferences(prevValue, payload);\r\n const changedPathsSet = new Set(changedPaths);\r\n const primaryPathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : path.slice(0, -1).join(\".\") || \"\";\r\n\r\n for (const [\r\n componentKey,\r\n component,\r\n ] 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 if (reactiveTypes.includes(\"none\")) continue;\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n continue;\r\n }\r\n\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths.has(primaryPathToCheck) ||\r\n component.paths.has(\"\")\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n let currentPathToCheck = changedPath;\r\n while (true) {\r\n if (component.paths.has(currentPathToCheck)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n const lastDotIndex = currentPathToCheck.lastIndexOf(\".\");\r\n if (lastDotIndex !== -1) {\r\n const parentPath = currentPathToCheck.substring(\r\n 0,\r\n lastDotIndex\r\n );\r\n if (\r\n !isNaN(\r\n Number(currentPathToCheck.substring(lastDotIndex + 1))\r\n )\r\n ) {\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n currentPathToCheck = parentPath;\r\n } else {\r\n currentPathToCheck = \"\";\r\n }\r\n if (currentPathToCheck === \"\") {\r\n break;\r\n }\r\n }\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n let depsChanged = false;\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) depsChanged = true;\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n depsChanged = true;\r\n }\r\n if (depsChanged) {\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 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 getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\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\r\n return initialState;\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 });\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 console.log(\r\n `PROXY APPLY TRAP HIT: stateKey=${stateKey}, path=${path.join(\".\")}`\r\n ); // <--- ADD LOGGING\r\n console.trace(\"Apply trap stack trace\");\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 === \"sync\" && path.length === 0) {\r\n return async function () {\r\n // Get the options for this state key\r\n const options = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey);\r\n const sync = options?.sync;\r\n\r\n if (!sync) {\r\n console.error(`No mutation defined for state key \"${stateKey}\"`);\r\n return { success: false, error: `No mutation defined` };\r\n }\r\n\r\n // Get the root state\r\n const state = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, []);\r\n\r\n // Get validation key\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n // Execute the mutation action\r\n const response = await sync.action(state);\r\n\r\n // Handle validation errors\r\n if (\r\n response &&\r\n !response.success &&\r\n response.validation_errors &&\r\n validationKey\r\n ) {\r\n // Clear existing errors\r\n getGlobalStore.getState().removeValidationError(validationKey);\r\n\r\n // Add new validation errors\r\n response.validation_errors.forEach((error) => {\r\n const errorPath = [validationKey, ...error.path].join(\".\");\r\n getGlobalStore\r\n .getState()\r\n .addValidationError(errorPath, error.message);\r\n });\r\n\r\n // Notify components to update\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 }\r\n\r\n // Call success/error callbacks\r\n if (response?.success && sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n } else if (!response?.success && sync.onError) {\r\n sync.onError(response.error);\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) {\r\n sync.onError(error);\r\n }\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n if (prop === \"_status\") {\r\n // Get current state at this path (non-reactive version)\r\n const thisReactiveState = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n }\r\n if (prop === \"getStatus\") {\r\n return function () {\r\n // Get current state at this path (reactive version)\r\n const thisReactiveState = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n );\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n };\r\n }\r\n if (prop === \"removeStorage\") {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n console.log(\"removing storage\", storageKey);\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\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 = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, 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 if (prop === \"getSelectedIndex\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n\r\n return selectedIndex ?? -1;\r\n };\r\n }\r\n if (prop === \"stateSort\") {\r\n return (\r\n compareFn: (\r\n a: InferArrayElement<T>,\r\n b: InferArrayElement<T>\r\n ) => number\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Create a shallow copy with original indices\r\n const arrayCopy = currentArray.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n // Sort the copy using the provided compare function\r\n const sortedArray = [...arrayCopy].sort(compareFn);\r\n\r\n // ADDED: Clear cache for sort operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Return the sorted array with state objects\r\n return rebuildStateShape(sortedArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: sortedArray.map((item) =>\r\n parseInt(item.__origIndex as string)\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((obj: any) => {\r\n return obj[thisKey] === thisValue;\r\n });\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 // 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 if (prop === \"last\") {\r\n // Added handler for 'last'\r\n return () => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n if (currentArray.length === 0) return undefined;\r\n const lastIndex = currentArray.length - 1;\r\n const lastValue = currentArray[lastIndex];\r\n const newPath = [...path, lastIndex.toString()];\r\n // shapeCache.clear(); // Decide if you need cache invalidation for 'last' access\r\n // stateVersion++;\r\n return rebuildStateShape(lastValue, newPath);\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().getNestedState(stateKey, path),\r\n path\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 if (prop === \"cutByValue\") {\r\n return (value: string | number | boolean) => {\r\n for (let index = 0; index < currentState.length; index++) {\r\n if (currentState[index] === value) {\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"toggleByValue\") {\r\n return (value: string | number | boolean) => {\r\n const index = currentState.findIndex((item) => item === value);\r\n if (index > -1) {\r\n // Value exists, so cut it\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n } else {\r\n // Value doesn't exist, so insert it\r\n pushFunc(effectiveSetState, value as any, path, stateKey);\r\n }\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 == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\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 (\r\n currentIndex ===\r\n getGlobalStore.getState().getSelectedIndex(stateKey, parentKey)\r\n );\r\n }\r\n return undefined;\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\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, thisIndex);\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, undefined);\r\n }\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 // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\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","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","isFunction","currentStateFromStore","resolvedInitialValue","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","notifyComponents","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","syncUpdate","dependencies","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","localkey","currentGloballyStoredInitialState","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","changedPaths","getDifferences","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","pathToCheck","changedPathsSet","primaryPathToCheck","componentKey","shouldUpdate","reactiveTypes","changedPath","currentPathToCheck","lastDotIndex","parentPath","depsResult","depsChanged","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","serverState","currentState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","selectedIndex","compareFn","sortedArray","i","item","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","currentArray","lastIndex","lastValue","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","newVal","validIndices","filteredArray","lastPathElement","parentValue","fn","$cogsSignal","parentKey","nested","thisObject","existingErrors","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 getDifferences,\r\n getNestedValue,\r\n isFunction,\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 { 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, T> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => StateObject<T>;\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>, TShape>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType;\r\n cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: InferArrayElement<TShape>,\r\n b: InferArrayElement<TShape>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n\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 getSelectedIndex: () => number;\r\n last: () => 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 getStatus: () => \"fresh\" | \"stale\";\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 removeStorage: () => void;\r\n sync: () => void;\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: string]: 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 }) => T;\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 sync?: {\r\n action: (state: T) => Promise<{\r\n success: boolean;\r\n data?: any;\r\n error?: any;\r\n validation_errors?: Array<{\r\n path: string[];\r\n message: string;\r\n }>;\r\n }>;\r\n onSuccess?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n };\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?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\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 initialState?: T | ((state: T) => T);\r\n dependencies?: any[]; // Just like useEffect dependencies\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\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\n// Fix for the setOptions function\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 mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == \"localStorage\" &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n if (\r\n key == \"initialState\" &&\r\n options[key] &&\r\n mergedOptions[key] !== options[key] && // Different references\r\n !isDeepEqual(mergedOptions[key], options[key]) // And different values\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\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 (\r\n Object.keys(initialOptionsPart).length > 0 ||\r\n (opt && Object.keys(opt).length > 0)\r\n ) {\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 const existingOptions = getInitialOptions(key);\r\n\r\n if (!existingOptions) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions(key, initialOptionsPart[key]);\r\n }\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n getGlobalStore.getState().setCreatedState(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\r\n if (\r\n options &&\r\n typeof options.initialState !== \"undefined\" &&\r\n isFunction(options.initialState)\r\n ) {\r\n const currentStateFromStore =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n\r\n const resolvedInitialValue = (options.initialState as Function)(\r\n currentStateFromStore\r\n );\r\n\r\n options = {\r\n ...options,\r\n initialState: resolvedInitialValue,\r\n };\r\n }\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\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 initialState: options?.initialState as any,\r\n dependencies: options?.dependencies,\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 notifyComponents(stateKey as string);\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 const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n if (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}-${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 updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\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 const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n if (!reactiveTypes?.includes(\"none\")) {\r\n updates.add(() => component.forceUpdate());\r\n }\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\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 const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes?.includes(\"none\")) {\r\n return;\r\n }\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 initialState,\r\n syncUpdate,\r\n dependencies,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n initialState?: TStateObject;\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 useEffect(() => {\r\n if (initialState) {\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n\r\n // Handle localStorage properly\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localkey\r\n );\r\n }\r\n\r\n const currentGloballyStoredInitialState =\r\n getGlobalStore.getState().initialStateGlobal[thisKey];\r\n console.log(\r\n \"currentGloballyStoredInitialState\",\r\n currentGloballyStoredInitialState,\r\n initialState,\r\n isDeepEqual(currentGloballyStoredInitialState, initialState)\r\n );\r\n // Only update if the deep contents have actually changed\r\n if (\r\n (currentGloballyStoredInitialState &&\r\n !isDeepEqual(currentGloballyStoredInitialState, initialState)) ||\r\n !currentGloballyStoredInitialState\r\n ) {\r\n let newState = initialState;\r\n\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n if (options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n }\r\n }\r\n\r\n updateGlobalState(\r\n thisKey,\r\n initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n notifyComponents(thisKey);\r\n\r\n const reactiveTypes = Array.isArray(reactiveType)\r\n ? reactiveType\r\n : [reactiveType || \"component\"];\r\n\r\n if (!reactiveTypes.includes(\"none\")) {\r\n forceUpdate({});\r\n }\r\n }\r\n }\r\n }, [initialState, ...(dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initialState,\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 const changedPaths = getDifferences(prevValue, payload); // Returns array of path strings like \"a.b.c\"\r\n const changedPathsSet = new Set(changedPaths); // For efficient lookup\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 const changedPaths = getDifferences(prevValue, payload);\r\n const changedPathsSet = new Set(changedPaths);\r\n const primaryPathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : path.slice(0, -1).join(\".\") || \"\";\r\n\r\n for (const [\r\n componentKey,\r\n component,\r\n ] 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 if (reactiveTypes.includes(\"none\")) continue;\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n continue;\r\n }\r\n\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths.has(primaryPathToCheck) ||\r\n component.paths.has(\"\")\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n let currentPathToCheck = changedPath;\r\n while (true) {\r\n if (component.paths.has(currentPathToCheck)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n const lastDotIndex = currentPathToCheck.lastIndexOf(\".\");\r\n if (lastDotIndex !== -1) {\r\n const parentPath = currentPathToCheck.substring(\r\n 0,\r\n lastDotIndex\r\n );\r\n if (\r\n !isNaN(\r\n Number(currentPathToCheck.substring(lastDotIndex + 1))\r\n )\r\n ) {\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n currentPathToCheck = parentPath;\r\n } else {\r\n currentPathToCheck = \"\";\r\n }\r\n if (currentPathToCheck === \"\") {\r\n break;\r\n }\r\n }\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n let depsChanged = false;\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) depsChanged = true;\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n depsChanged = true;\r\n }\r\n if (depsChanged) {\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 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 getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\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\r\n return initialState;\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 });\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 console.log(\r\n `PROXY APPLY TRAP HIT: stateKey=${stateKey}, path=${path.join(\".\")}`\r\n ); // <--- ADD LOGGING\r\n console.trace(\"Apply trap stack trace\");\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 === \"sync\" && path.length === 0) {\r\n return async function () {\r\n // Get the options for this state key\r\n const options = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey);\r\n const sync = options?.sync;\r\n\r\n if (!sync) {\r\n console.error(`No mutation defined for state key \"${stateKey}\"`);\r\n return { success: false, error: `No mutation defined` };\r\n }\r\n\r\n // Get the root state\r\n const state = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, []);\r\n\r\n // Get validation key\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n // Execute the mutation action\r\n const response = await sync.action(state);\r\n console.log(\"response\", response);\r\n // Handle validation errors\r\n if (\r\n response &&\r\n !response.success &&\r\n response.validation_errors &&\r\n validationKey\r\n ) {\r\n // Clear existing errors\r\n getGlobalStore.getState().removeValidationError(validationKey);\r\n\r\n // Add new validation errors\r\n response.validation_errors.forEach((error) => {\r\n const errorPath = [validationKey, ...error.path].join(\".\");\r\n getGlobalStore\r\n .getState()\r\n .addValidationError(errorPath, error.message);\r\n });\r\n\r\n // Notify components to update\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 }\r\n\r\n // Call success/error callbacks\r\n if (response?.success && sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n } else if (!response?.success && sync.onError) {\r\n sync.onError(response.error);\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) {\r\n sync.onError(error);\r\n }\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n if (prop === \"_status\") {\r\n // Get current state at this path (non-reactive version)\r\n const thisReactiveState = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n }\r\n if (prop === \"getStatus\") {\r\n return function () {\r\n // Get current state at this path (reactive version)\r\n const thisReactiveState = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n );\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n };\r\n }\r\n if (prop === \"removeStorage\") {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n console.log(\"removing storage\", storageKey);\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\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 = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, 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 if (prop === \"getSelectedIndex\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n\r\n return selectedIndex ?? -1;\r\n };\r\n }\r\n if (prop === \"stateSort\") {\r\n return (\r\n compareFn: (\r\n a: InferArrayElement<T>,\r\n b: InferArrayElement<T>\r\n ) => number\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Create a shallow copy with original indices\r\n const arrayCopy = currentArray.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n // Sort the copy using the provided compare function\r\n const sortedArray = [...arrayCopy].sort(compareFn);\r\n\r\n // ADDED: Clear cache for sort operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Return the sorted array with state objects\r\n return rebuildStateShape(sortedArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: sortedArray.map((item) =>\r\n parseInt(item.__origIndex as string)\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((obj: any) => {\r\n return obj[thisKey] === thisValue;\r\n });\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 // 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 if (prop === \"last\") {\r\n // Added handler for 'last'\r\n return () => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n if (currentArray.length === 0) return undefined;\r\n const lastIndex = currentArray.length - 1;\r\n const lastValue = currentArray[lastIndex];\r\n const newPath = [...path, lastIndex.toString()];\r\n // shapeCache.clear(); // Decide if you need cache invalidation for 'last' access\r\n // stateVersion++;\r\n return rebuildStateShape(lastValue, newPath);\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().getNestedState(stateKey, path),\r\n path\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 if (prop === \"cutByValue\") {\r\n return (value: string | number | boolean) => {\r\n for (let index = 0; index < currentState.length; index++) {\r\n if (currentState[index] === value) {\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"toggleByValue\") {\r\n return (value: string | number | boolean) => {\r\n const index = currentState.findIndex((item) => item === value);\r\n if (index > -1) {\r\n // Value exists, so cut it\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n } else {\r\n // Value doesn't exist, so insert it\r\n pushFunc(effectiveSetState, value as any, path, stateKey);\r\n }\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 == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\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 (\r\n currentIndex ===\r\n getGlobalStore.getState().getSelectedIndex(stateKey, parentKey)\r\n );\r\n }\r\n return undefined;\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\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, thisIndex);\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, undefined);\r\n }\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 // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\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","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","isFunction","currentStateFromStore","resolvedInitialValue","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","notifyComponents","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","syncUpdate","dependencies","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","localkey","currentGloballyStoredInitialState","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","changedPaths","getDifferences","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","changedPathsSet","primaryPathToCheck","componentKey","shouldUpdate","reactiveTypes","changedPath","currentPathToCheck","lastDotIndex","parentPath","depsResult","depsChanged","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","serverState","currentState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","selectedIndex","compareFn","sortedArray","i","item","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","currentArray","lastIndex","lastValue","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","newVal","validIndices","filteredArray","lastPathElement","parentValue","fn","$cogsSignal","parentKey","nested","thisObject","existingErrors","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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"}
|