cogsbox-state 0.5.16 → 0.5.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CogsState.jsx +168 -172
- package/dist/CogsState.jsx.map +1 -1
- package/package.json +1 -1
package/dist/CogsState.jsx
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as ot } from "react/jsx-runtime";
|
|
3
|
-
import { useState as
|
|
4
|
-
import { transformStateFunc as
|
|
5
|
-
import { pushFunc as it, updateFn as q, cutFunc as st, ValidationWrapper as
|
|
3
|
+
import { useState as X, useRef as z, useEffect as Y, useLayoutEffect as It, useMemo as Et, createElement as H, useSyncExternalStore as _t, startTransition as J } from "react";
|
|
4
|
+
import { transformStateFunc as pt, isFunction as ut, getNestedValue as L, isDeepEqual as k, debounce as wt } from "./utility.js";
|
|
5
|
+
import { pushFunc as it, updateFn as q, cutFunc as st, ValidationWrapper as $t, FormControlComponent as Vt } from "./Functions.jsx";
|
|
6
6
|
import "zod";
|
|
7
|
-
import { getGlobalStore as
|
|
8
|
-
import { useCogsConfig as
|
|
9
|
-
import
|
|
7
|
+
import { getGlobalStore as r, formRefStore as ct } from "./store.js";
|
|
8
|
+
import { useCogsConfig as Nt } from "./CogsStateClient.jsx";
|
|
9
|
+
import K from "./node_modules/uuid/dist/esm-browser/v4.js";
|
|
10
10
|
function lt(t, o) {
|
|
11
|
-
const g =
|
|
11
|
+
const g = r.getState().getInitialOptions, S = r.getState().setInitialStateOptions, l = g(t) || {};
|
|
12
12
|
S(t, {
|
|
13
13
|
...l,
|
|
14
14
|
...o
|
|
@@ -19,7 +19,7 @@ function dt({
|
|
|
19
19
|
options: o,
|
|
20
20
|
initialOptionsPart: g
|
|
21
21
|
}) {
|
|
22
|
-
const S =
|
|
22
|
+
const S = tt(t) || {}, l = g[t] || {}, E = r.getState().setInitialStateOptions, _ = { ...l, ...S };
|
|
23
23
|
let v = !1;
|
|
24
24
|
if (o)
|
|
25
25
|
for (const m in o)
|
|
@@ -31,7 +31,7 @@ function qt(t, { formElements: o, validation: g }) {
|
|
|
31
31
|
}
|
|
32
32
|
const zt = (t, o) => {
|
|
33
33
|
let g = t;
|
|
34
|
-
const [S, l] =
|
|
34
|
+
const [S, l] = pt(g);
|
|
35
35
|
(o?.formElements || o?.validation) && Object.keys(l).forEach((v) => {
|
|
36
36
|
l[v] = l[v] || {}, l[v].formElements = {
|
|
37
37
|
...o.formElements,
|
|
@@ -40,15 +40,15 @@ const zt = (t, o) => {
|
|
|
40
40
|
...l[v].formElements || {}
|
|
41
41
|
// State-specific overrides
|
|
42
42
|
};
|
|
43
|
-
}),
|
|
43
|
+
}), r.getState().setInitialStates(S);
|
|
44
44
|
const E = (v, m) => {
|
|
45
|
-
const [p] =
|
|
45
|
+
const [p] = X(m?.componentId ?? K());
|
|
46
46
|
dt({
|
|
47
47
|
stateKey: v,
|
|
48
48
|
options: m,
|
|
49
49
|
initialOptionsPart: l
|
|
50
50
|
});
|
|
51
|
-
const d =
|
|
51
|
+
const d = r.getState().cogsStateStore[v] || S[v], e = m?.modifyState ? m.modifyState(d) : d, [I, h] = Ot(
|
|
52
52
|
e,
|
|
53
53
|
{
|
|
54
54
|
stateKey: v,
|
|
@@ -72,15 +72,15 @@ const zt = (t, o) => {
|
|
|
72
72
|
}, {
|
|
73
73
|
setUpdaterState: B,
|
|
74
74
|
setState: x,
|
|
75
|
-
getInitialOptions:
|
|
75
|
+
getInitialOptions: tt,
|
|
76
76
|
getKeyState: ft,
|
|
77
|
-
getValidationErrors:
|
|
78
|
-
setStateLog:
|
|
79
|
-
updateInitialStateGlobal:
|
|
80
|
-
addValidationError:
|
|
77
|
+
getValidationErrors: ht,
|
|
78
|
+
setStateLog: Ct,
|
|
79
|
+
updateInitialStateGlobal: et,
|
|
80
|
+
addValidationError: Tt,
|
|
81
81
|
removeValidationError: R,
|
|
82
|
-
setServerSyncActions:
|
|
83
|
-
} =
|
|
82
|
+
setServerSyncActions: At
|
|
83
|
+
} = r.getState(), gt = (t) => {
|
|
84
84
|
if (!t) return null;
|
|
85
85
|
try {
|
|
86
86
|
const o = window.localStorage.getItem(t);
|
|
@@ -88,17 +88,17 @@ const zt = (t, o) => {
|
|
|
88
88
|
} catch (o) {
|
|
89
89
|
return console.error("Error loading from localStorage:", o), null;
|
|
90
90
|
}
|
|
91
|
-
},
|
|
91
|
+
}, Ft = (t, o, g, S) => {
|
|
92
92
|
if (g.localStorageKey) {
|
|
93
93
|
const l = {
|
|
94
94
|
state: t,
|
|
95
95
|
lastUpdated: Date.now(),
|
|
96
|
-
lastSyncedWithServer:
|
|
97
|
-
baseServerState:
|
|
96
|
+
lastSyncedWithServer: r.getState().serverSyncLog[o]?.[0]?.timeStamp,
|
|
97
|
+
baseServerState: r.getState().serverState[o]
|
|
98
98
|
}, E = g.initState ? `${S}-${o}-${g.localStorageKey}` : o;
|
|
99
99
|
window.localStorage.setItem(E, JSON.stringify(l));
|
|
100
100
|
}
|
|
101
|
-
},
|
|
101
|
+
}, jt = (t, o, g, S, l, E) => {
|
|
102
102
|
const _ = {
|
|
103
103
|
initialState: o,
|
|
104
104
|
updaterState: Z(
|
|
@@ -110,10 +110,10 @@ const zt = (t, o) => {
|
|
|
110
110
|
state: g
|
|
111
111
|
};
|
|
112
112
|
J(() => {
|
|
113
|
-
|
|
113
|
+
et(t, _.initialState), B(t, _.updaterState), x(t, _.state);
|
|
114
114
|
});
|
|
115
|
-
},
|
|
116
|
-
const o =
|
|
115
|
+
}, St = (t) => {
|
|
116
|
+
const o = r.getState().stateComponents.get(t);
|
|
117
117
|
if (!o) return;
|
|
118
118
|
const g = /* @__PURE__ */ new Set();
|
|
119
119
|
o.components.forEach((S) => {
|
|
@@ -124,13 +124,13 @@ const zt = (t, o) => {
|
|
|
124
124
|
});
|
|
125
125
|
});
|
|
126
126
|
}, Jt = (t, o) => {
|
|
127
|
-
const g =
|
|
127
|
+
const g = r.getState().stateComponents.get(t);
|
|
128
128
|
if (g) {
|
|
129
129
|
const S = `${t}////${o}`, l = g.components.get(S);
|
|
130
130
|
l && l.forceUpdate();
|
|
131
131
|
}
|
|
132
132
|
};
|
|
133
|
-
function
|
|
133
|
+
function Ot(t, {
|
|
134
134
|
stateKey: o,
|
|
135
135
|
serverSync: g,
|
|
136
136
|
localStorage: S,
|
|
@@ -143,22 +143,22 @@ function jt(t, {
|
|
|
143
143
|
initState: d,
|
|
144
144
|
syncUpdate: e
|
|
145
145
|
} = {}) {
|
|
146
|
-
const [I, h] =
|
|
146
|
+
const [I, h] = X({}), { sessionId: F } = Nt();
|
|
147
147
|
let b = !o;
|
|
148
|
-
const [u] =
|
|
149
|
-
A.current =
|
|
148
|
+
const [u] = X(o ?? K()), i = r.getState().stateLog[u], G = z(/* @__PURE__ */ new Set()), U = z(m ?? K()), A = z(null);
|
|
149
|
+
A.current = tt(u), Y(() => {
|
|
150
150
|
if (e && e.stateKey === u && e.path?.[0]) {
|
|
151
|
-
x(u, (
|
|
152
|
-
...
|
|
151
|
+
x(u, (a) => ({
|
|
152
|
+
...a,
|
|
153
153
|
[e.path[0]]: e.newValue
|
|
154
154
|
}));
|
|
155
155
|
const c = `${e.stateKey}:${e.path.join(".")}`;
|
|
156
|
-
|
|
156
|
+
r.getState().setSyncInfo(c, {
|
|
157
157
|
timeStamp: e.timeStamp,
|
|
158
158
|
userId: e.userId
|
|
159
159
|
});
|
|
160
160
|
}
|
|
161
|
-
}, [e]),
|
|
161
|
+
}, [e]), Y(() => {
|
|
162
162
|
lt(u, {
|
|
163
163
|
initState: d
|
|
164
164
|
});
|
|
@@ -166,18 +166,16 @@ function jt(t, {
|
|
|
166
166
|
p && (c = gt(
|
|
167
167
|
F + "-" + u + "-" + p
|
|
168
168
|
));
|
|
169
|
-
let
|
|
170
|
-
d?.initialState && (
|
|
169
|
+
let a = null;
|
|
170
|
+
d?.initialState && (a = d?.initialState, c && c.lastUpdated > (c.lastSyncedWithServer || 0) && (a = c.state), jt(
|
|
171
171
|
u,
|
|
172
172
|
d?.initialState,
|
|
173
|
-
|
|
173
|
+
a,
|
|
174
174
|
n,
|
|
175
175
|
U.current,
|
|
176
176
|
F
|
|
177
|
-
), console.log("newState222",
|
|
178
|
-
|
|
179
|
-
}));
|
|
180
|
-
}, [p, ...d?.dependencies || []]), vt(() => {
|
|
177
|
+
), console.log("newState222", a), St(u), h({}));
|
|
178
|
+
}, [p, ...d?.dependencies || []]), It(() => {
|
|
181
179
|
b && lt(u, {
|
|
182
180
|
serverSync: g,
|
|
183
181
|
formElements: l,
|
|
@@ -185,83 +183,81 @@ function jt(t, {
|
|
|
185
183
|
localStorage: S,
|
|
186
184
|
middleware: E
|
|
187
185
|
});
|
|
188
|
-
const c = `${u}////${U.current}`,
|
|
186
|
+
const c = `${u}////${U.current}`, a = r.getState().stateComponents.get(u) || {
|
|
189
187
|
components: /* @__PURE__ */ new Map()
|
|
190
188
|
};
|
|
191
|
-
return
|
|
189
|
+
return a.components.set(c, {
|
|
192
190
|
forceUpdate: () => h({}),
|
|
193
191
|
paths: /* @__PURE__ */ new Set(),
|
|
194
192
|
deps: [],
|
|
195
193
|
depsFunction: _ || void 0,
|
|
196
194
|
reactiveType: v ?? ["component", "deps"]
|
|
197
|
-
}),
|
|
195
|
+
}), r.getState().stateComponents.set(u, a), h({}), () => {
|
|
198
196
|
const f = `${u}////${U.current}`;
|
|
199
|
-
|
|
197
|
+
a && (a.components.delete(f), a.components.size === 0 && r.getState().stateComponents.delete(u));
|
|
200
198
|
};
|
|
201
199
|
}, []);
|
|
202
|
-
const n = (c,
|
|
203
|
-
if (Array.isArray(
|
|
204
|
-
const
|
|
205
|
-
G.current.add(
|
|
200
|
+
const n = (c, a, f, w) => {
|
|
201
|
+
if (Array.isArray(a)) {
|
|
202
|
+
const j = `${u}-${a.join(".")}`;
|
|
203
|
+
G.current.add(j);
|
|
206
204
|
}
|
|
207
|
-
x(u, (
|
|
208
|
-
const V = ut(c) ? c(
|
|
209
|
-
if (
|
|
210
|
-
let P = !1, y =
|
|
205
|
+
x(u, (j) => {
|
|
206
|
+
const V = ut(c) ? c(j) : c, O = `${u}-${a.join(".")}`;
|
|
207
|
+
if (O) {
|
|
208
|
+
let P = !1, y = r.getState().signalDomElements.get(O);
|
|
211
209
|
if ((!y || y.size === 0) && (f.updateType === "insert" || f.updateType === "cut")) {
|
|
212
|
-
const N =
|
|
210
|
+
const N = a.slice(0, -1), T = L(V, N);
|
|
213
211
|
if (Array.isArray(T)) {
|
|
214
212
|
P = !0;
|
|
215
213
|
const $ = `${u}-${N.join(".")}`;
|
|
216
|
-
y =
|
|
214
|
+
y = r.getState().signalDomElements.get($);
|
|
217
215
|
}
|
|
218
216
|
}
|
|
219
217
|
if (y) {
|
|
220
|
-
const N = P ?
|
|
221
|
-
y.forEach(({ parentId: T, position: $, effect:
|
|
222
|
-
const
|
|
218
|
+
const N = P ? L(V, a.slice(0, -1)) : L(V, a);
|
|
219
|
+
y.forEach(({ parentId: T, position: $, effect: D }) => {
|
|
220
|
+
const M = document.querySelector(
|
|
223
221
|
`[data-parent-id="${T}"]`
|
|
224
222
|
);
|
|
225
|
-
if (
|
|
226
|
-
const at = Array.from(
|
|
223
|
+
if (M) {
|
|
224
|
+
const at = Array.from(M.childNodes);
|
|
227
225
|
if (at[$]) {
|
|
228
|
-
const
|
|
229
|
-
at[$].textContent = String(
|
|
226
|
+
const vt = D ? new Function("state", `return (${D})(state)`)(N) : N;
|
|
227
|
+
at[$].textContent = String(vt);
|
|
230
228
|
}
|
|
231
229
|
}
|
|
232
230
|
});
|
|
233
231
|
}
|
|
234
232
|
}
|
|
235
|
-
f.updateType === "update" && (w || A.current?.validationKey) &&
|
|
236
|
-
(w || A.current?.validationKey) + "." +
|
|
233
|
+
f.updateType === "update" && (w || A.current?.validationKey) && a && R(
|
|
234
|
+
(w || A.current?.validationKey) + "." + a.join(".")
|
|
237
235
|
);
|
|
238
|
-
const C =
|
|
236
|
+
const C = a.slice(0, a.length - 1);
|
|
239
237
|
f.updateType === "cut" && A.current?.validationKey && R(
|
|
240
238
|
A.current?.validationKey + "." + C.join(".")
|
|
241
|
-
), f.updateType === "insert" && A.current?.validationKey &&
|
|
239
|
+
), f.updateType === "insert" && A.current?.validationKey && ht(
|
|
242
240
|
A.current?.validationKey + "." + C.join(".")
|
|
243
241
|
).filter(([y, N]) => {
|
|
244
242
|
let T = y?.split(".").length;
|
|
245
243
|
if (y == C.join(".") && T == C.length - 1) {
|
|
246
244
|
let $ = y + "." + C;
|
|
247
|
-
R(y),
|
|
245
|
+
R(y), Tt($, N);
|
|
248
246
|
}
|
|
249
247
|
});
|
|
250
|
-
const W =
|
|
251
|
-
if (
|
|
252
|
-
for (const [P, y] of
|
|
248
|
+
const W = L(j, a), mt = L(V, a), yt = f.updateType === "update" ? a.join(".") : [...a].slice(0, -1).join("."), nt = r.getState().stateComponents.get(u);
|
|
249
|
+
if (nt)
|
|
250
|
+
for (const [P, y] of nt.components.entries()) {
|
|
253
251
|
let N = !1;
|
|
254
252
|
const T = Array.isArray(y.reactiveType) ? y.reactiveType : [y.reactiveType || "component"];
|
|
255
253
|
if (!T.includes("none")) {
|
|
256
254
|
if (T.includes("all")) {
|
|
257
|
-
|
|
258
|
-
y.forceUpdate();
|
|
259
|
-
});
|
|
255
|
+
y.forceUpdate();
|
|
260
256
|
continue;
|
|
261
257
|
}
|
|
262
|
-
if (T.includes("component") && y.paths && (y.paths.has(
|
|
258
|
+
if (T.includes("component") && y.paths && (y.paths.has(yt) || y.paths.has("")) && (N = !0), !N && T.includes("deps") && y.depsFunction) {
|
|
263
259
|
const $ = y.depsFunction(V);
|
|
264
|
-
typeof $ == "boolean" ? $ && (N = !0) :
|
|
260
|
+
typeof $ == "boolean" ? $ && (N = !0) : k(y.deps, $) || (y.deps = $, N = !0);
|
|
265
261
|
}
|
|
266
262
|
N && y.forceUpdate();
|
|
267
263
|
}
|
|
@@ -269,19 +265,19 @@ function jt(t, {
|
|
|
269
265
|
const rt = {
|
|
270
266
|
timeStamp: Date.now(),
|
|
271
267
|
stateKey: u,
|
|
272
|
-
path:
|
|
268
|
+
path: a,
|
|
273
269
|
updateType: f.updateType,
|
|
274
270
|
status: "new",
|
|
275
271
|
oldValue: W,
|
|
276
|
-
newValue:
|
|
272
|
+
newValue: mt
|
|
277
273
|
};
|
|
278
|
-
if (
|
|
274
|
+
if (Ct(u, (P) => {
|
|
279
275
|
const N = [...P ?? [], rt].reduce((T, $) => {
|
|
280
|
-
const
|
|
281
|
-
return
|
|
276
|
+
const D = `${$.stateKey}:${JSON.stringify($.path)}`, M = T.get(D);
|
|
277
|
+
return M ? (M.timeStamp = Math.max(M.timeStamp, $.timeStamp), M.newValue = $.newValue, M.oldValue = M.oldValue ?? $.oldValue, M.updateType = $.updateType) : T.set(D, { ...$ }), T;
|
|
282
278
|
}, /* @__PURE__ */ new Map());
|
|
283
279
|
return Array.from(N.values());
|
|
284
|
-
}),
|
|
280
|
+
}), Ft(
|
|
285
281
|
V,
|
|
286
282
|
u,
|
|
287
283
|
A.current,
|
|
@@ -290,8 +286,8 @@ function jt(t, {
|
|
|
290
286
|
updateLog: i,
|
|
291
287
|
update: rt
|
|
292
288
|
}), A.current?.serverSync) {
|
|
293
|
-
const P =
|
|
294
|
-
|
|
289
|
+
const P = r.getState().serverState[u], y = A.current?.serverSync;
|
|
290
|
+
At(u, {
|
|
295
291
|
syncKey: typeof y.syncKey == "string" ? y.syncKey : y.syncKey({ state: V }),
|
|
296
292
|
rollBackState: P,
|
|
297
293
|
actionTimeStamp: Date.now() + (y.debounce ?? 3e3),
|
|
@@ -301,7 +297,7 @@ function jt(t, {
|
|
|
301
297
|
return V;
|
|
302
298
|
});
|
|
303
299
|
};
|
|
304
|
-
|
|
300
|
+
r.getState().updaterState[u] || (B(
|
|
305
301
|
u,
|
|
306
302
|
Z(
|
|
307
303
|
u,
|
|
@@ -309,8 +305,8 @@ function jt(t, {
|
|
|
309
305
|
U.current,
|
|
310
306
|
F
|
|
311
307
|
)
|
|
312
|
-
),
|
|
313
|
-
const s =
|
|
308
|
+
), r.getState().cogsStateStore[u] || x(u, t), r.getState().initialStateGlobal[u] || et(u, t));
|
|
309
|
+
const s = Et(() => Z(
|
|
314
310
|
u,
|
|
315
311
|
n,
|
|
316
312
|
U.current,
|
|
@@ -331,18 +327,18 @@ function Z(t, o, g, S) {
|
|
|
331
327
|
d?.validationKey && R(d.validationKey);
|
|
332
328
|
},
|
|
333
329
|
revertToInitialState: (d) => {
|
|
334
|
-
const e =
|
|
330
|
+
const e = r.getState().getInitialOptions(t)?.validation;
|
|
335
331
|
e?.key && R(e?.key), d?.validationKey && R(d.validationKey);
|
|
336
|
-
const I =
|
|
332
|
+
const I = r.getState().initialStateGlobal[t];
|
|
337
333
|
l.clear(), E++;
|
|
338
334
|
const h = p(I, []);
|
|
339
335
|
J(() => {
|
|
340
336
|
B(t, h), x(t, I);
|
|
341
|
-
const F =
|
|
337
|
+
const F = r.getState().stateComponents.get(t);
|
|
342
338
|
F && F.components.forEach((u) => {
|
|
343
339
|
u.forceUpdate();
|
|
344
340
|
});
|
|
345
|
-
const b =
|
|
341
|
+
const b = tt(t);
|
|
346
342
|
b?.localStorageKey && localStorage.removeItem(
|
|
347
343
|
b?.initState ? S + "-" + t + "-" + b?.localStorageKey : t
|
|
348
344
|
), localStorage.removeItem(t);
|
|
@@ -357,8 +353,8 @@ function Z(t, o, g, S) {
|
|
|
357
353
|
S
|
|
358
354
|
);
|
|
359
355
|
return J(() => {
|
|
360
|
-
|
|
361
|
-
const I =
|
|
356
|
+
et(t, d), B(t, e), x(t, d);
|
|
357
|
+
const I = r.getState().stateComponents.get(t);
|
|
362
358
|
I && I.components.forEach((h) => {
|
|
363
359
|
h.forceUpdate();
|
|
364
360
|
}), localStorage.removeItem(t);
|
|
@@ -366,12 +362,12 @@ function Z(t, o, g, S) {
|
|
|
366
362
|
fetchId: (I) => e.get()[I]
|
|
367
363
|
};
|
|
368
364
|
},
|
|
369
|
-
_initialState:
|
|
370
|
-
_serverState:
|
|
371
|
-
_isLoading:
|
|
365
|
+
_initialState: r.getState().initialStateGlobal[t],
|
|
366
|
+
_serverState: r.getState().serverState[t],
|
|
367
|
+
_isLoading: r.getState().isLoadingGlobal[t],
|
|
372
368
|
_isServerSynced: () => {
|
|
373
|
-
const d =
|
|
374
|
-
return !!(d &&
|
|
369
|
+
const d = r.getState().serverState[t];
|
|
370
|
+
return !!(d && k(d, ft(t)));
|
|
375
371
|
}
|
|
376
372
|
};
|
|
377
373
|
function p(d, e = [], I) {
|
|
@@ -380,18 +376,18 @@ function Z(t, o, g, S) {
|
|
|
380
376
|
const F = {
|
|
381
377
|
get(u, i) {
|
|
382
378
|
if (i !== "then" && !i.startsWith("$") && i !== "stateMapNoRender") {
|
|
383
|
-
const n = e.join("."), s = `${t}////${g}`, c =
|
|
379
|
+
const n = e.join("."), s = `${t}////${g}`, c = r.getState().stateComponents.get(t);
|
|
384
380
|
if (c) {
|
|
385
|
-
const
|
|
386
|
-
|
|
381
|
+
const a = c.components.get(s);
|
|
382
|
+
a && (e.length > 0 || i === "get") && a.paths.add(n);
|
|
387
383
|
}
|
|
388
384
|
}
|
|
389
385
|
if (i === "showValidationErrors")
|
|
390
386
|
return () => {
|
|
391
|
-
const n =
|
|
387
|
+
const n = r.getState().getInitialOptions(t)?.validation;
|
|
392
388
|
if (!n?.key)
|
|
393
389
|
throw new Error("Validation key not found");
|
|
394
|
-
return
|
|
390
|
+
return r.getState().getValidationErrors(n.key + "." + e.join("."));
|
|
395
391
|
};
|
|
396
392
|
if (Array.isArray(d)) {
|
|
397
393
|
if (i === "getSelected")
|
|
@@ -407,17 +403,17 @@ function Z(t, o, g, S) {
|
|
|
407
403
|
if (i === "stateMap" || i === "stateMapNoRender")
|
|
408
404
|
return (n) => {
|
|
409
405
|
const s = I?.filtered?.some(
|
|
410
|
-
(
|
|
411
|
-
), c = s ? d :
|
|
412
|
-
return i !== "stateMapNoRender" && (l.clear(), E++), c.map((
|
|
413
|
-
const w = s &&
|
|
414
|
-
|
|
406
|
+
(a) => a.join(".") === e.join(".")
|
|
407
|
+
), c = s ? d : r.getState().getNestedState(t, e);
|
|
408
|
+
return i !== "stateMapNoRender" && (l.clear(), E++), c.map((a, f) => {
|
|
409
|
+
const w = s && a.__origIndex ? a.__origIndex : f, j = p(
|
|
410
|
+
a,
|
|
415
411
|
[...e, w.toString()],
|
|
416
412
|
I
|
|
417
413
|
);
|
|
418
414
|
return n(
|
|
419
|
-
|
|
420
|
-
|
|
415
|
+
a,
|
|
416
|
+
j,
|
|
421
417
|
f,
|
|
422
418
|
d,
|
|
423
419
|
p(d, e, I)
|
|
@@ -425,7 +421,7 @@ function Z(t, o, g, S) {
|
|
|
425
421
|
});
|
|
426
422
|
};
|
|
427
423
|
if (i === "$stateMap")
|
|
428
|
-
return (n) => H(
|
|
424
|
+
return (n) => H(Mt, {
|
|
429
425
|
proxy: {
|
|
430
426
|
_stateKey: t,
|
|
431
427
|
_path: e,
|
|
@@ -438,13 +434,13 @@ function Z(t, o, g, S) {
|
|
|
438
434
|
return (n) => {
|
|
439
435
|
const c = I?.filtered?.some(
|
|
440
436
|
(f) => f.join(".") === e.join(".")
|
|
441
|
-
) ? d :
|
|
437
|
+
) ? d : r.getState().getNestedState(t, e);
|
|
442
438
|
l.clear(), E++;
|
|
443
|
-
const
|
|
439
|
+
const a = c.flatMap(
|
|
444
440
|
(f, w) => f[n] ?? []
|
|
445
441
|
);
|
|
446
442
|
return p(
|
|
447
|
-
|
|
443
|
+
a,
|
|
448
444
|
[...e, "[*]", n],
|
|
449
445
|
I
|
|
450
446
|
);
|
|
@@ -455,8 +451,8 @@ function Z(t, o, g, S) {
|
|
|
455
451
|
(w) => w[n] === s
|
|
456
452
|
);
|
|
457
453
|
if (c === -1) return;
|
|
458
|
-
const
|
|
459
|
-
return l.clear(), E++, l.clear(), E++, p(
|
|
454
|
+
const a = d[c], f = [...e, c.toString()];
|
|
455
|
+
return l.clear(), E++, l.clear(), E++, p(a, f);
|
|
460
456
|
};
|
|
461
457
|
if (i === "index")
|
|
462
458
|
return (n) => {
|
|
@@ -465,29 +461,29 @@ function Z(t, o, g, S) {
|
|
|
465
461
|
};
|
|
466
462
|
if (i === "insert")
|
|
467
463
|
return (n) => (_(e), it(o, n, e, t), p(
|
|
468
|
-
|
|
464
|
+
r.getState().cogsStateStore[t],
|
|
469
465
|
[]
|
|
470
466
|
));
|
|
471
467
|
if (i === "uniqueInsert")
|
|
472
468
|
return (n, s, c) => {
|
|
473
|
-
const
|
|
469
|
+
const a = r.getState().getNestedState(t, e), f = ut(n) ? n(a) : n;
|
|
474
470
|
let w = null;
|
|
475
|
-
if (!
|
|
471
|
+
if (!a.some((V) => {
|
|
476
472
|
if (s) {
|
|
477
473
|
const C = s.every(
|
|
478
|
-
(W) =>
|
|
474
|
+
(W) => k(V[W], f[W])
|
|
479
475
|
);
|
|
480
476
|
return C && (w = V), C;
|
|
481
477
|
}
|
|
482
|
-
const
|
|
483
|
-
return
|
|
478
|
+
const O = k(V, f);
|
|
479
|
+
return O && (w = V), O;
|
|
484
480
|
}))
|
|
485
481
|
_(e), it(o, f, e, t);
|
|
486
482
|
else if (c && w) {
|
|
487
|
-
const V = c(w),
|
|
488
|
-
(C) =>
|
|
483
|
+
const V = c(w), O = a.map(
|
|
484
|
+
(C) => k(C, w) ? V : C
|
|
489
485
|
);
|
|
490
|
-
_(e), q(o,
|
|
486
|
+
_(e), q(o, O, e);
|
|
491
487
|
}
|
|
492
488
|
};
|
|
493
489
|
if (i === "cut")
|
|
@@ -499,10 +495,10 @@ function Z(t, o, g, S) {
|
|
|
499
495
|
const s = d.map((f, w) => ({
|
|
500
496
|
...f,
|
|
501
497
|
__origIndex: w.toString()
|
|
502
|
-
})), c = [],
|
|
498
|
+
})), c = [], a = [];
|
|
503
499
|
for (let f = 0; f < s.length; f++)
|
|
504
|
-
n(s[f], f) && (c.push(f),
|
|
505
|
-
return l.clear(), E++, p(
|
|
500
|
+
n(s[f], f) && (c.push(f), a.push(s[f]));
|
|
501
|
+
return l.clear(), E++, p(a, e, {
|
|
506
502
|
filtered: [...I?.filtered || [], e],
|
|
507
503
|
validIndices: c
|
|
508
504
|
// Pass through the meta
|
|
@@ -511,7 +507,7 @@ function Z(t, o, g, S) {
|
|
|
511
507
|
}
|
|
512
508
|
const G = e[e.length - 1];
|
|
513
509
|
if (!isNaN(Number(G))) {
|
|
514
|
-
const n = e.slice(0, -1), s =
|
|
510
|
+
const n = e.slice(0, -1), s = r.getState().getNestedState(t, n);
|
|
515
511
|
if (Array.isArray(s) && i === "cut")
|
|
516
512
|
return () => st(
|
|
517
513
|
o,
|
|
@@ -521,78 +517,78 @@ function Z(t, o, g, S) {
|
|
|
521
517
|
);
|
|
522
518
|
}
|
|
523
519
|
if (i === "get")
|
|
524
|
-
return () =>
|
|
520
|
+
return () => r.getState().getNestedState(t, e);
|
|
525
521
|
if (i === "$derive")
|
|
526
|
-
return (n) =>
|
|
522
|
+
return (n) => Q({
|
|
527
523
|
_stateKey: t,
|
|
528
524
|
_path: e,
|
|
529
525
|
_effect: n.toString()
|
|
530
526
|
});
|
|
531
527
|
if (i === "$derive")
|
|
532
|
-
return (n) =>
|
|
528
|
+
return (n) => Q({
|
|
533
529
|
_stateKey: t,
|
|
534
530
|
_path: e,
|
|
535
531
|
_effect: n.toString()
|
|
536
532
|
});
|
|
537
533
|
if (i === "$get")
|
|
538
|
-
return () =>
|
|
534
|
+
return () => Q({
|
|
539
535
|
_stateKey: t,
|
|
540
536
|
_path: e
|
|
541
537
|
});
|
|
542
538
|
if (i === "lastSynced") {
|
|
543
539
|
const n = `${t}:${e.join(".")}`;
|
|
544
|
-
return
|
|
540
|
+
return r.getState().getSyncInfo(n);
|
|
545
541
|
}
|
|
546
542
|
if (i === "_selected") {
|
|
547
|
-
const n = e.slice(0, -1), s = n.join("."), c =
|
|
543
|
+
const n = e.slice(0, -1), s = n.join("."), c = r.getState().getNestedState(t, n);
|
|
548
544
|
return Array.isArray(c) ? Number(e[e.length - 1]) === v.get(s) : void 0;
|
|
549
545
|
}
|
|
550
546
|
if (i == "getLocalStorage")
|
|
551
547
|
return (n) => gt(S + "-" + t + "-" + n);
|
|
552
548
|
if (i === "setSelected")
|
|
553
549
|
return (n) => {
|
|
554
|
-
const s = e.slice(0, -1), c = Number(e[e.length - 1]),
|
|
555
|
-
n ? v.set(
|
|
556
|
-
const f =
|
|
550
|
+
const s = e.slice(0, -1), c = Number(e[e.length - 1]), a = s.join(".");
|
|
551
|
+
n ? v.set(a, c) : v.delete(a);
|
|
552
|
+
const f = r.getState().getNestedState(t, [...s]);
|
|
557
553
|
q(o, f, s), _(s);
|
|
558
554
|
};
|
|
559
555
|
if (e.length == 0) {
|
|
560
556
|
if (i === "validateZodSchema")
|
|
561
557
|
return () => {
|
|
562
|
-
const n =
|
|
558
|
+
const n = r.getState().getInitialOptions(t)?.validation, s = r.getState().addValidationError;
|
|
563
559
|
if (!n?.zodSchema)
|
|
564
560
|
throw new Error("Zod schema not found");
|
|
565
561
|
if (!n?.key)
|
|
566
562
|
throw new Error("Validation key not found");
|
|
567
563
|
R(n.key);
|
|
568
|
-
const c =
|
|
564
|
+
const c = r.getState().cogsStateStore[t];
|
|
569
565
|
try {
|
|
570
|
-
const
|
|
571
|
-
|
|
566
|
+
const a = r.getState().getValidationErrors(n.key);
|
|
567
|
+
a && a.length > 0 && a.forEach(([w]) => {
|
|
572
568
|
w && w.startsWith(n.key) && R(w);
|
|
573
569
|
});
|
|
574
570
|
const f = n.zodSchema.safeParse(c);
|
|
575
|
-
return f.success ? !0 : (f.error.errors.forEach((
|
|
576
|
-
const V =
|
|
577
|
-
s(C,
|
|
578
|
-
`Validation error at ${C}: ${
|
|
571
|
+
return f.success ? !0 : (f.error.errors.forEach((j) => {
|
|
572
|
+
const V = j.path, O = j.message, C = [n.key, ...V].join(".");
|
|
573
|
+
s(C, O), console.log(
|
|
574
|
+
`Validation error at ${C}: ${O}`
|
|
579
575
|
);
|
|
580
|
-
}),
|
|
581
|
-
} catch (
|
|
582
|
-
return console.error("Zod schema validation failed",
|
|
576
|
+
}), St(t), !1);
|
|
577
|
+
} catch (a) {
|
|
578
|
+
return console.error("Zod schema validation failed", a), !1;
|
|
583
579
|
}
|
|
584
580
|
};
|
|
585
581
|
if (i === "_componentId") return g;
|
|
586
582
|
if (i === "getComponents")
|
|
587
|
-
return () =>
|
|
583
|
+
return () => r().stateComponents.get(t);
|
|
588
584
|
if (i === "getAllFormRefs")
|
|
589
585
|
return () => ct.getState().getFormRefsByStateKey(t);
|
|
590
586
|
if (i === "_initialState")
|
|
591
|
-
return
|
|
587
|
+
return r.getState().initialStateGlobal[t];
|
|
592
588
|
if (i === "_serverState")
|
|
593
|
-
return
|
|
589
|
+
return r.getState().serverState[t];
|
|
594
590
|
if (i === "_isLoading")
|
|
595
|
-
return
|
|
591
|
+
return r.getState().isLoadingGlobal[t];
|
|
596
592
|
if (i === "revertToInitialState")
|
|
597
593
|
return m.revertToInitialState;
|
|
598
594
|
if (i === "updateInitialState") return m.updateInitialState;
|
|
@@ -605,11 +601,11 @@ function Z(t, o, g, S) {
|
|
|
605
601
|
children: n,
|
|
606
602
|
hideMessage: s
|
|
607
603
|
}) => /* @__PURE__ */ ot(
|
|
608
|
-
|
|
604
|
+
$t,
|
|
609
605
|
{
|
|
610
606
|
formOpts: s ? { validation: { message: "" } } : void 0,
|
|
611
607
|
path: e,
|
|
612
|
-
validationKey:
|
|
608
|
+
validationKey: r.getState().getInitialOptions(t)?.validation?.key || "",
|
|
613
609
|
stateKey: t,
|
|
614
610
|
validIndices: I?.validIndices,
|
|
615
611
|
children: n
|
|
@@ -621,21 +617,21 @@ function Z(t, o, g, S) {
|
|
|
621
617
|
if (i === "update")
|
|
622
618
|
return (n, s) => {
|
|
623
619
|
if (s?.debounce)
|
|
624
|
-
|
|
620
|
+
wt(() => {
|
|
625
621
|
q(o, n, e, "");
|
|
626
|
-
const c =
|
|
622
|
+
const c = r.getState().getNestedState(t, e);
|
|
627
623
|
s?.afterUpdate && s.afterUpdate(c);
|
|
628
624
|
}, s.debounce);
|
|
629
625
|
else {
|
|
630
626
|
q(o, n, e, "");
|
|
631
|
-
const c =
|
|
627
|
+
const c = r.getState().getNestedState(t, e);
|
|
632
628
|
s?.afterUpdate && s.afterUpdate(c);
|
|
633
629
|
}
|
|
634
630
|
_(e);
|
|
635
631
|
};
|
|
636
632
|
if (i === "formElement")
|
|
637
633
|
return (n, s) => /* @__PURE__ */ ot(
|
|
638
|
-
|
|
634
|
+
Vt,
|
|
639
635
|
{
|
|
640
636
|
setState: o,
|
|
641
637
|
stateKey: t,
|
|
@@ -644,7 +640,7 @@ function Z(t, o, g, S) {
|
|
|
644
640
|
formOpts: s
|
|
645
641
|
}
|
|
646
642
|
);
|
|
647
|
-
const U = [...e, i], A =
|
|
643
|
+
const U = [...e, i], A = r.getState().getNestedState(t, U);
|
|
648
644
|
return p(A, U, I);
|
|
649
645
|
}
|
|
650
646
|
}, b = new Proxy(m, F);
|
|
@@ -654,17 +650,17 @@ function Z(t, o, g, S) {
|
|
|
654
650
|
}), b;
|
|
655
651
|
}
|
|
656
652
|
return p(
|
|
657
|
-
|
|
653
|
+
r.getState().getNestedState(t, [])
|
|
658
654
|
);
|
|
659
655
|
}
|
|
660
|
-
function
|
|
656
|
+
function Q(t) {
|
|
661
657
|
return H(bt, { proxy: t });
|
|
662
658
|
}
|
|
663
|
-
function
|
|
659
|
+
function Mt({
|
|
664
660
|
proxy: t,
|
|
665
661
|
rebuildStateShape: o
|
|
666
662
|
}) {
|
|
667
|
-
const g =
|
|
663
|
+
const g = r().getNestedState(t._stateKey, t._path);
|
|
668
664
|
return console.log("value", g), Array.isArray(g) ? o(
|
|
669
665
|
g,
|
|
670
666
|
t._path
|
|
@@ -676,7 +672,7 @@ function bt({
|
|
|
676
672
|
proxy: t
|
|
677
673
|
}) {
|
|
678
674
|
const o = z(null), g = `${t._stateKey}-${t._path.join(".")}`;
|
|
679
|
-
return
|
|
675
|
+
return Y(() => {
|
|
680
676
|
const S = o.current;
|
|
681
677
|
if (!S || !S.parentElement) return;
|
|
682
678
|
const l = S.parentElement, _ = Array.from(l.childNodes).indexOf(S);
|
|
@@ -688,8 +684,8 @@ function bt({
|
|
|
688
684
|
position: _,
|
|
689
685
|
effect: t._effect
|
|
690
686
|
};
|
|
691
|
-
|
|
692
|
-
const d =
|
|
687
|
+
r.getState().addSignalElement(g, p);
|
|
688
|
+
const d = r.getState().getNestedState(t._stateKey, t._path);
|
|
693
689
|
let e;
|
|
694
690
|
if (t._effect)
|
|
695
691
|
try {
|
|
@@ -712,9 +708,9 @@ function bt({
|
|
|
712
708
|
});
|
|
713
709
|
}
|
|
714
710
|
function Bt(t) {
|
|
715
|
-
const o =
|
|
711
|
+
const o = _t(
|
|
716
712
|
(g) => {
|
|
717
|
-
const S =
|
|
713
|
+
const S = r.getState().stateComponents.get(t._stateKey) || {
|
|
718
714
|
components: /* @__PURE__ */ new Map()
|
|
719
715
|
};
|
|
720
716
|
return S.components.set(t._stateKey, {
|
|
@@ -722,16 +718,16 @@ function Bt(t) {
|
|
|
722
718
|
paths: /* @__PURE__ */ new Set([t._path.join(".")])
|
|
723
719
|
}), () => S.components.delete(t._stateKey);
|
|
724
720
|
},
|
|
725
|
-
() =>
|
|
721
|
+
() => r.getState().getNestedState(t._stateKey, t._path)
|
|
726
722
|
);
|
|
727
723
|
return H("text", {}, String(o));
|
|
728
724
|
}
|
|
729
725
|
export {
|
|
730
|
-
|
|
726
|
+
Q as $cogsSignal,
|
|
731
727
|
Bt as $cogsSignalStore,
|
|
732
728
|
qt as addStateOptions,
|
|
733
729
|
zt as createCogsState,
|
|
734
730
|
Jt as notifyComponent,
|
|
735
|
-
|
|
731
|
+
Ot as useCogsStateFn
|
|
736
732
|
};
|
|
737
733
|
//# 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 getNestedValue,\r\n isFunction,\r\n updateNestedProperty,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { boolean, ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => void;\r\n\r\ntype CutFunctionType = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => void;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {}) & {\r\n [K in keyof (any extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => void;\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: { key: string | ((state: T) => string) };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n localStorageKey?: string;\r\n initState?: {\r\n ctx?: Record<string, any>;\r\n initialState: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n };\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n mutation: UseMutationResult<any, unknown, any, unknown>;\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: Opt;\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 }\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 (opt?.formElements || opt?.validation) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n // Apply form elements with global as defaults\r\n initialOptionsPart[key].formElements = {\r\n ...opt.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n 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 initState: options?.initState,\r\n localStorageKey: options?.localStorageKey,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions.localStorageKey) {\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 = currentInitialOptions.initState\r\n ? `${sessionId}-${thisKey}-${currentInitialOptions.localStorageKey}`\r\n : thisKey;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n startTransition(() => {\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n });\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n updates.add(() => component.forceUpdate());\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n startTransition(() => {\r\n updates.forEach((update) => update());\r\n });\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n localStorageKey,\r\n initState,\r\n syncUpdate,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n\r\n useEffect(() => {\r\n setAndMergeOptions(thisKey as string, {\r\n initState,\r\n });\r\n let localData = null;\r\n if (localStorageKey) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localStorageKey\r\n );\r\n }\r\n let newState = null;\r\n if (initState?.initialState) {\r\n newState = initState?.initialState;\r\n console.log(\"newState\", newState);\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n }\r\n }\r\n updateGlobalState(\r\n thisKey,\r\n initState?.initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n console.log(\"newState222\", newState);\r\n queueMicrotask(() => {\r\n forceUpdate({});\r\n });\r\n }\r\n }, [localStorageKey, ...(initState?.dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (stateKey == \"cart\") {\r\n console.log(\"thisKey\", thisKey);\r\n console.log(\"stateEntry\", stateEntry);\r\n }\r\n if (stateEntry) {\r\n for (const [key, component] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes.includes(\"none\")) {\r\n continue;\r\n }\r\n\r\n // Force update if \"all\" is specified\r\n if (reactiveTypes.includes(\"all\")) {\r\n queueMicrotask(() => {\r\n component.forceUpdate();\r\n });\r\n continue;\r\n continue;\r\n }\r\n\r\n // Check component-level path reactivity\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths &&\r\n (component.paths.has(pathToCheck) || component.paths.has(\"\"))\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n\r\n // Check dependency-based reactivity\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) {\r\n shouldUpdate = true;\r\n }\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: \"new\" as const,\r\n oldValue,\r\n newValue,\r\n } satisfies UpdateTypeDetail;\r\n\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n\r\n // Aggregate the updates by stateKey and path\r\n const aggregatedLogs = logs.reduce((acc, log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = acc.get(uniqueKey);\r\n\r\n if (existing) {\r\n // Update the existing entry with the most recent details\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue; // Overwrite with the latest value\r\n existing.oldValue = existing.oldValue ?? log.oldValue; // Retain the initial oldValue\r\n existing.updateType = log.updateType; // Update to the most recent type\r\n } else {\r\n // Add the log if no existing match is found\r\n acc.set(uniqueKey, { ...(log as any) });\r\n }\r\n\r\n return acc;\r\n }, new Map<string, typeof newUpdate>());\r\n\r\n // Convert the aggregated map back to an array\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (middleware) {\r\n middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n if (latestInitialOptionsRef.current?.serverSync) {\r\n const serverStateStore = getGlobalStore.getState().serverState[thisKey];\r\n const serverSync = latestInitialOptionsRef.current?.serverSync;\r\n setServerSyncActions(thisKey, {\r\n syncKey:\r\n typeof serverSync.syncKey == \"string\"\r\n ? serverSync.syncKey\r\n : serverSync.syncKey({ state: payload }),\r\n rollBackState: serverStateStore,\r\n actionTimeStamp: Date.now() + (serverSync.debounce ?? 3000),\r\n status: \"waiting\",\r\n });\r\n }\r\n\r\n return payload;\r\n });\r\n };\r\n if (!getGlobalStore.getState().updaterState[thisKey]) {\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const selectedIndexMap = new Map<string, number>();\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n\r\n startTransition(() => {\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n if (initalOptionsGet?.localStorageKey) {\r\n localStorage.removeItem(\r\n initalOptionsGet?.initState\r\n ? sessionId +\r\n \"-\" +\r\n stateKey +\r\n \"-\" +\r\n initalOptionsGet?.localStorageKey\r\n : stateKey\r\n );\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n\r\n const handler = {\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = selectedIndexMap.get(path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\r\n (obj: any) => obj[thisKey] === thisValue\r\n );\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // ADDED: Clear cache for find operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n []\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices, // Pass through the meta\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return currentIndex === selectedIndexMap.get(parentKey);\r\n }\r\n return undefined;\r\n }\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n if (value) {\r\n selectedIndexMap.set(parentKey, thisIndex);\r\n } else {\r\n // Optional: clear selection if false\r\n selectedIndexMap.delete(parentKey);\r\n }\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // ADDED: Invalidate cache for parent path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n\r\n console.log(\r\n `Validation error at ${fullErrorPath}: ${errorMessage}`\r\n );\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(baseObj as StateObject<T>, 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 console.log(\"value\", value);\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","startTransition","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","initState","syncUpdate","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","isFunction","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","pathToCheck","shouldUpdate","reactiveTypes","depsResult","isDeepEqual","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","selectedIndexMap","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","newUpdaterState","field","serverState","currentState","meta","cacheKey","handler","target","prop","currentPath","selectedIndex","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","item","isMatch","updatedItem","updatedArray","updateFn","cutFunc","newVal","i","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","value","nested","thisObject","existingErrors","errorPath","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n createElement,\r\n startTransition,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport {\r\n debounce,\r\n getNestedValue,\r\n isFunction,\r\n updateNestedProperty,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { boolean, ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => void;\r\n\r\ntype CutFunctionType = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => void;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {}) & {\r\n [K in keyof (any extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => void;\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: { key: string | ((state: T) => string) };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n localStorageKey?: string;\r\n initState?: {\r\n ctx?: Record<string, any>;\r\n initialState: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n };\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n mutation: UseMutationResult<any, unknown, any, unknown>;\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: Opt;\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 }\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 (opt?.formElements || opt?.validation) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n // Apply form elements with global as defaults\r\n initialOptionsPart[key].formElements = {\r\n ...opt.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n 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 initState: options?.initState,\r\n localStorageKey: options?.localStorageKey,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions.localStorageKey) {\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 = currentInitialOptions.initState\r\n ? `${sessionId}-${thisKey}-${currentInitialOptions.localStorageKey}`\r\n : thisKey;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n startTransition(() => {\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n });\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n updates.add(() => component.forceUpdate());\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n startTransition(() => {\r\n updates.forEach((update) => update());\r\n });\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n localStorageKey,\r\n initState,\r\n syncUpdate,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n\r\n useEffect(() => {\r\n setAndMergeOptions(thisKey as string, {\r\n initState,\r\n });\r\n let localData = null;\r\n if (localStorageKey) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localStorageKey\r\n );\r\n }\r\n let newState = null;\r\n if (initState?.initialState) {\r\n newState = initState?.initialState;\r\n\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n }\r\n }\r\n updateGlobalState(\r\n thisKey,\r\n initState?.initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n console.log(\"newState222\", newState);\r\n notifyComponents(thisKey);\r\n forceUpdate({});\r\n }\r\n }, [localStorageKey, ...(initState?.dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n\r\n if (stateEntry) {\r\n for (const [key, component] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes.includes(\"none\")) {\r\n continue;\r\n }\r\n\r\n // Force update if \"all\" is specified\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n\r\n continue;\r\n }\r\n\r\n // Check component-level path reactivity\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths &&\r\n (component.paths.has(pathToCheck) || component.paths.has(\"\"))\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n\r\n // Check dependency-based reactivity\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) {\r\n shouldUpdate = true;\r\n }\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: \"new\" as const,\r\n oldValue,\r\n newValue,\r\n } satisfies UpdateTypeDetail;\r\n\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n\r\n // Aggregate the updates by stateKey and path\r\n const aggregatedLogs = logs.reduce((acc, log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = acc.get(uniqueKey);\r\n\r\n if (existing) {\r\n // Update the existing entry with the most recent details\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue; // Overwrite with the latest value\r\n existing.oldValue = existing.oldValue ?? log.oldValue; // Retain the initial oldValue\r\n existing.updateType = log.updateType; // Update to the most recent type\r\n } else {\r\n // Add the log if no existing match is found\r\n acc.set(uniqueKey, { ...(log as any) });\r\n }\r\n\r\n return acc;\r\n }, new Map<string, typeof newUpdate>());\r\n\r\n // Convert the aggregated map back to an array\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (middleware) {\r\n middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n if (latestInitialOptionsRef.current?.serverSync) {\r\n const serverStateStore = getGlobalStore.getState().serverState[thisKey];\r\n const serverSync = latestInitialOptionsRef.current?.serverSync;\r\n setServerSyncActions(thisKey, {\r\n syncKey:\r\n typeof serverSync.syncKey == \"string\"\r\n ? serverSync.syncKey\r\n : serverSync.syncKey({ state: payload }),\r\n rollBackState: serverStateStore,\r\n actionTimeStamp: Date.now() + (serverSync.debounce ?? 3000),\r\n status: \"waiting\",\r\n });\r\n }\r\n\r\n return payload;\r\n });\r\n };\r\n if (!getGlobalStore.getState().updaterState[thisKey]) {\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const selectedIndexMap = new Map<string, number>();\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n\r\n startTransition(() => {\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n if (initalOptionsGet?.localStorageKey) {\r\n localStorage.removeItem(\r\n initalOptionsGet?.initState\r\n ? sessionId +\r\n \"-\" +\r\n stateKey +\r\n \"-\" +\r\n initalOptionsGet?.localStorageKey\r\n : stateKey\r\n );\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n\r\n const handler = {\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = selectedIndexMap.get(path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\r\n (obj: any) => obj[thisKey] === thisValue\r\n );\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // ADDED: Clear cache for find operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n []\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices, // Pass through the meta\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return currentIndex === selectedIndexMap.get(parentKey);\r\n }\r\n return undefined;\r\n }\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n if (value) {\r\n selectedIndexMap.set(parentKey, thisIndex);\r\n } else {\r\n // Optional: clear selection if false\r\n selectedIndexMap.delete(parentKey);\r\n }\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // ADDED: Invalidate cache for parent path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n\r\n console.log(\r\n `Validation error at ${fullErrorPath}: ${errorMessage}`\r\n );\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(baseObj as StateObject<T>, 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 console.log(\"value\", value);\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","startTransition","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","initState","syncUpdate","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","isFunction","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","pathToCheck","shouldUpdate","reactiveTypes","depsResult","isDeepEqual","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","selectedIndexMap","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","newUpdaterState","field","serverState","currentState","meta","cacheKey","handler","target","prop","currentPath","selectedIndex","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","item","isMatch","updatedItem","updatedArray","updateFn","cutFunc","newVal","i","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","value","nested","thisObject","existingErrors","errorPath","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":"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"}
|