cogsbox-state 0.5.116 → 0.5.118

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.
@@ -1,54 +1,54 @@
1
1
  "use client";
2
- import { jsx as st } from "react/jsx-runtime";
2
+ import { jsx as ct } from "react/jsx-runtime";
3
3
  import { useState as tt, useRef as Z, useEffect as et, useLayoutEffect as vt, useMemo as It, createElement as X, useSyncExternalStore as _t, startTransition as Et } from "react";
4
4
  import { transformStateFunc as wt, isFunction as L, getNestedValue as U, isDeepEqual as M, debounce as $t } from "./utility.js";
5
5
  import { pushFunc as Q, updateFn as B, cutFunc as J, ValidationWrapper as Nt, FormControlComponent as Vt } from "./Functions.jsx";
6
6
  import "zod";
7
- import { getGlobalStore as r, formRefStore as ct } from "./store.js";
7
+ import { getGlobalStore as r, formRefStore as lt } from "./store.js";
8
8
  import { useCogsConfig as At } from "./CogsStateClient.jsx";
9
9
  import nt from "./node_modules/uuid/dist/esm-browser/v4.js";
10
- function lt(t, i) {
11
- const m = r.getState().getInitialOptions, y = r.getState().setInitialStateOptions, u = m(t) || {};
10
+ function dt(t, i) {
11
+ const m = r.getState().getInitialOptions, y = r.getState().setInitialStateOptions, g = m(t) || {};
12
12
  y(t, {
13
- ...u,
13
+ ...g,
14
14
  ...i
15
15
  });
16
16
  }
17
- function dt({
17
+ function ut({
18
18
  stateKey: t,
19
19
  options: i,
20
20
  initialOptionsPart: m
21
21
  }) {
22
- const y = q(t) || {}, u = m[t] || {}, w = r.getState().setInitialStateOptions, _ = { ...u, ...y };
22
+ const y = q(t) || {}, g = m[t] || {}, E = r.getState().setInitialStateOptions, _ = { ...g, ...y };
23
23
  let v = !1;
24
24
  if (i)
25
25
  for (const c in i)
26
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, _);
27
+ v && E(t, _);
28
28
  }
29
29
  function qt(t, { formElements: i, validation: m }) {
30
30
  return { initialState: t, formElements: i, validation: m };
31
31
  }
32
32
  const zt = (t, i) => {
33
33
  let m = t;
34
- const [y, u] = wt(m);
35
- (Object.keys(u).length > 0 || i && Object.keys(i).length > 0) && Object.keys(u).forEach((v) => {
36
- u[v] = u[v] || {}, u[v].formElements = {
34
+ const [y, g] = wt(m);
35
+ (Object.keys(g).length > 0 || i && Object.keys(i).length > 0) && Object.keys(g).forEach((v) => {
36
+ g[v] = g[v] || {}, g[v].formElements = {
37
37
  ...i?.formElements,
38
38
  // Global defaults first
39
39
  ...i?.validation,
40
- ...u[v].formElements || {}
40
+ ...g[v].formElements || {}
41
41
  // State-specific overrides
42
- }, q(v) || r.getState().setInitialStateOptions(v, u[v]);
42
+ }, q(v) || r.getState().setInitialStateOptions(v, g[v]);
43
43
  }), r.getState().setInitialStates(y), r.getState().setCreatedState(y);
44
- const w = (v, c) => {
44
+ const E = (v, c) => {
45
45
  const [f] = tt(c?.componentId ?? nt());
46
- dt({
46
+ ut({
47
47
  stateKey: v,
48
48
  options: c,
49
- initialOptionsPart: u
49
+ initialOptionsPart: g
50
50
  });
51
- const e = r.getState().cogsStateStore[v] || y[v], S = c?.modifyState ? c.modifyState(e) : e, [x, A] = jt(
51
+ const e = r.getState().cogsStateStore[v] || y[v], S = c?.modifyState ? c.modifyState(e) : e, [T, C] = jt(
52
52
  S,
53
53
  {
54
54
  stateKey: v,
@@ -63,12 +63,12 @@ const zt = (t, i) => {
63
63
  dependencies: c?.dependencies
64
64
  }
65
65
  );
66
- return A;
66
+ return C;
67
67
  };
68
68
  function _(v, c) {
69
- dt({ stateKey: v, options: c, initialOptionsPart: u });
69
+ ut({ stateKey: v, options: c, initialOptionsPart: g }), ot(v);
70
70
  }
71
- return { useCogsState: w, setCogsOptions: _ };
71
+ return { useCogsState: E, setCogsOptions: _ };
72
72
  }, {
73
73
  setUpdaterState: H,
74
74
  setState: D,
@@ -80,7 +80,7 @@ const zt = (t, i) => {
80
80
  addValidationError: kt,
81
81
  removeValidationError: P,
82
82
  setServerSyncActions: xt
83
- } = r.getState(), ut = (t) => {
83
+ } = r.getState(), ft = (t) => {
84
84
  if (!t) return null;
85
85
  try {
86
86
  const i = window.localStorage.getItem(t);
@@ -95,29 +95,29 @@ const zt = (t, i) => {
95
95
  m.localStorage?.key,
96
96
  y
97
97
  );
98
- const u = L(m?.localStorage?.key) ? m.localStorage?.key(t) : m?.localStorage?.key;
99
- if (u && y) {
100
- const w = {
98
+ const g = L(m?.localStorage?.key) ? m.localStorage?.key(t) : m?.localStorage?.key;
99
+ if (g && y) {
100
+ const E = {
101
101
  state: t,
102
102
  lastUpdated: Date.now(),
103
103
  lastSyncedWithServer: r.getState().serverSyncLog[i]?.[0]?.timeStamp,
104
104
  baseServerState: r.getState().serverState[i]
105
- }, _ = `${y}-${i}-${u}`;
106
- window.localStorage.setItem(_, JSON.stringify(w));
105
+ }, _ = `${y}-${i}-${g}`;
106
+ window.localStorage.setItem(_, JSON.stringify(E));
107
107
  }
108
- }, Ot = (t, i, m, y, u, w) => {
108
+ }, Ot = (t, i, m, y, g, E) => {
109
109
  const _ = {
110
110
  initialState: i,
111
111
  updaterState: Y(
112
112
  t,
113
113
  y,
114
- u,
115
- w
114
+ g,
115
+ E
116
116
  ),
117
117
  state: m
118
118
  };
119
119
  rt(t, _.initialState), H(t, _.updaterState), D(t, _.state);
120
- }, ft = (t) => {
120
+ }, ot = (t) => {
121
121
  const i = r.getState().stateComponents.get(t);
122
122
  if (!i) return;
123
123
  const m = /* @__PURE__ */ new Set();
@@ -129,16 +129,16 @@ const zt = (t, i) => {
129
129
  }, Bt = (t, i) => {
130
130
  const m = r.getState().stateComponents.get(t);
131
131
  if (m) {
132
- const y = `${t}////${i}`, u = m.components.get(y);
133
- u && u.forceUpdate();
132
+ const y = `${t}////${i}`, g = m.components.get(y);
133
+ g && g.forceUpdate();
134
134
  }
135
135
  };
136
136
  function jt(t, {
137
137
  stateKey: i,
138
138
  serverSync: m,
139
139
  localStorage: y,
140
- formElements: u,
141
- middleware: w,
140
+ formElements: g,
141
+ middleware: E,
142
142
  reactiveDeps: _,
143
143
  reactiveType: v,
144
144
  componentId: c,
@@ -146,12 +146,12 @@ function jt(t, {
146
146
  syncUpdate: e,
147
147
  dependencies: S
148
148
  } = {}) {
149
- const [x, A] = tt({}), { sessionId: T } = At();
149
+ const [T, C] = tt({}), { sessionId: O } = At();
150
150
  let R = !i;
151
- const [g] = tt(i ?? nt()), s = r.getState().stateLog[g], G = Z(/* @__PURE__ */ new Set()), b = Z(c ?? nt()), h = Z(null);
152
- h.current = q(g), et(() => {
153
- if (e && e.stateKey === g && e.path?.[0]) {
154
- D(g, (o) => ({
151
+ const [u] = tt(i ?? nt()), s = r.getState().stateLog[u], G = Z(/* @__PURE__ */ new Set()), b = Z(c ?? nt()), k = Z(null);
152
+ k.current = q(u), et(() => {
153
+ if (e && e.stateKey === u && e.path?.[0]) {
154
+ D(u, (o) => ({
155
155
  ...o,
156
156
  [e.path[0]]: e.newValue
157
157
  }));
@@ -162,137 +162,139 @@ function jt(t, {
162
162
  });
163
163
  }
164
164
  }, [e]), et(() => {
165
- f && lt(g, {
165
+ f && dt(u, {
166
166
  initialState: f
167
167
  });
168
- const l = h.current;
168
+ const l = k.current;
169
169
  let o = null;
170
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 = ut(
172
- T + "-" + g + "-" + d
171
+ console.log("newoptions", l), console.log("localkey", d), console.log("initialState", f), d && O && (o = ft(
172
+ O + "-" + u + "-" + d
173
173
  ));
174
- let E = f ?? r.getState().iniitialCreatedState[g];
175
- o && o.lastUpdated > (o.lastSyncedWithServer || 0) && (E = o.state, l?.localStorage?.onChange && l?.localStorage?.onChange(E)), console.log("newState thius is newstate", E), Ot(
176
- g,
174
+ const w = r.getState().iniitialCreatedState[u];
175
+ console.log("createdState - intiual", w, f);
176
+ let V = null;
177
+ f && (V = f, o && o.lastUpdated > (o.lastSyncedWithServer || 0) && (V = o.state, l?.localStorage?.onChange && l?.localStorage?.onChange(V)), console.log("newState thius is newstate", V), Ot(
178
+ u,
177
179
  f,
178
- E,
180
+ V,
179
181
  n,
180
182
  b.current,
181
- T
182
- ), ft(g), A({});
183
+ O
184
+ ), ot(u), C({}));
183
185
  }, [f, ...S || []]), vt(() => {
184
- R && lt(g, {
186
+ R && dt(u, {
185
187
  serverSync: m,
186
- formElements: u,
188
+ formElements: g,
187
189
  initialState: f,
188
190
  localStorage: y,
189
- middleware: w
191
+ middleware: E
190
192
  });
191
- const l = `${g}////${b.current}`, o = r.getState().stateComponents.get(g) || {
193
+ const l = `${u}////${b.current}`, o = r.getState().stateComponents.get(u) || {
192
194
  components: /* @__PURE__ */ new Map()
193
195
  };
194
196
  return o.components.set(l, {
195
- forceUpdate: () => A({}),
197
+ forceUpdate: () => C({}),
196
198
  paths: /* @__PURE__ */ new Set(),
197
199
  deps: [],
198
200
  depsFunction: _ || void 0,
199
201
  reactiveType: v ?? ["component", "deps"]
200
- }), r.getState().stateComponents.set(g, o), A({}), () => {
201
- const d = `${g}////${b.current}`;
202
- o && (o.components.delete(d), o.components.size === 0 && r.getState().stateComponents.delete(g));
202
+ }), r.getState().stateComponents.set(u, o), C({}), () => {
203
+ const d = `${u}////${b.current}`;
204
+ o && (o.components.delete(d), o.components.size === 0 && r.getState().stateComponents.delete(u));
203
205
  };
204
206
  }, []);
205
- const n = (l, o, d, E) => {
207
+ const n = (l, o, d, w) => {
206
208
  if (Array.isArray(o)) {
207
- const O = `${g}-${o.join(".")}`;
208
- G.current.add(O);
209
+ const V = `${u}-${o.join(".")}`;
210
+ G.current.add(V);
209
211
  }
210
- D(g, (O) => {
211
- const N = L(l) ? l(O) : l, p = `${g}-${o.join(".")}`;
212
+ D(u, (V) => {
213
+ const N = L(l) ? l(V) : l, p = `${u}-${o.join(".")}`;
212
214
  if (p) {
213
215
  let F = !1, I = r.getState().signalDomElements.get(p);
214
216
  if ((!I || I.size === 0) && (d.updateType === "insert" || d.updateType === "cut")) {
215
- const V = o.slice(0, -1), C = U(N, V);
216
- if (Array.isArray(C)) {
217
+ const A = o.slice(0, -1), h = U(N, A);
218
+ if (Array.isArray(h)) {
217
219
  F = !0;
218
- const $ = `${g}-${V.join(".")}`;
220
+ const $ = `${u}-${A.join(".")}`;
219
221
  I = r.getState().signalDomElements.get($);
220
222
  }
221
223
  }
222
224
  if (I) {
223
- const V = F ? U(N, o.slice(0, -1)) : U(N, o);
224
- I.forEach(({ parentId: C, position: $, effect: W }) => {
225
+ const A = F ? U(N, o.slice(0, -1)) : U(N, o);
226
+ I.forEach(({ parentId: h, position: $, effect: W }) => {
225
227
  const j = document.querySelector(
226
- `[data-parent-id="${C}"]`
228
+ `[data-parent-id="${h}"]`
227
229
  );
228
230
  if (j) {
229
- const it = Array.from(j.childNodes);
230
- if (it[$]) {
231
- const yt = W ? new Function("state", `return (${W})(state)`)(V) : V;
232
- it[$].textContent = String(yt);
231
+ const st = Array.from(j.childNodes);
232
+ if (st[$]) {
233
+ const yt = W ? new Function("state", `return (${W})(state)`)(A) : A;
234
+ st[$].textContent = String(yt);
233
235
  }
234
236
  }
235
237
  });
236
238
  }
237
239
  }
238
- d.updateType === "update" && (E || h.current?.validationKey) && o && P(
239
- (E || h.current?.validationKey) + "." + o.join(".")
240
+ d.updateType === "update" && (w || k.current?.validationKey) && o && P(
241
+ (w || k.current?.validationKey) + "." + o.join(".")
240
242
  );
241
- const k = o.slice(0, o.length - 1);
242
- d.updateType === "cut" && h.current?.validationKey && P(
243
- h.current?.validationKey + "." + k.join(".")
244
- ), d.updateType === "insert" && h.current?.validationKey && Ct(
245
- h.current?.validationKey + "." + k.join(".")
246
- ).filter(([I, V]) => {
247
- let C = I?.split(".").length;
248
- if (I == k.join(".") && C == k.length - 1) {
249
- let $ = I + "." + k;
250
- P(I), kt($, V);
243
+ const x = o.slice(0, o.length - 1);
244
+ d.updateType === "cut" && k.current?.validationKey && P(
245
+ k.current?.validationKey + "." + x.join(".")
246
+ ), d.updateType === "insert" && k.current?.validationKey && Ct(
247
+ k.current?.validationKey + "." + x.join(".")
248
+ ).filter(([I, A]) => {
249
+ let h = I?.split(".").length;
250
+ if (I == x.join(".") && h == x.length - 1) {
251
+ let $ = I + "." + x;
252
+ P(I), kt($, A);
251
253
  }
252
254
  });
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);
254
- if (ot)
255
- for (const [F, I] of ot.components.entries()) {
256
- let V = !1;
257
- const C = Array.isArray(I.reactiveType) ? I.reactiveType : [I.reactiveType || "component"];
258
- if (!C.includes("none")) {
259
- if (C.includes("all")) {
255
+ const z = U(V, o), St = U(N, o), mt = d.updateType === "update" ? o.join(".") : [...o].slice(0, -1).join("."), at = r.getState().stateComponents.get(u);
256
+ if (at)
257
+ for (const [F, I] of at.components.entries()) {
258
+ let A = !1;
259
+ const h = Array.isArray(I.reactiveType) ? I.reactiveType : [I.reactiveType || "component"];
260
+ if (!h.includes("none")) {
261
+ if (h.includes("all")) {
260
262
  I.forceUpdate();
261
263
  continue;
262
264
  }
263
- if (C.includes("component") && I.paths && (I.paths.has(mt) || I.paths.has("")) && (V = !0), !V && C.includes("deps") && I.depsFunction) {
265
+ if (h.includes("component") && I.paths && (I.paths.has(mt) || I.paths.has("")) && (A = !0), !A && h.includes("deps") && I.depsFunction) {
264
266
  const $ = I.depsFunction(N);
265
- typeof $ == "boolean" ? $ && (V = !0) : M(I.deps, $) || (I.deps = $, V = !0);
267
+ typeof $ == "boolean" ? $ && (A = !0) : M(I.deps, $) || (I.deps = $, A = !0);
266
268
  }
267
- V && I.forceUpdate();
269
+ A && I.forceUpdate();
268
270
  }
269
271
  }
270
- const at = {
272
+ const it = {
271
273
  timeStamp: Date.now(),
272
- stateKey: g,
274
+ stateKey: u,
273
275
  path: o,
274
276
  updateType: d.updateType,
275
277
  status: "new",
276
278
  oldValue: z,
277
279
  newValue: St
278
280
  };
279
- if (ht(g, (F) => {
280
- const V = [...F ?? [], at].reduce((C, $) => {
281
- const W = `${$.stateKey}:${JSON.stringify($.path)}`, j = C.get(W);
282
- return j ? (j.timeStamp = Math.max(j.timeStamp, $.timeStamp), j.newValue = $.newValue, j.oldValue = j.oldValue ?? $.oldValue, j.updateType = $.updateType) : C.set(W, { ...$ }), C;
281
+ if (ht(u, (F) => {
282
+ const A = [...F ?? [], it].reduce((h, $) => {
283
+ const W = `${$.stateKey}:${JSON.stringify($.path)}`, j = h.get(W);
284
+ return j ? (j.timeStamp = Math.max(j.timeStamp, $.timeStamp), j.newValue = $.newValue, j.oldValue = j.oldValue ?? $.oldValue, j.updateType = $.updateType) : h.set(W, { ...$ }), h;
283
285
  }, /* @__PURE__ */ new Map());
284
- return Array.from(V.values());
286
+ return Array.from(A.values());
285
287
  }), Tt(
286
288
  N,
287
- g,
288
- h.current,
289
- T
290
- ), w && w({
289
+ u,
290
+ k.current,
291
+ O
292
+ ), E && E({
291
293
  updateLog: s,
292
- update: at
293
- }), h.current?.serverSync) {
294
- const F = r.getState().serverState[g], I = h.current?.serverSync;
295
- xt(g, {
294
+ update: it
295
+ }), k.current?.serverSync) {
296
+ const F = r.getState().serverState[u], I = k.current?.serverSync;
297
+ xt(u, {
296
298
  syncKey: typeof I.syncKey == "string" ? I.syncKey : I.syncKey({ state: N }),
297
299
  rollBackState: F,
298
300
  actionTimeStamp: Date.now() + (I.debounce ?? 3e3),
@@ -302,31 +304,31 @@ function jt(t, {
302
304
  return N;
303
305
  });
304
306
  };
305
- r.getState().updaterState[g] || (H(
306
- g,
307
+ r.getState().updaterState[u] || (H(
308
+ u,
307
309
  Y(
308
- g,
310
+ u,
309
311
  n,
310
312
  b.current,
311
- T
313
+ O
312
314
  )
313
- ), r.getState().cogsStateStore[g] || D(g, t), r.getState().initialStateGlobal[g] || rt(g, t));
315
+ ), r.getState().cogsStateStore[u] || D(u, t), r.getState().initialStateGlobal[u] || rt(u, t));
314
316
  const a = It(() => Y(
315
- g,
317
+ u,
316
318
  n,
317
319
  b.current,
318
- T
319
- ), [g]);
320
- return [gt(g), a];
320
+ O
321
+ ), [u]);
322
+ return [gt(u), a];
321
323
  }
322
324
  function Y(t, i, m, y) {
323
- const u = /* @__PURE__ */ new Map();
324
- let w = 0;
325
+ const g = /* @__PURE__ */ new Map();
326
+ let E = 0;
325
327
  const _ = (f) => {
326
328
  const e = f.join(".");
327
- for (const [S] of u)
328
- (S === e || S.startsWith(e + ".")) && u.delete(S);
329
- w++;
329
+ for (const [S] of g)
330
+ (S === e || S.startsWith(e + ".")) && g.delete(S);
331
+ E++;
330
332
  }, v = {
331
333
  removeValidation: (f) => {
332
334
  f?.validationKey && P(f.validationKey);
@@ -335,16 +337,16 @@ function Y(t, i, m, y) {
335
337
  const e = r.getState().getInitialOptions(t)?.validation;
336
338
  e?.key && P(e?.key), f?.validationKey && P(f.validationKey);
337
339
  const S = r.getState().initialStateGlobal[t];
338
- r.getState().clearSelectedIndexesForState(t), u.clear(), w++;
339
- const x = c(S, []), A = q(t), T = L(A?.localStorage?.key) ? A?.localStorage?.key(S) : A?.localStorage?.key, R = `${y}-${t}-${T}`;
340
- R && localStorage.removeItem(R), H(t, x), D(t, S);
341
- const g = r.getState().stateComponents.get(t);
342
- return g && g.components.forEach((s) => {
340
+ r.getState().clearSelectedIndexesForState(t), g.clear(), E++;
341
+ const T = c(S, []), C = q(t), O = L(C?.localStorage?.key) ? C?.localStorage?.key(S) : C?.localStorage?.key, R = `${y}-${t}-${O}`;
342
+ R && localStorage.removeItem(R), H(t, T), D(t, S);
343
+ const u = r.getState().stateComponents.get(t);
344
+ return u && u.components.forEach((s) => {
343
345
  s.forceUpdate();
344
346
  }), S;
345
347
  },
346
348
  updateInitialState: (f) => {
347
- u.clear(), w++;
349
+ g.clear(), E++;
348
350
  const e = Y(
349
351
  t,
350
352
  i,
@@ -354,8 +356,8 @@ function Y(t, i, m, y) {
354
356
  return Et(() => {
355
357
  rt(t, f), H(t, e), D(t, f);
356
358
  const S = r.getState().stateComponents.get(t);
357
- S && S.components.forEach((x) => {
358
- x.forceUpdate();
359
+ S && S.components.forEach((T) => {
360
+ T.forceUpdate();
359
361
  });
360
362
  }), {
361
363
  fetchId: (S) => e.get()[S]
@@ -370,21 +372,21 @@ function Y(t, i, m, y) {
370
372
  }
371
373
  };
372
374
  function c(f, e = [], S) {
373
- const x = e.map(String).join(".");
374
- u.get(x);
375
- const A = function() {
375
+ const T = e.map(String).join(".");
376
+ g.get(T);
377
+ const C = function() {
376
378
  return r().getNestedState(t, e);
377
379
  };
378
- Object.keys(v).forEach((g) => {
379
- A[g] = v[g];
380
+ Object.keys(v).forEach((u) => {
381
+ C[u] = v[u];
380
382
  });
381
- const T = {
382
- apply(g, s, G) {
383
+ const O = {
384
+ apply(u, s, G) {
383
385
  return console.log(
384
386
  `PROXY APPLY TRAP HIT: stateKey=${t}, path=${e.join(".")}`
385
387
  ), console.trace("Apply trap stack trace"), r().getNestedState(t, e);
386
388
  },
387
- get(g, s) {
389
+ get(u, s) {
388
390
  if (s !== "then" && !s.startsWith("$") && s !== "stateMapNoRender") {
389
391
  const n = e.join("."), a = `${t}////${m}`, l = r.getState().stateComponents.get(t);
390
392
  if (l) {
@@ -431,11 +433,11 @@ function Y(t, i, m, y) {
431
433
  return () => r.getState().getSelectedIndex(t, e.join(".")) ?? -1;
432
434
  if (s === "stateSort")
433
435
  return (n) => {
434
- const o = [...r.getState().getNestedState(t, e).map((d, E) => ({
436
+ const o = [...r.getState().getNestedState(t, e).map((d, w) => ({
435
437
  ...d,
436
- __origIndex: E.toString()
438
+ __origIndex: w.toString()
437
439
  }))].sort(n);
438
- return u.clear(), w++, c(o, e, {
440
+ return g.clear(), E++, c(o, e, {
439
441
  filtered: [...S?.filtered || [], e],
440
442
  validIndices: o.map(
441
443
  (d) => parseInt(d.__origIndex)
@@ -447,15 +449,15 @@ function Y(t, i, m, y) {
447
449
  const a = S?.filtered?.some(
448
450
  (o) => o.join(".") === e.join(".")
449
451
  ), 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(
452
+ return s !== "stateMapNoRender" && (g.clear(), E++), l.map((o, d) => {
453
+ const w = a && o.__origIndex ? o.__origIndex : d, V = c(
452
454
  o,
453
- [...e, E.toString()],
455
+ [...e, w.toString()],
454
456
  S
455
457
  );
456
458
  return n(
457
459
  o,
458
- O,
460
+ V,
459
461
  d,
460
462
  f,
461
463
  c(f, e, S)
@@ -477,9 +479,9 @@ function Y(t, i, m, y) {
477
479
  const l = S?.filtered?.some(
478
480
  (d) => d.join(".") === e.join(".")
479
481
  ) ? f : r.getState().getNestedState(t, e);
480
- u.clear(), w++;
482
+ g.clear(), E++;
481
483
  const o = l.flatMap(
482
- (d, E) => d[n] ?? []
484
+ (d, w) => d[n] ?? []
483
485
  );
484
486
  return c(
485
487
  o,
@@ -490,11 +492,11 @@ function Y(t, i, m, y) {
490
492
  if (s === "findWith")
491
493
  return (n, a) => {
492
494
  const l = f.findIndex(
493
- (E) => E[n] === a
495
+ (w) => w[n] === a
494
496
  );
495
497
  if (l === -1) return;
496
498
  const o = f[l], d = [...e, l.toString()];
497
- return u.clear(), w++, u.clear(), w++, c(o, d);
499
+ return g.clear(), E++, g.clear(), E++, c(o, d);
498
500
  };
499
501
  if (s === "index")
500
502
  return (n) => {
@@ -509,21 +511,21 @@ function Y(t, i, m, y) {
509
511
  if (s === "uniqueInsert")
510
512
  return (n, a, l) => {
511
513
  const o = r.getState().getNestedState(t, e), d = L(n) ? n(o) : n;
512
- let E = null;
514
+ let w = null;
513
515
  if (!o.some((N) => {
514
516
  if (a) {
515
- const k = a.every(
517
+ const x = a.every(
516
518
  (z) => M(N[z], d[z])
517
519
  );
518
- return k && (E = N), k;
520
+ return x && (w = N), x;
519
521
  }
520
522
  const p = M(N, d);
521
- return p && (E = N), p;
523
+ return p && (w = N), p;
522
524
  }))
523
525
  _(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
526
+ else if (l && w) {
527
+ const N = l(w), p = o.map(
528
+ (x) => M(x, w) ? N : x
527
529
  );
528
530
  _(e), B(i, p, e);
529
531
  }
@@ -544,13 +546,13 @@ function Y(t, i, m, y) {
544
546
  };
545
547
  if (s === "stateFilter")
546
548
  return (n) => {
547
- const a = f.map((d, E) => ({
549
+ const a = f.map((d, w) => ({
548
550
  ...d,
549
- __origIndex: E.toString()
551
+ __origIndex: w.toString()
550
552
  })), l = [], o = [];
551
553
  for (let d = 0; d < a.length; d++)
552
554
  n(a[d], d) && (l.push(d), o.push(a[d]));
553
- return u.clear(), w++, c(o, e, {
555
+ return g.clear(), E++, c(o, e, {
554
556
  filtered: [...S?.filtered || [], e],
555
557
  validIndices: l
556
558
  // Always pass validIndices, even if empty
@@ -592,7 +594,7 @@ function Y(t, i, m, y) {
592
594
  return r.getState().getSyncInfo(n);
593
595
  }
594
596
  if (s == "getLocalStorage")
595
- return (n) => ut(y + "-" + t + "-" + n);
597
+ return (n) => ft(y + "-" + t + "-" + n);
596
598
  if (s === "_selected") {
597
599
  const n = e.slice(0, -1), a = n.join("."), l = r.getState().getNestedState(t, n);
598
600
  return Array.isArray(l) ? Number(e[e.length - 1]) === r.getState().getSelectedIndex(t, a) : void 0;
@@ -616,14 +618,14 @@ function Y(t, i, m, y) {
616
618
  const l = r.getState().cogsStateStore[t];
617
619
  try {
618
620
  const o = r.getState().getValidationErrors(n.key);
619
- o && o.length > 0 && o.forEach(([E]) => {
620
- E && E.startsWith(n.key) && P(E);
621
+ o && o.length > 0 && o.forEach(([w]) => {
622
+ w && w.startsWith(n.key) && P(w);
621
623
  });
622
624
  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);
626
- }), ft(t), !1);
625
+ return d.success ? !0 : (d.error.errors.forEach((V) => {
626
+ const N = V.path, p = V.message, x = [n.key, ...N].join(".");
627
+ a(x, p);
628
+ }), ot(t), !1);
627
629
  } catch (o) {
628
630
  return console.error("Zod schema validation failed", o), !1;
629
631
  }
@@ -632,7 +634,7 @@ function Y(t, i, m, y) {
632
634
  if (s === "getComponents")
633
635
  return () => r().stateComponents.get(t);
634
636
  if (s === "getAllFormRefs")
635
- return () => ct.getState().getFormRefsByStateKey(t);
637
+ return () => lt.getState().getFormRefsByStateKey(t);
636
638
  if (s === "_initialState")
637
639
  return r.getState().initialStateGlobal[t];
638
640
  if (s === "_serverState")
@@ -645,12 +647,12 @@ function Y(t, i, m, y) {
645
647
  if (s === "removeValidation") return v.removeValidation;
646
648
  }
647
649
  if (s === "getFormRef")
648
- return () => ct.getState().getFormRef(t + "." + e.join("."));
650
+ return () => lt.getState().getFormRef(t + "." + e.join("."));
649
651
  if (s === "validationWrapper")
650
652
  return ({
651
653
  children: n,
652
654
  hideMessage: a
653
- }) => /* @__PURE__ */ st(
655
+ }) => /* @__PURE__ */ ct(
654
656
  Nt,
655
657
  {
656
658
  formOpts: a ? { validation: { message: "" } } : void 0,
@@ -680,7 +682,7 @@ function Y(t, i, m, y) {
680
682
  _(e);
681
683
  };
682
684
  if (s === "formElement")
683
- return (n, a) => /* @__PURE__ */ st(
685
+ return (n, a) => /* @__PURE__ */ ct(
684
686
  Vt,
685
687
  {
686
688
  setState: i,
@@ -690,13 +692,13 @@ function Y(t, i, m, y) {
690
692
  formOpts: a
691
693
  }
692
694
  );
693
- const b = [...e, s], h = r.getState().getNestedState(t, b);
694
- return c(h, b, S);
695
+ const b = [...e, s], k = r.getState().getNestedState(t, b);
696
+ return c(k, b, S);
695
697
  }
696
- }, R = new Proxy(A, T);
697
- return u.set(x, {
698
+ }, R = new Proxy(C, O);
699
+ return g.set(T, {
698
700
  proxy: R,
699
- stateVersion: w
701
+ stateVersion: E
700
702
  }), R;
701
703
  }
702
704
  return c(
@@ -715,7 +717,7 @@ function pt({
715
717
  m,
716
718
  t._path
717
719
  ).stateMapNoRender(
718
- (u, w, _, v, c) => t._mapFn(u, w, _, v, c)
720
+ (g, E, _, v, c) => t._mapFn(g, E, _, v, c)
719
721
  ) : null;
720
722
  }
721
723
  function bt({
@@ -725,9 +727,9 @@ function bt({
725
727
  return et(() => {
726
728
  const y = i.current;
727
729
  if (!y || !y.parentElement) return;
728
- const u = y.parentElement, _ = Array.from(u.childNodes).indexOf(y);
729
- let v = u.getAttribute("data-parent-id");
730
- v || (v = `parent-${crypto.randomUUID()}`, u.setAttribute("data-parent-id", v));
730
+ const g = y.parentElement, _ = Array.from(g.childNodes).indexOf(y);
731
+ let v = g.getAttribute("data-parent-id");
732
+ v || (v = `parent-${crypto.randomUUID()}`, g.setAttribute("data-parent-id", v));
731
733
  const f = {
732
734
  instanceId: `instance-${crypto.randomUUID()}`,
733
735
  parentId: v,
@@ -743,14 +745,14 @@ function bt({
743
745
  "state",
744
746
  `return (${t._effect})(state)`
745
747
  )(e);
746
- } catch (A) {
747
- console.error("Error evaluating effect function during mount:", A), S = e;
748
+ } catch (C) {
749
+ console.error("Error evaluating effect function during mount:", C), S = e;
748
750
  }
749
751
  else
750
752
  S = e;
751
753
  S !== null && typeof S == "object" && (S = JSON.stringify(S));
752
- const x = document.createTextNode(String(S));
753
- y.replaceWith(x);
754
+ const T = document.createTextNode(String(S));
755
+ y.replaceWith(T);
754
756
  }, [t._stateKey, t._path.join("."), t._effect]), X("span", {
755
757
  ref: i,
756
758
  style: { display: "none" },
@@ -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\nimport { get } from \"http\";\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 getGlobalStore.getState().setCreatedState(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n 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 =\r\n initialState ?? getGlobalStore.getState().iniitialCreatedState[thisKey];\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 }, [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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"}
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 getGlobalStore.getState().setCreatedState(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n 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 notifyComponents(stateKey as string);\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions?.log) {\r\n console.log(\r\n \"saving to localstorage\",\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n if (key && sessionId) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n 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 const createdState =\r\n getGlobalStore.getState().iniitialCreatedState[thisKey];\r\n console.log(\"createdState - intiual\", createdState, initialState);\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","notifyComponents","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","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","createdState","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.116",
3
+ "version": "0.5.118",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",