cogsbox-state 0.5.15 → 0.5.16

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,46 +1,46 @@
1
1
  "use client";
2
- import { jsx as at } from "react/jsx-runtime";
2
+ import { jsx as ot } from "react/jsx-runtime";
3
3
  import { useState as Y, useRef as z, useEffect as K, useLayoutEffect as vt, useMemo as It, createElement as H, useSyncExternalStore as Et, startTransition as J } from "react";
4
- import { transformStateFunc as _t, isFunction as ut, getNestedValue as L, isDeepEqual as k, debounce as pt } from "./utility.js";
4
+ import { transformStateFunc as _t, isFunction as ut, getNestedValue as D, isDeepEqual as L, debounce as pt } from "./utility.js";
5
5
  import { pushFunc as it, updateFn as q, cutFunc as st, ValidationWrapper as wt, FormControlComponent as $t } from "./Functions.jsx";
6
6
  import "zod";
7
- import { getGlobalStore as o, formRefStore as ct } from "./store.js";
7
+ import { getGlobalStore as a, formRefStore as ct } from "./store.js";
8
8
  import { useCogsConfig as Vt } from "./CogsStateClient.jsx";
9
9
  import tt from "./node_modules/uuid/dist/esm-browser/v4.js";
10
- function lt(t, a) {
11
- const g = o.getState().getInitialOptions, S = o.getState().setInitialStateOptions, l = g(t) || {};
10
+ function lt(t, o) {
11
+ const g = a.getState().getInitialOptions, S = a.getState().setInitialStateOptions, l = g(t) || {};
12
12
  S(t, {
13
13
  ...l,
14
- ...a
14
+ ...o
15
15
  });
16
16
  }
17
17
  function dt({
18
18
  stateKey: t,
19
- options: a,
19
+ options: o,
20
20
  initialOptionsPart: g
21
21
  }) {
22
- const S = et(t) || {}, l = g[t] || {}, E = o.getState().setInitialStateOptions, _ = { ...l, ...S };
22
+ const S = et(t) || {}, l = g[t] || {}, E = a.getState().setInitialStateOptions, _ = { ...l, ...S };
23
23
  let v = !1;
24
- if (a)
25
- for (const m in a)
26
- _.hasOwnProperty(m) || (v = !0, _[m] = a[m]);
24
+ if (o)
25
+ for (const m in o)
26
+ _.hasOwnProperty(m) || (v = !0, _[m] = o[m]);
27
27
  v && E(t, _);
28
28
  }
29
- function qt(t, { formElements: a, validation: g }) {
30
- return { initialState: t, formElements: a, validation: g };
29
+ function qt(t, { formElements: o, validation: g }) {
30
+ return { initialState: t, formElements: o, validation: g };
31
31
  }
32
- const zt = (t, a) => {
32
+ const zt = (t, o) => {
33
33
  let g = t;
34
34
  const [S, l] = _t(g);
35
- (a?.formElements || a?.validation) && Object.keys(l).forEach((v) => {
35
+ (o?.formElements || o?.validation) && Object.keys(l).forEach((v) => {
36
36
  l[v] = l[v] || {}, l[v].formElements = {
37
- ...a.formElements,
37
+ ...o.formElements,
38
38
  // Global defaults first
39
- ...a?.validation,
39
+ ...o?.validation,
40
40
  ...l[v].formElements || {}
41
41
  // State-specific overrides
42
42
  };
43
- }), o.getState().setInitialStates(S);
43
+ }), a.getState().setInitialStates(S);
44
44
  const E = (v, m) => {
45
45
  const [p] = Y(m?.componentId ?? tt());
46
46
  dt({
@@ -48,7 +48,7 @@ const zt = (t, a) => {
48
48
  options: m,
49
49
  initialOptionsPart: l
50
50
  });
51
- const d = o.getState().cogsStateStore[v] || S[v], e = m?.modifyState ? m.modifyState(d) : d, [I, h] = Mt(
51
+ const d = a.getState().cogsStateStore[v] || S[v], e = m?.modifyState ? m.modifyState(d) : d, [I, h] = jt(
52
52
  e,
53
53
  {
54
54
  stateKey: v,
@@ -80,27 +80,27 @@ const zt = (t, a) => {
80
80
  addValidationError: Ct,
81
81
  removeValidationError: R,
82
82
  setServerSyncActions: Tt
83
- } = o.getState(), gt = (t) => {
83
+ } = a.getState(), gt = (t) => {
84
84
  if (!t) return null;
85
85
  try {
86
- const a = window.localStorage.getItem(t);
87
- return a ? JSON.parse(a) : null;
88
- } catch (a) {
89
- return console.error("Error loading from localStorage:", a), null;
86
+ const o = window.localStorage.getItem(t);
87
+ return o ? JSON.parse(o) : null;
88
+ } catch (o) {
89
+ return console.error("Error loading from localStorage:", o), null;
90
90
  }
91
- }, At = (t, a, g, S) => {
91
+ }, At = (t, o, g, S) => {
92
92
  if (g.localStorageKey) {
93
93
  const l = {
94
94
  state: t,
95
95
  lastUpdated: Date.now(),
96
- lastSyncedWithServer: o.getState().serverSyncLog[a]?.[0]?.timeStamp,
97
- baseServerState: o.getState().serverState[a]
98
- }, E = g.initState ? `${S}-${a}-${g.localStorageKey}` : a;
96
+ lastSyncedWithServer: a.getState().serverSyncLog[o]?.[0]?.timeStamp,
97
+ baseServerState: a.getState().serverState[o]
98
+ }, E = g.initState ? `${S}-${o}-${g.localStorageKey}` : o;
99
99
  window.localStorage.setItem(E, JSON.stringify(l));
100
100
  }
101
- }, Ft = (t, a, g, S, l, E) => {
101
+ }, Ft = (t, o, g, S, l, E) => {
102
102
  const _ = {
103
- initialState: a,
103
+ initialState: o,
104
104
  updaterState: Z(
105
105
  t,
106
106
  S,
@@ -112,26 +112,26 @@ const zt = (t, a) => {
112
112
  J(() => {
113
113
  nt(t, _.initialState), B(t, _.updaterState), x(t, _.state);
114
114
  });
115
- }, jt = (t) => {
116
- const a = o.getState().stateComponents.get(t);
117
- if (!a) return;
115
+ }, Mt = (t) => {
116
+ const o = a.getState().stateComponents.get(t);
117
+ if (!o) return;
118
118
  const g = /* @__PURE__ */ new Set();
119
- a.components.forEach((S) => {
119
+ o.components.forEach((S) => {
120
120
  g.add(() => S.forceUpdate());
121
121
  }), queueMicrotask(() => {
122
122
  J(() => {
123
123
  g.forEach((S) => S());
124
124
  });
125
125
  });
126
- }, Jt = (t, a) => {
127
- const g = o.getState().stateComponents.get(t);
126
+ }, Jt = (t, o) => {
127
+ const g = a.getState().stateComponents.get(t);
128
128
  if (g) {
129
- const S = `${t}////${a}`, l = g.components.get(S);
129
+ const S = `${t}////${o}`, l = g.components.get(S);
130
130
  l && l.forceUpdate();
131
131
  }
132
132
  };
133
- function Mt(t, {
134
- stateKey: a,
133
+ function jt(t, {
134
+ stateKey: o,
135
135
  serverSync: g,
136
136
  localStorage: S,
137
137
  formElements: l,
@@ -144,8 +144,8 @@ function Mt(t, {
144
144
  syncUpdate: e
145
145
  } = {}) {
146
146
  const [I, h] = Y({}), { sessionId: F } = Vt();
147
- let b = !a;
148
- const [u] = Y(a ?? tt()), i = o.getState().stateLog[u], G = z(/* @__PURE__ */ new Set()), U = z(m ?? tt()), A = z(null);
147
+ let b = !o;
148
+ const [u] = Y(o ?? tt()), i = a.getState().stateLog[u], G = z(/* @__PURE__ */ new Set()), U = z(m ?? tt()), A = z(null);
149
149
  A.current = et(u), K(() => {
150
150
  if (e && e.stateKey === u && e.path?.[0]) {
151
151
  x(u, (r) => ({
@@ -153,7 +153,7 @@ function Mt(t, {
153
153
  [e.path[0]]: e.newValue
154
154
  }));
155
155
  const c = `${e.stateKey}:${e.path.join(".")}`;
156
- o.getState().setSyncInfo(c, {
156
+ a.getState().setSyncInfo(c, {
157
157
  timeStamp: e.timeStamp,
158
158
  userId: e.userId
159
159
  });
@@ -174,7 +174,9 @@ function Mt(t, {
174
174
  n,
175
175
  U.current,
176
176
  F
177
- ), console.log("newState222", r), h({}));
177
+ ), console.log("newState222", r), queueMicrotask(() => {
178
+ h({});
179
+ }));
178
180
  }, [p, ...d?.dependencies || []]), vt(() => {
179
181
  b && lt(u, {
180
182
  serverSync: g,
@@ -183,7 +185,7 @@ function Mt(t, {
183
185
  localStorage: S,
184
186
  middleware: E
185
187
  });
186
- const c = `${u}////${U.current}`, r = o.getState().stateComponents.get(u) || {
188
+ const c = `${u}////${U.current}`, r = a.getState().stateComponents.get(u) || {
187
189
  components: /* @__PURE__ */ new Map()
188
190
  };
189
191
  return r.components.set(c, {
@@ -192,39 +194,39 @@ function Mt(t, {
192
194
  deps: [],
193
195
  depsFunction: _ || void 0,
194
196
  reactiveType: v ?? ["component", "deps"]
195
- }), o.getState().stateComponents.set(u, r), h({}), () => {
197
+ }), a.getState().stateComponents.set(u, r), h({}), () => {
196
198
  const f = `${u}////${U.current}`;
197
- r && (r.components.delete(f), r.components.size === 0 && o.getState().stateComponents.delete(u));
199
+ r && (r.components.delete(f), r.components.size === 0 && a.getState().stateComponents.delete(u));
198
200
  };
199
201
  }, []);
200
202
  const n = (c, r, f, w) => {
201
203
  if (Array.isArray(r)) {
202
- const j = `${u}-${r.join(".")}`;
203
- G.current.add(j);
204
+ const M = `${u}-${r.join(".")}`;
205
+ G.current.add(M);
204
206
  }
205
- x(u, (j) => {
206
- const V = ut(c) ? c(j) : c, M = `${u}-${r.join(".")}`;
207
- if (M) {
208
- let P = !1, y = o.getState().signalDomElements.get(M);
207
+ x(u, (M) => {
208
+ const V = ut(c) ? c(M) : c, j = `${u}-${r.join(".")}`;
209
+ if (j) {
210
+ let P = !1, y = a.getState().signalDomElements.get(j);
209
211
  if ((!y || y.size === 0) && (f.updateType === "insert" || f.updateType === "cut")) {
210
- const N = r.slice(0, -1), T = L(V, N);
212
+ const N = r.slice(0, -1), T = D(V, N);
211
213
  if (Array.isArray(T)) {
212
214
  P = !0;
213
215
  const $ = `${u}-${N.join(".")}`;
214
- y = o.getState().signalDomElements.get($);
216
+ y = a.getState().signalDomElements.get($);
215
217
  }
216
218
  }
217
219
  if (y) {
218
- const N = P ? L(V, r.slice(0, -1)) : L(V, r);
219
- y.forEach(({ parentId: T, position: $, effect: D }) => {
220
+ const N = P ? D(V, r.slice(0, -1)) : D(V, r);
221
+ y.forEach(({ parentId: T, position: $, effect: k }) => {
220
222
  const O = document.querySelector(
221
223
  `[data-parent-id="${T}"]`
222
224
  );
223
225
  if (O) {
224
- const ot = Array.from(O.childNodes);
225
- if (ot[$]) {
226
- const yt = D ? new Function("state", `return (${D})(state)`)(N) : N;
227
- ot[$].textContent = String(yt);
226
+ const at = Array.from(O.childNodes);
227
+ if (at[$]) {
228
+ const yt = k ? new Function("state", `return (${k})(state)`)(N) : N;
229
+ at[$].textContent = String(yt);
228
230
  }
229
231
  }
230
232
  });
@@ -245,19 +247,21 @@ function Mt(t, {
245
247
  R(y), Ct($, N);
246
248
  }
247
249
  });
248
- const W = L(j, r), St = L(V, r), mt = f.updateType === "update" ? r.join(".") : [...r].slice(0, -1).join("."), Q = o.getState().stateComponents.get(u);
249
- if (a == "cart" && (console.log("thisKey", u), console.log("stateEntry", Q)), Q)
250
+ const W = D(M, r), St = D(V, r), mt = f.updateType === "update" ? r.join(".") : [...r].slice(0, -1).join("."), Q = a.getState().stateComponents.get(u);
251
+ if (o == "cart" && (console.log("thisKey", u), console.log("stateEntry", Q)), Q)
250
252
  for (const [P, y] of Q.components.entries()) {
251
253
  let N = !1;
252
254
  const T = Array.isArray(y.reactiveType) ? y.reactiveType : [y.reactiveType || "component"];
253
255
  if (!T.includes("none")) {
254
256
  if (T.includes("all")) {
255
- y.forceUpdate();
257
+ queueMicrotask(() => {
258
+ y.forceUpdate();
259
+ });
256
260
  continue;
257
261
  }
258
262
  if (T.includes("component") && y.paths && (y.paths.has(mt) || y.paths.has("")) && (N = !0), !N && T.includes("deps") && y.depsFunction) {
259
263
  const $ = y.depsFunction(V);
260
- typeof $ == "boolean" ? $ && (N = !0) : k(y.deps, $) || (y.deps = $, N = !0);
264
+ typeof $ == "boolean" ? $ && (N = !0) : L(y.deps, $) || (y.deps = $, N = !0);
261
265
  }
262
266
  N && y.forceUpdate();
263
267
  }
@@ -273,8 +277,8 @@ function Mt(t, {
273
277
  };
274
278
  if (ht(u, (P) => {
275
279
  const N = [...P ?? [], rt].reduce((T, $) => {
276
- const D = `${$.stateKey}:${JSON.stringify($.path)}`, O = T.get(D);
277
- return O ? (O.timeStamp = Math.max(O.timeStamp, $.timeStamp), O.newValue = $.newValue, O.oldValue = O.oldValue ?? $.oldValue, O.updateType = $.updateType) : T.set(D, { ...$ }), T;
280
+ const k = `${$.stateKey}:${JSON.stringify($.path)}`, O = T.get(k);
281
+ return O ? (O.timeStamp = Math.max(O.timeStamp, $.timeStamp), O.newValue = $.newValue, O.oldValue = O.oldValue ?? $.oldValue, O.updateType = $.updateType) : T.set(k, { ...$ }), T;
278
282
  }, /* @__PURE__ */ new Map());
279
283
  return Array.from(N.values());
280
284
  }), At(
@@ -286,7 +290,7 @@ function Mt(t, {
286
290
  updateLog: i,
287
291
  update: rt
288
292
  }), A.current?.serverSync) {
289
- const P = o.getState().serverState[u], y = A.current?.serverSync;
293
+ const P = a.getState().serverState[u], y = A.current?.serverSync;
290
294
  Tt(u, {
291
295
  syncKey: typeof y.syncKey == "string" ? y.syncKey : y.syncKey({ state: V }),
292
296
  rollBackState: P,
@@ -297,7 +301,7 @@ function Mt(t, {
297
301
  return V;
298
302
  });
299
303
  };
300
- o.getState().updaterState[u] || (console.log("Initializing state for", u, t), B(
304
+ a.getState().updaterState[u] || (B(
301
305
  u,
302
306
  Z(
303
307
  u,
@@ -305,7 +309,7 @@ function Mt(t, {
305
309
  U.current,
306
310
  F
307
311
  )
308
- ), o.getState().cogsStateStore[u] || x(u, t), o.getState().initialStateGlobal[u] || nt(u, t));
312
+ ), a.getState().cogsStateStore[u] || x(u, t), a.getState().initialStateGlobal[u] || nt(u, t));
309
313
  const s = It(() => Z(
310
314
  u,
311
315
  n,
@@ -314,7 +318,7 @@ function Mt(t, {
314
318
  ), [u]);
315
319
  return [ft(u), s];
316
320
  }
317
- function Z(t, a, g, S) {
321
+ function Z(t, o, g, S) {
318
322
  const l = /* @__PURE__ */ new Map();
319
323
  let E = 0;
320
324
  const _ = (d) => {
@@ -327,14 +331,14 @@ function Z(t, a, g, S) {
327
331
  d?.validationKey && R(d.validationKey);
328
332
  },
329
333
  revertToInitialState: (d) => {
330
- const e = o.getState().getInitialOptions(t)?.validation;
334
+ const e = a.getState().getInitialOptions(t)?.validation;
331
335
  e?.key && R(e?.key), d?.validationKey && R(d.validationKey);
332
- const I = o.getState().initialStateGlobal[t];
336
+ const I = a.getState().initialStateGlobal[t];
333
337
  l.clear(), E++;
334
338
  const h = p(I, []);
335
339
  J(() => {
336
340
  B(t, h), x(t, I);
337
- const F = o.getState().stateComponents.get(t);
341
+ const F = a.getState().stateComponents.get(t);
338
342
  F && F.components.forEach((u) => {
339
343
  u.forceUpdate();
340
344
  });
@@ -348,13 +352,13 @@ function Z(t, a, g, S) {
348
352
  l.clear(), E++;
349
353
  const e = Z(
350
354
  t,
351
- a,
355
+ o,
352
356
  g,
353
357
  S
354
358
  );
355
359
  return J(() => {
356
360
  nt(t, d), B(t, e), x(t, d);
357
- const I = o.getState().stateComponents.get(t);
361
+ const I = a.getState().stateComponents.get(t);
358
362
  I && I.components.forEach((h) => {
359
363
  h.forceUpdate();
360
364
  }), localStorage.removeItem(t);
@@ -362,12 +366,12 @@ function Z(t, a, g, S) {
362
366
  fetchId: (I) => e.get()[I]
363
367
  };
364
368
  },
365
- _initialState: o.getState().initialStateGlobal[t],
366
- _serverState: o.getState().serverState[t],
367
- _isLoading: o.getState().isLoadingGlobal[t],
369
+ _initialState: a.getState().initialStateGlobal[t],
370
+ _serverState: a.getState().serverState[t],
371
+ _isLoading: a.getState().isLoadingGlobal[t],
368
372
  _isServerSynced: () => {
369
- const d = o.getState().serverState[t];
370
- return !!(d && k(d, ft(t)));
373
+ const d = a.getState().serverState[t];
374
+ return !!(d && L(d, ft(t)));
371
375
  }
372
376
  };
373
377
  function p(d, e = [], I) {
@@ -376,7 +380,7 @@ function Z(t, a, g, S) {
376
380
  const F = {
377
381
  get(u, i) {
378
382
  if (i !== "then" && !i.startsWith("$") && i !== "stateMapNoRender") {
379
- const n = e.join("."), s = `${t}////${g}`, c = o.getState().stateComponents.get(t);
383
+ const n = e.join("."), s = `${t}////${g}`, c = a.getState().stateComponents.get(t);
380
384
  if (c) {
381
385
  const r = c.components.get(s);
382
386
  r && (e.length > 0 || i === "get") && r.paths.add(n);
@@ -384,10 +388,10 @@ function Z(t, a, g, S) {
384
388
  }
385
389
  if (i === "showValidationErrors")
386
390
  return () => {
387
- const n = o.getState().getInitialOptions(t)?.validation;
391
+ const n = a.getState().getInitialOptions(t)?.validation;
388
392
  if (!n?.key)
389
393
  throw new Error("Validation key not found");
390
- return o.getState().getValidationErrors(n.key + "." + e.join("."));
394
+ return a.getState().getValidationErrors(n.key + "." + e.join("."));
391
395
  };
392
396
  if (Array.isArray(d)) {
393
397
  if (i === "getSelected")
@@ -404,16 +408,16 @@ function Z(t, a, g, S) {
404
408
  return (n) => {
405
409
  const s = I?.filtered?.some(
406
410
  (r) => r.join(".") === e.join(".")
407
- ), c = s ? d : o.getState().getNestedState(t, e);
411
+ ), c = s ? d : a.getState().getNestedState(t, e);
408
412
  return i !== "stateMapNoRender" && (l.clear(), E++), c.map((r, f) => {
409
- const w = s && r.__origIndex ? r.__origIndex : f, j = p(
413
+ const w = s && r.__origIndex ? r.__origIndex : f, M = p(
410
414
  r,
411
415
  [...e, w.toString()],
412
416
  I
413
417
  );
414
418
  return n(
415
419
  r,
416
- j,
420
+ M,
417
421
  f,
418
422
  d,
419
423
  p(d, e, I)
@@ -434,7 +438,7 @@ function Z(t, a, g, S) {
434
438
  return (n) => {
435
439
  const c = I?.filtered?.some(
436
440
  (f) => f.join(".") === e.join(".")
437
- ) ? d : o.getState().getNestedState(t, e);
441
+ ) ? d : a.getState().getNestedState(t, e);
438
442
  l.clear(), E++;
439
443
  const r = c.flatMap(
440
444
  (f, w) => f[n] ?? []
@@ -460,35 +464,35 @@ function Z(t, a, g, S) {
460
464
  return p(s, [...e, n.toString()]);
461
465
  };
462
466
  if (i === "insert")
463
- return (n) => (_(e), it(a, n, e, t), p(
464
- o.getState().cogsStateStore[t],
467
+ return (n) => (_(e), it(o, n, e, t), p(
468
+ a.getState().cogsStateStore[t],
465
469
  []
466
470
  ));
467
471
  if (i === "uniqueInsert")
468
472
  return (n, s, c) => {
469
- const r = o.getState().getNestedState(t, e), f = ut(n) ? n(r) : n;
473
+ const r = a.getState().getNestedState(t, e), f = ut(n) ? n(r) : n;
470
474
  let w = null;
471
475
  if (!r.some((V) => {
472
476
  if (s) {
473
477
  const C = s.every(
474
- (W) => k(V[W], f[W])
478
+ (W) => L(V[W], f[W])
475
479
  );
476
480
  return C && (w = V), C;
477
481
  }
478
- const M = k(V, f);
479
- return M && (w = V), M;
482
+ const j = L(V, f);
483
+ return j && (w = V), j;
480
484
  }))
481
- _(e), it(a, f, e, t);
485
+ _(e), it(o, f, e, t);
482
486
  else if (c && w) {
483
- const V = c(w), M = r.map(
484
- (C) => k(C, w) ? V : C
487
+ const V = c(w), j = r.map(
488
+ (C) => L(C, w) ? V : C
485
489
  );
486
- _(e), q(a, M, e);
490
+ _(e), q(o, j, e);
487
491
  }
488
492
  };
489
493
  if (i === "cut")
490
494
  return (n, s) => {
491
- s?.waitForSync || (_(e), st(a, e, t, n));
495
+ s?.waitForSync || (_(e), st(o, e, t, n));
492
496
  };
493
497
  if (i === "stateFilter")
494
498
  return (n) => {
@@ -507,17 +511,17 @@ function Z(t, a, g, S) {
507
511
  }
508
512
  const G = e[e.length - 1];
509
513
  if (!isNaN(Number(G))) {
510
- const n = e.slice(0, -1), s = o.getState().getNestedState(t, n);
514
+ const n = e.slice(0, -1), s = a.getState().getNestedState(t, n);
511
515
  if (Array.isArray(s) && i === "cut")
512
516
  return () => st(
513
- a,
517
+ o,
514
518
  n,
515
519
  t,
516
520
  Number(G)
517
521
  );
518
522
  }
519
523
  if (i === "get")
520
- return () => o.getState().getNestedState(t, e);
524
+ return () => a.getState().getNestedState(t, e);
521
525
  if (i === "$derive")
522
526
  return (n) => X({
523
527
  _stateKey: t,
@@ -537,10 +541,10 @@ function Z(t, a, g, S) {
537
541
  });
538
542
  if (i === "lastSynced") {
539
543
  const n = `${t}:${e.join(".")}`;
540
- return o.getState().getSyncInfo(n);
544
+ return a.getState().getSyncInfo(n);
541
545
  }
542
546
  if (i === "_selected") {
543
- const n = e.slice(0, -1), s = n.join("."), c = o.getState().getNestedState(t, n);
547
+ const n = e.slice(0, -1), s = n.join("."), c = a.getState().getNestedState(t, n);
544
548
  return Array.isArray(c) ? Number(e[e.length - 1]) === v.get(s) : void 0;
545
549
  }
546
550
  if (i == "getLocalStorage")
@@ -549,46 +553,46 @@ function Z(t, a, g, S) {
549
553
  return (n) => {
550
554
  const s = e.slice(0, -1), c = Number(e[e.length - 1]), r = s.join(".");
551
555
  n ? v.set(r, c) : v.delete(r);
552
- const f = o.getState().getNestedState(t, [...s]);
553
- q(a, f, s), _(s);
556
+ const f = a.getState().getNestedState(t, [...s]);
557
+ q(o, f, s), _(s);
554
558
  };
555
559
  if (e.length == 0) {
556
560
  if (i === "validateZodSchema")
557
561
  return () => {
558
- const n = o.getState().getInitialOptions(t)?.validation, s = o.getState().addValidationError;
562
+ const n = a.getState().getInitialOptions(t)?.validation, s = a.getState().addValidationError;
559
563
  if (!n?.zodSchema)
560
564
  throw new Error("Zod schema not found");
561
565
  if (!n?.key)
562
566
  throw new Error("Validation key not found");
563
567
  R(n.key);
564
- const c = o.getState().cogsStateStore[t];
568
+ const c = a.getState().cogsStateStore[t];
565
569
  try {
566
- const r = o.getState().getValidationErrors(n.key);
570
+ const r = a.getState().getValidationErrors(n.key);
567
571
  r && r.length > 0 && r.forEach(([w]) => {
568
572
  w && w.startsWith(n.key) && R(w);
569
573
  });
570
574
  const f = n.zodSchema.safeParse(c);
571
- return f.success ? !0 : (f.error.errors.forEach((j) => {
572
- const V = j.path, M = j.message, C = [n.key, ...V].join(".");
573
- s(C, M), console.log(
574
- `Validation error at ${C}: ${M}`
575
+ return f.success ? !0 : (f.error.errors.forEach((M) => {
576
+ const V = M.path, j = M.message, C = [n.key, ...V].join(".");
577
+ s(C, j), console.log(
578
+ `Validation error at ${C}: ${j}`
575
579
  );
576
- }), jt(t), !1);
580
+ }), Mt(t), !1);
577
581
  } catch (r) {
578
582
  return console.error("Zod schema validation failed", r), !1;
579
583
  }
580
584
  };
581
585
  if (i === "_componentId") return g;
582
586
  if (i === "getComponents")
583
- return () => o().stateComponents.get(t);
587
+ return () => a().stateComponents.get(t);
584
588
  if (i === "getAllFormRefs")
585
589
  return () => ct.getState().getFormRefsByStateKey(t);
586
590
  if (i === "_initialState")
587
- return o.getState().initialStateGlobal[t];
591
+ return a.getState().initialStateGlobal[t];
588
592
  if (i === "_serverState")
589
- return o.getState().serverState[t];
593
+ return a.getState().serverState[t];
590
594
  if (i === "_isLoading")
591
- return o.getState().isLoadingGlobal[t];
595
+ return a.getState().isLoadingGlobal[t];
592
596
  if (i === "revertToInitialState")
593
597
  return m.revertToInitialState;
594
598
  if (i === "updateInitialState") return m.updateInitialState;
@@ -600,12 +604,12 @@ function Z(t, a, g, S) {
600
604
  return ({
601
605
  children: n,
602
606
  hideMessage: s
603
- }) => /* @__PURE__ */ at(
607
+ }) => /* @__PURE__ */ ot(
604
608
  wt,
605
609
  {
606
610
  formOpts: s ? { validation: { message: "" } } : void 0,
607
611
  path: e,
608
- validationKey: o.getState().getInitialOptions(t)?.validation?.key || "",
612
+ validationKey: a.getState().getInitialOptions(t)?.validation?.key || "",
609
613
  stateKey: t,
610
614
  validIndices: I?.validIndices,
611
615
  children: n
@@ -618,29 +622,29 @@ function Z(t, a, g, S) {
618
622
  return (n, s) => {
619
623
  if (s?.debounce)
620
624
  pt(() => {
621
- q(a, n, e, "");
622
- const c = o.getState().getNestedState(t, e);
625
+ q(o, n, e, "");
626
+ const c = a.getState().getNestedState(t, e);
623
627
  s?.afterUpdate && s.afterUpdate(c);
624
628
  }, s.debounce);
625
629
  else {
626
- q(a, n, e, "");
627
- const c = o.getState().getNestedState(t, e);
630
+ q(o, n, e, "");
631
+ const c = a.getState().getNestedState(t, e);
628
632
  s?.afterUpdate && s.afterUpdate(c);
629
633
  }
630
634
  _(e);
631
635
  };
632
636
  if (i === "formElement")
633
- return (n, s) => /* @__PURE__ */ at(
637
+ return (n, s) => /* @__PURE__ */ ot(
634
638
  $t,
635
639
  {
636
- setState: a,
640
+ setState: o,
637
641
  stateKey: t,
638
642
  path: e,
639
643
  child: n,
640
644
  formOpts: s
641
645
  }
642
646
  );
643
- const U = [...e, i], A = o.getState().getNestedState(t, U);
647
+ const U = [...e, i], A = a.getState().getNestedState(t, U);
644
648
  return p(A, U, I);
645
649
  }
646
650
  }, b = new Proxy(m, F);
@@ -650,7 +654,7 @@ function Z(t, a, g, S) {
650
654
  }), b;
651
655
  }
652
656
  return p(
653
- o.getState().getNestedState(t, [])
657
+ a.getState().getNestedState(t, [])
654
658
  );
655
659
  }
656
660
  function X(t) {
@@ -658,10 +662,10 @@ function X(t) {
658
662
  }
659
663
  function Ot({
660
664
  proxy: t,
661
- rebuildStateShape: a
665
+ rebuildStateShape: o
662
666
  }) {
663
- const g = o().getNestedState(t._stateKey, t._path);
664
- return console.log("value", g), Array.isArray(g) ? a(
667
+ const g = a().getNestedState(t._stateKey, t._path);
668
+ return console.log("value", g), Array.isArray(g) ? o(
665
669
  g,
666
670
  t._path
667
671
  ).stateMapNoRender(
@@ -671,9 +675,9 @@ function Ot({
671
675
  function bt({
672
676
  proxy: t
673
677
  }) {
674
- const a = z(null), g = `${t._stateKey}-${t._path.join(".")}`;
678
+ const o = z(null), g = `${t._stateKey}-${t._path.join(".")}`;
675
679
  return K(() => {
676
- const S = a.current;
680
+ const S = o.current;
677
681
  if (!S || !S.parentElement) return;
678
682
  const l = S.parentElement, _ = Array.from(l.childNodes).indexOf(S);
679
683
  let v = l.getAttribute("data-parent-id");
@@ -684,8 +688,8 @@ function bt({
684
688
  position: _,
685
689
  effect: t._effect
686
690
  };
687
- o.getState().addSignalElement(g, p);
688
- const d = o.getState().getNestedState(t._stateKey, t._path);
691
+ a.getState().addSignalElement(g, p);
692
+ const d = a.getState().getNestedState(t._stateKey, t._path);
689
693
  let e;
690
694
  if (t._effect)
691
695
  try {
@@ -702,15 +706,15 @@ function bt({
702
706
  const I = document.createTextNode(String(e));
703
707
  S.replaceWith(I);
704
708
  }, [t._stateKey, t._path.join("."), t._effect]), H("span", {
705
- ref: a,
709
+ ref: o,
706
710
  style: { display: "none" },
707
711
  "data-signal-id": g
708
712
  });
709
713
  }
710
714
  function Bt(t) {
711
- const a = Et(
715
+ const o = Et(
712
716
  (g) => {
713
- const S = o.getState().stateComponents.get(t._stateKey) || {
717
+ const S = a.getState().stateComponents.get(t._stateKey) || {
714
718
  components: /* @__PURE__ */ new Map()
715
719
  };
716
720
  return S.components.set(t._stateKey, {
@@ -718,9 +722,9 @@ function Bt(t) {
718
722
  paths: /* @__PURE__ */ new Set([t._path.join(".")])
719
723
  }), () => S.components.delete(t._stateKey);
720
724
  },
721
- () => o.getState().getNestedState(t._stateKey, t._path)
725
+ () => a.getState().getNestedState(t._stateKey, t._path)
722
726
  );
723
- return H("text", {}, String(a));
727
+ return H("text", {}, String(o));
724
728
  }
725
729
  export {
726
730
  X as $cogsSignal,
@@ -728,6 +732,6 @@ export {
728
732
  qt as addStateOptions,
729
733
  zt as createCogsState,
730
734
  Jt as notifyComponent,
731
- Mt as useCogsStateFn
735
+ jt as useCogsStateFn
732
736
  };
733
737
  //# sourceMappingURL=CogsState.jsx.map
@@ -1 +1 @@
1
- {"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n createElement,\r\n startTransition,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport {\r\n debounce,\r\n getNestedValue,\r\n isFunction,\r\n updateNestedProperty,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { boolean, ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => void;\r\n\r\ntype CutFunctionType = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => void;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {}) & {\r\n [K in keyof (any extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => void;\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: { key: string | ((state: T) => string) };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n localStorageKey?: string;\r\n initState?: {\r\n ctx?: Record<string, any>;\r\n initialState: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n };\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n mutation: UseMutationResult<any, unknown, any, unknown>;\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: Opt;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n }\r\n }\r\n }\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (opt?.formElements || opt?.validation) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n // Apply form elements with global as defaults\r\n initialOptionsPart[key].formElements = {\r\n ...opt.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initState: options?.initState,\r\n localStorageKey: options?.localStorageKey,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions.localStorageKey) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = currentInitialOptions.initState\r\n ? `${sessionId}-${thisKey}-${currentInitialOptions.localStorageKey}`\r\n : thisKey;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n startTransition(() => {\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n });\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n updates.add(() => component.forceUpdate());\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n startTransition(() => {\r\n updates.forEach((update) => update());\r\n });\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n localStorageKey,\r\n initState,\r\n syncUpdate,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n\r\n useEffect(() => {\r\n setAndMergeOptions(thisKey as string, {\r\n initState,\r\n });\r\n let localData = null;\r\n if (localStorageKey) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localStorageKey\r\n );\r\n }\r\n let newState = null;\r\n if (initState?.initialState) {\r\n newState = initState?.initialState;\r\n console.log(\"newState\", newState);\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n }\r\n }\r\n updateGlobalState(\r\n thisKey,\r\n initState?.initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n console.log(\"newState222\", newState);\r\n forceUpdate({});\r\n }\r\n }, [localStorageKey, ...(initState?.dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (stateKey == \"cart\") {\r\n console.log(\"thisKey\", thisKey);\r\n console.log(\"stateEntry\", stateEntry);\r\n }\r\n if (stateEntry) {\r\n for (const [key, component] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes.includes(\"none\")) {\r\n continue;\r\n }\r\n\r\n // Force update if \"all\" is specified\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\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 console.log(\"Initializing state for\", thisKey, stateObject); // Debug log\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const selectedIndexMap = new Map<string, number>();\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n\r\n startTransition(() => {\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n if (initalOptionsGet?.localStorageKey) {\r\n localStorage.removeItem(\r\n initalOptionsGet?.initState\r\n ? sessionId +\r\n \"-\" +\r\n stateKey +\r\n \"-\" +\r\n initalOptionsGet?.localStorageKey\r\n : stateKey\r\n );\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n\r\n const handler = {\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = selectedIndexMap.get(path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\r\n (obj: any) => obj[thisKey] === thisValue\r\n );\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // ADDED: Clear cache for find operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n []\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices, // Pass through the meta\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return currentIndex === selectedIndexMap.get(parentKey);\r\n }\r\n return undefined;\r\n }\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n if (value) {\r\n selectedIndexMap.set(parentKey, thisIndex);\r\n } else {\r\n // Optional: clear selection if false\r\n selectedIndexMap.delete(parentKey);\r\n }\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // ADDED: Invalidate cache for parent path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n\r\n console.log(\r\n `Validation error at ${fullErrorPath}: ${errorMessage}`\r\n );\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseObj as StateObject<T>, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n console.log(\"value\", value);\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","startTransition","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","initState","syncUpdate","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","isFunction","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","pathToCheck","shouldUpdate","reactiveTypes","depsResult","isDeepEqual","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","selectedIndexMap","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","newUpdaterState","field","serverState","currentState","meta","cacheKey","handler","target","prop","currentPath","selectedIndex","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","item","isMatch","updatedItem","updatedArray","updateFn","cutFunc","newVal","i","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","value","nested","thisObject","existingErrors","errorPath","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":"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"}
1
+ {"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n createElement,\r\n startTransition,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport {\r\n debounce,\r\n getNestedValue,\r\n isFunction,\r\n updateNestedProperty,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport type { UseMutationResult } from \"@tanstack/react-query\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { boolean, ZodArray, ZodObject, type ZodRawShape } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => void;\r\n\r\ntype CutFunctionType = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => void;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>>;\r\n cut: CutFunctionType;\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape> & {\r\n [K in keyof (any[] extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<Prettify<T>>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\nexport type FormOptsType = {\r\n key?: string;\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n stretch?: boolean;\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n formElements?: boolean;\r\n debounceTime?: number;\r\n stateServerDifferences?: string[][];\r\n};\r\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n showValidationErrors: () => string[];\r\n setValidation: (ctx: string) => void;\r\n removeValidation: (ctx: string) => void;\r\n ignoreFields: (fields: string[]) => StateObject<T>;\r\n _selected: boolean;\r\n setSelected: (value: boolean) => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {}) & {\r\n [K in keyof (any extends infer T ? T : never)]: never;\r\n };\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => void;\r\n middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n _isServerSynced: () => boolean;\r\n getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\nexport type EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"update\" | \"insert\" | \"cut\" },\r\n validationKey?: string,\r\n opts?: UpdateOpts<TStateObject>\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: \"update\" | \"insert\" | \"cut\";\r\n path: string[];\r\n status: \"new\" | \"sent\" | \"synced\";\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n};\r\n\r\nexport type ActionsType<T> = {\r\n type: \"onChange\";\r\n action: ({ state, actionType }: { state: T; actionType: string }) => void;\r\n debounce?: number;\r\n}[];\r\n\r\ntype ArrayToObject<T extends string[]> = Record<T[number], string>;\r\ntype CookieType<T> = {\r\n timeStamp: number;\r\n value: T;\r\n cookieName: string;\r\n OnUnMountCookie?: Boolean;\r\n};\r\nexport type CogsCookiesType<T extends string[] = string[]> = CookieType<\r\n ArrayToObject<T>\r\n>;\r\nexport type ReactivityType = \"none\" | \"component\" | \"deps\" | \"all\";\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchema?: ZodObject<ZodRawShape> | ZodArray<ZodObject<ZodRawShape>>;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: { key: string | ((state: T) => string) };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n localStorageKey?: string;\r\n initState?: {\r\n ctx?: Record<string, any>;\r\n initialState: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n };\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n mutation: UseMutationResult<any, unknown, any, unknown>;\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: Opt;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n }\r\n }\r\n }\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (opt?.formElements || opt?.validation) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n // Apply form elements with global as defaults\r\n initialOptionsPart[key].formElements = {\r\n ...opt.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initState: options?.initState,\r\n localStorageKey: options?.localStorageKey,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\n\r\nconst loadFromLocalStorage = (localStorageKey: string) => {\r\n if (!localStorageKey) return null;\r\n\r\n try {\r\n const storedData = window.localStorage.getItem(localStorageKey);\r\n if (!storedData) return null;\r\n\r\n const parsedData = JSON.parse(storedData);\r\n\r\n return parsedData;\r\n } catch (error) {\r\n console.error(\"Error loading from localStorage:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions.localStorageKey) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = currentInitialOptions.initState\r\n ? `${sessionId}-${thisKey}-${currentInitialOptions.localStorageKey}`\r\n : thisKey;\r\n\r\n window.localStorage.setItem(storageKey, JSON.stringify(data));\r\n }\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n startTransition(() => {\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n });\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n updates.add(() => component.forceUpdate());\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n startTransition(() => {\r\n updates.forEach((update) => update());\r\n });\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n localStorageKey,\r\n initState,\r\n syncUpdate,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n\r\n useEffect(() => {\r\n setAndMergeOptions(thisKey as string, {\r\n initState,\r\n });\r\n let localData = null;\r\n if (localStorageKey) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localStorageKey\r\n );\r\n }\r\n let newState = null;\r\n if (initState?.initialState) {\r\n newState = initState?.initialState;\r\n console.log(\"newState\", newState);\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n }\r\n }\r\n updateGlobalState(\r\n thisKey,\r\n initState?.initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n console.log(\"newState222\", newState);\r\n queueMicrotask(() => {\r\n forceUpdate({});\r\n });\r\n }\r\n }, [localStorageKey, ...(initState?.dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction:\r\n | TStateObject\r\n | ((prevState: TStateObject) => TStateObject),\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (stateKey == \"cart\") {\r\n console.log(\"thisKey\", thisKey);\r\n console.log(\"stateEntry\", stateEntry);\r\n }\r\n if (stateEntry) {\r\n for (const [key, component] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes.includes(\"none\")) {\r\n continue;\r\n }\r\n\r\n // Force update if \"all\" is specified\r\n if (reactiveTypes.includes(\"all\")) {\r\n queueMicrotask(() => {\r\n component.forceUpdate();\r\n });\r\n continue;\r\n continue;\r\n }\r\n\r\n // Check component-level path reactivity\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths &&\r\n (component.paths.has(pathToCheck) || component.paths.has(\"\"))\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n\r\n // Check dependency-based reactivity\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) {\r\n shouldUpdate = true;\r\n }\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: \"new\" as const,\r\n oldValue,\r\n newValue,\r\n } satisfies UpdateTypeDetail;\r\n\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n\r\n // Aggregate the updates by stateKey and path\r\n const aggregatedLogs = logs.reduce((acc, log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = acc.get(uniqueKey);\r\n\r\n if (existing) {\r\n // Update the existing entry with the most recent details\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue; // Overwrite with the latest value\r\n existing.oldValue = existing.oldValue ?? log.oldValue; // Retain the initial oldValue\r\n existing.updateType = log.updateType; // Update to the most recent type\r\n } else {\r\n // Add the log if no existing match is found\r\n acc.set(uniqueKey, { ...(log as any) });\r\n }\r\n\r\n return acc;\r\n }, new Map<string, typeof newUpdate>());\r\n\r\n // Convert the aggregated map back to an array\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (middleware) {\r\n middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n if (latestInitialOptionsRef.current?.serverSync) {\r\n const serverStateStore = getGlobalStore.getState().serverState[thisKey];\r\n const serverSync = latestInitialOptionsRef.current?.serverSync;\r\n setServerSyncActions(thisKey, {\r\n syncKey:\r\n typeof serverSync.syncKey == \"string\"\r\n ? serverSync.syncKey\r\n : serverSync.syncKey({ state: payload }),\r\n rollBackState: serverStateStore,\r\n actionTimeStamp: Date.now() + (serverSync.debounce ?? 3000),\r\n status: \"waiting\",\r\n });\r\n }\r\n\r\n return payload;\r\n });\r\n };\r\n if (!getGlobalStore.getState().updaterState[thisKey]) {\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const selectedIndexMap = new Map<string, number>();\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n\r\n startTransition(() => {\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n if (initalOptionsGet?.localStorageKey) {\r\n localStorage.removeItem(\r\n initalOptionsGet?.initState\r\n ? sessionId +\r\n \"-\" +\r\n stateKey +\r\n \"-\" +\r\n initalOptionsGet?.localStorageKey\r\n : stateKey\r\n );\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n localStorage.removeItem(stateKey);\r\n });\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n\r\n const handler = {\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = selectedIndexMap.get(path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex(\r\n (obj: any) => obj[thisKey] === thisValue\r\n );\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // ADDED: Clear cache for find operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n []\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices, // Pass through the meta\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return currentIndex === selectedIndexMap.get(parentKey);\r\n }\r\n return undefined;\r\n }\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n if (value) {\r\n selectedIndexMap.set(parentKey, thisIndex);\r\n } else {\r\n // Optional: clear selection if false\r\n selectedIndexMap.delete(parentKey);\r\n }\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // ADDED: Invalidate cache for parent path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n\r\n console.log(\r\n `Validation error at ${fullErrorPath}: ${errorMessage}`\r\n );\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseObj as StateObject<T>, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n console.log(\"value\", value);\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","loadFromLocalStorage","localStorageKey","storedData","error","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","data","storageKey","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","startTransition","notifyComponents","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","initState","syncUpdate","reactiveForce","forceUpdate","useCogsConfig","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","localData","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","isFunction","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","pathToCheck","shouldUpdate","reactiveTypes","depsResult","isDeepEqual","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","selectedIndexMap","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","newUpdaterState","field","serverState","currentState","meta","cacheKey","handler","target","prop","currentPath","selectedIndex","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","pushFunc","fields","onMatch","currentArray","matchedItem","item","isMatch","updatedItem","updatedArray","updateFn","cutFunc","newVal","i","validIndices","filteredArray","lastPathElement","parentPath","parentValue","fn","$cogsSignal","parentKey","value","nested","thisObject","existingErrors","errorPath","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":";;;;;;;;;AA8XA,SAASA,GAAmBC,GAAkBC,GAA8B;AACpEC,QAAAA,IAAoBC,EAAe,SAAA,EAAW,mBAC9CC,IACJD,EAAe,SAAA,EAAW,wBAEtBE,IAAiBH,EAAkBF,CAAkB,KAAK,CAAC;AAEjE,EAAAI,EAAuBJ,GAAoB;AAAA,IACzC,GAAGK;AAAA,IACH,GAAGJ;AAAA,EAAA,CACJ;AACH;AAEA,SAASK,GAA0B;AAAA,EACjC,UAAAN;AAAA,EACA,SAAAO;AAAA,EACA,oBAAAC;AACF,GAIG;AACD,QAAMH,IAAiBH,GAAkBF,CAAkB,KAAK,CAAC,GAC3DS,IAA0BD,EAAmBR,CAAkB,KAAK,CAAC,GACrEI,IACJD,EAAe,SAAA,EAAW,wBACtBO,IAAgB,EAAE,GAAGD,GAAyB,GAAGJ,EAAe;AAEtE,MAAIM,IAAY;AAChB,MAAIJ;AACF,eAAWK,KAAOL;AAChB,MAAKG,EAAc,eAAeE,CAAG,MACvBD,IAAA,IACED,EAAAE,CAAG,IAAIL,EAAQK,CAA2B;AAI9D,EAAID,KACFP,EAAuBJ,GAAoBU,CAAa;AAE5D;AACO,SAASG,GACdC,GACA,EAAE,cAAAC,GAAc,YAAAC,KAChB;AACO,SAAA,EAAE,cAAAF,GAA4B,cAAAC,GAAc,YAAAC,EAAW;AAChE;AAEa,MAAAC,KAAkB,CAC7BH,GACAI,MACG;AACH,MAAIC,IAAkBL;AAGtB,QAAM,CAACM,GAAWZ,CAAkB,IAClCa,GAA0BF,CAAe;AAGvC,GAAAD,GAAK,gBAAgBA,GAAK,eAC5B,OAAO,KAAKV,CAAkB,EAAE,QAAQ,CAACI,MAAQ;AAE/C,IAAAJ,EAAmBI,CAAG,IAAIJ,EAAmBI,CAAG,KAAK,CAAC,GAGnCJ,EAAAI,CAAG,EAAE,eAAe;AAAA,MACrC,GAAGM,EAAI;AAAA;AAAA,MACP,GAAGA,GAAK;AAAA,MACR,GAAIV,EAAmBI,CAAG,EAAE,gBAAgB,CAAA;AAAA;AAAA,IAC9C;AAAA,EAAA,CACD,GAGYT,EAAA,SAAA,EAAW,iBAAiBiB,CAAS;AAG9C,QAAAE,IAAe,CACnBtB,GACAO,MACG;AACH,UAAM,CAACgB,CAAW,IAAIC,EAASjB,GAAS,eAAekB,IAAQ;AACpD,IAAAnB,GAAA;AAAA,MACT,UAAAN;AAAA,MACA,SAAAO;AAAA,MACA,oBAAAC;AAAA,IAAA,CACD;AAEK,UAAAkB,IACJvB,EAAe,SAAS,EAAE,eAAeH,CAAkB,KAC3DoB,EAAUpB,CAAkB,GACxB2B,IAAepB,GAAS,cAC1BA,EAAQ,YAAYmB,CAAQ,IAC5BA,GAEE,CAACE,GAAOC,CAAO,IAAIC;AAAA,MACvBH;AAAA,MACA;AAAA,QACE,UAAA3B;AAAA,QACA,YAAYO,GAAS;AAAA,QACrB,aAAAgB;AAAA,QACA,cAAchB,GAAS;AAAA,QACvB,YAAYA,GAAS;AAAA,QACrB,aAAaA,GAAS;AAAA,QACtB,cAAcA,GAAS;AAAA,QACvB,cAAcA,GAAS;AAAA,QACvB,WAAWA,GAAS;AAAA,QACpB,iBAAiBA,GAAS;AAAA,MAAA;AAAA,IAE9B;AAEO,WAAAsB;AAAA,EACT;AAES,WAAAE,EACP/B,GACAO,GACA;AACA,IAAAD,GAAW,EAAE,UAAAN,GAAU,SAAAO,GAAS,oBAAAC,EAAA,CAAoB;AAAA,EAAA;AAG/C,SAAA,EAAE,cAAAc,GAAc,gBAAAS,EAAe;AACxC,GAEM;AAAA,EACJ,iBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,mBAAA/B;AAAA,EACA,aAAAgC;AAAA,EACA,qBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,sBAAAC;AACF,IAAIrC,EAAe,SAAS,GAEtBsC,KAAuB,CAACC,MAA4B;AACpD,MAAA,CAACA,EAAwB,QAAA;AAEzB,MAAA;AACF,UAAMC,IAAa,OAAO,aAAa,QAAQD,CAAe;AAC1D,WAACC,IAEc,KAAK,MAAMA,CAAU,IAFhB;AAAA,WAKjBC,GAAO;AACN,mBAAA,MAAM,oCAAoCA,CAAK,GAChD;AAAA,EAAA;AAEX,GAEMC,KAAqB,CACzBjB,GACAkB,GACAC,GACAC,MACG;AACH,MAAID,EAAsB,iBAAiB;AACzC,UAAME,IAA4B;AAAA,MAChC,OAAArB;AAAA,MACA,aAAa,KAAK,IAAI;AAAA,MACtB,sBACEzB,EAAe,SAAS,EAAE,cAAc2C,CAAO,IAAI,CAAC,GAAG;AAAA,MACzD,iBAAiB3C,EAAe,SAAS,EAAE,YAAY2C,CAAO;AAAA,IAChE,GAEMI,IAAaH,EAAsB,YACrC,GAAGC,CAAS,IAAIF,CAAO,IAAIC,EAAsB,eAAe,KAChED;AAEJ,WAAO,aAAa,QAAQI,GAAY,KAAK,UAAUD,CAAI,CAAC;AAAA,EAAA;AAEhE,GASME,KAAoB,CACxBL,GACAhC,GACAsC,GACAC,GACA9B,GACAyB,MACG;AAEH,QAAMM,IAAU;AAAA,IACd,cAAAxC;AAAA,IACA,cAAcyC;AAAA,MACZT;AAAA,MACAO;AAAA,MACA9B;AAAA,MACAyB;AAAA,IACF;AAAA,IACA,OAAOI;AAAA,EACT;AAEA,EAAAI,EAAgB,MAAM;AACK,IAAAnB,GAAAS,GAASQ,EAAQ,YAAY,GACtCtB,EAAAc,GAASQ,EAAQ,YAAY,GACpCrB,EAAAa,GAASQ,EAAQ,KAAK;AAAA,EAAA,CAChC;AACH,GAEMG,KAAmB,CAACX,MAAoB;AAC5C,QAAMY,IAAavD,EAAe,SAAW,EAAA,gBAAgB,IAAI2C,CAAO;AACxE,MAAI,CAACY,EAAY;AAGX,QAAAJ,wBAAc,IAAgB;AACzB,EAAAI,EAAA,WAAW,QAAQ,CAACC,MAAc;AAC3C,IAAAL,EAAQ,IAAI,MAAMK,EAAU,YAAA,CAAa;AAAA,EAAA,CAC1C,GAGD,eAAe,MAAM;AACnB,IAAAH,EAAgB,MAAM;AACpB,MAAAF,EAAQ,QAAQ,CAACM,MAAWA,EAAA,CAAQ;AAAA,IAAA,CACrC;AAAA,EAAA,CACF;AACH,GAEaC,KAAkB,CAAC7D,GAAkBuB,MAAwB;AACxE,QAAMmC,IAAavD,EAAe,SAAW,EAAA,gBAAgB,IAAIH,CAAQ;AACzE,MAAI0D,GAAY;AACd,UAAMI,IAAkB,GAAG9D,CAAQ,OAAOuB,CAAW,IAC/CoC,IAAYD,EAAW,WAAW,IAAII,CAAe;AAE3D,IAAIH,KAGFA,EAAU,YAAY;AAAA,EACxB;AAEJ;AAEO,SAAS7B,GACdiC,GACA;AAAA,EACE,UAAA/D;AAAA,EACA,YAAAgE;AAAA,EACA,cAAAC;AAAAA,EACA,cAAAlD;AAAA,EACA,YAAAmD;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAA7C;AAAA,EACA,iBAAAmB;AAAA,EACA,WAAA2B;AAAA,EACA,YAAAC;AACF,IAGgC,IAChC;AACA,QAAM,CAACC,GAAeC,CAAW,IAAIhD,EAAS,CAAA,CAAE,GAC1C,EAAE,WAAAwB,EAAU,IAAIyB,GAAc;AAEhC,MAAAC,IAAa,CAAA1E;AACjB,QAAM,CAAC8C,CAAO,IAAItB,EAASxB,KAAYyB,IAAQ,GACzCkD,IAAWxE,EAAe,SAAS,EAAE,SAAS2C,CAAO,GACrD8B,IAAsBC,EAAW,oBAAA,KAAa,GAC9CC,IAAiBD,EAAOtD,KAAeE,GAAA,CAAQ,GAC/CsD,IAA0BF,EAAY,IAAI;AACxB,EAAAE,EAAA,UAAU7E,GAAkB4C,CAAiB,GAErEkC,EAAU,MAAM;AACd,QAAIV,KAAcA,EAAW,aAAaxB,KAAWwB,EAAW,OAAO,CAAC,GAAG;AAEhE,MAAArC,EAAAa,GAAS,CAACmC,OAAoB;AAAA,QACrC,GAAGA;AAAA,QACH,CAACX,EAAW,KAAM,CAAC,CAAE,GAAGA,EAAW;AAAA,MAAA,EACnC;AAGI,YAAAY,IAAU,GAAGZ,EAAW,QAAQ,IAAIA,EAAW,KAAK,KAAK,GAAG,CAAC;AACpD,MAAAnE,EAAA,SAAA,EAAW,YAAY+E,GAAS;AAAA,QAC7C,WAAWZ,EAAW;AAAA,QACtB,QAAQA,EAAW;AAAA,MAAA,CACpB;AAAA,IAAA;AAAA,EACH,GACC,CAACA,CAAU,CAAC,GAEfU,EAAU,MAAM;AACd,IAAAjF,GAAmB+C,GAAmB;AAAA,MACpC,WAAAuB;AAAA,IAAA,CACD;AACD,QAAIc,IAAY;AAChB,IAAIzC,MACUyC,IAAA1C;AAAA,MACVO,IAAY,MAAMF,IAAU,MAAMJ;AAAA,IACpC;AAEF,QAAIU,IAAW;AACf,IAAIiB,GAAW,iBACbjB,IAAWiB,GAAW,cACd,QAAA,IAAI,YAAYjB,CAAQ,GAC5B+B,KACEA,EAAU,eAAeA,EAAU,wBAAwB,OAC7D/B,IAAW+B,EAAU,QAGzBhC;AAAA,MACEL;AAAA,MACAuB,GAAW;AAAA,MACXjB;AAAA,MACAC;AAAA,MACAyB,EAAe;AAAA,MACf9B;AAAA,IACF,GACQ,QAAA,IAAI,eAAeI,CAAQ,GACnC,eAAe,MAAM;AACnB,MAAAoB,EAAY,CAAA,CAAE;AAAA,IAAA,CACf;AAAA,EAEL,GAAG,CAAC9B,GAAiB,GAAI2B,GAAW,gBAAgB,CAAG,CAAA,CAAC,GAExDe,GAAgB,MAAM;AACpB,IAAIV,KACF3E,GAAmB+C,GAAmB;AAAA,MACpC,YAAAkB;AAAA,MACA,cAAAjD;AAAA,MACA,WAAAsD;AAAA,MACA,cAAAJ;AAAAA,MACA,YAAAC;AAAA,IAAA,CACD;AAGH,UAAMmB,IAAU,GAAGvC,CAAO,OAAOgC,EAAe,OAAO,IACjDpB,IAAavD,EAChB,SAAA,EACA,gBAAgB,IAAI2C,CAAO,KAAK;AAAA,MACjC,gCAAgB,IAAI;AAAA,IACtB;AAEW,WAAAY,EAAA,WAAW,IAAI2B,GAAS;AAAA,MACjC,aAAa,MAAMb,EAAY,EAAE;AAAA,MACjC,2BAAW,IAAI;AAAA,MACf,MAAM,CAAC;AAAA,MACP,cAAcL,KAAgB;AAAA,MAC9B,cAAcC,KAAgB,CAAC,aAAa,MAAM;AAAA,IAAA,CACnD,GAEDjE,EAAe,SAAS,EAAE,gBAAgB,IAAI2C,GAASY,CAAU,GAEjEc,EAAY,CAAA,CAAE,GACP,MAAM;AACX,YAAMa,IAAU,GAAGvC,CAAO,OAAOgC,EAAe,OAAO;AAEvD,MAAIpB,MACSA,EAAA,WAAW,OAAO2B,CAAO,GAChC3B,EAAW,WAAW,SAAS,KACjCvD,EAAe,SAAS,EAAE,gBAAgB,OAAO2C,CAAO;AAAA,IAG9D;AAAA,EACF,GAAG,EAAE;AAEL,QAAMO,IAAoB,CACxBiC,GAGAC,GACAC,GACAC,MACG;AACC,QAAA,MAAM,QAAQF,CAAI,GAAG;AACvB,YAAMG,IAAU,GAAG5C,CAAO,IAAIyC,EAAK,KAAK,GAAG,CAAC;AACxB,MAAAX,EAAA,QAAQ,IAAIc,CAAO;AAAA,IAAA;AAEhC,IAAAzD,EAAAa,GAAS,CAAC6C,MAA4B;AAC7C,YAAMC,IAAUC,GAAyBP,CAAkB,IACvDA,EAAmBK,CAAyB,IAC5CL,GAEEQ,IAAW,GAAGhD,CAAO,IAAIyC,EAAK,KAAK,GAAG,CAAC;AAC7C,UAAIO,GAAU;AACZ,YAAIC,IAAmB,IACnBC,IAAW7F,EACZ,SACA,EAAA,kBAAkB,IAAI2F,CAAQ;AAG9B,aAAA,CAACE,KAAYA,EAAS,SAAS,OAC/BR,EAAU,eAAe,YAAYA,EAAU,eAAe,QAC/D;AAEA,gBAAMS,IAAYV,EAAK,MAAM,GAAG,EAAE,GAC5BW,IAAaC,EAAeP,GAASK,CAAS;AAEhD,cAAA,MAAM,QAAQC,CAAU,GAAG;AACV,YAAAH,IAAA;AACnB,kBAAMK,IAAgB,GAAGtD,CAAO,IAAImD,EAAU,KAAK,GAAG,CAAC;AACvD,YAAAD,IAAW7F,EACR,SAAA,EACA,kBAAkB,IAAIiG,CAAa;AAAA,UAAA;AAAA,QACxC;AAGF,YAAIJ,GAAU;AACZ,gBAAMK,IAAWN,IACbI,EAAeP,GAASL,EAAK,MAAM,GAAG,EAAE,CAAC,IACzCY,EAAeP,GAASL,CAAI;AAChC,UAAAS,EAAS,QAAQ,CAAC,EAAE,UAAAM,GAAU,UAAAC,GAAU,QAAAC,QAAa;AACnD,kBAAMC,IAAS,SAAS;AAAA,cACtB,oBAAoBH,CAAQ;AAAA,YAC9B;AACA,gBAAIG,GAAQ;AACV,oBAAMC,KAAa,MAAM,KAAKD,EAAO,UAAU;AAC3C,kBAAAC,GAAWH,CAAQ,GAAG;AAClB,sBAAAI,KAAeH,IACjB,IAAI,SAAS,SAAS,WAAWA,CAAM,UAAU,EAAEH,CAAQ,IAC3DA;AACJ,gBAAAK,GAAWH,CAAQ,EAAE,cAAc,OAAOI,EAAY;AAAA,cAAA;AAAA,YACxD;AAAA,UACF,CACD;AAAA,QAAA;AAAA,MACH;AAEF,MACEnB,EAAU,eAAe,aACxBC,KAAiBV,EAAwB,SAAS,kBACnDQ,KAEAhD;AAAA,SACGkD,KAAiBV,EAAwB,SAAS,iBACjD,MACAQ,EAAK,KAAK,GAAG;AAAA,MACjB;AAEF,YAAMqB,IAAoBrB,EAAK,MAAM,GAAGA,EAAK,SAAS,CAAC;AACvD,MACEC,EAAU,eAAe,SACzBT,EAAwB,SAAS,iBAEjCxC;AAAA,QACEwC,EAAwB,SAAS,gBAC/B,MACA6B,EAAkB,KAAK,GAAG;AAAA,MAC9B,GAGApB,EAAU,eAAe,YACzBT,EAAwB,SAAS,iBAEb5C;AAAA,QAClB4C,EAAwB,SAAS,gBAC/B,MACA6B,EAAkB,KAAK,GAAG;AAAA,MAC9B,EAIc,OAAO,CAAC,CAACC,GAAGC,CAAC,MAAM;AAC/B,YAAIC,IAASF,GAAG,MAAM,GAAG,EAAE;AAGzB,YAAAA,KAAKD,EAAkB,KAAK,GAAG,KAC/BG,KAAUH,EAAkB,SAAS,GACrC;AAEI,cAAAI,IAASH,IAAI,MAAMD;AACvB,UAAArE,EAAsBsE,CAAE,GACxBvE,GAAmB0E,GAAQF,CAAE;AAAA,QAAA;AAAA,MAC/B,CACD;AAGG,YAAAG,IAAWd,EAAeR,GAAWJ,CAAI,GACzCc,KAAWF,EAAeP,GAASL,CAAI,GACvC2B,KACJ1B,EAAU,eAAe,WACrBD,EAAK,KAAK,GAAG,IACb,CAAC,GAAGA,CAAI,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,GAC/B7B,IAAavD,EAAe,SAAW,EAAA,gBAAgB,IAAI2C,CAAO;AAKxE,UAJI9C,KAAY,WACN,QAAA,IAAI,WAAW8C,CAAO,GACtB,QAAA,IAAI,cAAcY,CAAU,IAElCA;AACF,mBAAW,CAAC9C,GAAK+C,CAAS,KAAKD,EAAW,WAAW,WAAW;AAC9D,cAAIyD,IAAe;AACb,gBAAAC,IAAgB,MAAM,QAAQzD,EAAU,YAAY,IACtDA,EAAU,eACV,CAACA,EAAU,gBAAgB,WAAW;AAGtC,cAAA,CAAAyD,EAAc,SAAS,MAAM,GAK7B;AAAA,gBAAAA,EAAc,SAAS,KAAK,GAAG;AACjC,6BAAe,MAAM;AACnB,gBAAAzD,EAAU,YAAY;AAAA,cAAA,CACvB;AACD;AAAA,YACA;AAcF,gBAVIyD,EAAc,SAAS,WAAW,KAElCzD,EAAU,UACTA,EAAU,MAAM,IAAIuD,EAAW,KAAKvD,EAAU,MAAM,IAAI,EAAE,OAE5CwD,IAAA,KAKf,CAACA,KAAgBC,EAAc,SAAS,MAAM,KAC5CzD,EAAU,cAAc;AACpB,oBAAA0D,IAAa1D,EAAU,aAAaiC,CAAO;AAE7C,cAAA,OAAOyB,KAAe,YACpBA,MACaF,IAAA,MAEPG,EAAY3D,EAAU,MAAM0D,CAAU,MAChD1D,EAAU,OAAO0D,GACFF,IAAA;AAAA,YACjB;AAIJ,YAAIA,KACFxD,EAAU,YAAY;AAAA;AAAA,QACxB;AAKJ,YAAM4D,KAAY;AAAA,QAChB,WAHgB,KAAK,IAAI;AAAA,QAIzB,UAAUzE;AAAA,QACV,MAAAyC;AAAA,QACA,YAAYC,EAAU;AAAA,QACtB,QAAQ;AAAA,QACR,UAAAyB;AAAA,QACA,UAAAZ;AAAA,MACF;AAyCI,UAvCQjE,GAAAU,GAAS,CAAC0E,MAAa;AAIjC,cAAMC,IAHO,CAAC,GAAID,KAAY,CAAA,GAAKD,EAAS,EAGhB,OAAO,CAACG,GAAKC,MAAQ;AACzC,gBAAAC,IAAY,GAAGD,EAAI,QAAQ,IAAI,KAAK,UAAUA,EAAI,IAAI,CAAC,IACvDE,IAAWH,EAAI,IAAIE,CAAS;AAElC,iBAAIC,KAEFA,EAAS,YAAY,KAAK,IAAIA,EAAS,WAAWF,EAAI,SAAS,GAC/DE,EAAS,WAAWF,EAAI,UACfE,EAAA,WAAWA,EAAS,YAAYF,EAAI,UAC7CE,EAAS,aAAaF,EAAI,cAG1BD,EAAI,IAAIE,GAAW,EAAE,GAAID,GAAa,GAGjCD;AAAA,QAAA,GACF,oBAAA,IAAA,CAA+B;AAGtC,eAAO,MAAM,KAAKD,EAAe,OAAA,CAAQ;AAAA,MAAA,CAC1C,GAED5E;AAAA,QACE+C;AAAA,QACA9C;AAAA,QACAiC,EAAwB;AAAA,QACxB/B;AAAA,MACF,GAEIkB,KACSA,EAAA;AAAA,QACT,WAAWS;AAAA,QACX,QAAQ4C;AAAA,MAAA,CACT,GAECxC,EAAwB,SAAS,YAAY;AAC/C,cAAM+C,IAAmB3H,EAAe,SAAS,EAAE,YAAY2C,CAAO,GAChEkB,IAAae,EAAwB,SAAS;AACpD,QAAAvC,GAAqBM,GAAS;AAAA,UAC5B,SACE,OAAOkB,EAAW,WAAW,WACzBA,EAAW,UACXA,EAAW,QAAQ,EAAE,OAAO4B,EAAA,CAAS;AAAA,UAC3C,eAAekC;AAAA,UACf,iBAAiB,KAAK,IAAI,KAAK9D,EAAW,YAAY;AAAA,UACtD,QAAQ;AAAA,QAAA,CACT;AAAA,MAAA;AAGI,aAAA4B;AAAA,IAAA,CACR;AAAA,EACH;AACA,EAAKzF,EAAe,SAAW,EAAA,aAAa2C,CAAO,MACjDd;AAAA,IACEc;AAAA,IACAS;AAAA,MACET;AAAA,MACAO;AAAA,MACAyB,EAAe;AAAA,MACf9B;AAAA,IAAA;AAAA,EAEJ,GACK7C,EAAe,SAAW,EAAA,eAAe2C,CAAO,KACnDb,EAASa,GAASiB,CAAW,GAE1B5D,EAAe,SAAW,EAAA,mBAAmB2C,CAAO,KACvDT,GAAyBS,GAASiB,CAAW;AAI3C,QAAAgE,IAAeC,GAAQ,MAEpBzE;AAAA,IACLT;AAAA,IACAO;AAAA,IACAyB,EAAe;AAAA,IACf9B;AAAA,EACF,GACC,CAACF,CAAO,CAAC;AAEZ,SAAO,CAACZ,GAAYY,CAAO,GAAGiF,CAAY;AAI5C;AAEA,SAASxE,EACPvD,GACAqD,GACA9B,GACAyB,GACgB;AAMV,QAAAiF,wBAAiB,IAAwB;AAC/C,MAAIC,IAAe;AAGb,QAAAC,IAAsB,CAAC5C,MAAmB;AACxC,UAAAG,IAAUH,EAAK,KAAK,GAAG;AAClB,eAAA,CAAC3E,CAAG,KAAKqH;AAClB,OAAIrH,MAAQ8E,KAAW9E,EAAI,WAAW8E,IAAU,GAAG,MACjDuC,EAAW,OAAOrH,CAAG;AAGzB,IAAAsH;AAAA,EACF,GAEME,wBAAuB,IAAoB,GAE3CC,IAAU;AAAA,IACd,kBAAkB,CAACC,MAAqC;AACtD,MAAIA,GAAK,iBACP/F,EAAsB+F,EAAI,aAAa;AAAA,IAE3C;AAAA,IAEA,sBAAsB,CAACA,MAAqC;AAC1D,YAAMC,IAAOpI,EACV,SACA,EAAA,kBAAkBH,CAAQ,GAAG;AAChC,MAAIuI,GAAM,OACRhG,EAAsBgG,GAAM,GAAG,GAG7BD,GAAK,iBACP/F,EAAsB+F,EAAI,aAAa;AAGzC,YAAMxH,IACJX,EAAe,SAAS,EAAE,mBAAmBH,CAAQ;AAGvD,MAAAiI,EAAW,MAAM,GACjBC;AAEA,YAAMM,IAAWC,EAAkB3H,GAAc,EAAE;AAEnD,MAAA0C,EAAgB,MAAM;AACpB,QAAAxB,EAAgBhC,GAAUwI,CAAQ,GAClCvG,EAASjC,GAAUc,CAAY;AAC/B,cAAM4C,IAAavD,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAC/B,QAAI0D,KACSA,EAAA,WAAW,QAAQ,CAACC,MAAc;AAC3C,UAAAA,EAAU,YAAY;AAAA,QAAA,CACvB;AAEG,cAAA+E,IAAmBxI,GAAkBF,CAAkB;AAC7D,QAAI0I,GAAkB,mBACP,aAAA;AAAA,UACXA,GAAkB,YACd1F,IACE,MACAhD,IACA,MACA0I,GAAkB,kBACpB1I;AAAA,QACN,GAEF,aAAa,WAAWA,CAAQ;AAAA,MAAA,CACjC;AAAA,IACH;AAAA,IACA,oBAAoB,CAACoD,MAAgB;AAEnC,MAAA6E,EAAW,MAAM,GACjBC;AAEA,YAAMS,IAAkBpF;AAAA,QACtBvD;AAAA,QACAqD;AAAA,QACA9B;AAAA,QACAyB;AAAA,MACF;AACA,aAAAQ,EAAgB,MAAM;AACpB,QAAAnB,GAAyBrC,GAAUoD,CAAQ,GAC3CpB,EAAgBhC,GAAU2I,CAAe,GACzC1G,EAASjC,GAAUoD,CAAQ;AAC3B,cAAMM,IAAavD,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAC/B,QAAI0D,KACSA,EAAA,WAAW,QAAQ,CAACC,MAAc;AAC3C,UAAAA,EAAU,YAAY;AAAA,QAAA,CACvB,GAEH,aAAa,WAAW3D,CAAQ;AAAA,MAAA,CACjC,GACM;AAAA,QACL,SAAS,CAAC4I,MAAmBD,EAAgB,MAAMC,CAAK;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,eAAezI,EAAe,WAAW,mBAAmBH,CAAQ;AAAA,IACpE,cAAcG,EAAe,WAAW,YAAYH,CAAQ;AAAA,IAC5D,YAAYG,EAAe,WAAW,gBAAgBH,CAAQ;AAAA,IAC9D,iBAAiB,MAAM;AACrB,YAAM6I,IAAc1I,EAAe,SAAS,EAAE,YAAYH,CAAQ;AAC3D,aAAA,GACL6I,KAAevB,EAAYuB,GAAa3G,GAAYlC,CAAQ,CAAC;AAAA,IAC/D;AAAA,EAEJ;AAEA,WAASyI,EACPK,GACAvD,IAAiB,CAAA,GACjBwD,GACK;AACL,UAAMC,IAAWzD,EAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAGtB,IAAA0C,EAAW,IAAIe,CAAQ;AAK3C,UAAMC,IAAU;AAAA,MACd,IAAIC,GAAaC,GAAc;AAE3B,YAAAA,MAAS,UACT,CAACA,EAAK,WAAW,GAAG,KACpBA,MAAS,oBACT;AACM,gBAAAC,IAAc7D,EAAK,KAAK,GAAG,GAC3BzB,IAAkB,GAAG9D,CAAQ,OAAOuB,CAAW,IAE/CmC,IAAavD,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAE/B,cAAI0D,GAAY;AACd,kBAAMC,IAAYD,EAAW,WAAW,IAAII,CAAe;AAE3D,YAAIH,MAEE4B,EAAK,SAAS,KAAK4D,MAAS,UACpBxF,EAAA,MAAM,IAAIyF,CAAW;AAAA,UAGnC;AAAA,QACF;AAEF,YAAID,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMZ,IAAOpI,EACV,SACA,EAAA,kBAAkBH,CAAQ,GAAG;AAE5B,gBAAA,CAACuI,GAAM;AACH,oBAAA,IAAI,MAAM,0BAA0B;AAMrC,mBAJQpI,EACZ,SAAA,EACA,oBAAoBoI,EAAK,MAAM,MAAMhD,EAAK,KAAK,GAAG,CAAC;AAAA,UAGxD;AAEE,YAAA,MAAM,QAAQuD,CAAY,GAAG;AAC/B,cAAIK,MAAS;AACX,mBAAO,MAAM;AACX,oBAAME,IAAgBjB,EAAiB,IAAI7C,EAAK,KAAK,GAAG,CAAC;AACrD,kBAAA8D,MAAkB;AACf,uBAAAZ;AAAA,kBACLK,EAAaO,CAAa;AAAA,kBAC1B,CAAC,GAAG9D,GAAM8D,EAAc,UAAU;AAAA,kBAClCN;AAAA,gBACF;AAAA,YACF;AAGE,cAAAI,MAAS,cAAcA,MAAS;AAClC,mBAAO,CACLG,MAOG;AACG,oBAAAC,IAAaR,GAAM,UAAU;AAAA,gBACjC,CAACS,MAAMA,EAAE,KAAK,GAAG,MAAMjE,EAAK,KAAK,GAAG;AAAA,cACtC,GACMkE,IAAaF,IACfT,IACA3I,EAAe,WAAW,eAAeH,GAAUuF,CAAI;AAE3D,qBAAI4D,MAAS,uBACXlB,EAAW,MAAM,GACjBC,MAGKuB,EAAW,IAAI,CAACC,GAAUC,MAAkB;AACjD,sBAAMC,IACJL,KAAcG,EAAI,cAAcA,EAAI,cAAcC,GAC9CE,IAAepB;AAAA,kBACnBiB;AAAA,kBACA,CAAC,GAAGnE,GAAMqE,EAAU,UAAU;AAAA,kBAC9Bb;AAAA,gBACF;AACO,uBAAAO;AAAA,kBACLI;AAAA,kBACAG;AAAA,kBACAF;AAAA,kBACAb;AAAA,kBACAL,EAAkBK,GAAqBvD,GAAMwD,CAAI;AAAA,gBACnD;AAAA,cAAA,CACD;AAAA,YACH;AAEF,cAAII,MAAS;AACX,mBAAO,CACLG,MAQOQ,EAAcC,IAAmB;AAAA,cACtC,OAAO;AAAA,gBACL,WAAW/J;AAAA,gBACX,OAAOuF;AAAA,gBACP,QAAQ+D;AAAA;AAAA,cACV;AAAA,cAEA,mBAAAb;AAAA,YAAA,CACD;AAGL,cAAIU,MAAS;AACX,mBAAO,CAACa,MAAsB;AAItB,oBAAAP,IAHaV,GAAM,UAAU;AAAA,gBACjC,CAACS,MAAMA,EAAE,KAAK,GAAG,MAAMjE,EAAK,KAAK,GAAG;AAAA,cACtC,IAEIuD,IACA3I,EAAe,WAAW,eAAeH,GAAUuF,CAAI;AAG3D,cAAA0C,EAAW,MAAM,GACjBC;AAEA,oBAAM+B,IAAmBR,EAAW;AAAA,gBAClC,CAACC,GAAUC,MACFD,EAAIM,CAAS,KAAK,CAAC;AAAA,cAE9B;AAEO,qBAAAvB;AAAA,gBACLwB;AAAA,gBACA,CAAC,GAAG1E,GAAM,OAAOyE,CAAS;AAAA,gBAC1BjB;AAAA,cACF;AAAA,YACF;AAGF,cAAII,MAAS;AACJ,mBAAA,CACLrG,GACAoH,MACG;AACH,oBAAMC,IAAarB,EAAa;AAAA,gBAC9B,CAACR,MAAaA,EAAIxF,CAAO,MAAMoH;AAAA,cACjC;AACI,kBAAAC,MAAe,GAAW;AACxB,oBAAAC,IAAatB,EAAaqB,CAAU,GACpCE,IAAU,CAAC,GAAG9E,GAAM4E,EAAW,UAAU;AAO/C,qBAAAlC,EAAW,MAAM,GACjBC,KAGAD,EAAW,MAAM,GACjBC,KAEOO,EAAkB2B,GAAYC,CAAO;AAAA,YAC9C;AAGF,cAAIlB,MAAS;AACX,mBAAO,CAACQ,MAAkB;AAClB,oBAAAW,IAAaxB,EAAaa,CAAK;AAC9B,qBAAAlB,EAAkB6B,GAAY,CAAC,GAAG/E,GAAMoE,EAAM,SAAA,CAAU,CAAC;AAAA,YAClE;AAGF,cAAIR,MAAS;AACX,mBAAO,CAACvD,OAENuC,EAAoB5C,CAAI,GACfgF,GAAAlH,GAAmBuC,GAASL,GAAMvF,CAAQ,GAC5CyI;AAAA,cACLtI,EAAe,SAAA,EAAW,eAAeH,CAAQ;AAAA,cACjD,CAAA;AAAA,YACF;AAIJ,cAAImJ,MAAS;AACJ,mBAAA,CACLvD,GACA4E,GACAC,MACG;AACH,oBAAMC,IAAevK,EAClB,SACA,EAAA,eAAeH,GAAUuF,CAAI,GAC1Bc,IAAWR,GAAcD,CAAO,IAClCA,EAAQ8E,CAAmB,IAC1B9E;AAEL,kBAAI+E,IAAmB;AAkBvB,kBAjBiB,CAACD,EAAa,KAAK,CAACE,MAAS;AAC5C,oBAAIJ,GAAQ;AACV,wBAAMK,IAAUL,EAAO;AAAA,oBAAM,CAAC5B,MAC5BtB,EAAYsD,EAAKhC,CAAK,GAAGvC,EAASuC,CAAK,CAAC;AAAA,kBAC1C;AACA,yBAAIiC,MACYF,IAAAC,IAETC;AAAAA,gBAAA;AAEH,sBAAAA,IAAUvD,EAAYsD,GAAMvE,CAAQ;AAC1C,uBAAIwE,MACYF,IAAAC,IAETC;AAAA,cAAA,CACR;AAGC,gBAAA1C,EAAoB5C,CAAI,GACfgF,GAAAlH,GAAmBgD,GAAUd,GAAMvF,CAAQ;AAAA,uBAC3CyK,KAAWE,GAAa;AAC3B,sBAAAG,IAAcL,EAAQE,CAAW,GACjCI,IAAeL,EAAa;AAAA,kBAAI,CAACE,MACrCtD,EAAYsD,GAAMD,CAAW,IAAIG,IAAcF;AAAA,gBACjD;AACA,gBAAAzC,EAAoB5C,CAAI,GACfyF,EAAA3H,GAAmB0H,GAAqBxF,CAAI;AAAA,cAAA;AAAA,YAEzD;AAGF,cAAI4D,MAAS;AACJ,mBAAA,CAACQ,GAAepJ,MAAwC;AAC7D,cAAIA,GAAS,gBAEb4H,EAAoB5C,CAAI,GAChB0F,GAAA5H,GAAmBkC,GAAMvF,GAAU2J,CAAK;AAAA,YAClD;AAGF,cAAIR,MAAS;AACX,mBAAO,CACLG,MAIG;AACH,oBAAM4B,IAASpC,EAAa,IAAI,CAAChC,GAAQqE,OAAe;AAAA,gBACtD,GAAGrE;AAAA,gBACH,aAAaqE,EAAE,SAAS;AAAA,cAAA,EACxB,GAEIC,IAAyB,CAAC,GAC1BC,IAA6C,CAAC;AAEpD,uBAASF,IAAI,GAAGA,IAAID,EAAO,QAAQC;AACjC,gBAAI7B,EAAW4B,EAAOC,CAAC,GAAGA,CAAC,MACzBC,EAAa,KAAKD,CAAC,GACLE,EAAA,KAAKH,EAAOC,CAAC,CAAC;AAKhC,qBAAAlD,EAAW,MAAM,GACjBC,KACOO,EAAkB4C,GAAsB9F,GAAM;AAAA,gBACnD,UAAU,CAAC,GAAIwD,GAAM,YAAY,CAAA,GAAKxD,CAAI;AAAA,gBAC1C,cAAA6F;AAAA;AAAA,cAAA,CACD;AAAA,YACH;AAAA,QACF;AAEF,cAAME,IAAkB/F,EAAKA,EAAK,SAAS,CAAC;AAC5C,YAAI,CAAC,MAAM,OAAO+F,CAAe,CAAC,GAAG;AACnC,gBAAMC,IAAahG,EAAK,MAAM,GAAG,EAAE,GAC7BiG,IAAcrL,EACjB,SACA,EAAA,eAAeH,GAAUuL,CAAU;AAEtC,cAAI,MAAM,QAAQC,CAAW,KAAKrC,MAAS;AACzC,mBAAO,MACL8B;AAAA,cACE5H;AAAA,cACAkI;AAAA,cACAvL;AAAA,cACA,OAAOsL,CAAe;AAAA,YACxB;AAAA,QACJ;AAGF,YAAInC,MAAS;AACX,iBAAO,MAAMhJ,EAAe,SAAA,EAAW,eAAeH,GAAUuF,CAAI;AAEtE,YAAI4D,MAAS;AACJ,iBAAA,CAACsC,MACNC,EAAY;AAAA,YACV,WAAW1L;AAAA,YACX,OAAOuF;AAAA,YACP,SAASkG,EAAG,SAAS;AAAA,UAAA,CACtB;AAGL,YAAItC,MAAS;AACJ,iBAAA,CAACsC,MACNC,EAAY;AAAA,YACV,WAAW1L;AAAA,YACX,OAAOuF;AAAA,YACP,SAASkG,EAAG,SAAS;AAAA,UAAA,CACtB;AAGL,YAAItC,MAAS;AACX,iBAAO,MACLuC,EAAY;AAAA,YACV,WAAW1L;AAAA,YACX,OAAOuF;AAAA,UAAA,CACR;AAEL,YAAI4D,MAAS,cAAc;AACzB,gBAAMjE,IAAU,GAAGlF,CAAQ,IAAIuF,EAAK,KAAK,GAAG,CAAC;AAC7C,iBAAOpF,EAAe,WAAW,YAAY+E,CAAO;AAAA,QAAA;AAGtD,YAAIiE,MAAS,aAAa;AACxB,gBAAMoC,IAAahG,EAAK,MAAM,GAAG,EAAE,GAC7BoG,IAAYJ,EAAW,KAAK,GAAG,GAC/B9E,IAAStG,EACZ,SACA,EAAA,eAAeH,GAAUuL,CAAU;AAClC,iBAAA,MAAM,QAAQ9E,CAAM,IACD,OAAOlB,EAAKA,EAAK,SAAS,CAAC,CAAC,MACzB6C,EAAiB,IAAIuD,CAAS,IAEjD;AAAA,QAAA;AAET,YAAIxC,KAAQ;AACV,iBAAO,CAACvI,MACN6B,GAAqBO,IAAY,MAAMhD,IAAW,MAAMY,CAAG;AAG/D,YAAIuI,MAAS;AACX,iBAAO,CAACyC,MAAmB;AACzB,kBAAML,IAAahG,EAAK,MAAM,GAAG,EAAE,GAC7BqE,IAAY,OAAOrE,EAAKA,EAAK,SAAS,CAAC,CAAC,GACxCoG,IAAYJ,EAAW,KAAK,GAAG;AACrC,YAAIK,IACexD,EAAA,IAAIuD,GAAW/B,CAAS,IAGzCxB,EAAiB,OAAOuD,CAAS;AAE7B,kBAAAE,IAAS1L,EACZ,SAAS,EACT,eAAeH,GAAU,CAAC,GAAGuL,CAAU,CAAC;AAClC,YAAAP,EAAA3H,GAAmBwI,GAAQN,CAAU,GAG9CpD,EAAoBoD,CAAU;AAAA,UAChC;AAGE,YAAAhG,EAAK,UAAU,GAAG;AACpB,cAAI4D,MAAS;AACX,mBAAO,MAAM;AACX,oBAAMZ,IAAOpI,EACV,SACA,EAAA,kBAAkBH,CAAQ,GAAG,YAC1BsC,IACJnC,EAAe,SAAA,EAAW;AAExB,kBAAA,CAACoI,GAAM;AACH,sBAAA,IAAI,MAAM,sBAAsB;AAGpC,kBAAA,CAACA,GAAM;AACH,sBAAA,IAAI,MAAM,0BAA0B;AAE5C,cAAAhG,EAAsBgG,EAAK,GAAG;AAC9B,oBAAMuD,IACJ3L,EAAe,SAAS,EAAE,eAAeH,CAAQ;AAE/C,kBAAA;AAGF,sBAAM+L,IAAiB5L,EACpB,SACA,EAAA,oBAAoBoI,EAAK,GAAG;AAC3B,gBAAAwD,KAAkBA,EAAe,SAAS,KAC5CA,EAAe,QAAQ,CAAC,CAACC,CAAS,MAAM;AACtC,kBAAIA,KAAaA,EAAU,WAAWzD,EAAK,GAAI,KAC7ChG,EAAsByJ,CAAS;AAAA,gBACjC,CACD;AAIH,sBAAMC,IAAS1D,EAAK,UAAU,UAAUuD,CAAU;AAE9C,uBAACG,EAAO,UAyBL,MAvBaA,EAAO,MAAM,OAErB,QAAQ,CAACrJ,MAAU;AAC3B,wBAAMoJ,IAAYpJ,EAAM,MAClBsJ,IAAetJ,EAAM,SAIrBuJ,IAAgB,CAAC5D,EAAK,KAAK,GAAGyD,CAAS,EAAE,KAAK,GAAG;AAGvD1J,kBAAAA,EAAmB6J,GAAeD,CAAY,GAEtC,QAAA;AAAA,oBACN,uBAAuBC,CAAa,KAAKD,CAAY;AAAA,kBACvD;AAAA,gBAAA,CACD,GAEDzI,GAAiBzD,CAAQ,GAElB;AAAA,uBAIF4C,GAAO;AACN,+BAAA,MAAM,gCAAgCA,CAAK,GAC5C;AAAA,cAAA;AAAA,YAEX;AAEE,cAAAuG,MAAS,eAAuB,QAAA5H;AACpC,cAAI4H,MAAS;AACX,mBAAO,MAAMhJ,EAAiB,EAAA,gBAAgB,IAAIH,CAAQ;AAE5D,cAAImJ,MAAS;AACX,mBAAO,MACEiD,GAAa,WAAW,sBAAsBpM,CAAQ;AAIjE,cAAImJ,MAAS;AACX,mBAAOhJ,EAAe,WAAW,mBAAmBH,CAAQ;AAC9D,cAAImJ,MAAS;AACX,mBAAOhJ,EAAe,WAAW,YAAYH,CAAQ;AACvD,cAAImJ,MAAS;AACX,mBAAOhJ,EAAe,WAAW,gBAAgBH,CAAQ;AAC3D,cAAImJ,MAAS;AACX,mBAAOd,EAAQ;AACb,cAAAc,MAAS,qBAAsB,QAAOd,EAAQ;AAC9C,cAAAc,MAAS,mBAAoB,QAAOd,EAAQ;AAAA,QAAA;AAElD,YAAIc,MAAS;AACX,iBAAO,MACEiD,GACJ,SACA,EAAA,WAAWpM,IAAW,MAAMuF,EAAK,KAAK,GAAG,CAAC;AAIjD,YAAI4D,MAAS;AACX,iBAAO,CAAC;AAAA,YACN,UAAAkD;AAAA,YACA,aAAAC;AAAA,UAAA,MAKA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,UACEF,IAAc,EAAE,YAAY,EAAE,SAAS,SAAS;AAAA,cAElD,MAAA/G;AAAA,cACA,eACEpF,EAAe,WAAW,kBAAkBH,CAAQ,GAChD,YAAY,OAAO;AAAA,cAEzB,UAAAA;AAAA,cACA,cAAc+I,GAAM;AAAA,cAEnB,UAAAsD;AAAA,YAAA;AAAA,UACH;AAIA,YAAAlD,MAAS,YAAoB,QAAAnJ;AAC7B,YAAAmJ,MAAS,QAAgB,QAAA5D;AACzB,YAAA4D,MAAS,kBAAmB,QAAOd,EAAQ;AAE/C,YAAIc,MAAS;AACJ,iBAAA,CAACvD,GAAuB6G,MAAyB;AAEtD,gBAAIA,GAAM;AACR,cAAAC,GAAS,MAAM;AACJ,gBAAA1B,EAAA3H,GAAmBuC,GAASL,GAAM,EAAE;AAC7C,sBAAMc,IAAWlG,EACd,SACA,EAAA,eAAeH,GAAUuF,CAAI;AAChC,gBAAIkH,GAAM,eAAkBA,EAAA,YAAYpG,CAAQ;AAAA,cAAA,GAC/CoG,EAAK,QAAQ;AAAA,iBACX;AACI,cAAAzB,EAAA3H,GAAmBuC,GAASL,GAAM,EAAE;AAC7C,oBAAMc,IAAWlG,EACd,SACA,EAAA,eAAeH,GAAUuF,CAAI;AAChC,cAAIkH,GAAM,eAAkBA,EAAA,YAAYpG,CAAQ;AAAA,YAAA;AAElD,YAAA8B,EAAoB5C,CAAI;AAAA,UAC1B;AAGF,YAAI4D,MAAS;AACJ,iBAAA,CAACwD,GAAuBC,MAE3B,gBAAAL;AAAA,YAACM;AAAA,YAAA;AAAA,cACC,UAAUxJ;AAAA,cACV,UAAArD;AAAA,cACA,MAAAuF;AAAA,cACA,OAAAoH;AAAA,cACA,UAAAC;AAAA,YAAA;AAAA,UACF;AAKN,cAAME,IAAW,CAAC,GAAGvH,GAAM4D,CAAI,GACzB4D,IAAY5M,EACf,SACA,EAAA,eAAeH,GAAU8M,CAAQ;AAC7B,eAAArE,EAAkBsE,GAAWD,GAAU/D,CAAI;AAAA,MAAA;AAAA,IAEtD,GAEMiE,IAAgB,IAAI,MAAM3E,GAA2BY,CAAO;AAElE,WAAAhB,EAAW,IAAIe,GAAU;AAAA,MACvB,OAAOgE;AAAA,MACP,cAAA9E;AAAA,IAAA,CACD,GAEM8E;AAAA,EAAA;AAGF,SAAAvE;AAAA,IACLtI,EAAe,SAAS,EAAE,eAAeH,GAAU,CAAE,CAAA;AAAA,EACvD;AACF;AAEO,SAAS0L,EAAYuB,GAIzB;AACD,SAAOnD,EAAcoD,IAAgB,EAAE,OAAAD,GAAO;AAChD;AAEA,SAASlD,GAAkB;AAAA,EACzB,OAAAkD;AAAA,EAEA,mBAAAxE;AACF,GAkBG;AACD,QAAMmD,IAAQzL,IAAiB,eAAe8M,EAAM,WAAWA,EAAM,KAAK;AAE1E,SADQ,QAAA,IAAI,SAASrB,CAAK,GACrB,MAAM,QAAQA,CAAK,IAGJnD;AAAA,IAClBmD;AAAA,IACAqB,EAAM;AAAA,EACR,EAEmB;AAAA,IACjB,CAACrC,GAAMuC,GAAQxD,GAAOiC,GAAOwB,MAEpBH,EAAM,OAAOrC,GAAMuC,GAAQxD,GAAOiC,GAAOwB,CAAW;AAAA,EAE/D,IAZS;AAaX;AACA,SAASF,GAAe;AAAA,EACtB,OAAAD;AACF,GAMG;AACK,QAAAI,IAAaxI,EAAwB,IAAI,GACzCiB,IAAW,GAAGmH,EAAM,SAAS,IAAIA,EAAM,MAAM,KAAK,GAAG,CAAC;AAE5D,SAAAjI,EAAU,MAAM;AACd,UAAMsI,IAAUD,EAAW;AAC3B,QAAI,CAACC,KAAW,CAACA,EAAQ,cAAe;AAExC,UAAMC,IAAgBD,EAAQ,eAExB/G,IADa,MAAM,KAAKgH,EAAc,UAAU,EAC1B,QAAQD,CAAO;AAEvC,QAAAhH,IAAWiH,EAAc,aAAa,gBAAgB;AAC1D,IAAKjH,MACQA,IAAA,UAAU,OAAO,WAAY,CAAA,IAC1BiH,EAAA,aAAa,kBAAkBjH,CAAQ;AAIvD,UAAMkH,IAAc;AAAA,MAClB,YAFiB,YAAY,OAAO,WAAY,CAAA;AAAA,MAGhD,UAAAlH;AAAA,MACA,UAAAC;AAAA,MACA,QAAQ0G,EAAM;AAAA,IAChB;AAEA,IAAA9M,EAAe,SAAS,EAAE,iBAAiB2F,GAAU0H,CAAW;AAG1D,UAAA5B,IAAQzL,EACX,SAAS,EACT,eAAe8M,EAAM,WAAWA,EAAM,KAAK;AAE1C,QAAAtG;AACJ,QAAIsG,EAAM;AACJ,UAAA;AACF,QAAAtG,IAAe,IAAI;AAAA,UACjB;AAAA,UACA,WAAWsG,EAAM,OAAO;AAAA,UACxBrB,CAAK;AAAA,eACA6B,GAAK;AACJ,gBAAA,MAAM,kDAAkDA,CAAG,GACpD9G,IAAAiF;AAAA,MAAA;AAAA;AAGF,MAAAjF,IAAAiF;AAGjB,IAAIjF,MAAiB,QAAQ,OAAOA,KAAiB,aACpCA,IAAA,KAAK,UAAUA,CAAY;AAG5C,UAAM+G,IAAW,SAAS,eAAe,OAAO/G,CAAY,CAAC;AAC7D,IAAA2G,EAAQ,YAAYI,CAAQ;AAAA,EAAA,GAC3B,CAACT,EAAM,WAAWA,EAAM,MAAM,KAAK,GAAG,GAAGA,EAAM,OAAO,CAAC,GAEnDnD,EAAc,QAAQ;AAAA,IAC3B,KAAKuD;AAAA,IACL,OAAO,EAAE,SAAS,OAAO;AAAA,IACzB,kBAAkBvH;AAAA,EAAA,CACnB;AACH;AACO,SAAS6H,GAAiBV,GAG9B;AACD,QAAMrB,IAAQgC;AAAA,IACZ,CAACC,MAAW;AACJ,YAAAnK,IAAavD,EAChB,SAAS,EACT,gBAAgB,IAAI8M,EAAM,SAAS,KAAK;AAAA,QACzC,gCAAgB,IAAI;AAAA,MACtB;AACW,aAAAvJ,EAAA,WAAW,IAAIuJ,EAAM,WAAW;AAAA,QACzC,aAAaY;AAAA,QACb,2BAAW,IAAI,CAACZ,EAAM,MAAM,KAAK,GAAG,CAAC,CAAC;AAAA,MAAA,CACvC,GACM,MAAMvJ,EAAW,WAAW,OAAOuJ,EAAM,SAAS;AAAA,IAC3D;AAAA,IACA,MAAM9M,EAAe,WAAW,eAAe8M,EAAM,WAAWA,EAAM,KAAK;AAAA,EAC7E;AACA,SAAOnD,EAAc,QAAQ,CAAI,GAAA,OAAO8B,CAAK,CAAC;AAChD;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.15",
3
+ "version": "0.5.16",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -38,6 +38,7 @@
38
38
  "react-dom": "^18.2.0"
39
39
  },
40
40
  "devDependencies": {
41
+ "@types/node": "^22.14.0",
41
42
  "@types/react": "^18.2.0",
42
43
  "@types/react-dom": "^18.2.0",
43
44
  "@types/react-syntax-highlighter": "^15.5.13",