cogsbox-state 0.5.113 → 0.5.115
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 +159 -161
- package/dist/CogsState.jsx.map +1 -1
- package/package.json +1 -1
package/dist/CogsState.jsx
CHANGED
|
@@ -19,12 +19,12 @@ function dt({
|
|
|
19
19
|
options: i,
|
|
20
20
|
initialOptionsPart: m
|
|
21
21
|
}) {
|
|
22
|
-
const y = q(t) || {}, u = m[t] || {}, w = r.getState().setInitialStateOptions,
|
|
22
|
+
const y = q(t) || {}, u = m[t] || {}, w = r.getState().setInitialStateOptions, _ = { ...u, ...y };
|
|
23
23
|
let v = !1;
|
|
24
24
|
if (i)
|
|
25
|
-
for (const
|
|
26
|
-
|
|
27
|
-
v && w(t,
|
|
25
|
+
for (const c in i)
|
|
26
|
+
_.hasOwnProperty(c) ? (c == "localStorage" && i[c] && _[c].key !== i[c]?.key && (v = !0, _[c] = i[c]), c == "initialState" && i[c] && _[c] !== i[c] && (v = !0, _[c] = i[c])) : (v = !0, _[c] = i[c]);
|
|
27
|
+
v && w(t, _);
|
|
28
28
|
}
|
|
29
29
|
function qt(t, { formElements: i, validation: m }) {
|
|
30
30
|
return { initialState: t, formElements: i, validation: m };
|
|
@@ -41,34 +41,34 @@ const zt = (t, i) => {
|
|
|
41
41
|
// State-specific overrides
|
|
42
42
|
}, q(v) || r.getState().setInitialStateOptions(v, u[v]);
|
|
43
43
|
}), r.getState().setInitialStates(y);
|
|
44
|
-
const w = (v,
|
|
45
|
-
const [f] = tt(
|
|
44
|
+
const w = (v, c) => {
|
|
45
|
+
const [f] = tt(c?.componentId ?? nt());
|
|
46
46
|
dt({
|
|
47
47
|
stateKey: v,
|
|
48
|
-
options:
|
|
48
|
+
options: c,
|
|
49
49
|
initialOptionsPart: u
|
|
50
50
|
});
|
|
51
|
-
const e = r.getState().cogsStateStore[v] || y[v], S =
|
|
51
|
+
const e = r.getState().cogsStateStore[v] || y[v], S = c?.modifyState ? c.modifyState(e) : e, [x, A] = jt(
|
|
52
52
|
S,
|
|
53
53
|
{
|
|
54
54
|
stateKey: v,
|
|
55
|
-
syncUpdate:
|
|
55
|
+
syncUpdate: c?.syncUpdate,
|
|
56
56
|
componentId: f,
|
|
57
|
-
localStorage:
|
|
58
|
-
middleware:
|
|
59
|
-
enabledSync:
|
|
60
|
-
reactiveType:
|
|
61
|
-
reactiveDeps:
|
|
62
|
-
initialState:
|
|
63
|
-
dependencies:
|
|
57
|
+
localStorage: c?.localStorage,
|
|
58
|
+
middleware: c?.middleware,
|
|
59
|
+
enabledSync: c?.enabledSync,
|
|
60
|
+
reactiveType: c?.reactiveType,
|
|
61
|
+
reactiveDeps: c?.reactiveDeps,
|
|
62
|
+
initialState: c?.initialState,
|
|
63
|
+
dependencies: c?.dependencies
|
|
64
64
|
}
|
|
65
65
|
);
|
|
66
66
|
return A;
|
|
67
67
|
};
|
|
68
|
-
function
|
|
69
|
-
dt({ stateKey: v, options:
|
|
68
|
+
function _(v, c) {
|
|
69
|
+
dt({ stateKey: v, options: c, initialOptionsPart: u });
|
|
70
70
|
}
|
|
71
|
-
return { useCogsState: w, setCogsOptions:
|
|
71
|
+
return { useCogsState: w, setCogsOptions: _ };
|
|
72
72
|
}, {
|
|
73
73
|
setUpdaterState: H,
|
|
74
74
|
setState: D,
|
|
@@ -79,7 +79,7 @@ const zt = (t, i) => {
|
|
|
79
79
|
updateInitialStateGlobal: rt,
|
|
80
80
|
addValidationError: kt,
|
|
81
81
|
removeValidationError: P,
|
|
82
|
-
setServerSyncActions:
|
|
82
|
+
setServerSyncActions: xt
|
|
83
83
|
} = r.getState(), gt = (t) => {
|
|
84
84
|
if (!t) return null;
|
|
85
85
|
try {
|
|
@@ -88,7 +88,7 @@ const zt = (t, i) => {
|
|
|
88
88
|
} catch (i) {
|
|
89
89
|
return console.error("Error loading from localStorage:", i), null;
|
|
90
90
|
}
|
|
91
|
-
},
|
|
91
|
+
}, Tt = (t, i, m, y) => {
|
|
92
92
|
m?.log && console.log(
|
|
93
93
|
"saving to localstorage",
|
|
94
94
|
i,
|
|
@@ -102,11 +102,11 @@ const zt = (t, i) => {
|
|
|
102
102
|
lastUpdated: Date.now(),
|
|
103
103
|
lastSyncedWithServer: r.getState().serverSyncLog[i]?.[0]?.timeStamp,
|
|
104
104
|
baseServerState: r.getState().serverState[i]
|
|
105
|
-
},
|
|
106
|
-
window.localStorage.setItem(
|
|
105
|
+
}, _ = `${y}-${i}-${u}`;
|
|
106
|
+
window.localStorage.setItem(_, JSON.stringify(w));
|
|
107
107
|
}
|
|
108
|
-
},
|
|
109
|
-
const
|
|
108
|
+
}, Ot = (t, i, m, y, u, w) => {
|
|
109
|
+
const _ = {
|
|
110
110
|
initialState: i,
|
|
111
111
|
updaterState: Y(
|
|
112
112
|
t,
|
|
@@ -116,7 +116,7 @@ const zt = (t, i) => {
|
|
|
116
116
|
),
|
|
117
117
|
state: m
|
|
118
118
|
};
|
|
119
|
-
rt(t,
|
|
119
|
+
rt(t, _.initialState), H(t, _.updaterState), D(t, _.state);
|
|
120
120
|
}, ft = (t) => {
|
|
121
121
|
const i = r.getState().stateComponents.get(t);
|
|
122
122
|
if (!i) return;
|
|
@@ -133,55 +133,53 @@ const zt = (t, i) => {
|
|
|
133
133
|
u && u.forceUpdate();
|
|
134
134
|
}
|
|
135
135
|
};
|
|
136
|
-
function
|
|
136
|
+
function jt(t, {
|
|
137
137
|
stateKey: i,
|
|
138
138
|
serverSync: m,
|
|
139
139
|
localStorage: y,
|
|
140
140
|
formElements: u,
|
|
141
141
|
middleware: w,
|
|
142
|
-
reactiveDeps:
|
|
142
|
+
reactiveDeps: _,
|
|
143
143
|
reactiveType: v,
|
|
144
|
-
componentId:
|
|
144
|
+
componentId: c,
|
|
145
145
|
initialState: f,
|
|
146
146
|
syncUpdate: e,
|
|
147
147
|
dependencies: S
|
|
148
148
|
} = {}) {
|
|
149
149
|
const [x, A] = tt({}), { sessionId: T } = At();
|
|
150
150
|
let R = !i;
|
|
151
|
-
const [g] = tt(i ?? nt()), s = r.getState().stateLog[g], G = Z(/* @__PURE__ */ new Set()), b = Z(
|
|
151
|
+
const [g] = tt(i ?? nt()), s = r.getState().stateLog[g], G = Z(/* @__PURE__ */ new Set()), b = Z(c ?? nt()), C = Z(null);
|
|
152
152
|
C.current = q(g), et(() => {
|
|
153
153
|
if (e && e.stateKey === g && e.path?.[0]) {
|
|
154
154
|
D(g, (o) => ({
|
|
155
155
|
...o,
|
|
156
156
|
[e.path[0]]: e.newValue
|
|
157
157
|
}));
|
|
158
|
-
const
|
|
159
|
-
r.getState().setSyncInfo(
|
|
158
|
+
const l = `${e.stateKey}:${e.path.join(".")}`;
|
|
159
|
+
r.getState().setSyncInfo(l, {
|
|
160
160
|
timeStamp: e.timeStamp,
|
|
161
161
|
userId: e.userId
|
|
162
162
|
});
|
|
163
163
|
}
|
|
164
164
|
}, [e]), et(() => {
|
|
165
|
-
|
|
166
|
-
return;
|
|
167
|
-
lt(g, {
|
|
165
|
+
f && lt(g, {
|
|
168
166
|
initialState: f
|
|
169
167
|
});
|
|
170
|
-
const
|
|
168
|
+
const l = C.current;
|
|
171
169
|
let o = null;
|
|
172
|
-
const d = L(
|
|
173
|
-
console.log("newoptions",
|
|
170
|
+
const d = L(l?.localStorage?.key) ? l?.localStorage?.key(f) : l?.localStorage?.key;
|
|
171
|
+
console.log("newoptions", l), console.log("localkey", d), console.log("initialState", f), d && T && (o = gt(
|
|
174
172
|
T + "-" + g + "-" + d
|
|
175
173
|
));
|
|
176
|
-
let
|
|
177
|
-
o && o.lastUpdated > (o.lastSyncedWithServer || 0) && (
|
|
174
|
+
let E = null;
|
|
175
|
+
f && (E = f, o && o.lastUpdated > (o.lastSyncedWithServer || 0) && (E = o.state, l?.localStorage?.onChange && l?.localStorage?.onChange(E)), console.log("newState thius is newstate", E), Ot(
|
|
178
176
|
g,
|
|
179
177
|
f,
|
|
180
|
-
|
|
178
|
+
E,
|
|
181
179
|
n,
|
|
182
180
|
b.current,
|
|
183
181
|
T
|
|
184
|
-
),
|
|
182
|
+
), ft(g), A({}));
|
|
185
183
|
}, [f, ...S || []]), vt(() => {
|
|
186
184
|
R && lt(g, {
|
|
187
185
|
serverSync: m,
|
|
@@ -190,45 +188,45 @@ function Ot(t, {
|
|
|
190
188
|
localStorage: y,
|
|
191
189
|
middleware: w
|
|
192
190
|
});
|
|
193
|
-
const
|
|
191
|
+
const l = `${g}////${b.current}`, o = r.getState().stateComponents.get(g) || {
|
|
194
192
|
components: /* @__PURE__ */ new Map()
|
|
195
193
|
};
|
|
196
|
-
return o.components.set(
|
|
194
|
+
return o.components.set(l, {
|
|
197
195
|
forceUpdate: () => A({}),
|
|
198
196
|
paths: /* @__PURE__ */ new Set(),
|
|
199
197
|
deps: [],
|
|
200
|
-
depsFunction:
|
|
198
|
+
depsFunction: _ || void 0,
|
|
201
199
|
reactiveType: v ?? ["component", "deps"]
|
|
202
200
|
}), r.getState().stateComponents.set(g, o), A({}), () => {
|
|
203
201
|
const d = `${g}////${b.current}`;
|
|
204
202
|
o && (o.components.delete(d), o.components.size === 0 && r.getState().stateComponents.delete(g));
|
|
205
203
|
};
|
|
206
204
|
}, []);
|
|
207
|
-
const n = (
|
|
205
|
+
const n = (l, o, d, E) => {
|
|
208
206
|
if (Array.isArray(o)) {
|
|
209
|
-
const
|
|
210
|
-
G.current.add(
|
|
207
|
+
const O = `${g}-${o.join(".")}`;
|
|
208
|
+
G.current.add(O);
|
|
211
209
|
}
|
|
212
|
-
D(g, (
|
|
213
|
-
const N = L(
|
|
214
|
-
if (
|
|
215
|
-
let F = !1,
|
|
216
|
-
if ((!
|
|
210
|
+
D(g, (O) => {
|
|
211
|
+
const N = L(l) ? l(O) : l, p = `${g}-${o.join(".")}`;
|
|
212
|
+
if (p) {
|
|
213
|
+
let F = !1, I = r.getState().signalDomElements.get(p);
|
|
214
|
+
if ((!I || I.size === 0) && (d.updateType === "insert" || d.updateType === "cut")) {
|
|
217
215
|
const V = o.slice(0, -1), h = U(N, V);
|
|
218
216
|
if (Array.isArray(h)) {
|
|
219
217
|
F = !0;
|
|
220
218
|
const $ = `${g}-${V.join(".")}`;
|
|
221
|
-
|
|
219
|
+
I = r.getState().signalDomElements.get($);
|
|
222
220
|
}
|
|
223
221
|
}
|
|
224
|
-
if (
|
|
222
|
+
if (I) {
|
|
225
223
|
const V = F ? U(N, o.slice(0, -1)) : U(N, o);
|
|
226
|
-
|
|
227
|
-
const
|
|
224
|
+
I.forEach(({ parentId: h, position: $, effect: W }) => {
|
|
225
|
+
const j = document.querySelector(
|
|
228
226
|
`[data-parent-id="${h}"]`
|
|
229
227
|
);
|
|
230
|
-
if (
|
|
231
|
-
const it = Array.from(
|
|
228
|
+
if (j) {
|
|
229
|
+
const it = Array.from(j.childNodes);
|
|
232
230
|
if (it[$]) {
|
|
233
231
|
const yt = W ? new Function("state", `return (${W})(state)`)(V) : V;
|
|
234
232
|
it[$].textContent = String(yt);
|
|
@@ -237,36 +235,36 @@ function Ot(t, {
|
|
|
237
235
|
});
|
|
238
236
|
}
|
|
239
237
|
}
|
|
240
|
-
d.updateType === "update" && (
|
|
241
|
-
(
|
|
238
|
+
d.updateType === "update" && (E || C.current?.validationKey) && o && P(
|
|
239
|
+
(E || C.current?.validationKey) + "." + o.join(".")
|
|
242
240
|
);
|
|
243
|
-
const
|
|
241
|
+
const k = o.slice(0, o.length - 1);
|
|
244
242
|
d.updateType === "cut" && C.current?.validationKey && P(
|
|
245
|
-
C.current?.validationKey + "." +
|
|
243
|
+
C.current?.validationKey + "." + k.join(".")
|
|
246
244
|
), d.updateType === "insert" && C.current?.validationKey && ht(
|
|
247
|
-
C.current?.validationKey + "." +
|
|
248
|
-
).filter(([
|
|
249
|
-
let h =
|
|
250
|
-
if (
|
|
251
|
-
let $ =
|
|
252
|
-
P(
|
|
245
|
+
C.current?.validationKey + "." + k.join(".")
|
|
246
|
+
).filter(([I, V]) => {
|
|
247
|
+
let h = I?.split(".").length;
|
|
248
|
+
if (I == k.join(".") && h == k.length - 1) {
|
|
249
|
+
let $ = I + "." + k;
|
|
250
|
+
P(I), kt($, V);
|
|
253
251
|
}
|
|
254
252
|
});
|
|
255
|
-
const z = U(
|
|
253
|
+
const z = U(O, o), St = U(N, o), mt = d.updateType === "update" ? o.join(".") : [...o].slice(0, -1).join("."), ot = r.getState().stateComponents.get(g);
|
|
256
254
|
if (ot)
|
|
257
|
-
for (const [F,
|
|
255
|
+
for (const [F, I] of ot.components.entries()) {
|
|
258
256
|
let V = !1;
|
|
259
|
-
const h = Array.isArray(
|
|
257
|
+
const h = Array.isArray(I.reactiveType) ? I.reactiveType : [I.reactiveType || "component"];
|
|
260
258
|
if (!h.includes("none")) {
|
|
261
259
|
if (h.includes("all")) {
|
|
262
|
-
|
|
260
|
+
I.forceUpdate();
|
|
263
261
|
continue;
|
|
264
262
|
}
|
|
265
|
-
if (h.includes("component") &&
|
|
266
|
-
const $ =
|
|
267
|
-
typeof $ == "boolean" ? $ && (V = !0) : M(
|
|
263
|
+
if (h.includes("component") && I.paths && (I.paths.has(mt) || I.paths.has("")) && (V = !0), !V && h.includes("deps") && I.depsFunction) {
|
|
264
|
+
const $ = I.depsFunction(N);
|
|
265
|
+
typeof $ == "boolean" ? $ && (V = !0) : M(I.deps, $) || (I.deps = $, V = !0);
|
|
268
266
|
}
|
|
269
|
-
V &&
|
|
267
|
+
V && I.forceUpdate();
|
|
270
268
|
}
|
|
271
269
|
}
|
|
272
270
|
const at = {
|
|
@@ -280,11 +278,11 @@ function Ot(t, {
|
|
|
280
278
|
};
|
|
281
279
|
if (Ct(g, (F) => {
|
|
282
280
|
const V = [...F ?? [], at].reduce((h, $) => {
|
|
283
|
-
const W = `${$.stateKey}:${JSON.stringify($.path)}`,
|
|
284
|
-
return
|
|
281
|
+
const W = `${$.stateKey}:${JSON.stringify($.path)}`, j = h.get(W);
|
|
282
|
+
return j ? (j.timeStamp = Math.max(j.timeStamp, $.timeStamp), j.newValue = $.newValue, j.oldValue = j.oldValue ?? $.oldValue, j.updateType = $.updateType) : h.set(W, { ...$ }), h;
|
|
285
283
|
}, /* @__PURE__ */ new Map());
|
|
286
284
|
return Array.from(V.values());
|
|
287
|
-
}),
|
|
285
|
+
}), Tt(
|
|
288
286
|
N,
|
|
289
287
|
g,
|
|
290
288
|
C.current,
|
|
@@ -293,11 +291,11 @@ function Ot(t, {
|
|
|
293
291
|
updateLog: s,
|
|
294
292
|
update: at
|
|
295
293
|
}), C.current?.serverSync) {
|
|
296
|
-
const F = r.getState().serverState[g],
|
|
297
|
-
|
|
298
|
-
syncKey: typeof
|
|
294
|
+
const F = r.getState().serverState[g], I = C.current?.serverSync;
|
|
295
|
+
xt(g, {
|
|
296
|
+
syncKey: typeof I.syncKey == "string" ? I.syncKey : I.syncKey({ state: N }),
|
|
299
297
|
rollBackState: F,
|
|
300
|
-
actionTimeStamp: Date.now() + (
|
|
298
|
+
actionTimeStamp: Date.now() + (I.debounce ?? 3e3),
|
|
301
299
|
status: "waiting"
|
|
302
300
|
});
|
|
303
301
|
}
|
|
@@ -324,7 +322,7 @@ function Ot(t, {
|
|
|
324
322
|
function Y(t, i, m, y) {
|
|
325
323
|
const u = /* @__PURE__ */ new Map();
|
|
326
324
|
let w = 0;
|
|
327
|
-
const
|
|
325
|
+
const _ = (f) => {
|
|
328
326
|
const e = f.join(".");
|
|
329
327
|
for (const [S] of u)
|
|
330
328
|
(S === e || S.startsWith(e + ".")) && u.delete(S);
|
|
@@ -338,7 +336,7 @@ function Y(t, i, m, y) {
|
|
|
338
336
|
e?.key && P(e?.key), f?.validationKey && P(f.validationKey);
|
|
339
337
|
const S = r.getState().initialStateGlobal[t];
|
|
340
338
|
r.getState().clearSelectedIndexesForState(t), u.clear(), w++;
|
|
341
|
-
const x =
|
|
339
|
+
const x = c(S, []), A = q(t), T = L(A?.localStorage?.key) ? A?.localStorage?.key(S) : A?.localStorage?.key, R = `${y}-${t}-${T}`;
|
|
342
340
|
R && localStorage.removeItem(R), H(t, x), D(t, S);
|
|
343
341
|
const g = r.getState().stateComponents.get(t);
|
|
344
342
|
return g && g.components.forEach((s) => {
|
|
@@ -371,7 +369,7 @@ function Y(t, i, m, y) {
|
|
|
371
369
|
return !!(f && M(f, ut(t)));
|
|
372
370
|
}
|
|
373
371
|
};
|
|
374
|
-
function
|
|
372
|
+
function c(f, e = [], S) {
|
|
375
373
|
const x = e.map(String).join(".");
|
|
376
374
|
u.get(x);
|
|
377
375
|
const A = function() {
|
|
@@ -388,27 +386,27 @@ function Y(t, i, m, y) {
|
|
|
388
386
|
},
|
|
389
387
|
get(g, s) {
|
|
390
388
|
if (s !== "then" && !s.startsWith("$") && s !== "stateMapNoRender") {
|
|
391
|
-
const n = e.join("."), a = `${t}////${m}`,
|
|
392
|
-
if (
|
|
393
|
-
const o =
|
|
389
|
+
const n = e.join("."), a = `${t}////${m}`, l = r.getState().stateComponents.get(t);
|
|
390
|
+
if (l) {
|
|
391
|
+
const o = l.components.get(a);
|
|
394
392
|
o && (e.length > 0 || s === "get") && o.paths.add(n);
|
|
395
393
|
}
|
|
396
394
|
}
|
|
397
395
|
if (s === "_status") {
|
|
398
|
-
const n = r.getState().getNestedState(t, e), a = r.getState().initialStateGlobal[t],
|
|
399
|
-
return M(n,
|
|
396
|
+
const n = r.getState().getNestedState(t, e), a = r.getState().initialStateGlobal[t], l = U(a, e);
|
|
397
|
+
return M(n, l) ? "fresh" : "stale";
|
|
400
398
|
}
|
|
401
399
|
if (s === "getStatus")
|
|
402
400
|
return function() {
|
|
403
401
|
const n = r().getNestedState(
|
|
404
402
|
t,
|
|
405
403
|
e
|
|
406
|
-
), a = r.getState().initialStateGlobal[t],
|
|
407
|
-
return M(n,
|
|
404
|
+
), a = r.getState().initialStateGlobal[t], l = U(a, e);
|
|
405
|
+
return M(n, l) ? "fresh" : "stale";
|
|
408
406
|
};
|
|
409
407
|
if (s === "removeStorage")
|
|
410
408
|
return () => {
|
|
411
|
-
const n = r.getState().initialStateGlobal[t], a = q(t),
|
|
409
|
+
const n = r.getState().initialStateGlobal[t], a = q(t), l = L(a?.localStorage?.key) ? a?.localStorage?.key(n) : a?.localStorage?.key, o = `${y}-${t}-${l}`;
|
|
412
410
|
console.log("removing storage", o), o && localStorage.removeItem(o);
|
|
413
411
|
};
|
|
414
412
|
if (s === "showValidationErrors")
|
|
@@ -423,7 +421,7 @@ function Y(t, i, m, y) {
|
|
|
423
421
|
return () => {
|
|
424
422
|
const n = r.getState().getSelectedIndex(t, e.join("."));
|
|
425
423
|
if (n !== void 0)
|
|
426
|
-
return
|
|
424
|
+
return c(
|
|
427
425
|
f[n],
|
|
428
426
|
[...e, n.toString()],
|
|
429
427
|
S
|
|
@@ -433,11 +431,11 @@ function Y(t, i, m, y) {
|
|
|
433
431
|
return () => r.getState().getSelectedIndex(t, e.join(".")) ?? -1;
|
|
434
432
|
if (s === "stateSort")
|
|
435
433
|
return (n) => {
|
|
436
|
-
const o = [...r.getState().getNestedState(t, e).map((d,
|
|
434
|
+
const o = [...r.getState().getNestedState(t, e).map((d, E) => ({
|
|
437
435
|
...d,
|
|
438
|
-
__origIndex:
|
|
436
|
+
__origIndex: E.toString()
|
|
439
437
|
}))].sort(n);
|
|
440
|
-
return u.clear(), w++,
|
|
438
|
+
return u.clear(), w++, c(o, e, {
|
|
441
439
|
filtered: [...S?.filtered || [], e],
|
|
442
440
|
validIndices: o.map(
|
|
443
441
|
(d) => parseInt(d.__origIndex)
|
|
@@ -448,42 +446,42 @@ function Y(t, i, m, y) {
|
|
|
448
446
|
return (n) => {
|
|
449
447
|
const a = S?.filtered?.some(
|
|
450
448
|
(o) => o.join(".") === e.join(".")
|
|
451
|
-
),
|
|
452
|
-
return s !== "stateMapNoRender" && (u.clear(), w++),
|
|
453
|
-
const
|
|
449
|
+
), l = a ? f : r.getState().getNestedState(t, e);
|
|
450
|
+
return s !== "stateMapNoRender" && (u.clear(), w++), l.map((o, d) => {
|
|
451
|
+
const E = a && o.__origIndex ? o.__origIndex : d, O = c(
|
|
454
452
|
o,
|
|
455
|
-
[...e,
|
|
453
|
+
[...e, E.toString()],
|
|
456
454
|
S
|
|
457
455
|
);
|
|
458
456
|
return n(
|
|
459
457
|
o,
|
|
460
|
-
|
|
458
|
+
O,
|
|
461
459
|
d,
|
|
462
460
|
f,
|
|
463
|
-
|
|
461
|
+
c(f, e, S)
|
|
464
462
|
);
|
|
465
463
|
});
|
|
466
464
|
};
|
|
467
465
|
if (s === "$stateMap")
|
|
468
|
-
return (n) => X(
|
|
466
|
+
return (n) => X(pt, {
|
|
469
467
|
proxy: {
|
|
470
468
|
_stateKey: t,
|
|
471
469
|
_path: e,
|
|
472
470
|
_mapFn: n
|
|
473
471
|
// Pass the actual function, not string
|
|
474
472
|
},
|
|
475
|
-
rebuildStateShape:
|
|
473
|
+
rebuildStateShape: c
|
|
476
474
|
});
|
|
477
475
|
if (s === "stateFlattenOn")
|
|
478
476
|
return (n) => {
|
|
479
|
-
const
|
|
477
|
+
const l = S?.filtered?.some(
|
|
480
478
|
(d) => d.join(".") === e.join(".")
|
|
481
479
|
) ? f : r.getState().getNestedState(t, e);
|
|
482
480
|
u.clear(), w++;
|
|
483
|
-
const o =
|
|
484
|
-
(d,
|
|
481
|
+
const o = l.flatMap(
|
|
482
|
+
(d, E) => d[n] ?? []
|
|
485
483
|
);
|
|
486
|
-
return
|
|
484
|
+
return c(
|
|
487
485
|
o,
|
|
488
486
|
[...e, "[*]", n],
|
|
489
487
|
S
|
|
@@ -491,48 +489,48 @@ function Y(t, i, m, y) {
|
|
|
491
489
|
};
|
|
492
490
|
if (s === "findWith")
|
|
493
491
|
return (n, a) => {
|
|
494
|
-
const
|
|
495
|
-
(
|
|
492
|
+
const l = f.findIndex(
|
|
493
|
+
(E) => E[n] === a
|
|
496
494
|
);
|
|
497
|
-
if (
|
|
498
|
-
const o = f[
|
|
499
|
-
return u.clear(), w++, u.clear(), w++,
|
|
495
|
+
if (l === -1) return;
|
|
496
|
+
const o = f[l], d = [...e, l.toString()];
|
|
497
|
+
return u.clear(), w++, u.clear(), w++, c(o, d);
|
|
500
498
|
};
|
|
501
499
|
if (s === "index")
|
|
502
500
|
return (n) => {
|
|
503
501
|
const a = f[n];
|
|
504
|
-
return
|
|
502
|
+
return c(a, [...e, n.toString()]);
|
|
505
503
|
};
|
|
506
504
|
if (s === "insert")
|
|
507
|
-
return (n) => (
|
|
505
|
+
return (n) => (_(e), Q(i, n, e, t), c(
|
|
508
506
|
r.getState().cogsStateStore[t],
|
|
509
507
|
[]
|
|
510
508
|
));
|
|
511
509
|
if (s === "uniqueInsert")
|
|
512
|
-
return (n, a,
|
|
510
|
+
return (n, a, l) => {
|
|
513
511
|
const o = r.getState().getNestedState(t, e), d = L(n) ? n(o) : n;
|
|
514
|
-
let
|
|
512
|
+
let E = null;
|
|
515
513
|
if (!o.some((N) => {
|
|
516
514
|
if (a) {
|
|
517
|
-
const
|
|
515
|
+
const k = a.every(
|
|
518
516
|
(z) => M(N[z], d[z])
|
|
519
517
|
);
|
|
520
|
-
return
|
|
518
|
+
return k && (E = N), k;
|
|
521
519
|
}
|
|
522
|
-
const
|
|
523
|
-
return
|
|
520
|
+
const p = M(N, d);
|
|
521
|
+
return p && (E = N), p;
|
|
524
522
|
}))
|
|
525
|
-
|
|
526
|
-
else if (
|
|
527
|
-
const N =
|
|
528
|
-
(
|
|
523
|
+
_(e), Q(i, d, e, t);
|
|
524
|
+
else if (l && E) {
|
|
525
|
+
const N = l(E), p = o.map(
|
|
526
|
+
(k) => M(k, E) ? N : k
|
|
529
527
|
);
|
|
530
|
-
|
|
528
|
+
_(e), B(i, p, e);
|
|
531
529
|
}
|
|
532
530
|
};
|
|
533
531
|
if (s === "cut")
|
|
534
532
|
return (n, a) => {
|
|
535
|
-
a?.waitForSync || (
|
|
533
|
+
a?.waitForSync || (_(e), J(i, e, t, n));
|
|
536
534
|
};
|
|
537
535
|
if (s === "cutByValue")
|
|
538
536
|
return (n) => {
|
|
@@ -541,20 +539,20 @@ function Y(t, i, m, y) {
|
|
|
541
539
|
};
|
|
542
540
|
if (s === "toggleByValue")
|
|
543
541
|
return (n) => {
|
|
544
|
-
const a = f.findIndex((
|
|
542
|
+
const a = f.findIndex((l) => l === n);
|
|
545
543
|
a > -1 ? J(i, e, t, a) : Q(i, n, e, t);
|
|
546
544
|
};
|
|
547
545
|
if (s === "stateFilter")
|
|
548
546
|
return (n) => {
|
|
549
|
-
const a = f.map((d,
|
|
547
|
+
const a = f.map((d, E) => ({
|
|
550
548
|
...d,
|
|
551
|
-
__origIndex:
|
|
552
|
-
})),
|
|
549
|
+
__origIndex: E.toString()
|
|
550
|
+
})), l = [], o = [];
|
|
553
551
|
for (let d = 0; d < a.length; d++)
|
|
554
|
-
n(a[d], d) && (
|
|
555
|
-
return u.clear(), w++,
|
|
552
|
+
n(a[d], d) && (l.push(d), o.push(a[d]));
|
|
553
|
+
return u.clear(), w++, c(o, e, {
|
|
556
554
|
filtered: [...S?.filtered || [], e],
|
|
557
|
-
validIndices:
|
|
555
|
+
validIndices: l
|
|
558
556
|
// Always pass validIndices, even if empty
|
|
559
557
|
});
|
|
560
558
|
};
|
|
@@ -596,15 +594,15 @@ function Y(t, i, m, y) {
|
|
|
596
594
|
if (s == "getLocalStorage")
|
|
597
595
|
return (n) => gt(y + "-" + t + "-" + n);
|
|
598
596
|
if (s === "_selected") {
|
|
599
|
-
const n = e.slice(0, -1), a = n.join("."),
|
|
600
|
-
return Array.isArray(
|
|
597
|
+
const n = e.slice(0, -1), a = n.join("."), l = r.getState().getNestedState(t, n);
|
|
598
|
+
return Array.isArray(l) ? Number(e[e.length - 1]) === r.getState().getSelectedIndex(t, a) : void 0;
|
|
601
599
|
}
|
|
602
600
|
if (s === "setSelected")
|
|
603
601
|
return (n) => {
|
|
604
|
-
const a = e.slice(0, -1),
|
|
605
|
-
n ? r.getState().setSelectedIndex(t, o,
|
|
602
|
+
const a = e.slice(0, -1), l = Number(e[e.length - 1]), o = a.join(".");
|
|
603
|
+
n ? r.getState().setSelectedIndex(t, o, l) : r.getState().setSelectedIndex(t, o, void 0);
|
|
606
604
|
const d = r.getState().getNestedState(t, [...a]);
|
|
607
|
-
B(i, d, a),
|
|
605
|
+
B(i, d, a), _(a);
|
|
608
606
|
};
|
|
609
607
|
if (e.length == 0) {
|
|
610
608
|
if (s === "validateZodSchema")
|
|
@@ -615,16 +613,16 @@ function Y(t, i, m, y) {
|
|
|
615
613
|
if (!n?.key)
|
|
616
614
|
throw new Error("Validation key not found");
|
|
617
615
|
P(n.key);
|
|
618
|
-
const
|
|
616
|
+
const l = r.getState().cogsStateStore[t];
|
|
619
617
|
try {
|
|
620
618
|
const o = r.getState().getValidationErrors(n.key);
|
|
621
|
-
o && o.length > 0 && o.forEach(([
|
|
622
|
-
|
|
619
|
+
o && o.length > 0 && o.forEach(([E]) => {
|
|
620
|
+
E && E.startsWith(n.key) && P(E);
|
|
623
621
|
});
|
|
624
|
-
const d = n.zodSchema.safeParse(
|
|
625
|
-
return d.success ? !0 : (d.error.errors.forEach((
|
|
626
|
-
const N =
|
|
627
|
-
a(
|
|
622
|
+
const d = n.zodSchema.safeParse(l);
|
|
623
|
+
return d.success ? !0 : (d.error.errors.forEach((O) => {
|
|
624
|
+
const N = O.path, p = O.message, k = [n.key, ...N].join(".");
|
|
625
|
+
a(k, p);
|
|
628
626
|
}), ft(t), !1);
|
|
629
627
|
} catch (o) {
|
|
630
628
|
return console.error("Zod schema validation failed", o), !1;
|
|
@@ -671,15 +669,15 @@ function Y(t, i, m, y) {
|
|
|
671
669
|
if (a?.debounce)
|
|
672
670
|
$t(() => {
|
|
673
671
|
B(i, n, e, "");
|
|
674
|
-
const
|
|
675
|
-
a?.afterUpdate && a.afterUpdate(
|
|
672
|
+
const l = r.getState().getNestedState(t, e);
|
|
673
|
+
a?.afterUpdate && a.afterUpdate(l);
|
|
676
674
|
}, a.debounce);
|
|
677
675
|
else {
|
|
678
676
|
B(i, n, e, "");
|
|
679
|
-
const
|
|
680
|
-
a?.afterUpdate && a.afterUpdate(
|
|
677
|
+
const l = r.getState().getNestedState(t, e);
|
|
678
|
+
a?.afterUpdate && a.afterUpdate(l);
|
|
681
679
|
}
|
|
682
|
-
|
|
680
|
+
_(e);
|
|
683
681
|
};
|
|
684
682
|
if (s === "formElement")
|
|
685
683
|
return (n, a) => /* @__PURE__ */ st(
|
|
@@ -693,7 +691,7 @@ function Y(t, i, m, y) {
|
|
|
693
691
|
}
|
|
694
692
|
);
|
|
695
693
|
const b = [...e, s], C = r.getState().getNestedState(t, b);
|
|
696
|
-
return
|
|
694
|
+
return c(C, b, S);
|
|
697
695
|
}
|
|
698
696
|
}, R = new Proxy(A, T);
|
|
699
697
|
return u.set(x, {
|
|
@@ -701,14 +699,14 @@ function Y(t, i, m, y) {
|
|
|
701
699
|
stateVersion: w
|
|
702
700
|
}), R;
|
|
703
701
|
}
|
|
704
|
-
return
|
|
702
|
+
return c(
|
|
705
703
|
r.getState().getNestedState(t, [])
|
|
706
704
|
);
|
|
707
705
|
}
|
|
708
706
|
function K(t) {
|
|
709
707
|
return X(bt, { proxy: t });
|
|
710
708
|
}
|
|
711
|
-
function
|
|
709
|
+
function pt({
|
|
712
710
|
proxy: t,
|
|
713
711
|
rebuildStateShape: i
|
|
714
712
|
}) {
|
|
@@ -717,7 +715,7 @@ function jt({
|
|
|
717
715
|
m,
|
|
718
716
|
t._path
|
|
719
717
|
).stateMapNoRender(
|
|
720
|
-
(u, w,
|
|
718
|
+
(u, w, _, v, c) => t._mapFn(u, w, _, v, c)
|
|
721
719
|
) : null;
|
|
722
720
|
}
|
|
723
721
|
function bt({
|
|
@@ -727,13 +725,13 @@ function bt({
|
|
|
727
725
|
return et(() => {
|
|
728
726
|
const y = i.current;
|
|
729
727
|
if (!y || !y.parentElement) return;
|
|
730
|
-
const u = y.parentElement,
|
|
728
|
+
const u = y.parentElement, _ = Array.from(u.childNodes).indexOf(y);
|
|
731
729
|
let v = u.getAttribute("data-parent-id");
|
|
732
730
|
v || (v = `parent-${crypto.randomUUID()}`, u.setAttribute("data-parent-id", v));
|
|
733
731
|
const f = {
|
|
734
732
|
instanceId: `instance-${crypto.randomUUID()}`,
|
|
735
733
|
parentId: v,
|
|
736
|
-
position:
|
|
734
|
+
position: _,
|
|
737
735
|
effect: t._effect
|
|
738
736
|
};
|
|
739
737
|
r.getState().addSignalElement(m, f);
|
|
@@ -780,6 +778,6 @@ export {
|
|
|
780
778
|
qt as addStateOptions,
|
|
781
779
|
zt as createCogsState,
|
|
782
780
|
Bt as notifyComponent,
|
|
783
|
-
|
|
781
|
+
jt as useCogsStateFn
|
|
784
782
|
};
|
|
785
783
|
//# sourceMappingURL=CogsState.jsx.map
|
package/dist/CogsState.jsx.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n createElement,\r\n startTransition,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport {\r\n debounce,\r\n getDifferences,\r\n getNestedValue,\r\n isFunction,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U> = (\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 cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: InferArrayElement<TShape>,\r\n b: InferArrayElement<TShape>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n getSelectedIndex: () => number;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n getStatus: () => \"fresh\" | \"stale\";\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => void;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {}) & {\r\n [K in keyof (any extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n log?: boolean;\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n initialState?: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n mutation: UseMutationResult<any, unknown, any, unknown>;\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == \"localStorage\" &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (\r\n Object.keys(initialOptionsPart).length > 0 ||\r\n (opt && Object.keys(opt).length > 0)\r\n ) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n initialOptionsPart[key].formElements = {\r\n ...opt?.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n const existingOptions = getInitialOptions(key);\r\n\r\n if (!existingOptions) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions(key, initialOptionsPart[key]);\r\n }\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initialState: options?.initialState,\r\n dependencies: options?.dependencies,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions?.log) {\r\n console.log(\r\n \"saving to localstorage\",\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n if (key && sessionId) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n updates.add(() => component.forceUpdate());\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n } & 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 if (!initialState) {\r\n return;\r\n }\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n console.log(\"newoptions\", options);\r\n console.log(\"localkey\", localkey);\r\n console.log(\"initialState\", initialState);\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localkey\r\n );\r\n }\r\n\r\n let newState = null;\r\n let loadingLocalData = false;\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n loadingLocalData = true;\r\n }\r\n }\r\n if (initialState) {\r\n newState = initialState;\r\n }\r\n\r\n if (newState) {\r\n console.log(\"newState thius is newstate\", newState);\r\n\r\n updateGlobalState(\r\n thisKey,\r\n initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n if (loadingLocalData && options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n\r\n notifyComponents(thisKey);\r\n forceUpdate({});\r\n }\r\n }, [initialState, ...(dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initialState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\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 baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n\r\n return initialState;\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n });\r\n\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // Copy properties from baseObj to the function with type assertion\r\n Object.keys(baseObj).forEach((key) => {\r\n (baseFunction as any)[key] = (baseObj as any)[key];\r\n });\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n console.log(\r\n `PROXY APPLY TRAP HIT: stateKey=${stateKey}, path=${path.join(\".\")}`\r\n ); // <--- ADD LOGGING\r\n console.trace(\"Apply trap stack trace\");\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"_status\") {\r\n // Get current state at this path (non-reactive version)\r\n const thisReactiveState = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n }\r\n if (prop === \"getStatus\") {\r\n return function () {\r\n // Get current state at this path (reactive version)\r\n const thisReactiveState = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n );\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n };\r\n }\r\n if (prop === \"removeStorage\") {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n console.log(\"removing storage\", storageKey);\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n };\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n if (prop === \"getSelectedIndex\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n\r\n return selectedIndex ?? -1;\r\n };\r\n }\r\n if (prop === \"stateSort\") {\r\n return (\r\n compareFn: (\r\n a: InferArrayElement<T>,\r\n b: InferArrayElement<T>\r\n ) => number\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Create a shallow copy with original indices\r\n const arrayCopy = currentArray.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n // Sort the copy using the provided compare function\r\n const sortedArray = [...arrayCopy].sort(compareFn);\r\n\r\n // ADDED: Clear cache for sort operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Return the sorted array with state objects\r\n return rebuildStateShape(sortedArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: sortedArray.map((item) =>\r\n parseInt(item.__origIndex as string)\r\n ),\r\n });\r\n };\r\n }\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\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 if (prop === \"cutByValue\") {\r\n return (value: string | number | boolean) => {\r\n for (let index = 0; index < currentState.length; index++) {\r\n if (currentState[index] === value) {\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"toggleByValue\") {\r\n return (value: string | number | boolean) => {\r\n const index = currentState.findIndex((item) => item === value);\r\n if (index > -1) {\r\n // Value exists, so cut it\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n } else {\r\n // Value doesn't exist, so insert it\r\n pushFunc(effectiveSetState, value as any, path, stateKey);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Always include validIndices, even if it's an empty array\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: validIndices, // Always pass validIndices, even if empty\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return (\r\n currentIndex ===\r\n getGlobalStore.getState().getSelectedIndex(stateKey, parentKey)\r\n );\r\n }\r\n return undefined;\r\n }\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, thisIndex);\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, undefined);\r\n }\r\n\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","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","isFunction","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","syncUpdate","dependencies","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","localkey","loadingLocalData","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","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","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","serverState","currentState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","thisReactiveState","initialStateAtPath","selectedIndex","compareFn","sortedArray","i","item","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","newVal","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","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 getDifferences,\r\n getNestedValue,\r\n isFunction,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U> = (\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 cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: InferArrayElement<TShape>,\r\n b: InferArrayElement<TShape>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n getSelectedIndex: () => number;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n getStatus: () => \"fresh\" | \"stale\";\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => void;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {}) & {\r\n [K in keyof (any extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n log?: boolean;\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n initialState?: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n mutation: UseMutationResult<any, unknown, any, unknown>;\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == \"localStorage\" &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n if (\r\n key == \"initialState\" &&\r\n options[key] &&\r\n mergedOptions[key] !== options[key]\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (\r\n Object.keys(initialOptionsPart).length > 0 ||\r\n (opt && Object.keys(opt).length > 0)\r\n ) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n initialOptionsPart[key].formElements = {\r\n ...opt?.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n const existingOptions = getInitialOptions(key);\r\n\r\n if (!existingOptions) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions(key, initialOptionsPart[key]);\r\n }\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initialState: options?.initialState,\r\n dependencies: options?.dependencies,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions?.log) {\r\n console.log(\r\n \"saving to localstorage\",\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n if (key && sessionId) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n updates.add(() => component.forceUpdate());\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n } & 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 if (initialState) {\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n }\r\n\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n console.log(\"newoptions\", options);\r\n console.log(\"localkey\", localkey);\r\n console.log(\"initialState\", initialState);\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localkey\r\n );\r\n }\r\n\r\n let newState = null;\r\n let loadingLocalData = false;\r\n\r\n if (initialState) {\r\n newState = initialState;\r\n\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n if (options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n }\r\n }\r\n console.log(\"newState thius is newstate\", newState);\r\n\r\n updateGlobalState(\r\n thisKey,\r\n initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n notifyComponents(thisKey);\r\n forceUpdate({});\r\n }\r\n }, [initialState, ...(dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initialState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\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 baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n\r\n return initialState;\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n });\r\n\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // Copy properties from baseObj to the function with type assertion\r\n Object.keys(baseObj).forEach((key) => {\r\n (baseFunction as any)[key] = (baseObj as any)[key];\r\n });\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n console.log(\r\n `PROXY APPLY TRAP HIT: stateKey=${stateKey}, path=${path.join(\".\")}`\r\n ); // <--- ADD LOGGING\r\n console.trace(\"Apply trap stack trace\");\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"_status\") {\r\n // Get current state at this path (non-reactive version)\r\n const thisReactiveState = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n }\r\n if (prop === \"getStatus\") {\r\n return function () {\r\n // Get current state at this path (reactive version)\r\n const thisReactiveState = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n );\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n };\r\n }\r\n if (prop === \"removeStorage\") {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n console.log(\"removing storage\", storageKey);\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n };\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n if (prop === \"getSelectedIndex\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n\r\n return selectedIndex ?? -1;\r\n };\r\n }\r\n if (prop === \"stateSort\") {\r\n return (\r\n compareFn: (\r\n a: InferArrayElement<T>,\r\n b: InferArrayElement<T>\r\n ) => number\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Create a shallow copy with original indices\r\n const arrayCopy = currentArray.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n // Sort the copy using the provided compare function\r\n const sortedArray = [...arrayCopy].sort(compareFn);\r\n\r\n // ADDED: Clear cache for sort operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Return the sorted array with state objects\r\n return rebuildStateShape(sortedArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: sortedArray.map((item) =>\r\n parseInt(item.__origIndex as string)\r\n ),\r\n });\r\n };\r\n }\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\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 if (prop === \"cutByValue\") {\r\n return (value: string | number | boolean) => {\r\n for (let index = 0; index < currentState.length; index++) {\r\n if (currentState[index] === value) {\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"toggleByValue\") {\r\n return (value: string | number | boolean) => {\r\n const index = currentState.findIndex((item) => item === value);\r\n if (index > -1) {\r\n // Value exists, so cut it\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n } else {\r\n // Value doesn't exist, so insert it\r\n pushFunc(effectiveSetState, value as any, path, stateKey);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Always include validIndices, even if it's an empty array\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: validIndices, // Always pass validIndices, even if empty\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return (\r\n currentIndex ===\r\n getGlobalStore.getState().getSelectedIndex(stateKey, parentKey)\r\n );\r\n }\r\n return undefined;\r\n }\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, thisIndex);\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, undefined);\r\n }\r\n\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","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","isFunction","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","syncUpdate","dependencies","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","localkey","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","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","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","serverState","currentState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","thisReactiveState","initialStateAtPath","selectedIndex","compareFn","sortedArray","i","item","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","newVal","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","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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"}
|