cogsbox-state 0.5.160 → 0.5.161

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.
@@ -50,7 +50,7 @@ const Ye = (e, i) => {
50
50
  options: l,
51
51
  initialOptionsPart: u
52
52
  });
53
- const t = r.getState().cogsStateStore[S] || g[S], v = l?.modifyState ? l.modifyState(t) : t, [P, T] = pe(
53
+ const t = r.getState().cogsStateStore[S] || g[S], v = l?.modifyState ? l.modifyState(t) : t, [P, T] = Fe(
54
54
  v,
55
55
  {
56
56
  stateKey: S,
@@ -77,9 +77,9 @@ const Ye = (e, i) => {
77
77
  getInitialOptions: B,
78
78
  getKeyState: Ie,
79
79
  getValidationErrors: xe,
80
- setStateLog: Ce,
80
+ setStateLog: be,
81
81
  updateInitialStateGlobal: se,
82
- addValidationError: be,
82
+ addValidationError: Ce,
83
83
  removeValidationError: D,
84
84
  setServerSyncActions: Pe
85
85
  } = r.getState(), je = (e, i, y, g) => {
@@ -117,10 +117,10 @@ const Ye = (e, i) => {
117
117
  `${g}-${e}-${u}`
118
118
  );
119
119
  if (I && I.lastUpdated > (I.lastSyncedWithServer || 0))
120
- return q(e, I.state), i?.localStorage?.onChange && i.localStorage.onChange(I.state), ee(e), !0;
120
+ return q(e, I.state), ee(e), !0;
121
121
  }
122
122
  return !1;
123
- }, Fe = (e, i, y, g, u, I) => {
123
+ }, pe = (e, i, y, g, u, I) => {
124
124
  const E = {
125
125
  initialState: i,
126
126
  updaterState: Q(
@@ -150,7 +150,7 @@ const Ye = (e, i) => {
150
150
  u && u.forceUpdate();
151
151
  }
152
152
  };
153
- function pe(e, {
153
+ function Fe(e, {
154
154
  stateKey: i,
155
155
  serverSync: y,
156
156
  localStorage: g,
@@ -192,7 +192,7 @@ function pe(e, {
192
192
  const _ = r.getState().initialStateGlobal[f];
193
193
  if (_ && !U(_, m) || !_) {
194
194
  let h = m;
195
- a && a.lastUpdated > (a.lastSyncedWithServer || 0) && (h = a.state, d?.localStorage?.onChange && d?.localStorage?.onChange(h)), Fe(
195
+ a && a.lastUpdated > (a.lastSyncedWithServer || 0) && (h = a.state, d?.localStorage?.onChange && d?.localStorage?.onChange(h)), pe(
196
196
  f,
197
197
  m,
198
198
  h,
@@ -230,19 +230,19 @@ function pe(e, {
230
230
  z.current.add(h);
231
231
  }
232
232
  q(f, (h) => {
233
- const $ = W(d) ? d(h) : d, F = `${f}-${a.join(".")}`;
234
- if (F) {
235
- let p = !1, w = r.getState().signalDomElements.get(F);
233
+ const $ = W(d) ? d(h) : d, p = `${f}-${a.join(".")}`;
234
+ if (p) {
235
+ let F = !1, w = r.getState().signalDomElements.get(p);
236
236
  if ((!w || w.size === 0) && (c.updateType === "insert" || c.updateType === "cut")) {
237
- const b = a.slice(0, -1), O = L($, b);
237
+ const C = a.slice(0, -1), O = L($, C);
238
238
  if (Array.isArray(O)) {
239
- p = !0;
240
- const N = `${f}-${b.join(".")}`;
239
+ F = !0;
240
+ const N = `${f}-${C.join(".")}`;
241
241
  w = r.getState().signalDomElements.get(N);
242
242
  }
243
243
  }
244
244
  if (w) {
245
- const b = p ? L($, a.slice(0, -1)) : L($, a);
245
+ const C = F ? L($, a.slice(0, -1)) : L($, a);
246
246
  w.forEach(({ parentId: O, position: N, effect: V }) => {
247
247
  const A = document.querySelector(
248
248
  `[data-parent-id="${O}"]`
@@ -250,8 +250,8 @@ function pe(e, {
250
250
  if (A) {
251
251
  const R = Array.from(A.childNodes);
252
252
  if (R[N]) {
253
- const C = V ? new Function("state", `return (${V})(state)`)(b) : b;
254
- R[N].textContent = String(C);
253
+ const b = V ? new Function("state", `return (${V})(state)`)(C) : C;
254
+ R[N].textContent = String(b);
255
255
  }
256
256
  }
257
257
  });
@@ -265,18 +265,18 @@ function pe(e, {
265
265
  k.current?.validationKey + "." + x.join(".")
266
266
  ), c.updateType === "insert" && k.current?.validationKey && xe(
267
267
  k.current?.validationKey + "." + x.join(".")
268
- ).filter(([w, b]) => {
268
+ ).filter(([w, C]) => {
269
269
  let O = w?.split(".").length;
270
270
  if (w == x.join(".") && O == x.length - 1) {
271
271
  let N = w + "." + x;
272
- D(w), be(N, b);
272
+ D(w), Ce(N, C);
273
273
  }
274
274
  });
275
275
  const Z = L(h, a), Ee = L($, a);
276
276
  c.updateType === "update" ? a.join(".") : [...a].slice(0, -1).join(".");
277
277
  const le = r.getState().stateComponents.get(f);
278
278
  if (le) {
279
- const p = ye(h, $), w = new Set(p), b = c.updateType === "update" ? a.join(".") : a.slice(0, -1).join(".") || "";
279
+ const F = ye(h, $), w = new Set(F), C = c.updateType === "update" ? a.join(".") : a.slice(0, -1).join(".") || "";
280
280
  for (const [
281
281
  O,
282
282
  N
@@ -288,38 +288,38 @@ function pe(e, {
288
288
  N.forceUpdate();
289
289
  continue;
290
290
  }
291
- if (A.includes("component") && ((N.paths.has(b) || N.paths.has("")) && (V = !0), !V))
291
+ if (A.includes("component") && ((N.paths.has(C) || N.paths.has("")) && (V = !0), !V))
292
292
  for (const R of w) {
293
- let C = R;
293
+ let b = R;
294
294
  for (; ; ) {
295
- if (N.paths.has(C)) {
295
+ if (N.paths.has(b)) {
296
296
  V = !0;
297
297
  break;
298
298
  }
299
- const te = C.lastIndexOf(".");
299
+ const te = b.lastIndexOf(".");
300
300
  if (te !== -1) {
301
- const ue = C.substring(
301
+ const ue = b.substring(
302
302
  0,
303
303
  te
304
304
  );
305
305
  if (!isNaN(
306
- Number(C.substring(te + 1))
306
+ Number(b.substring(te + 1))
307
307
  ) && N.paths.has(ue)) {
308
308
  V = !0;
309
309
  break;
310
310
  }
311
- C = ue;
311
+ b = ue;
312
312
  } else
313
- C = "";
314
- if (C === "")
313
+ b = "";
314
+ if (b === "")
315
315
  break;
316
316
  }
317
317
  if (V) break;
318
318
  }
319
319
  if (!V && A.includes("deps") && N.depsFunction) {
320
320
  const R = N.depsFunction($);
321
- let C = !1;
322
- typeof R == "boolean" ? R && (C = !0) : U(N.deps, R) || (N.deps = R, C = !0), C && (V = !0);
321
+ let b = !1;
322
+ typeof R == "boolean" ? R && (b = !0) : U(N.deps, R) || (N.deps = R, b = !0), b && (V = !0);
323
323
  }
324
324
  V && N.forceUpdate();
325
325
  }
@@ -334,12 +334,12 @@ function pe(e, {
334
334
  oldValue: Z,
335
335
  newValue: Ee
336
336
  };
337
- if (Ce(f, (p) => {
338
- const b = [...p ?? [], de].reduce((O, N) => {
337
+ if (be(f, (F) => {
338
+ const C = [...F ?? [], de].reduce((O, N) => {
339
339
  const V = `${N.stateKey}:${JSON.stringify(N.path)}`, A = O.get(V);
340
340
  return A ? (A.timeStamp = Math.max(A.timeStamp, N.timeStamp), A.newValue = N.newValue, A.oldValue = A.oldValue ?? N.oldValue, A.updateType = N.updateType) : O.set(V, { ...N }), O;
341
341
  }, /* @__PURE__ */ new Map());
342
- return Array.from(b.values());
342
+ return Array.from(C.values());
343
343
  }), je(
344
344
  $,
345
345
  f,
@@ -349,10 +349,10 @@ function pe(e, {
349
349
  updateLog: s,
350
350
  update: de
351
351
  }), k.current?.serverSync) {
352
- const p = r.getState().serverState[f], w = k.current?.serverSync;
352
+ const F = r.getState().serverState[f], w = k.current?.serverSync;
353
353
  Pe(f, {
354
354
  syncKey: typeof w.syncKey == "string" ? w.syncKey : w.syncKey({ state: $ }),
355
- rollBackState: p,
355
+ rollBackState: F,
356
356
  actionTimeStamp: Date.now() + (w.debounce ?? 3e3),
357
357
  status: "waiting"
358
358
  });
@@ -612,15 +612,15 @@ function Q(e, i, y, g) {
612
612
  );
613
613
  return x && (_ = $), x;
614
614
  }
615
- const F = U($, c);
616
- return F && (_ = $), F;
615
+ const p = U($, c);
616
+ return p && (_ = $), p;
617
617
  }))
618
618
  E(t), ne(i, c, t, e);
619
619
  else if (d && _) {
620
- const $ = d(_), F = a.map(
620
+ const $ = d(_), p = a.map(
621
621
  (x) => U(x, _) ? $ : x
622
622
  );
623
- E(t), J(i, F, t);
623
+ E(t), J(i, p, t);
624
624
  }
625
625
  };
626
626
  if (s === "cut")
@@ -731,8 +731,8 @@ function Q(e, i, y, g) {
731
731
  });
732
732
  const c = n.zodSchema.safeParse(d);
733
733
  return c.success ? !0 : (c.error.errors.forEach((h) => {
734
- const $ = h.path, F = h.message, x = [n.key, ...$].join(".");
735
- o(x, F);
734
+ const $ = h.path, p = h.message, x = [n.key, ...$].join(".");
735
+ o(x, p);
736
736
  }), ee(e), !1);
737
737
  } catch (a) {
738
738
  return console.error("Zod schema validation failed", a), !1;
@@ -888,6 +888,6 @@ export {
888
888
  He as addStateOptions,
889
889
  Ye as createCogsState,
890
890
  Xe as notifyComponent,
891
- pe as useCogsStateFn
891
+ Fe as useCogsStateFn
892
892
  };
893
893
  //# 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 getDifferences,\r\n getNestedValue,\r\n isFunction,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport superjson from \"superjson\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { z } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U, T> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => StateObject<T>;\r\n\r\ntype CutFunctionType<T> = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => StateObject<T>;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\ntype ArraySpecificPrototypeKeys =\r\n | \"concat\"\r\n | \"copyWithin\"\r\n | \"fill\"\r\n | \"find\"\r\n | \"findIndex\"\r\n | \"flat\"\r\n | \"flatMap\"\r\n | \"includes\"\r\n | \"indexOf\"\r\n | \"join\"\r\n | \"keys\"\r\n | \"lastIndexOf\"\r\n | \"map\"\r\n | \"pop\"\r\n | \"push\"\r\n | \"reduce\"\r\n | \"reduceRight\"\r\n | \"reverse\"\r\n | \"shift\"\r\n | \"slice\"\r\n | \"some\"\r\n | \"sort\"\r\n | \"splice\"\r\n | \"unshift\"\r\n | \"values\"\r\n | \"entries\"\r\n | \"every\"\r\n | \"filter\"\r\n | \"forEach\"\r\n | \"with\";\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType<TShape>;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType<TShape>;\r\n cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: InferArrayElement<TShape>,\r\n b: InferArrayElement<TShape>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n clearSelected: () => void;\r\n getSelectedIndex: () => number;\r\n last: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape>;\r\n\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\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<T>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\n\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n getStatus: () => \"fresh\" | \"stale\";\r\n\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 toggleSelected: () => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => void;\r\n sync: () => void;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {});\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n getDifferences: () => string[];\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: UpdateArg<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?: z.ZodTypeAny;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n log?: boolean;\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n sync?: {\r\n action: (state: T) => Promise<{\r\n success: boolean;\r\n data?: any;\r\n error?: any;\r\n errors?: Array<{\r\n path: (string | number)[];\r\n message: string;\r\n }>;\r\n }>;\r\n onSuccess?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n };\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n initialState?: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\n// Fix for the setOptions function\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == \"localStorage\" &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n if (\r\n key == \"initialState\" &&\r\n options[key] &&\r\n mergedOptions[key] !== options[key] && // Different references\r\n !isDeepEqual(mergedOptions[key], options[key]) // And different values\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (\r\n Object.keys(initialOptionsPart).length > 0 ||\r\n (opt && Object.keys(opt).length > 0)\r\n ) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n initialOptionsPart[key].formElements = {\r\n ...opt?.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n const existingOptions = getInitialOptions(key);\r\n\r\n if (!existingOptions) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions(key, initialOptionsPart[key]);\r\n }\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n getGlobalStore.getState().setCreatedState(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initialState: options?.initialState as any,\r\n dependencies: options?.dependencies,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n\r\n if (options.localStorage) {\r\n loadAndApplyLocalStorage(stateKey as string, options);\r\n }\r\n\r\n notifyComponents(stateKey as string);\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions?.log) {\r\n console.log(\r\n \"saving to localstorage\",\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n\r\n const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n\r\n if (key && sessionId) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n // Use SuperJSON serialize to get the json part only\r\n const superJsonResult = superjson.serialize(data);\r\n window.localStorage.setItem(\r\n storageKey,\r\n JSON.stringify(superJsonResult.json)\r\n );\r\n }\r\n};\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 // Parse the json part back normally\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\nconst loadAndApplyLocalStorage = (stateKey: string, options: any) => {\r\n const currentState = getGlobalStore.getState().cogsStateStore[stateKey];\r\n const { sessionId } = useCogsConfig();\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options.localStorage.key(currentState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${stateKey}-${localkey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (localData.lastSyncedWithServer || 0)\r\n ) {\r\n setState(stateKey, localData.state);\r\n\r\n if (options?.localStorage?.onChange) {\r\n options.localStorage.onChange(localData.state);\r\n }\r\n\r\n notifyComponents(stateKey);\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n if (!reactiveTypes?.includes(\"none\")) {\r\n updates.add(() => component.forceUpdate());\r\n }\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes?.includes(\"none\")) {\r\n return;\r\n }\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n initialState?: TStateObject;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n useEffect(() => {\r\n if (initialState) {\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n\r\n // Handle localStorage properly\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localkey\r\n );\r\n }\r\n\r\n const currentGloballyStoredInitialState =\r\n getGlobalStore.getState().initialStateGlobal[thisKey];\r\n\r\n // Only update if the deep contents have actually changed\r\n if (\r\n (currentGloballyStoredInitialState &&\r\n !isDeepEqual(currentGloballyStoredInitialState, initialState)) ||\r\n !currentGloballyStoredInitialState\r\n ) {\r\n let newState = initialState;\r\n\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n if (options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n }\r\n }\r\n\r\n updateGlobalState(\r\n thisKey,\r\n initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n notifyComponents(thisKey);\r\n\r\n const reactiveTypes = Array.isArray(reactiveType)\r\n ? reactiveType\r\n : [reactiveType || \"component\"];\r\n\r\n if (!reactiveTypes.includes(\"none\")) {\r\n forceUpdate({});\r\n }\r\n }\r\n }\r\n }, [initialState, ...(dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initialState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction: UpdateArg<TStateObject>,\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n\r\n if (stateEntry) {\r\n const changedPaths = getDifferences(prevValue, payload);\r\n const changedPathsSet = new Set(changedPaths);\r\n const primaryPathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : path.slice(0, -1).join(\".\") || \"\";\r\n\r\n for (const [\r\n componentKey,\r\n component,\r\n ] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n if (reactiveTypes.includes(\"none\")) continue;\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n continue;\r\n }\r\n\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths.has(primaryPathToCheck) ||\r\n component.paths.has(\"\")\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n let currentPathToCheck = changedPath;\r\n while (true) {\r\n if (component.paths.has(currentPathToCheck)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n const lastDotIndex = currentPathToCheck.lastIndexOf(\".\");\r\n if (lastDotIndex !== -1) {\r\n const parentPath = currentPathToCheck.substring(\r\n 0,\r\n lastDotIndex\r\n );\r\n if (\r\n !isNaN(\r\n Number(currentPathToCheck.substring(lastDotIndex + 1))\r\n )\r\n ) {\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n currentPathToCheck = parentPath;\r\n } else {\r\n currentPathToCheck = \"\";\r\n }\r\n if (currentPathToCheck === \"\") {\r\n break;\r\n }\r\n }\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n let depsChanged = false;\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) depsChanged = true;\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n depsChanged = true;\r\n }\r\n if (depsChanged) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: \"new\" as const,\r\n oldValue,\r\n newValue,\r\n } satisfies UpdateTypeDetail;\r\n\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n\r\n // Aggregate the updates by stateKey and path\r\n const aggregatedLogs = logs.reduce((acc, log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = acc.get(uniqueKey);\r\n\r\n if (existing) {\r\n // Update the existing entry with the most recent details\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue; // Overwrite with the latest value\r\n existing.oldValue = existing.oldValue ?? log.oldValue; // Retain the initial oldValue\r\n existing.updateType = log.updateType; // Update to the most recent type\r\n } else {\r\n // Add the log if no existing match is found\r\n acc.set(uniqueKey, { ...(log as any) });\r\n }\r\n\r\n return acc;\r\n }, new Map<string, typeof newUpdate>());\r\n\r\n // Convert the aggregated map back to an array\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (middleware) {\r\n middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n if (latestInitialOptionsRef.current?.serverSync) {\r\n const serverStateStore = getGlobalStore.getState().serverState[thisKey];\r\n const serverSync = latestInitialOptionsRef.current?.serverSync;\r\n setServerSyncActions(thisKey, {\r\n syncKey:\r\n typeof serverSync.syncKey == \"string\"\r\n ? serverSync.syncKey\r\n : serverSync.syncKey({ state: payload }),\r\n rollBackState: serverStateStore,\r\n actionTimeStamp: Date.now() + (serverSync.debounce ?? 3000),\r\n status: \"waiting\",\r\n });\r\n }\r\n\r\n return payload;\r\n });\r\n };\r\n if (!getGlobalStore.getState().updaterState[thisKey]) {\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n\r\n return initialState;\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n });\r\n\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // Copy properties from baseObj to the function with type assertion\r\n Object.keys(baseObj).forEach((key) => {\r\n (baseFunction as any)[key] = (baseObj as any)[key];\r\n });\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n console.log(\r\n `PROXY APPLY TRAP HIT: stateKey=${stateKey}, path=${path.join(\".\")}`\r\n ); // <--- ADD LOGGING\r\n console.trace(\"Apply trap stack trace\");\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"getDifferences\") {\r\n return () => {\r\n const differences = getDifferences(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n getGlobalStore.getState().initialStateGlobal[stateKey]\r\n );\r\n return differences;\r\n };\r\n }\r\n if (prop === \"sync\" && path.length === 0) {\r\n return async function () {\r\n // Get the options for this state key\r\n const options = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey);\r\n const sync = options?.sync;\r\n\r\n if (!sync) {\r\n console.error(`No mutation defined for state key \"${stateKey}\"`);\r\n return { success: false, error: `No mutation defined` };\r\n }\r\n\r\n // Get the root state\r\n const state = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, []);\r\n\r\n // Get validation key\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n // Execute the mutation action\r\n const response = await sync.action(state);\r\n\r\n // Handle validation errors\r\n if (\r\n response &&\r\n !response.success &&\r\n response.errors &&\r\n validationKey\r\n ) {\r\n // Clear existing errors\r\n getGlobalStore.getState().removeValidationError(validationKey);\r\n\r\n // Add new validation errors\r\n response.errors.forEach((error) => {\r\n const errorPath = [validationKey, ...error.path].join(\".\");\r\n\r\n getGlobalStore\r\n .getState()\r\n .addValidationError(errorPath, error.message);\r\n });\r\n\r\n // Notify components to update\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n }\r\n\r\n // Call success/error callbacks\r\n if (response?.success && sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n } else if (!response?.success && sync.onError) {\r\n sync.onError(response.error);\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) {\r\n sync.onError(error);\r\n }\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n if (prop === \"_status\") {\r\n // Get current state at this path (non-reactive version)\r\n const thisReactiveState = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n }\r\n if (prop === \"getStatus\") {\r\n return function () {\r\n // Get current state at this path (reactive version)\r\n const thisReactiveState = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n );\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n };\r\n }\r\n if (prop === \"removeStorage\") {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n console.log(\"removing storage\", storageKey);\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n };\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n if (prop === \"clearSelected\") {\r\n return () => {\r\n getGlobalStore.getState().clearSelectedIndex({ stateKey, path });\r\n };\r\n }\r\n if (prop === \"getSelectedIndex\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n\r\n return selectedIndex ?? -1;\r\n };\r\n }\r\n if (prop === \"stateSort\") {\r\n return (\r\n compareFn: (\r\n a: InferArrayElement<T>,\r\n b: InferArrayElement<T>\r\n ) => number\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Create a shallow copy with original indices\r\n const arrayCopy = currentArray.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n // Sort the copy using the provided compare function\r\n const sortedArray = [...arrayCopy].sort(compareFn);\r\n\r\n // ADDED: Clear cache for sort operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Return the sorted array with state objects\r\n return rebuildStateShape(sortedArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: sortedArray.map((item) =>\r\n parseInt(item.__origIndex as string)\r\n ),\r\n });\r\n };\r\n }\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex((obj: any) => {\r\n return obj[thisKey] === thisValue;\r\n });\r\n\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n if (prop === \"last\") {\r\n // Added handler for 'last'\r\n return () => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n if (currentArray.length === 0) return undefined;\r\n const lastIndex = currentArray.length - 1;\r\n const lastValue = currentArray[lastIndex];\r\n const newPath = [...path, lastIndex.toString()];\r\n // shapeCache.clear(); // Decide if you need cache invalidation for 'last' access\r\n // stateVersion++;\r\n return rebuildStateShape(lastValue, newPath);\r\n };\r\n }\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n path\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n path\r\n );\r\n };\r\n }\r\n if (prop === \"cutByValue\") {\r\n return (value: string | number | boolean) => {\r\n for (let index = 0; index < currentState.length; index++) {\r\n if (currentState[index] === value) {\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"toggleByValue\") {\r\n return (value: string | number | boolean) => {\r\n const index = currentState.findIndex((item) => item === value);\r\n if (index > -1) {\r\n // Value exists, so cut it\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n } else {\r\n // Value doesn't exist, so insert it\r\n pushFunc(effectiveSetState, value as any, path, stateKey);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Always include validIndices, even if it's an empty array\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: validIndices, // Always pass validIndices, even if empty\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return (\r\n currentIndex ===\r\n getGlobalStore.getState().getSelectedIndex(stateKey, parentKey)\r\n );\r\n }\r\n return undefined;\r\n }\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, thisIndex);\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, undefined);\r\n }\r\n\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (prop === \"toggleSelected\") {\r\n return () => {\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 const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, parentKey);\r\n\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(\r\n stateKey,\r\n parentKey,\r\n selectedIndex === thisIndex ? undefined : thisIndex\r\n );\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","loadAndApplyLocalStorage","notifyComponents","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","isFunction","data","storageKey","superJsonResult","superjson","loadFromLocalStorage","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","syncUpdate","dependencies","reactiveForce","forceUpdate","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","currentGloballyStoredInitialState","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","changedPaths","getDifferences","changedPathsSet","primaryPathToCheck","componentKey","shouldUpdate","reactiveTypes","changedPath","currentPathToCheck","lastDotIndex","parentPath","depsResult","depsChanged","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","serverState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","selectedIndex","compareFn","sortedArray","i","item","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","currentArray","lastIndex","lastValue","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","newVal","validIndices","filteredArray","lastPathElement","parentValue","fn","$cogsSignal","parentKey","nested","thisObject","existingErrors","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":"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"}
1
+ {"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n createElement,\r\n startTransition,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n useSyncExternalStore,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nimport {\r\n debounce,\r\n getDifferences,\r\n getNestedValue,\r\n isFunction,\r\n type GenericObject,\r\n} from \"./utility.js\";\r\nimport {\r\n cutFunc,\r\n FormControlComponent,\r\n pushFunc,\r\n updateFn,\r\n ValidationWrapper,\r\n} from \"./Functions.js\";\r\nimport { isDeepEqual, transformStateFunc } from \"./utility.js\";\r\nimport superjson from \"superjson\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport { z } from \"zod\";\r\n\r\nimport { formRefStore, getGlobalStore, type ComponentsType } from \"./store.js\";\r\nimport { useCogsConfig } from \"./CogsStateClient.js\";\r\n\r\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\r\n\r\nexport type ServerSyncStatus = {\r\n isFresh: boolean;\r\n isFreshTime: number;\r\n isStale: boolean;\r\n isStaleTime: number;\r\n isSyncing: boolean;\r\n isSyncingTime: number;\r\n};\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = {\r\n get: () => T;\r\n\r\n set: UpdateType<T>;\r\n syncStatus: (SyncInfo & { date: Date }) | null;\r\n path: string[];\r\n validationErrors: () => string[];\r\n addValidationError: (message?: string) => void;\r\n\r\n inputProps: {\r\n ref?: React.RefObject<any>;\r\n value?: T extends boolean ? never : T;\r\n onChange?: (\r\n event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\r\n ) => void;\r\n onBlur?: () => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\r\n\r\ntype findWithFuncType<U> = (\r\n thisKey: keyof U,\r\n thisValue: U[keyof U]\r\n) => EndType<U> & StateObject<U>;\r\nexport type PushArgs<U, T> = (\r\n update:\r\n | Prettify<U>\r\n | ((prevState: NonNullable<Prettify<U>>[]) => NonNullable<Prettify<U>>),\r\n opts?: UpdateOpts<U>\r\n) => StateObject<T>;\r\n\r\ntype CutFunctionType<T> = (\r\n index?: number,\r\n options?: { waitForSync?: boolean }\r\n) => StateObject<T>;\r\n\r\nexport type InferArrayElement<T> = T extends (infer U)[] ? U : never;\r\ntype ArraySpecificPrototypeKeys =\r\n | \"concat\"\r\n | \"copyWithin\"\r\n | \"fill\"\r\n | \"find\"\r\n | \"findIndex\"\r\n | \"flat\"\r\n | \"flatMap\"\r\n | \"includes\"\r\n | \"indexOf\"\r\n | \"join\"\r\n | \"keys\"\r\n | \"lastIndexOf\"\r\n | \"map\"\r\n | \"pop\"\r\n | \"push\"\r\n | \"reduce\"\r\n | \"reduceRight\"\r\n | \"reverse\"\r\n | \"shift\"\r\n | \"slice\"\r\n | \"some\"\r\n | \"sort\"\r\n | \"splice\"\r\n | \"unshift\"\r\n | \"values\"\r\n | \"entries\"\r\n | \"every\"\r\n | \"filter\"\r\n | \"forEach\"\r\n | \"with\";\r\n\r\nexport type ArrayEndType<TShape extends unknown> = {\r\n findWith: findWithFuncType<InferArrayElement<TShape>>;\r\n index: (index: number) => StateObject<InferArrayElement<TShape>> & {\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType<TShape>;\r\n _index: number;\r\n } & EndType<InferArrayElement<TShape>>;\r\n insert: PushArgs<InferArrayElement<TShape>, TShape>;\r\n cut: CutFunctionType<TShape>;\r\n cutByValue: (value: string | number | boolean) => void;\r\n toggleByValue: (value: string | number | boolean) => void;\r\n stateSort: (\r\n compareFn: (\r\n a: InferArrayElement<TShape>,\r\n b: InferArrayElement<TShape>\r\n ) => number\r\n ) => ArrayEndType<TShape>;\r\n\r\n stateMapNoRender: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n $stateMap: (\r\n callbackfn: (\r\n value: InferArrayElement<TShape>,\r\n setter: StateObject<InferArrayElement<TShape>>,\r\n index: number,\r\n array: TShape,\r\n arraySetter: StateObject<TShape>\r\n ) => void\r\n ) => any;\r\n stateFlattenOn: <K extends keyof InferArrayElement<TShape>>(\r\n field: K\r\n ) => StateObject<InferArrayElement<InferArrayElement<TShape>[K]>[]>;\r\n uniqueInsert: (\r\n payload: UpdateArg<InferArrayElement<TShape>>,\r\n fields?: (keyof InferArrayElement<TShape>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n stateFilter: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => void\r\n ) => ArrayEndType<TShape>;\r\n getSelected: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n clearSelected: () => void;\r\n getSelectedIndex: () => number;\r\n last: () => StateObject<InferArrayElement<TShape>> | undefined;\r\n} & EndType<TShape>;\r\n\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\n\r\nexport type UpdateType<T> = (\r\n payload: UpdateArg<T>,\r\n opts?: UpdateOpts<T>\r\n) => void;\r\n\r\nexport type UpdateOpts<T> = {\r\n afterUpdate?: (state: T) => void;\r\n debounce?: number;\r\n};\r\nexport type ObjectEndType<T> = EndType<T> & {\r\n [K in keyof T]-?: ObjectEndType<T[K]>;\r\n} & {\r\n stateObject: (callbackfn: (value: T, setter: StateObject<T>) => void) => any;\r\n delete: () => void;\r\n};\r\ntype EffectFunction<T, R> = (state: T) => R;\r\nexport type EndType<T, IsArrayElement = false> = {\r\n update: UpdateType<T>;\r\n _path: string[];\r\n _stateKey: string;\r\n formElement: (control: FormControl<T>, opts?: FormOptsType) => JSX.Element;\r\n get: () => T;\r\n $get: () => T;\r\n $derive: <R>(fn: EffectFunction<T, R>) => R;\r\n _status: \"fresh\" | \"stale\" | \"synced\";\r\n getStatus: () => \"fresh\" | \"stale\";\r\n\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 toggleSelected: () => void;\r\n getFormRef: () => React.RefObject<any> | undefined;\r\n removeStorage: () => void;\r\n sync: () => void;\r\n validationWrapper: ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => JSX.Element;\r\n lastSynced?: SyncInfo;\r\n} & (IsArrayElement extends true ? { cut: () => void } : {});\r\n\r\nexport type StateObject<T> = (T extends any[]\r\n ? ArrayEndType<T>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K]> } & ObjectEndType<T>\r\n : T extends string | number | boolean | null\r\n ? T\r\n : never) &\r\n EndType<T, true> & {\r\n getAllFormRefs: () => Map<string, React.RefObject<any>>;\r\n _componentId: string | null;\r\n getComponents: () => ComponentsType;\r\n validateZodSchema: () => void;\r\n _initialState: T;\r\n updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n _isLoading: boolean;\r\n _serverState: T;\r\n revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n getDifferences: () => string[];\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: UpdateArg<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?: z.ZodTypeAny;\r\n onBlur?: boolean;\r\n};\r\n\r\nexport type OptionsType<T extends unknown = unknown> = {\r\n log?: boolean;\r\n componentId?: string;\r\n serverSync?: ServerSyncType<T>;\r\n validation?: ValidationOptionsType;\r\n enableServerState?: boolean;\r\n sync?: {\r\n action: (state: T) => Promise<{\r\n success: boolean;\r\n data?: any;\r\n error?: any;\r\n errors?: Array<{\r\n path: (string | number)[];\r\n message: string;\r\n }>;\r\n }>;\r\n onSuccess?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n };\r\n middleware?: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void;\r\n\r\n modifyState?: (state: T) => T;\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n formElements?: FormsElementsType;\r\n enabledSync?: (state: T) => boolean;\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType[] | ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n initialState?: T;\r\n dependencies?: any[]; // Just like useEffect dependencies\r\n};\r\nexport type ServerSyncType<T> = {\r\n testKey?: string;\r\n syncKey: (({ state }: { state: T }) => string) | string;\r\n syncFunction: ({ state }: { state: T }) => void;\r\n debounce?: number;\r\n\r\n snapshot?: {\r\n name: (({ state }: { state: T }) => string) | string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\nexport type SyncActionsType<T> = {\r\n syncKey: string;\r\n\r\n rollBackState?: T;\r\n actionTimeStamp: number;\r\n retryCount?: number;\r\n status:\r\n | \"success\"\r\n | \"waiting\"\r\n | \"rolledBack\"\r\n | \"error\"\r\n | \"cancelled\"\r\n | \"failed\";\r\n snapshot?: {\r\n name: string;\r\n stateKeys: StateKeys[];\r\n currentUrl: string;\r\n currentParams?: URLSearchParams;\r\n };\r\n};\r\n\r\nexport type ValidationWrapperOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n active: boolean;\r\n stretch?: boolean;\r\n path: string[];\r\n message?: string;\r\n data?: T;\r\n key?: string;\r\n};\r\nexport type SyncRenderOptions<T extends unknown = unknown> = {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: T;\r\n key?: string;\r\n};\r\n\r\ntype FormsElementsType<T extends unknown = unknown> = {\r\n validation?: (options: ValidationWrapperOptions<T>) => React.ReactNode;\r\n syncRender?: (options: SyncRenderOptions<T>) => React.ReactNode;\r\n};\r\n\r\nexport type InitialStateInnerType<T extends unknown = unknown> = {\r\n initialState: T;\r\n} & OptionsType<T>;\r\n\r\nexport type InitialStateType<T> = {\r\n [key: string]: InitialStateInnerType<T>;\r\n};\r\n\r\nexport type AllStateTypes<T extends unknown> = Record<string, T>;\r\n\r\nexport type CogsInitialState<T> = {\r\n initialState: T;\r\n formElements?: FormsElementsType<T>;\r\n};\r\n\r\nexport type TransformedStateType<T> = {\r\n [P in keyof T]: T[P] extends CogsInitialState<infer U> ? U : T[P];\r\n};\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const getInitialOptions = getGlobalStore.getState().getInitialOptions;\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n setInitialStateOptions(stateKey as string, {\r\n ...initialOptions,\r\n ...newOptions,\r\n });\r\n}\r\n\r\n// Fix for the setOptions function\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n const setInitialStateOptions =\r\n getGlobalStore.getState().setInitialStateOptions;\r\n const mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n\r\n let needToAdd = false;\r\n if (options) {\r\n for (const key in options) {\r\n if (!mergedOptions.hasOwnProperty(key)) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key as keyof typeof options];\r\n } else {\r\n if (\r\n key == \"localStorage\" &&\r\n options[key] &&\r\n mergedOptions[key].key !== options[key]?.key\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n if (\r\n key == \"initialState\" &&\r\n options[key] &&\r\n mergedOptions[key] !== options[key] && // Different references\r\n !isDeepEqual(mergedOptions[key], options[key]) // And different values\r\n ) {\r\n needToAdd = true;\r\n mergedOptions[key] = options[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n }\r\n}\r\nexport function addStateOptions<T extends unknown>(\r\n initialState: T,\r\n { formElements, validation }: OptionsType<T>\r\n) {\r\n return { initialState: initialState, formElements, validation } as T;\r\n}\r\n\r\nexport const createCogsState = <State extends Record<string, unknown>>(\r\n initialState: State,\r\n opt?: { formElements?: FormsElementsType; validation?: ValidationOptionsType }\r\n) => {\r\n let newInitialState = initialState;\r\n\r\n // Extract state parts and options using transformStateFunc\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(newInitialState);\r\n\r\n // Apply global formElements as defaults to each state key's options\r\n if (\r\n Object.keys(initialOptionsPart).length > 0 ||\r\n (opt && Object.keys(opt).length > 0)\r\n ) {\r\n Object.keys(initialOptionsPart).forEach((key) => {\r\n // Get the existing options for this state key\r\n initialOptionsPart[key] = initialOptionsPart[key] || {};\r\n\r\n initialOptionsPart[key].formElements = {\r\n ...opt?.formElements, // Global defaults first\r\n ...opt?.validation,\r\n ...(initialOptionsPart[key].formElements || {}), // State-specific overrides\r\n };\r\n const existingOptions = getInitialOptions(key);\r\n\r\n if (!existingOptions) {\r\n getGlobalStore\r\n .getState()\r\n .setInitialStateOptions(key, initialOptionsPart[key]);\r\n }\r\n });\r\n }\r\n\r\n getGlobalStore.getState().setInitialStates(statePart);\r\n getGlobalStore.getState().setCreatedState(statePart);\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: OptionsType<(typeof statePart)[StateKey]>\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const thiState =\r\n getGlobalStore.getState().cogsStateStore[stateKey as string] ||\r\n statePart[stateKey as string];\r\n const partialState = options?.modifyState\r\n ? options.modifyState(thiState)\r\n : thiState;\r\n\r\n const [state, updater] = useCogsStateFn<(typeof statePart)[StateKey]>(\r\n partialState,\r\n {\r\n stateKey: stateKey as string,\r\n syncUpdate: options?.syncUpdate,\r\n componentId,\r\n localStorage: options?.localStorage,\r\n middleware: options?.middleware,\r\n enabledSync: options?.enabledSync,\r\n reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n initialState: options?.initialState as any,\r\n dependencies: options?.dependencies,\r\n }\r\n );\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptions<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: OptionsType<(typeof statePart)[StateKey]>\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart });\r\n\r\n if (options.localStorage) {\r\n loadAndApplyLocalStorage(stateKey as string, options);\r\n }\r\n\r\n notifyComponents(stateKey as string);\r\n }\r\n\r\n return { useCogsState, setCogsOptions };\r\n};\r\n\r\nconst {\r\n setUpdaterState,\r\n setState,\r\n getInitialOptions,\r\n getKeyState,\r\n getValidationErrors,\r\n setStateLog,\r\n updateInitialStateGlobal,\r\n addValidationError,\r\n removeValidationError,\r\n setServerSyncActions,\r\n} = getGlobalStore.getState();\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string\r\n) => {\r\n if (currentInitialOptions?.log) {\r\n console.log(\r\n \"saving to localstorage\",\r\n thisKey,\r\n currentInitialOptions.localStorage?.key,\r\n sessionId\r\n );\r\n }\r\n\r\n const key = isFunction(currentInitialOptions?.localStorage?.key)\r\n ? currentInitialOptions.localStorage?.key(state)\r\n : currentInitialOptions?.localStorage?.key;\r\n\r\n if (key && sessionId) {\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer:\r\n getGlobalStore.getState().serverSyncLog[thisKey]?.[0]?.timeStamp,\r\n baseServerState: getGlobalStore.getState().serverState[thisKey],\r\n };\r\n\r\n const storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n // Use SuperJSON serialize to get the json part only\r\n const superJsonResult = superjson.serialize(data);\r\n window.localStorage.setItem(\r\n storageKey,\r\n JSON.stringify(superJsonResult.json)\r\n );\r\n }\r\n};\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 // Parse the json part back normally\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\nconst loadAndApplyLocalStorage = (stateKey: string, options: any) => {\r\n const currentState = getGlobalStore.getState().cogsStateStore[stateKey];\r\n const { sessionId } = useCogsConfig();\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options.localStorage.key(currentState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${stateKey}-${localkey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (localData.lastSyncedWithServer || 0)\r\n ) {\r\n setState(stateKey, localData.state);\r\n\r\n notifyComponents(stateKey);\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\ntype LocalStorageData<T> = {\r\n state: T;\r\n lastUpdated: number;\r\n lastSyncedWithServer?: number;\r\n baseServerState?: T; // Add this to track what server state our changes are based on\r\n};\r\n\r\nconst updateGlobalState = (\r\n thisKey: string,\r\n initialState: any,\r\n newState: any,\r\n effectiveSetState: EffectiveSetState<any>,\r\n componentId: string,\r\n sessionId?: string\r\n) => {\r\n // Update all global state at once\r\n const updates = {\r\n initialState: initialState,\r\n updaterState: createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n ),\r\n state: newState,\r\n };\r\n\r\n updateInitialStateGlobal(thisKey, updates.initialState);\r\n setUpdaterState(thisKey, updates.updaterState);\r\n setState(thisKey, updates.state);\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n if (!stateEntry) return;\r\n\r\n // Batch component updates\r\n const updates = new Set<() => void>();\r\n stateEntry.components.forEach((component) => {\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n if (!reactiveTypes?.includes(\"none\")) {\r\n updates.add(() => component.forceUpdate());\r\n }\r\n });\r\n\r\n // Schedule updates in the next tick to allow batching\r\n queueMicrotask(() => {\r\n updates.forEach((update) => update());\r\n });\r\n};\r\n\r\nexport const notifyComponent = (stateKey: string, componentId: string) => {\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n const component = stateEntry.components.get(fullComponentId);\r\n const reactiveTypes = component\r\n ? Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"]\r\n : null;\r\n\r\n // Skip if reactivity is disabled\r\n if (reactiveTypes?.includes(\"none\")) {\r\n return;\r\n }\r\n\r\n if (component) {\r\n // Force an update to ensure the current value is saved\r\n\r\n component.forceUpdate();\r\n }\r\n }\r\n};\r\n\r\nexport function useCogsStateFn<TStateObject extends unknown>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n serverSync,\r\n localStorage,\r\n formElements,\r\n middleware,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n initialState?: TStateObject;\r\n } & OptionsType<TStateObject> = {}\r\n) {\r\n const [reactiveForce, forceUpdate] = useState({}); //this is the key to reactivity\r\n const { sessionId } = useCogsConfig();\r\n\r\n let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\r\n const stateLog = getGlobalStore.getState().stateLog[thisKey];\r\n const componentUpdatesRef = useRef(new Set<string>());\r\n const componentIdRef = useRef(componentId ?? uuidv4());\r\n const latestInitialOptionsRef = useRef<any>(null);\r\n latestInitialOptionsRef.current = getInitialOptions(thisKey as string);\r\n\r\n useEffect(() => {\r\n if (syncUpdate && syncUpdate.stateKey === thisKey && syncUpdate.path?.[0]) {\r\n // Update the actual state value\r\n setState(thisKey, (prevState: any) => ({\r\n ...prevState,\r\n [syncUpdate.path![0]!]: syncUpdate.newValue,\r\n }));\r\n\r\n // Create combined key and update sync info\r\n const syncKey = `${syncUpdate.stateKey}:${syncUpdate.path.join(\".\")}`;\r\n getGlobalStore.getState().setSyncInfo(syncKey, {\r\n timeStamp: syncUpdate.timeStamp!,\r\n userId: syncUpdate.userId!,\r\n });\r\n }\r\n }, [syncUpdate]);\r\n useEffect(() => {\r\n if (initialState) {\r\n setAndMergeOptions(thisKey as string, {\r\n initialState,\r\n });\r\n\r\n const options = latestInitialOptionsRef.current;\r\n let localData = null;\r\n\r\n // Handle localStorage properly\r\n const localkey = isFunction(options?.localStorage?.key)\r\n ? options?.localStorage?.key(initialState)\r\n : options?.localStorage?.key;\r\n\r\n if (localkey && sessionId) {\r\n localData = loadFromLocalStorage(\r\n sessionId + \"-\" + thisKey + \"-\" + localkey\r\n );\r\n }\r\n\r\n const currentGloballyStoredInitialState =\r\n getGlobalStore.getState().initialStateGlobal[thisKey];\r\n\r\n // Only update if the deep contents have actually changed\r\n if (\r\n (currentGloballyStoredInitialState &&\r\n !isDeepEqual(currentGloballyStoredInitialState, initialState)) ||\r\n !currentGloballyStoredInitialState\r\n ) {\r\n let newState = initialState;\r\n\r\n if (localData) {\r\n if (localData.lastUpdated > (localData.lastSyncedWithServer || 0)) {\r\n newState = localData.state;\r\n if (options?.localStorage?.onChange) {\r\n options?.localStorage?.onChange(newState);\r\n }\r\n }\r\n }\r\n\r\n updateGlobalState(\r\n thisKey,\r\n initialState,\r\n newState,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n notifyComponents(thisKey);\r\n\r\n const reactiveTypes = Array.isArray(reactiveType)\r\n ? reactiveType\r\n : [reactiveType || \"component\"];\r\n\r\n if (!reactiveTypes.includes(\"none\")) {\r\n forceUpdate({});\r\n }\r\n }\r\n }\r\n }, [initialState, ...(dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n serverSync,\r\n formElements,\r\n initialState,\r\n localStorage,\r\n middleware,\r\n });\r\n }\r\n\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(thisKey) || {\r\n components: new Map(),\r\n };\r\n\r\n stateEntry.components.set(depsKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n deps: [],\r\n depsFunction: reactiveDeps || undefined,\r\n reactiveType: reactiveType ?? [\"component\", \"deps\"],\r\n });\r\n\r\n getGlobalStore.getState().stateComponents.set(thisKey, stateEntry);\r\n //need to force update to create the stateUpdates references\r\n forceUpdate({});\r\n return () => {\r\n const depsKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(depsKey);\r\n if (stateEntry.components.size === 0) {\r\n getGlobalStore.getState().stateComponents.delete(thisKey);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = (\r\n newStateOrFunction: UpdateArg<TStateObject>,\r\n path: string[],\r\n updateObj: { updateType: \"insert\" | \"cut\" | \"update\" },\r\n validationKey?: string\r\n ) => {\r\n if (Array.isArray(path)) {\r\n const pathKey = `${thisKey}-${path.join(\".\")}`;\r\n componentUpdatesRef.current.add(pathKey);\r\n }\r\n setState(thisKey, (prevValue: TStateObject) => {\r\n const payload = isFunction<TStateObject>(newStateOrFunction)\r\n ? newStateOrFunction(prevValue as TStateObject)\r\n : newStateOrFunction;\r\n\r\n const signalId = `${thisKey}-${path.join(\".\")}`;\r\n if (signalId) {\r\n let isArrayOperation = false;\r\n let elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(signalId);\r\n\r\n if (\r\n (!elements || elements.size === 0) &&\r\n (updateObj.updateType === \"insert\" || updateObj.updateType === \"cut\")\r\n ) {\r\n // Remove last segment (index) from path\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n // If it's an array, use that path for signal\r\n if (Array.isArray(arrayValue)) {\r\n isArrayOperation = true;\r\n const arraySignalId = `${thisKey}-${arrayPath.join(\".\")}`;\r\n elements = getGlobalStore\r\n .getState()\r\n .signalDomElements.get(arraySignalId);\r\n }\r\n }\r\n\r\n if (elements) {\r\n const newValue = isArrayOperation\r\n ? getNestedValue(payload, path.slice(0, -1))\r\n : getNestedValue(payload, path);\r\n elements.forEach(({ parentId, position, effect }) => {\r\n const parent = document.querySelector(\r\n `[data-parent-id=\"${parentId}\"]`\r\n );\r\n if (parent) {\r\n const childNodes = Array.from(parent.childNodes);\r\n if (childNodes[position]) {\r\n const displayValue = effect\r\n ? new Function(\"state\", `return (${effect})(state)`)(newValue)\r\n : newValue;\r\n childNodes[position].textContent = String(displayValue);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n if (\r\n updateObj.updateType === \"update\" &&\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validationKey) +\r\n \".\" +\r\n path.join(\".\")\r\n );\r\n }\r\n const arrayWithoutIndex = path.slice(0, path.length - 1);\r\n if (\r\n updateObj.updateType === \"cut\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validationKey\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validationKey +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n\r\n //TODO this is untested its supposed to cahnge teh validation errors alreaady stored when a new entry is push\r\n\r\n getValidation.filter(([k, v]) => {\r\n let length = k?.split(\".\").length;\r\n\r\n if (\r\n k == arrayWithoutIndex.join(\".\") &&\r\n length == arrayWithoutIndex.length - 1\r\n ) {\r\n // console.log(length, pathWithoutIndex.length);\r\n let newKey = k + \".\" + arrayWithoutIndex;\r\n removeValidationError(k!);\r\n addValidationError(newKey, v!);\r\n }\r\n });\r\n }\r\n\r\n const oldValue = getNestedValue(prevValue, path);\r\n const newValue = getNestedValue(payload, path);\r\n const pathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : [...path].slice(0, -1).join(\".\");\r\n const stateEntry = getGlobalStore.getState().stateComponents.get(thisKey);\r\n\r\n if (stateEntry) {\r\n const changedPaths = getDifferences(prevValue, payload);\r\n const changedPathsSet = new Set(changedPaths);\r\n const primaryPathToCheck =\r\n updateObj.updateType === \"update\"\r\n ? path.join(\".\")\r\n : path.slice(0, -1).join(\".\") || \"\";\r\n\r\n for (const [\r\n componentKey,\r\n component,\r\n ] of stateEntry.components.entries()) {\r\n let shouldUpdate = false;\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || \"component\"];\r\n\r\n if (reactiveTypes.includes(\"none\")) continue;\r\n if (reactiveTypes.includes(\"all\")) {\r\n component.forceUpdate();\r\n continue;\r\n }\r\n\r\n if (reactiveTypes.includes(\"component\")) {\r\n if (\r\n component.paths.has(primaryPathToCheck) ||\r\n component.paths.has(\"\")\r\n ) {\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n let currentPathToCheck = changedPath;\r\n while (true) {\r\n if (component.paths.has(currentPathToCheck)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n const lastDotIndex = currentPathToCheck.lastIndexOf(\".\");\r\n if (lastDotIndex !== -1) {\r\n const parentPath = currentPathToCheck.substring(\r\n 0,\r\n lastDotIndex\r\n );\r\n if (\r\n !isNaN(\r\n Number(currentPathToCheck.substring(lastDotIndex + 1))\r\n )\r\n ) {\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n currentPathToCheck = parentPath;\r\n } else {\r\n currentPathToCheck = \"\";\r\n }\r\n if (currentPathToCheck === \"\") {\r\n break;\r\n }\r\n }\r\n if (shouldUpdate) break;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldUpdate && reactiveTypes.includes(\"deps\")) {\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(payload);\r\n let depsChanged = false;\r\n if (typeof depsResult === \"boolean\") {\r\n if (depsResult) depsChanged = true;\r\n } else if (!isDeepEqual(component.deps, depsResult)) {\r\n component.deps = depsResult;\r\n depsChanged = true;\r\n }\r\n if (depsChanged) {\r\n shouldUpdate = true;\r\n }\r\n }\r\n }\r\n\r\n if (shouldUpdate) {\r\n component.forceUpdate();\r\n }\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n const newUpdate = {\r\n timeStamp,\r\n stateKey: thisKey,\r\n path,\r\n updateType: updateObj.updateType,\r\n status: \"new\" as const,\r\n oldValue,\r\n newValue,\r\n } satisfies UpdateTypeDetail;\r\n\r\n setStateLog(thisKey, (prevLogs) => {\r\n const logs = [...(prevLogs ?? []), newUpdate];\r\n\r\n // Aggregate the updates by stateKey and path\r\n const aggregatedLogs = logs.reduce((acc, log) => {\r\n const uniqueKey = `${log.stateKey}:${JSON.stringify(log.path)}`;\r\n const existing = acc.get(uniqueKey);\r\n\r\n if (existing) {\r\n // Update the existing entry with the most recent details\r\n existing.timeStamp = Math.max(existing.timeStamp, log.timeStamp);\r\n existing.newValue = log.newValue; // Overwrite with the latest value\r\n existing.oldValue = existing.oldValue ?? log.oldValue; // Retain the initial oldValue\r\n existing.updateType = log.updateType; // Update to the most recent type\r\n } else {\r\n // Add the log if no existing match is found\r\n acc.set(uniqueKey, { ...(log as any) });\r\n }\r\n\r\n return acc;\r\n }, new Map<string, typeof newUpdate>());\r\n\r\n // Convert the aggregated map back to an array\r\n return Array.from(aggregatedLogs.values());\r\n });\r\n\r\n saveToLocalStorage(\r\n payload,\r\n thisKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n\r\n if (middleware) {\r\n middleware({\r\n updateLog: stateLog,\r\n update: newUpdate,\r\n });\r\n }\r\n if (latestInitialOptionsRef.current?.serverSync) {\r\n const serverStateStore = getGlobalStore.getState().serverState[thisKey];\r\n const serverSync = latestInitialOptionsRef.current?.serverSync;\r\n setServerSyncActions(thisKey, {\r\n syncKey:\r\n typeof serverSync.syncKey == \"string\"\r\n ? serverSync.syncKey\r\n : serverSync.syncKey({ state: payload }),\r\n rollBackState: serverStateStore,\r\n actionTimeStamp: Date.now() + (serverSync.debounce ?? 3000),\r\n status: \"waiting\",\r\n });\r\n }\r\n\r\n return payload;\r\n });\r\n };\r\n if (!getGlobalStore.getState().updaterState[thisKey]) {\r\n setUpdaterState(\r\n thisKey,\r\n createProxyHandler(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n )\r\n );\r\n if (!getGlobalStore.getState().cogsStateStore[thisKey]) {\r\n setState(thisKey, stateObject);\r\n }\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n // Create proxy with baseObject as target\r\n return createProxyHandler<TStateObject>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n }, [thisKey]);\r\n\r\n return [getKeyState(thisKey), updaterFinal] as [\r\n TStateObject,\r\n StateObject<TStateObject>,\r\n ];\r\n}\r\n\r\nfunction createProxyHandler<T>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n componentId: string,\r\n sessionId?: string\r\n): StateObject<T> {\r\n // ADDED: Enhanced cache with versioning\r\n type CacheEntry = {\r\n proxy: any;\r\n stateVersion: number;\r\n };\r\n const shapeCache = new Map<string, CacheEntry>();\r\n let stateVersion = 0;\r\n\r\n // ADDED: Cache invalidation helper\r\n const invalidateCachePath = (path: string[]) => {\r\n const pathKey = path.join(\".\");\r\n for (const [key] of shapeCache) {\r\n if (key === pathKey || key.startsWith(pathKey + \".\")) {\r\n shapeCache.delete(key);\r\n }\r\n }\r\n stateVersion++;\r\n };\r\n\r\n const baseObj = {\r\n removeValidation: (obj?: { validationKey?: string }) => {\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n },\r\n\r\n revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n if (init?.key) {\r\n removeValidationError(init?.key);\r\n }\r\n\r\n if (obj?.validationKey) {\r\n removeValidationError(obj.validationKey);\r\n }\r\n\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n\r\n getGlobalStore.getState().clearSelectedIndexesForState(stateKey);\r\n // ADDED: Clear cache on revert\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newProxy = rebuildStateShape(initialState, []);\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n setUpdaterState(stateKey, newProxy);\r\n setState(stateKey, initialState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n\r\n return initialState;\r\n },\r\n updateInitialState: (newState: T) => {\r\n // ADDED: Clear cache on initial state update\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n startTransition(() => {\r\n updateInitialStateGlobal(stateKey, newState);\r\n setUpdaterState(stateKey, newUpdaterState);\r\n setState(stateKey, newState);\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n });\r\n\r\n return {\r\n fetchId: (field: keyof T) => newUpdaterState.get()[field],\r\n };\r\n },\r\n _initialState: getGlobalStore.getState().initialStateGlobal[stateKey],\r\n _serverState: getGlobalStore.getState().serverState[stateKey],\r\n _isLoading: getGlobalStore.getState().isLoadingGlobal[stateKey],\r\n _isServerSynced: () => {\r\n const serverState = getGlobalStore.getState().serverState[stateKey];\r\n return Boolean(\r\n serverState && isDeepEqual(serverState, getKeyState(stateKey))\r\n );\r\n },\r\n };\r\n\r\n function rebuildStateShape(\r\n currentState: T,\r\n path: string[] = [],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ): any {\r\n const cacheKey = path.map(String).join(\".\");\r\n\r\n // MODIFIED: Cache check with version\r\n const cachedEntry = shapeCache.get(cacheKey);\r\n // if (cachedEntry?.stateVersion === stateVersion) {\r\n // return cachedEntry.proxy;\r\n // }\r\n type CallableStateObject<T> = {\r\n (): T;\r\n } & {\r\n [key: string]: any;\r\n };\r\n\r\n const baseFunction = function () {\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n } as unknown as CallableStateObject<T>;\r\n\r\n // Copy properties from baseObj to the function with type assertion\r\n Object.keys(baseObj).forEach((key) => {\r\n (baseFunction as any)[key] = (baseObj as any)[key];\r\n });\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any[]) {\r\n console.log(\r\n `PROXY APPLY TRAP HIT: stateKey=${stateKey}, path=${path.join(\".\")}`\r\n ); // <--- ADD LOGGING\r\n console.trace(\"Apply trap stack trace\");\r\n return getGlobalStore().getNestedState(stateKey, path);\r\n },\r\n\r\n get(target: any, prop: string) {\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\"\r\n ) {\r\n const currentPath = path.join(\".\");\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n\r\n if (stateEntry) {\r\n const component = stateEntry.components.get(fullComponentId);\r\n\r\n if (component) {\r\n // Only add paths for non-root or specifically for get() at root\r\n if (path.length > 0 || prop === \"get\") {\r\n component.paths.add(currentPath);\r\n }\r\n } else {\r\n }\r\n }\r\n }\r\n if (prop === \"getDifferences\") {\r\n return () => {\r\n const differences = getDifferences(\r\n getGlobalStore.getState().cogsStateStore[stateKey],\r\n getGlobalStore.getState().initialStateGlobal[stateKey]\r\n );\r\n return differences;\r\n };\r\n }\r\n if (prop === \"sync\" && path.length === 0) {\r\n return async function () {\r\n // Get the options for this state key\r\n const options = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey);\r\n const sync = options?.sync;\r\n\r\n if (!sync) {\r\n console.error(`No mutation defined for state key \"${stateKey}\"`);\r\n return { success: false, error: `No mutation defined` };\r\n }\r\n\r\n // Get the root state\r\n const state = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, []);\r\n\r\n // Get validation key\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n // Execute the mutation action\r\n const response = await sync.action(state);\r\n\r\n // Handle validation errors\r\n if (\r\n response &&\r\n !response.success &&\r\n response.errors &&\r\n validationKey\r\n ) {\r\n // Clear existing errors\r\n getGlobalStore.getState().removeValidationError(validationKey);\r\n\r\n // Add new validation errors\r\n response.errors.forEach((error) => {\r\n const errorPath = [validationKey, ...error.path].join(\".\");\r\n\r\n getGlobalStore\r\n .getState()\r\n .addValidationError(errorPath, error.message);\r\n });\r\n\r\n // Notify components to update\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey);\r\n if (stateEntry) {\r\n stateEntry.components.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n }\r\n }\r\n\r\n // Call success/error callbacks\r\n if (response?.success && sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n } else if (!response?.success && sync.onError) {\r\n sync.onError(response.error);\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) {\r\n sync.onError(error);\r\n }\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n if (prop === \"_status\") {\r\n // Get current state at this path (non-reactive version)\r\n const thisReactiveState = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n }\r\n if (prop === \"getStatus\") {\r\n return function () {\r\n // Get current state at this path (reactive version)\r\n const thisReactiveState = getGlobalStore().getNestedState(\r\n stateKey,\r\n path\r\n );\r\n\r\n // Get initial state at this path\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initialStateAtPath = getNestedValue(initialState, path);\r\n // Simply compare current state with initial state\r\n if (isDeepEqual(thisReactiveState, initialStateAtPath)) {\r\n return \"fresh\"; // Matches initial state\r\n } else {\r\n return \"stale\"; // Different from initial state\r\n }\r\n };\r\n }\r\n if (prop === \"removeStorage\") {\r\n return () => {\r\n const initialState =\r\n getGlobalStore.getState().initialStateGlobal[stateKey];\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(initialState)\r\n : initalOptionsGet?.localStorage?.key;\r\n\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n console.log(\"removing storage\", storageKey);\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n };\r\n }\r\n if (prop === \"showValidationErrors\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n const errors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key + \".\" + path.join(\".\"));\r\n\r\n return errors;\r\n };\r\n }\r\n if (Array.isArray(currentState)) {\r\n if (prop === \"getSelected\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n if (selectedIndex === undefined) return undefined;\r\n return rebuildStateShape(\r\n currentState[selectedIndex],\r\n [...path, selectedIndex.toString()],\r\n meta\r\n );\r\n };\r\n }\r\n if (prop === \"clearSelected\") {\r\n return () => {\r\n getGlobalStore.getState().clearSelectedIndex({ stateKey, path });\r\n };\r\n }\r\n if (prop === \"getSelectedIndex\") {\r\n return () => {\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, path.join(\".\"));\r\n\r\n return selectedIndex ?? -1;\r\n };\r\n }\r\n if (prop === \"stateSort\") {\r\n return (\r\n compareFn: (\r\n a: InferArrayElement<T>,\r\n b: InferArrayElement<T>\r\n ) => number\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n\r\n // Create a shallow copy with original indices\r\n const arrayCopy = currentArray.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n // Sort the copy using the provided compare function\r\n const sortedArray = [...arrayCopy].sort(compareFn);\r\n\r\n // ADDED: Clear cache for sort operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Return the sorted array with state objects\r\n return rebuildStateShape(sortedArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: sortedArray.map((item) =>\r\n parseInt(item.__origIndex as string)\r\n ),\r\n });\r\n };\r\n }\r\n if (prop === \"stateMap\" || prop === \"stateMapNoRender\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n if (prop !== \"stateMapNoRender\") {\r\n shapeCache.clear();\r\n stateVersion++;\r\n }\r\n\r\n return arrayToMap.map((val: any, index: number) => {\r\n const thisIndex =\r\n isFiltered && val.__origIndex ? val.__origIndex : index;\r\n const elementProxy = rebuildStateShape(\r\n val,\r\n [...path, thisIndex.toString()],\r\n meta\r\n );\r\n return callbackfn(\r\n val,\r\n elementProxy,\r\n index,\r\n currentState as any,\r\n rebuildStateShape(currentState as any, path, meta)\r\n );\r\n });\r\n };\r\n }\r\n if (prop === \"$stateMap\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n setter: StateObject<InferArrayElement<T>>,\r\n index: number,\r\n array: T,\r\n arraySetter: StateObject<T>\r\n ) => void\r\n ) => {\r\n return createElement(SignalMapRenderer, {\r\n proxy: {\r\n _stateKey: stateKey,\r\n _path: path,\r\n _mapFn: callbackfn as any, // Pass the actual function, not string\r\n },\r\n\r\n rebuildStateShape,\r\n });\r\n };\r\n }\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const isFiltered = meta?.filtered?.some(\r\n (p) => p.join(\".\") === path.join(\".\")\r\n );\r\n const arrayToMap = isFiltered\r\n ? currentState\r\n : getGlobalStore.getState().getNestedState(stateKey, path);\r\n\r\n // ADDED: Clear shape cache for flattening operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any, index: number) => {\r\n return val[fieldName] ?? [];\r\n }\r\n );\r\n\r\n return rebuildStateShape(\r\n flattenedResults,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (\r\n thisKey: keyof InferArrayElement<T>,\r\n thisValue: InferArrayElement<T>[keyof InferArrayElement<T>]\r\n ) => {\r\n const foundIndex = currentState.findIndex((obj: any) => {\r\n return obj[thisKey] === thisValue;\r\n });\r\n\r\n if (foundIndex === -1) return undefined;\r\n const foundValue = currentState[foundIndex];\r\n const newPath = [...path, foundIndex.toString()];\r\n // console.log(\r\n // \"findWithfindWithfindWithfindWith\",\r\n // stateKey,\r\n // foundValue,\r\n // newPath,\r\n // );\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Try returning without spread\r\n return rebuildStateShape(foundValue, newPath);\r\n };\r\n }\r\n\r\n if (prop === \"index\") {\r\n return (index: number) => {\r\n const indexValue = currentState[index];\r\n return rebuildStateShape(indexValue, [...path, index.toString()]);\r\n };\r\n }\r\n if (prop === \"last\") {\r\n // Added handler for 'last'\r\n return () => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n if (currentArray.length === 0) return undefined;\r\n const lastIndex = currentArray.length - 1;\r\n const lastValue = currentArray[lastIndex];\r\n const newPath = [...path, lastIndex.toString()];\r\n // shapeCache.clear(); // Decide if you need cache invalidation for 'last' access\r\n // stateVersion++;\r\n return rebuildStateShape(lastValue, newPath);\r\n };\r\n }\r\n if (prop === \"insert\") {\r\n return (payload: UpdateArg<T>) => {\r\n // ADDED: Invalidate cache on insert\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, payload, path, stateKey);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n path\r\n );\r\n };\r\n }\r\n\r\n if (prop === \"uniqueInsert\") {\r\n return (\r\n payload: UpdateArg<T>,\r\n fields?: (keyof InferArrayElement<T>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => {\r\n const currentArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n const newValue = isFunction<T>(payload)\r\n ? payload(currentArray as any)\r\n : (payload as any);\r\n\r\n let matchedItem: any = null;\r\n const isUnique = !currentArray.some((item) => {\r\n if (fields) {\r\n const isMatch = fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n );\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n }\r\n const isMatch = isDeepEqual(item, newValue);\r\n if (isMatch) {\r\n matchedItem = item;\r\n }\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n invalidateCachePath(path);\r\n pushFunc(effectiveSetState, newValue, path, stateKey);\r\n } else if (onMatch && matchedItem) {\r\n const updatedItem = onMatch(matchedItem);\r\n const updatedArray = currentArray.map((item) =>\r\n isDeepEqual(item, matchedItem) ? updatedItem : item\r\n );\r\n invalidateCachePath(path);\r\n updateFn(effectiveSetState, updatedArray as any, path);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"cut\") {\r\n return (index: number, options?: { waitForSync?: boolean }) => {\r\n if (options?.waitForSync) return;\r\n // ADDED: Invalidate cache on cut\r\n invalidateCachePath(path);\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, path),\r\n path\r\n );\r\n };\r\n }\r\n if (prop === \"cutByValue\") {\r\n return (value: string | number | boolean) => {\r\n for (let index = 0; index < currentState.length; index++) {\r\n if (currentState[index] === value) {\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n }\r\n }\r\n };\r\n }\r\n if (prop === \"toggleByValue\") {\r\n return (value: string | number | boolean) => {\r\n const index = currentState.findIndex((item) => item === value);\r\n if (index > -1) {\r\n // Value exists, so cut it\r\n cutFunc(effectiveSetState, path, stateKey, index);\r\n } else {\r\n // Value doesn't exist, so insert it\r\n pushFunc(effectiveSetState, value as any, path, stateKey);\r\n }\r\n };\r\n }\r\n\r\n if (prop === \"stateFilter\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const newVal = currentState.map((v: any, i: number) => ({\r\n ...v,\r\n __origIndex: i.toString(),\r\n }));\r\n\r\n const validIndices: number[] = [];\r\n const filteredArray: Array<InferArrayElement<T>> = [];\r\n\r\n for (let i = 0; i < newVal.length; i++) {\r\n if (callbackfn(newVal[i], i)) {\r\n validIndices.push(i);\r\n filteredArray.push(newVal[i]);\r\n }\r\n }\r\n\r\n // ADDED: Clear cache for filter operation\r\n shapeCache.clear();\r\n stateVersion++;\r\n\r\n // Always include validIndices, even if it's an empty array\r\n return rebuildStateShape(filteredArray as any, path, {\r\n filtered: [...(meta?.filtered || []), path],\r\n validIndices: validIndices, // Always pass validIndices, even if empty\r\n });\r\n };\r\n }\r\n }\r\n const lastPathElement = path[path.length - 1];\r\n if (!isNaN(Number(lastPathElement))) {\r\n const parentPath = path.slice(0, -1);\r\n const parentValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n\r\n if (Array.isArray(parentValue) && prop === \"cut\") {\r\n return () =>\r\n cutFunc(\r\n effectiveSetState,\r\n parentPath,\r\n stateKey,\r\n Number(lastPathElement)\r\n );\r\n }\r\n }\r\n\r\n if (prop === \"get\") {\r\n return () => getGlobalStore.getState().getNestedState(stateKey, path);\r\n }\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$derive\") {\r\n return (fn: any) =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n _effect: fn.toString(),\r\n });\r\n }\r\n\r\n if (prop === \"$get\") {\r\n return () =>\r\n $cogsSignal({\r\n _stateKey: stateKey,\r\n _path: path,\r\n });\r\n }\r\n if (prop === \"lastSynced\") {\r\n const syncKey = `${stateKey}:${path.join(\".\")}`;\r\n return getGlobalStore.getState().getSyncInfo(syncKey);\r\n }\r\n\r\n if (prop == \"getLocalStorage\") {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + \"-\" + stateKey + \"-\" + key);\r\n }\r\n if (prop === \"_selected\") {\r\n const parentPath = path.slice(0, -1);\r\n const parentKey = parentPath.join(\".\");\r\n const parent = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, parentPath);\r\n if (Array.isArray(parent)) {\r\n const currentIndex = Number(path[path.length - 1]);\r\n return (\r\n currentIndex ===\r\n getGlobalStore.getState().getSelectedIndex(stateKey, parentKey)\r\n );\r\n }\r\n return undefined;\r\n }\r\n if (prop === \"setSelected\") {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const thisIndex = Number(path[path.length - 1]);\r\n const parentKey = parentPath.join(\".\");\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, thisIndex);\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(stateKey, parentKey, undefined);\r\n }\r\n\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (prop === \"toggleSelected\") {\r\n return () => {\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 const selectedIndex = getGlobalStore\r\n .getState()\r\n .getSelectedIndex(stateKey, parentKey);\r\n\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(\r\n stateKey,\r\n parentKey,\r\n selectedIndex === thisIndex ? undefined : thisIndex\r\n );\r\n const nested = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, [...parentPath]);\r\n updateFn(effectiveSetState, nested, parentPath);\r\n\r\n // Invalidate cache for this path\r\n invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === \"validateZodSchema\") {\r\n return () => {\r\n const init = getGlobalStore\r\n .getState()\r\n .getInitialOptions(stateKey)?.validation;\r\n const addValidationError =\r\n getGlobalStore.getState().addValidationError;\r\n\r\n if (!init?.zodSchema) {\r\n throw new Error(\"Zod schema not found\");\r\n }\r\n\r\n if (!init?.key) {\r\n throw new Error(\"Validation key not found\");\r\n }\r\n removeValidationError(init.key);\r\n const thisObject =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n\r\n try {\r\n // First clear any existing validation errors for this schema\r\n // This ensures we don't have stale errors\r\n const existingErrors = getGlobalStore\r\n .getState()\r\n .getValidationErrors(init.key);\r\n if (existingErrors && existingErrors.length > 0) {\r\n existingErrors.forEach(([errorPath]) => {\r\n if (errorPath && errorPath.startsWith(init.key!)) {\r\n removeValidationError(errorPath);\r\n }\r\n });\r\n }\r\n\r\n // Attempt to validate with Zod\r\n const result = init.zodSchema.safeParse(thisObject);\r\n\r\n if (!result.success) {\r\n // Process Zod errors and add them to the validation store\r\n const zodErrors = result.error.errors;\r\n\r\n zodErrors.forEach((error) => {\r\n const errorPath = error.path;\r\n const errorMessage = error.message;\r\n\r\n // Build the full path for the validation error\r\n // Format: validationKey.path.to.field\r\n const fullErrorPath = [init.key, ...errorPath].join(\".\");\r\n\r\n // Add the error to the store\r\n addValidationError(fullErrorPath, errorMessage);\r\n });\r\n\r\n notifyComponents(stateKey);\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(\"Zod schema validation failed\", error);\r\n return false;\r\n }\r\n };\r\n }\r\n if (prop === \"_componentId\") return componentId;\r\n if (prop === \"getComponents\") {\r\n return () => getGlobalStore().stateComponents.get(stateKey);\r\n }\r\n if (prop === \"getAllFormRefs\") {\r\n return () => {\r\n return formRefStore.getState().getFormRefsByStateKey(stateKey);\r\n };\r\n }\r\n\r\n if (prop === \"_initialState\")\r\n return getGlobalStore.getState().initialStateGlobal[stateKey];\r\n if (prop === \"_serverState\")\r\n return getGlobalStore.getState().serverState[stateKey];\r\n if (prop === \"_isLoading\")\r\n return getGlobalStore.getState().isLoadingGlobal[stateKey];\r\n if (prop === \"revertToInitialState\")\r\n return baseObj.revertToInitialState;\r\n if (prop === \"updateInitialState\") return baseObj.updateInitialState;\r\n if (prop === \"removeValidation\") return baseObj.removeValidation;\r\n }\r\n if (prop === \"getFormRef\") {\r\n return () => {\r\n return formRefStore\r\n .getState()\r\n .getFormRef(stateKey + \".\" + path.join(\".\"));\r\n };\r\n }\r\n\r\n if (prop === \"validationWrapper\") {\r\n return ({\r\n children,\r\n hideMessage,\r\n }: {\r\n children: React.ReactNode;\r\n hideMessage?: boolean;\r\n }) => (\r\n <ValidationWrapper\r\n formOpts={\r\n hideMessage ? { validation: { message: \"\" } } : undefined\r\n }\r\n path={path}\r\n validationKey={\r\n getGlobalStore.getState().getInitialOptions(stateKey)\r\n ?.validation?.key || \"\"\r\n }\r\n stateKey={stateKey}\r\n validIndices={meta?.validIndices}\r\n >\r\n {children}\r\n </ValidationWrapper>\r\n );\r\n }\r\n\r\n if (prop === \"_stateKey\") return stateKey;\r\n if (prop === \"_path\") return path;\r\n if (prop === \"_isServerSynced\") return baseObj._isServerSynced;\r\n\r\n if (prop === \"update\") {\r\n return (payload: UpdateArg<T>, opts?: UpdateOpts<T>) => {\r\n // ADDED: Invalidate cache on update\r\n if (opts?.debounce) {\r\n debounce(() => {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }, opts.debounce);\r\n } else {\r\n updateFn(effectiveSetState, payload, path, \"\");\r\n const newValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path);\r\n if (opts?.afterUpdate) opts.afterUpdate(newValue);\r\n }\r\n invalidateCachePath(path);\r\n };\r\n }\r\n\r\n if (prop === \"formElement\") {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormControlComponent<T>\r\n setState={effectiveSetState}\r\n stateKey={stateKey}\r\n path={path}\r\n child={child}\r\n formOpts={formOpts}\r\n />\r\n );\r\n };\r\n }\r\n\r\n const nextPath = [...path, prop];\r\n const nextValue = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, nextPath);\r\n return rebuildStateShape(nextValue, nextPath, meta);\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(baseFunction, handler);\r\n\r\n shapeCache.set(cacheKey, {\r\n proxy: proxyInstance,\r\n stateVersion: stateVersion,\r\n });\r\n\r\n return proxyInstance;\r\n }\r\n\r\n return rebuildStateShape(\r\n getGlobalStore.getState().getNestedState(stateKey, [])\r\n );\r\n}\r\n\r\nexport function $cogsSignal(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\r\n}\r\n\r\nfunction SignalMapRenderer({\r\n proxy,\r\n\r\n rebuildStateShape,\r\n}: {\r\n proxy: {\r\n _stateKey: string;\r\n _path: string[];\r\n _mapFn: (\r\n value: any,\r\n setter: any,\r\n index: number,\r\n array: any[],\r\n arraySetter: any\r\n ) => ReactNode;\r\n };\r\n\r\n rebuildStateShape: (\r\n currentState: any,\r\n path: string[],\r\n meta?: { filtered?: string[][]; validIndices?: number[] }\r\n ) => any;\r\n}) {\r\n const value = getGlobalStore().getNestedState(proxy._stateKey, proxy._path);\r\n\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n const arraySetter = rebuildStateShape(\r\n value,\r\n proxy._path\r\n ) as ArrayEndType<any>;\r\n // Use existing global state management\r\n return arraySetter.stateMapNoRender(\r\n (item, setter, index, value, arraysetter) => {\r\n // Execute map function in React context with existing state/proxies\r\n return proxy._mapFn(item, setter, index, value, arraysetter);\r\n }\r\n );\r\n}\r\nfunction SignalRenderer({\r\n proxy,\r\n}: {\r\n proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n _effect?: string;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join(\".\")}`;\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || !element.parentElement) return;\r\n\r\n const parentElement = element.parentElement;\r\n const childNodes = Array.from(parentElement.childNodes);\r\n const position = childNodes.indexOf(element);\r\n\r\n let parentId = parentElement.getAttribute(\"data-parent-id\");\r\n if (!parentId) {\r\n parentId = `parent-${crypto.randomUUID()}`;\r\n parentElement.setAttribute(\"data-parent-id\", parentId);\r\n }\r\n\r\n const instanceId = `instance-${crypto.randomUUID()}`;\r\n const elementInfo = {\r\n instanceId,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n };\r\n\r\n getGlobalStore.getState().addSignalElement(signalId, elementInfo);\r\n\r\n // Get the raw value from the store\r\n const value = getGlobalStore\r\n .getState()\r\n .getNestedState(proxy._stateKey, proxy._path);\r\n\r\n let displayValue;\r\n if (proxy._effect) {\r\n try {\r\n displayValue = new Function(\r\n \"state\",\r\n `return (${proxy._effect})(state)`\r\n )(value);\r\n } catch (err) {\r\n console.error(\"Error evaluating effect function during mount:\", err);\r\n displayValue = value; // Fallback to raw value\r\n }\r\n } else {\r\n displayValue = value;\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === \"object\") {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n\r\n const textNode = document.createTextNode(String(displayValue));\r\n element.replaceWith(textNode);\r\n }, [proxy._stateKey, proxy._path.join(\".\"), proxy._effect]);\r\n\r\n return createElement(\"span\", {\r\n ref: elementRef,\r\n style: { display: \"none\" },\r\n \"data-signal-id\": signalId,\r\n });\r\n}\r\nexport function $cogsSignalStore(proxy: {\r\n _path: string[];\r\n _stateKey: string;\r\n}) {\r\n const value = useSyncExternalStore(\r\n (notify) => {\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(proxy._stateKey) || {\r\n components: new Map(),\r\n };\r\n stateEntry.components.set(proxy._stateKey, {\r\n forceUpdate: notify,\r\n paths: new Set([proxy._path.join(\".\")]),\r\n });\r\n return () => stateEntry.components.delete(proxy._stateKey);\r\n },\r\n () => getGlobalStore.getState().getNestedState(proxy._stateKey, proxy._path)\r\n );\r\n return createElement(\"text\", {}, String(value));\r\n}\r\n"],"names":["setAndMergeOptions","stateKey","newOptions","getInitialOptions","getGlobalStore","setInitialStateOptions","initialOptions","setOptions","options","initialOptionsPart","initialOptionsPartState","mergedOptions","needToAdd","key","isDeepEqual","addStateOptions","initialState","formElements","validation","createCogsState","opt","newInitialState","statePart","transformStateFunc","useCogsState","componentId","useState","uuidv4","thiState","partialState","state","updater","useCogsStateFn","setCogsOptions","loadAndApplyLocalStorage","notifyComponents","setUpdaterState","setState","getKeyState","getValidationErrors","setStateLog","updateInitialStateGlobal","addValidationError","removeValidationError","setServerSyncActions","saveToLocalStorage","thisKey","currentInitialOptions","sessionId","isFunction","data","storageKey","superJsonResult","superjson","loadFromLocalStorage","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","stateEntry","component","update","notifyComponent","fullComponentId","stateObject","serverSync","localStorage","middleware","reactiveDeps","reactiveType","syncUpdate","dependencies","reactiveForce","forceUpdate","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","currentGloballyStoredInitialState","useLayoutEffect","depsKey","newStateOrFunction","path","updateObj","validationKey","pathKey","prevValue","payload","signalId","isArrayOperation","elements","arrayPath","arrayValue","getNestedValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","k","v","length","newKey","oldValue","changedPaths","getDifferences","changedPathsSet","primaryPathToCheck","componentKey","shouldUpdate","reactiveTypes","changedPath","currentPathToCheck","lastDotIndex","parentPath","depsResult","depsChanged","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","serverState","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","currentPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","selectedIndex","compareFn","sortedArray","i","item","callbackfn","isFiltered","p","arrayToMap","val","index","thisIndex","elementProxy","createElement","SignalMapRenderer","fieldName","flattenedResults","thisValue","foundIndex","foundValue","newPath","indexValue","currentArray","lastIndex","lastValue","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","newVal","validIndices","filteredArray","lastPathElement","parentValue","fn","$cogsSignal","parentKey","nested","thisObject","existingErrors","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","setter","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":";;;;;;;;;;AAybA,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;AAGA,SAASK,GAA0B;AAAA,EACjC,UAAAN;AAAA,EACA,SAAAO;AAAA,EACA,oBAAAC;AACF,GAIG;AACD,QAAMH,IAAiBH,EAAkBF,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,KAKjCA,KAAO,kBACPL,EAAQK,CAAG,KACXF,EAAcE,CAAG,EAAE,QAAQL,EAAQK,CAAG,GAAG,QAE7BD,IAAA,IACED,EAAAE,CAAG,IAAIL,EAAQK,CAAG,IAGhCA,KAAO,kBACPL,EAAQK,CAAG,KACXF,EAAcE,CAAG,MAAML,EAAQK,CAAG;AAAA,MAClC,CAACC,EAAYH,EAAcE,CAAG,GAAGL,EAAQK,CAAG,CAAC,MAEjCD,IAAA,IACED,EAAAE,CAAG,IAAIL,EAAQK,CAAG,OAlBtBD,IAAA,IACED,EAAAE,CAAG,IAAIL,EAAQK,CAA2B;AAuB9D,EAAID,KACFP,EAAuBJ,GAAoBU,CAAa;AAE5D;AACO,SAASI,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,GAAWb,CAAkB,IAClCc,GAA0BF,CAAe;AAG3C,GACE,OAAO,KAAKZ,CAAkB,EAAE,SAAS,KACxCW,KAAO,OAAO,KAAKA,CAAG,EAAE,SAAS,MAElC,OAAO,KAAKX,CAAkB,EAAE,QAAQ,CAACI,MAAQ;AAE/C,IAAAJ,EAAmBI,CAAG,IAAIJ,EAAmBI,CAAG,KAAK,CAAC,GAEnCJ,EAAAI,CAAG,EAAE,eAAe;AAAA,MACrC,GAAGO,GAAK;AAAA;AAAA,MACR,GAAGA,GAAK;AAAA,MACR,GAAIX,EAAmBI,CAAG,EAAE,gBAAgB,CAAA;AAAA;AAAA,IAC9C,GACwBV,EAAkBU,CAAG,KAG3CT,EACG,WACA,uBAAuBS,GAAKJ,EAAmBI,CAAG,CAAC;AAAA,EACxD,CACD,GAGYT,EAAA,SAAA,EAAW,iBAAiBkB,CAAS,GACrClB,EAAA,SAAA,EAAW,gBAAgBkB,CAAS;AAG7C,QAAAE,IAAe,CACnBvB,GACAO,MACG;AACH,UAAM,CAACiB,CAAW,IAAIC,GAASlB,GAAS,eAAemB,IAAQ;AAEpD,IAAApB,GAAA;AAAA,MACT,UAAAN;AAAA,MACA,SAAAO;AAAA,MACA,oBAAAC;AAAA,IAAA,CACD;AAEK,UAAAmB,IACJxB,EAAe,SAAS,EAAE,eAAeH,CAAkB,KAC3DqB,EAAUrB,CAAkB,GACxB4B,IAAerB,GAAS,cAC1BA,EAAQ,YAAYoB,CAAQ,IAC5BA,GAEE,CAACE,GAAOC,CAAO,IAAIC;AAAA,MACvBH;AAAA,MACA;AAAA,QACE,UAAA5B;AAAA,QACA,YAAYO,GAAS;AAAA,QACrB,aAAAiB;AAAA,QACA,cAAcjB,GAAS;AAAA,QACvB,YAAYA,GAAS;AAAA,QACrB,aAAaA,GAAS;AAAA,QACtB,cAAcA,GAAS;AAAA,QACvB,cAAcA,GAAS;AAAA,QACvB,cAAcA,GAAS;AAAA,QACvB,cAAcA,GAAS;AAAA,MAAA;AAAA,IAE3B;AAEO,WAAAuB;AAAA,EACT;AAES,WAAAE,EACPhC,GACAO,GACA;AACA,IAAAD,GAAW,EAAE,UAAAN,GAAU,SAAAO,GAAS,oBAAAC,EAAA,CAAoB,GAEhDD,EAAQ,gBACV0B,GAAyBjC,GAAoBO,CAAO,GAGtD2B,GAAiBlC,CAAkB;AAAA,EAAA;AAG9B,SAAA,EAAE,cAAAuB,GAAc,gBAAAS,EAAe;AACxC,GAEM;AAAA,EACJ,iBAAAG;AAAA,EACA,UAAAC;AAAA,EACA,mBAAAlC;AAAA,EACA,aAAAmC;AAAA,EACA,qBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,sBAAAC;AACF,IAAIxC,EAAe,SAAS,GACtByC,KAAqB,CACzBf,GACAgB,GACAC,GACAC,MACG;AACH,EAAID,GAAuB,OACjB,QAAA;AAAA,IACN;AAAA,IACAD;AAAA,IACAC,EAAsB,cAAc;AAAA,IACpCC;AAAA,EACF;AAGF,QAAMnC,IAAMoC,EAAWF,GAAuB,cAAc,GAAG,IAC3DA,EAAsB,cAAc,IAAIjB,CAAK,IAC7CiB,GAAuB,cAAc;AAEzC,MAAIlC,KAAOmC,GAAW;AACpB,UAAME,IAA4B;AAAA,MAChC,OAAApB;AAAA,MACA,aAAa,KAAK,IAAI;AAAA,MACtB,sBACE1B,EAAe,SAAS,EAAE,cAAc0C,CAAO,IAAI,CAAC,GAAG;AAAA,MACzD,iBAAiB1C,EAAe,SAAS,EAAE,YAAY0C,CAAO;AAAA,IAChE,GAEMK,IAAa,GAAGH,CAAS,IAAIF,CAAO,IAAIjC,CAAG,IAG3CuC,IAAkBC,GAAU,UAAUH,CAAI;AAChD,WAAO,aAAa;AAAA,MAClBC;AAAA,MACA,KAAK,UAAUC,EAAgB,IAAI;AAAA,IACrC;AAAA,EAAA;AAEJ,GAEME,KAAuB,CAACC,MAA4B;AACpD,MAAA,CAACA,EAAwB,QAAA;AAEzB,MAAA;AACF,UAAMC,IAAa,OAAO,aAAa,QAAQD,CAAe;AAC1D,WAACC,IAGc,KAAK,MAAMA,CAAU,IAHhB;AAAA,WAMjBC,GAAO;AACN,mBAAA,MAAM,oCAAoCA,CAAK,GAChD;AAAA,EAAA;AAEX,GACMvB,KAA2B,CAACjC,GAAkBO,MAAiB;AACnE,QAAMkD,IAAetD,EAAe,SAAS,EAAE,eAAeH,CAAQ,GAChE,EAAE,WAAA+C,EAAU,IAAIW,GAAc,GAC9BC,IAAWX,EAAWzC,GAAS,cAAc,GAAG,IAClDA,EAAQ,aAAa,IAAIkD,CAAY,IACrClD,GAAS,cAAc;AAE3B,MAAIoD,KAAYZ,GAAW;AACzB,UAAMa,IAAYP;AAAA,MAChB,GAAGN,CAAS,IAAI/C,CAAQ,IAAI2D,CAAQ;AAAA,IACtC;AAEA,QACEC,KACAA,EAAU,eAAeA,EAAU,wBAAwB;AAElD,aAAAxB,EAAApC,GAAU4D,EAAU,KAAK,GAElC1B,GAAiBlC,CAAQ,GAClB;AAAA,EACT;AAEK,SAAA;AACT,GASM6D,KAAoB,CACxBhB,GACA9B,GACA+C,GACAC,GACAvC,GACAuB,MACG;AAEH,QAAMiB,IAAU;AAAA,IACd,cAAAjD;AAAA,IACA,cAAckD;AAAA,MACZpB;AAAA,MACAkB;AAAA,MACAvC;AAAA,MACAuB;AAAA,IACF;AAAA,IACA,OAAOe;AAAA,EACT;AAEyB,EAAAtB,GAAAK,GAASmB,EAAQ,YAAY,GACtC7B,EAAAU,GAASmB,EAAQ,YAAY,GACpC5B,EAAAS,GAASmB,EAAQ,KAAK;AACjC,GAEM9B,KAAmB,CAACW,MAAoB;AAC5C,QAAMqB,IAAa/D,EAAe,SAAW,EAAA,gBAAgB,IAAI0C,CAAO;AACxE,MAAI,CAACqB,EAAY;AAGX,QAAAF,wBAAc,IAAgB;AACzB,EAAAE,EAAA,WAAW,QAAQ,CAACC,MAAc;AAM3C,KALsBA,IAClB,MAAM,QAAQA,EAAU,YAAY,IAClCA,EAAU,eACV,CAACA,EAAU,gBAAgB,WAAW,IACxC,OACgB,SAAS,MAAM,KACjCH,EAAQ,IAAI,MAAMG,EAAU,YAAA,CAAa;AAAA,EAC3C,CACD,GAGD,eAAe,MAAM;AACnB,IAAAH,EAAQ,QAAQ,CAACI,MAAWA,EAAA,CAAQ;AAAA,EAAA,CACrC;AACH,GAEaC,KAAkB,CAACrE,GAAkBwB,MAAwB;AACxE,QAAM0C,IAAa/D,EAAe,SAAW,EAAA,gBAAgB,IAAIH,CAAQ;AACzE,MAAIkE,GAAY;AACd,UAAMI,IAAkB,GAAGtE,CAAQ,OAAOwB,CAAW,IAC/C2C,IAAYD,EAAW,WAAW,IAAII,CAAe;AAQvD,SAPkBH,IAClB,MAAM,QAAQA,EAAU,YAAY,IAClCA,EAAU,eACV,CAACA,EAAU,gBAAgB,WAAW,IACxC,OAGe,SAAS,MAAM;AAChC;AAGF,IAAIA,KAGFA,EAAU,YAAY;AAAA,EACxB;AAEJ;AAEO,SAASpC,GACdwC,GACA;AAAA,EACE,UAAAvE;AAAA,EACA,YAAAwE;AAAA,EACA,cAAAC;AAAAA,EACA,cAAAzD;AAAA,EACA,YAAA0D;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAApD;AAAA,EACA,cAAAT;AAAA,EACA,YAAA8D;AAAA,EACA,cAAAC;AACF,IAIgC,IAChC;AACA,QAAM,CAACC,GAAeC,CAAW,IAAIvD,GAAS,CAAA,CAAE,GAC1C,EAAE,WAAAsB,EAAU,IAAIW,GAAc;AAEhC,MAAAuB,IAAa,CAAAjF;AACjB,QAAM,CAAC6C,CAAO,IAAIpB,GAASzB,KAAY0B,IAAQ,GACzCwD,IAAW/E,EAAe,SAAS,EAAE,SAAS0C,CAAO,GACrDsC,IAAsBC,EAAW,oBAAA,KAAa,GAC9CC,IAAiBD,EAAO5D,KAAeE,GAAA,CAAQ,GAC/C4D,IAA0BF,EAAY,IAAI;AACxB,EAAAE,EAAA,UAAUpF,EAAkB2C,CAAiB,GAErE0C,GAAU,MAAM;AACd,QAAIV,KAAcA,EAAW,aAAahC,KAAWgC,EAAW,OAAO,CAAC,GAAG;AAEhE,MAAAzC,EAAAS,GAAS,CAAC2C,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,MAAA1E,EAAA,SAAA,EAAW,YAAYsF,GAAS;AAAA,QAC7C,WAAWZ,EAAW;AAAA,QACtB,QAAQA,EAAW;AAAA,MAAA,CACpB;AAAA,IAAA;AAAA,EACH,GACC,CAACA,CAAU,CAAC,GACfU,GAAU,MAAM;AACd,QAAIxE,GAAc;AAChB,MAAAhB,GAAmB8C,GAAmB;AAAA,QACpC,cAAA9B;AAAA,MAAA,CACD;AAED,YAAMR,IAAU+E,EAAwB;AACxC,UAAI1B,IAAY;AAGhB,YAAMD,IAAWX,EAAWzC,GAAS,cAAc,GAAG,IAClDA,GAAS,cAAc,IAAIQ,CAAY,IACvCR,GAAS,cAAc;AAE3B,MAAIoD,KAAYZ,MACFa,IAAAP;AAAA,QACVN,IAAY,MAAMF,IAAU,MAAMc;AAAA,MACpC;AAGF,YAAM+B,IACJvF,EAAe,SAAS,EAAE,mBAAmB0C,CAAO;AAGtD,UACG6C,KACC,CAAC7E,EAAY6E,GAAmC3E,CAAY,KAC9D,CAAC2E,GACD;AACA,YAAI5B,IAAW/C;AAEf,QAAI6C,KACEA,EAAU,eAAeA,EAAU,wBAAwB,OAC7DE,IAAWF,EAAU,OACjBrD,GAAS,cAAc,YAChBA,GAAA,cAAc,SAASuD,CAAQ,IAK9CD;AAAA,UACEhB;AAAA,UACA9B;AAAA,UACA+C;AAAA,UACAC;AAAA,UACAsB,EAAe;AAAA,UACftC;AAAA,QACF,GAEAb,GAAiBW,CAAO,IAEF,MAAM,QAAQ+B,CAAY,IAC5CA,IACA,CAACA,KAAgB,WAAW,GAEb,SAAS,MAAM,KAChCI,EAAY,CAAA,CAAE;AAAA,MAChB;AAAA,IACF;AAAA,KAED,CAACjE,GAAc,GAAI+D,KAAgB,CAAG,CAAA,CAAC,GAE1Ca,GAAgB,MAAM;AACpB,IAAIV,KACFlF,GAAmB8C,GAAmB;AAAA,MACpC,YAAA2B;AAAA,MACA,cAAAxD;AAAA,MACA,cAAAD;AAAA,MACA,cAAA0D;AAAAA,MACA,YAAAC;AAAA,IAAA,CACD;AAGH,UAAMkB,IAAU,GAAG/C,CAAO,OAAOwC,EAAe,OAAO,IACjDnB,IAAa/D,EAChB,SAAA,EACA,gBAAgB,IAAI0C,CAAO,KAAK;AAAA,MACjC,gCAAgB,IAAI;AAAA,IACtB;AAEW,WAAAqB,EAAA,WAAW,IAAI0B,GAAS;AAAA,MACjC,aAAa,MAAMZ,EAAY,EAAE;AAAA,MACjC,2BAAW,IAAI;AAAA,MACf,MAAM,CAAC;AAAA,MACP,cAAcL,KAAgB;AAAA,MAC9B,cAAcC,KAAgB,CAAC,aAAa,MAAM;AAAA,IAAA,CACnD,GAEDzE,EAAe,SAAS,EAAE,gBAAgB,IAAI0C,GAASqB,CAAU,GAEjEc,EAAY,CAAA,CAAE,GACP,MAAM;AACX,YAAMY,IAAU,GAAG/C,CAAO,OAAOwC,EAAe,OAAO;AAEvD,MAAInB,MACSA,EAAA,WAAW,OAAO0B,CAAO,GAChC1B,EAAW,WAAW,SAAS,KACjC/D,EAAe,SAAS,EAAE,gBAAgB,OAAO0C,CAAO;AAAA,IAG9D;AAAA,EACF,GAAG,EAAE;AAEL,QAAMkB,IAAoB,CACxB8B,GACAC,GACAC,GACAC,MACG;AACC,QAAA,MAAM,QAAQF,CAAI,GAAG;AACvB,YAAMG,IAAU,GAAGpD,CAAO,IAAIiD,EAAK,KAAK,GAAG,CAAC;AACxB,MAAAX,EAAA,QAAQ,IAAIc,CAAO;AAAA,IAAA;AAEhC,IAAA7D,EAAAS,GAAS,CAACqD,MAA4B;AAC7C,YAAMC,IAAUnD,EAAyB6C,CAAkB,IACvDA,EAAmBK,CAAyB,IAC5CL,GAEEO,IAAW,GAAGvD,CAAO,IAAIiD,EAAK,KAAK,GAAG,CAAC;AAC7C,UAAIM,GAAU;AACZ,YAAIC,IAAmB,IACnBC,IAAWnG,EACZ,SACA,EAAA,kBAAkB,IAAIiG,CAAQ;AAG9B,aAAA,CAACE,KAAYA,EAAS,SAAS,OAC/BP,EAAU,eAAe,YAAYA,EAAU,eAAe,QAC/D;AAEA,gBAAMQ,IAAYT,EAAK,MAAM,GAAG,EAAE,GAC5BU,IAAaC,EAAeN,GAASI,CAAS;AAEhD,cAAA,MAAM,QAAQC,CAAU,GAAG;AACV,YAAAH,IAAA;AACnB,kBAAMK,IAAgB,GAAG7D,CAAO,IAAI0D,EAAU,KAAK,GAAG,CAAC;AACvD,YAAAD,IAAWnG,EACR,SAAA,EACA,kBAAkB,IAAIuG,CAAa;AAAA,UAAA;AAAA,QACxC;AAGF,YAAIJ,GAAU;AACZ,gBAAMK,IAAWN,IACbI,EAAeN,GAASL,EAAK,MAAM,GAAG,EAAE,CAAC,IACzCW,EAAeN,GAASL,CAAI;AAChC,UAAAQ,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,IAAa,MAAM,KAAKD,EAAO,UAAU;AAC3C,kBAAAC,EAAWH,CAAQ,GAAG;AAClB,sBAAAI,IAAeH,IACjB,IAAI,SAAS,SAAS,WAAWA,CAAM,UAAU,EAAEH,CAAQ,IAC3DA;AACJ,gBAAAK,EAAWH,CAAQ,EAAE,cAAc,OAAOI,CAAY;AAAA,cAAA;AAAA,YACxD;AAAA,UACF,CACD;AAAA,QAAA;AAAA,MACH;AAEF,MACElB,EAAU,eAAe,aACxBC,KAAiBV,EAAwB,SAAS,kBACnDQ,KAEApD;AAAA,SACGsD,KAAiBV,EAAwB,SAAS,iBACjD,MACAQ,EAAK,KAAK,GAAG;AAAA,MACjB;AAEF,YAAMoB,IAAoBpB,EAAK,MAAM,GAAGA,EAAK,SAAS,CAAC;AACvD,MACEC,EAAU,eAAe,SACzBT,EAAwB,SAAS,iBAEjC5C;AAAA,QACE4C,EAAwB,SAAS,gBAC/B,MACA4B,EAAkB,KAAK,GAAG;AAAA,MAC9B,GAGAnB,EAAU,eAAe,YACzBT,EAAwB,SAAS,iBAEbhD;AAAA,QAClBgD,EAAwB,SAAS,gBAC/B,MACA4B,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,UAAAxE,EAAsByE,CAAE,GACxB1E,GAAmB6E,GAAQF,CAAE;AAAA,QAAA;AAAA,MAC/B,CACD;AAGG,YAAAG,IAAWd,EAAeP,GAAWJ,CAAI,GACzCa,KAAWF,EAAeN,GAASL,CAAI;AAE3C,MAAAC,EAAU,eAAe,WACrBD,EAAK,KAAK,GAAG,IACb,CAAC,GAAGA,CAAI,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AACrC,YAAM5B,KAAa/D,EAAe,SAAW,EAAA,gBAAgB,IAAI0C,CAAO;AAExE,UAAIqB,IAAY;AACR,cAAAsD,IAAeC,GAAevB,GAAWC,CAAO,GAChDuB,IAAkB,IAAI,IAAIF,CAAY,GACtCG,IACJ5B,EAAU,eAAe,WACrBD,EAAK,KAAK,GAAG,IACbA,EAAK,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,KAAK;AAE1B,mBAAA;AAAA,UACT8B;AAAA,UACAzD;AAAA,QAAA,KACGD,GAAW,WAAW,WAAW;AACpC,cAAI2D,IAAe;AACb,gBAAAC,IAAgB,MAAM,QAAQ3D,EAAU,YAAY,IACtDA,EAAU,eACV,CAACA,EAAU,gBAAgB,WAAW;AAEtC,cAAA,CAAA2D,EAAc,SAAS,MAAM,GAC7B;AAAA,gBAAAA,EAAc,SAAS,KAAK,GAAG;AACjC,cAAA3D,EAAU,YAAY;AACtB;AAAA,YAAA;AAGE,gBAAA2D,EAAc,SAAS,WAAW,OAElC3D,EAAU,MAAM,IAAIwD,CAAkB,KACtCxD,EAAU,MAAM,IAAI,EAAE,OAEP0D,IAAA,KAGb,CAACA;AACH,yBAAWE,KAAeL,GAAiB;AACzC,oBAAIM,IAAqBD;AACzB,2BAAa;AACX,sBAAI5D,EAAU,MAAM,IAAI6D,CAAkB,GAAG;AAC5B,oBAAAH,IAAA;AACf;AAAA,kBAAA;AAEI,wBAAAI,KAAeD,EAAmB,YAAY,GAAG;AACvD,sBAAIC,OAAiB,IAAI;AACvB,0BAAMC,KAAaF,EAAmB;AAAA,sBACpC;AAAA,sBACAC;AAAA,oBACF;AACA,wBACE,CAAC;AAAA,sBACC,OAAOD,EAAmB,UAAUC,KAAe,CAAC,CAAC;AAAA,oBAAA,KAGnD9D,EAAU,MAAM,IAAI+D,EAAU,GAAG;AACpB,sBAAAL,IAAA;AACf;AAAA,oBAAA;AAGiB,oBAAAG,IAAAE;AAAA,kBAAA;AAEA,oBAAAF,IAAA;AAEvB,sBAAIA,MAAuB;AACzB;AAAA,gBACF;AAEF,oBAAIH,EAAc;AAAA,cAAA;AAKxB,gBAAI,CAACA,KAAgBC,EAAc,SAAS,MAAM,KAC5C3D,EAAU,cAAc;AACpB,oBAAAgE,IAAahE,EAAU,aAAagC,CAAO;AACjD,kBAAIiC,IAAc;AACd,cAAA,OAAOD,KAAe,YACpBA,MAA0BC,IAAA,MACpBvH,EAAYsD,EAAU,MAAMgE,CAAU,MAChDhE,EAAU,OAAOgE,GACHC,IAAA,KAEZA,MACaP,IAAA;AAAA,YACjB;AAIJ,YAAIA,KACF1D,EAAU,YAAY;AAAA;AAAA,QACxB;AAAA,MACF;AAIF,YAAMkE,KAAY;AAAA,QAChB,WAHgB,KAAK,IAAI;AAAA,QAIzB,UAAUxF;AAAA,QACV,MAAAiD;AAAA,QACA,YAAYC,EAAU;AAAA,QACtB,QAAQ;AAAA,QACR,UAAAwB;AAAA,QACA,UAAAZ;AAAA,MACF;AAyCI,UAvCQpE,GAAAM,GAAS,CAACyF,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,GAED3F;AAAA,QACEuD;AAAA,QACAtD;AAAA,QACAyC,EAAwB;AAAA,QACxBvC;AAAA,MACF,GAEI2B,KACSA,EAAA;AAAA,QACT,WAAWQ;AAAA,QACX,QAAQmD;AAAA,MAAA,CACT,GAEC/C,EAAwB,SAAS,YAAY;AAC/C,cAAMsD,IAAmBzI,EAAe,SAAS,EAAE,YAAY0C,CAAO,GAChE2B,IAAac,EAAwB,SAAS;AACpD,QAAA3C,GAAqBE,GAAS;AAAA,UAC5B,SACE,OAAO2B,EAAW,WAAW,WACzBA,EAAW,UACXA,EAAW,QAAQ,EAAE,OAAO2B,EAAA,CAAS;AAAA,UAC3C,eAAeyC;AAAA,UACf,iBAAiB,KAAK,IAAI,KAAKpE,EAAW,YAAY;AAAA,UACtD,QAAQ;AAAA,QAAA,CACT;AAAA,MAAA;AAGI,aAAA2B;AAAA,IAAA,CACR;AAAA,EACH;AACA,EAAKhG,EAAe,SAAW,EAAA,aAAa0C,CAAO,MACjDV;AAAA,IACEU;AAAA,IACAoB;AAAA,MACEpB;AAAA,MACAkB;AAAA,MACAsB,EAAe;AAAA,MACftC;AAAA,IAAA;AAAA,EAEJ,GACK5C,EAAe,SAAW,EAAA,eAAe0C,CAAO,KACnDT,EAASS,GAAS0B,CAAW,GAE1BpE,EAAe,SAAW,EAAA,mBAAmB0C,CAAO,KACvDL,GAAyBK,GAAS0B,CAAW;AAI3C,QAAAsE,IAAeC,GAAQ,MAEpB7E;AAAA,IACLpB;AAAA,IACAkB;AAAA,IACAsB,EAAe;AAAA,IACftC;AAAA,EACF,GACC,CAACF,CAAO,CAAC;AAEZ,SAAO,CAACR,GAAYQ,CAAO,GAAGgG,CAAY;AAI5C;AAEA,SAAS5E,EACPjE,GACA+D,GACAvC,GACAuB,GACgB;AAMV,QAAAgG,wBAAiB,IAAwB;AAC/C,MAAIC,IAAe;AAGb,QAAAC,IAAsB,CAACnD,MAAmB;AACxC,UAAAG,IAAUH,EAAK,KAAK,GAAG;AAClB,eAAA,CAAClF,CAAG,KAAKmI;AAClB,OAAInI,MAAQqF,KAAWrF,EAAI,WAAWqF,IAAU,GAAG,MACjD8C,EAAW,OAAOnI,CAAG;AAGzB,IAAAoI;AAAA,EACF,GAEME,IAAU;AAAA,IACd,kBAAkB,CAACC,MAAqC;AACtD,MAAIA,GAAK,iBACPzG,EAAsByG,EAAI,aAAa;AAAA,IAE3C;AAAA,IAEA,sBAAsB,CAACA,MAAqC;AAC1D,YAAMC,IAAOjJ,EACV,SACA,EAAA,kBAAkBH,CAAQ,GAAG;AAChC,MAAIoJ,GAAM,OACR1G,EAAsB0G,GAAM,GAAG,GAG7BD,GAAK,iBACPzG,EAAsByG,EAAI,aAAa;AAGzC,YAAMpI,IACJZ,EAAe,SAAS,EAAE,mBAAmBH,CAAQ;AAExC,MAAAG,EAAA,SAAA,EAAW,6BAA6BH,CAAQ,GAE/D+I,EAAW,MAAM,GACjBC;AAEA,YAAMK,IAAWC,EAAkBvI,GAAc,EAAE,GAC7CwI,IAAmBrJ,EAAkBF,CAAkB,GACvDwJ,IAAWxG,EAAWuG,GAAkB,cAAc,GAAG,IAC3DA,GAAkB,cAAc,IAAIxI,CAAY,IAChDwI,GAAkB,cAAc,KAE9BrG,IAAa,GAAGH,CAAS,IAAI/C,CAAQ,IAAIwJ,CAAQ;AAEvD,MAAItG,KACF,aAAa,WAAWA,CAAU,GAGpCf,EAAgBnC,GAAUqJ,CAAQ,GAClCjH,EAASpC,GAAUe,CAAY;AAC/B,YAAMmD,IAAa/D,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAC/B,aAAIkE,KACSA,EAAA,WAAW,QAAQ,CAACC,MAAc;AAC3C,QAAAA,EAAU,YAAY;AAAA,MAAA,CACvB,GAGIpD;AAAA,IACT;AAAA,IACA,oBAAoB,CAAC+C,MAAgB;AAEnC,MAAAiF,EAAW,MAAM,GACjBC;AAEA,YAAMS,IAAkBxF;AAAA,QACtBjE;AAAA,QACA+D;AAAA,QACAvC;AAAA,QACAuB;AAAA,MACF;AACA,aAAA2G,GAAgB,MAAM;AACpB,QAAAlH,GAAyBxC,GAAU8D,CAAQ,GAC3C3B,EAAgBnC,GAAUyJ,CAAe,GACzCrH,EAASpC,GAAU8D,CAAQ;AAC3B,cAAMI,IAAa/D,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAC/B,QAAIkE,KACSA,EAAA,WAAW,QAAQ,CAACC,MAAc;AAC3C,UAAAA,EAAU,YAAY;AAAA,QAAA,CACvB;AAAA,MACH,CACD,GAEM;AAAA,QACL,SAAS,CAACwF,MAAmBF,EAAgB,MAAME,CAAK;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,eAAexJ,EAAe,WAAW,mBAAmBH,CAAQ;AAAA,IACpE,cAAcG,EAAe,WAAW,YAAYH,CAAQ;AAAA,IAC5D,YAAYG,EAAe,WAAW,gBAAgBH,CAAQ;AAAA,IAC9D,iBAAiB,MAAM;AACrB,YAAM4J,IAAczJ,EAAe,SAAS,EAAE,YAAYH,CAAQ;AAC3D,aAAA,GACL4J,KAAe/I,EAAY+I,GAAavH,GAAYrC,CAAQ,CAAC;AAAA,IAC/D;AAAA,EAEJ;AAEA,WAASsJ,EACP7F,GACAqC,IAAiB,CAAA,GACjB+D,GACK;AACL,UAAMC,IAAWhE,EAAK,IAAI,MAAM,EAAE,KAAK,GAAG;AAGtB,IAAAiD,EAAW,IAAIe,CAAQ;AAU3C,UAAMC,IAAe,WAAY;AAC/B,aAAO5J,EAAe,EAAE,eAAeH,GAAU8F,CAAI;AAAA,IACvD;AAGA,WAAO,KAAKoD,CAAO,EAAE,QAAQ,CAACtI,MAAQ;AACnC,MAAAmJ,EAAqBnJ,CAAG,IAAKsI,EAAgBtI,CAAG;AAAA,IAAA,CAClD;AAED,UAAMoJ,IAAU;AAAA,MACd,MAAMC,GAAaC,GAAcC,GAAa;AACpC,uBAAA;AAAA,UACN,kCAAkCnK,CAAQ,UAAU8F,EAAK,KAAK,GAAG,CAAC;AAAA,QACpE,GACA,QAAQ,MAAM,wBAAwB,GAC/B3F,EAAe,EAAE,eAAeH,GAAU8F,CAAI;AAAA,MACvD;AAAA,MAEA,IAAImE,GAAaG,GAAc;AAE3B,YAAAA,MAAS,UACT,CAACA,EAAK,WAAW,GAAG,KACpBA,MAAS,oBACT;AACM,gBAAAC,IAAcvE,EAAK,KAAK,GAAG,GAC3BxB,IAAkB,GAAGtE,CAAQ,OAAOwB,CAAW,IAE/C0C,IAAa/D,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAE/B,cAAIkE,GAAY;AACd,kBAAMC,IAAYD,EAAW,WAAW,IAAII,CAAe;AAE3D,YAAIH,MAEE2B,EAAK,SAAS,KAAKsE,MAAS,UACpBjG,EAAA,MAAM,IAAIkG,CAAW;AAAA,UAGnC;AAAA,QACF;AAEF,YAAID,MAAS;AACX,iBAAO,MACe3C;AAAA,YAClBtH,EAAe,SAAA,EAAW,eAAeH,CAAQ;AAAA,YACjDG,EAAe,WAAW,mBAAmBH,CAAQ;AAAA,UACvD;AAIJ,YAAIoK,MAAS,UAAUtE,EAAK,WAAW;AACrC,iBAAO,iBAAkB;AAEvB,kBAAMvF,IAAUJ,EACb,SAAS,EACT,kBAAkBH,CAAQ,GACvBsK,IAAO/J,GAAS;AAEtB,gBAAI,CAAC+J;AACK,6BAAA,MAAM,sCAAsCtK,CAAQ,GAAG,GACxD,EAAE,SAAS,IAAO,OAAO,sBAAsB;AAIxD,kBAAM6B,IAAQ1B,EACX,WACA,eAAeH,GAAU,EAAE,GAGxBgG,IAAgBzF,GAAS,YAAY;AAEvC,gBAAA;AAEF,oBAAMgK,IAAW,MAAMD,EAAK,OAAOzI,CAAK;AAGxC,kBACE0I,KACA,CAACA,EAAS,WACVA,EAAS,UACTvE,GACA;AAEe,gBAAA7F,EAAA,SAAA,EAAW,sBAAsB6F,CAAa,GAGpDuE,EAAA,OAAO,QAAQ,CAAC/G,MAAU;AAC3B,wBAAAgH,IAAY,CAACxE,GAAe,GAAGxC,EAAM,IAAI,EAAE,KAAK,GAAG;AAEzD,kBAAArD,EACG,SAAS,EACT,mBAAmBqK,GAAWhH,EAAM,OAAO;AAAA,gBAAA,CAC/C;AAGD,sBAAMU,IAAa/D,EAChB,SACA,EAAA,gBAAgB,IAAIH,CAAQ;AAC/B,gBAAIkE,KACSA,EAAA,WAAW,QAAQ,CAACC,MAAc;AAC3C,kBAAAA,EAAU,YAAY;AAAA,gBAAA,CACvB;AAAA,cACH;AAIE,qBAAAoG,GAAU,WAAWD,EAAK,YACvBA,EAAA,UAAUC,EAAS,IAAI,IACnB,CAACA,GAAU,WAAWD,EAAK,WAC/BA,EAAA,QAAQC,EAAS,KAAK,GAGtBA;AAAA,qBACA/G,GAAO;AACd,qBAAI8G,EAAK,WACPA,EAAK,QAAQ9G,CAAK,GAEb,EAAE,SAAS,IAAO,OAAAA,EAAM;AAAA,YAAA;AAAA,UAEnC;AAEF,YAAI4G,MAAS,WAAW;AAEtB,gBAAMK,IAAoBtK,EACvB,SACA,EAAA,eAAeH,GAAU8F,CAAI,GAG1B/E,IACJZ,EAAe,SAAS,EAAE,mBAAmBH,CAAQ,GACjD0K,IAAqBjE,EAAe1F,GAAc+E,CAAI;AAGxD,iBAAAjF,EAAY4J,GAAmBC,CAAkB,IAC5C,UAEA;AAAA,QACT;AAEF,YAAIN,MAAS;AACX,iBAAO,WAAY;AAEX,kBAAAK,IAAoBtK,IAAiB;AAAA,cACzCH;AAAA,cACA8F;AAAA,YACF,GAGM/E,IACJZ,EAAe,SAAS,EAAE,mBAAmBH,CAAQ,GACjD0K,IAAqBjE,EAAe1F,GAAc+E,CAAI;AAExD,mBAAAjF,EAAY4J,GAAmBC,CAAkB,IAC5C,UAEA;AAAA,UAEX;AAEF,YAAIN,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMrJ,IACJZ,EAAe,SAAS,EAAE,mBAAmBH,CAAQ,GACjDuJ,IAAmBrJ,EAAkBF,CAAkB,GACvDwJ,IAAWxG,EAAWuG,GAAkB,cAAc,GAAG,IAC3DA,GAAkB,cAAc,IAAIxI,CAAY,IAChDwI,GAAkB,cAAc,KAE9BrG,IAAa,GAAGH,CAAS,IAAI/C,CAAQ,IAAIwJ,CAAQ;AAC/C,oBAAA,IAAI,oBAAoBtG,CAAU,GACtCA,KACF,aAAa,WAAWA,CAAU;AAAA,UAEtC;AAEF,YAAIkH,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMhB,IAAOjJ,EACV,SACA,EAAA,kBAAkBH,CAAQ,GAAG;AAE5B,gBAAA,CAACoJ,GAAM;AACH,oBAAA,IAAI,MAAM,0BAA0B;AAMrC,mBAJQjJ,EACZ,SAAA,EACA,oBAAoBiJ,EAAK,MAAM,MAAMtD,EAAK,KAAK,GAAG,CAAC;AAAA,UAGxD;AAEE,YAAA,MAAM,QAAQrC,CAAY,GAAG;AAC/B,cAAI2G,MAAS;AACX,mBAAO,MAAM;AACL,oBAAAO,IAAgBxK,EACnB,WACA,iBAAiBH,GAAU8F,EAAK,KAAK,GAAG,CAAC;AACxC,kBAAA6E,MAAkB;AACf,uBAAArB;AAAA,kBACL7F,EAAakH,CAAa;AAAA,kBAC1B,CAAC,GAAG7E,GAAM6E,EAAc,UAAU;AAAA,kBAClCd;AAAA,gBACF;AAAA,YACF;AAEF,cAAIO,MAAS;AACX,mBAAO,MAAM;AACX,cAAAjK,EAAe,WAAW,mBAAmB,EAAE,UAAAH,GAAU,MAAA8F,GAAM;AAAA,YACjE;AAEF,cAAIsE,MAAS;AACX,mBAAO,MACiBjK,EACnB,WACA,iBAAiBH,GAAU8F,EAAK,KAAK,GAAG,CAAC,KAEpB;AAG5B,cAAIsE,MAAS;AACX,mBAAO,CACLQ,MAIG;AAYH,oBAAMC,IAAc,CAAC,GAXA1K,EAClB,SACA,EAAA,eAAeH,GAAU8F,CAAI,EAGD,IAAI,CAACsB,GAAQ0D,OAAe;AAAA,gBACzD,GAAG1D;AAAA,gBACH,aAAa0D,EAAE,SAAS;AAAA,cAAA,EACxB,CAG+B,EAAE,KAAKF,CAAS;AAGjD,qBAAA7B,EAAW,MAAM,GACjBC,KAGOM,EAAkBuB,GAAoB/E,GAAM;AAAA,gBACjD,UAAU,CAAC,GAAI+D,GAAM,YAAY,CAAA,GAAK/D,CAAI;AAAA,gBAC1C,cAAc+E,EAAY;AAAA,kBAAI,CAACE,MAC7B,SAASA,EAAK,WAAqB;AAAA,gBAAA;AAAA,cACrC,CACD;AAAA,YACH;AAEE,cAAAX,MAAS,cAAcA,MAAS;AAClC,mBAAO,CACLY,MAOG;AACG,oBAAAC,IAAapB,GAAM,UAAU;AAAA,gBACjC,CAACqB,MAAMA,EAAE,KAAK,GAAG,MAAMpF,EAAK,KAAK,GAAG;AAAA,cACtC,GACMqF,IAAaF,IACfxH,IACAtD,EAAe,WAAW,eAAeH,GAAU8F,CAAI;AAE3D,qBAAIsE,MAAS,uBACXrB,EAAW,MAAM,GACjBC,MAGKmC,EAAW,IAAI,CAACC,GAAUC,MAAkB;AACjD,sBAAMC,IACJL,KAAcG,EAAI,cAAcA,EAAI,cAAcC,GAC9CE,IAAejC;AAAA,kBACnB8B;AAAA,kBACA,CAAC,GAAGtF,GAAMwF,EAAU,UAAU;AAAA,kBAC9BzB;AAAA,gBACF;AACO,uBAAAmB;AAAA,kBACLI;AAAA,kBACAG;AAAA,kBACAF;AAAA,kBACA5H;AAAA,kBACA6F,EAAkB7F,GAAqBqC,GAAM+D,CAAI;AAAA,gBACnD;AAAA,cAAA,CACD;AAAA,YACH;AAEF,cAAIO,MAAS;AACX,mBAAO,CACLY,MAQOQ,EAAcC,IAAmB;AAAA,cACtC,OAAO;AAAA,gBACL,WAAWzL;AAAA,gBACX,OAAO8F;AAAA,gBACP,QAAQkF;AAAA;AAAA,cACV;AAAA,cAEA,mBAAA1B;AAAA,YAAA,CACD;AAGL,cAAIc,MAAS;AACX,mBAAO,CAACsB,MAAsB;AAItB,oBAAAP,IAHatB,GAAM,UAAU;AAAA,gBACjC,CAACqB,MAAMA,EAAE,KAAK,GAAG,MAAMpF,EAAK,KAAK,GAAG;AAAA,cACtC,IAEIrC,IACAtD,EAAe,WAAW,eAAeH,GAAU8F,CAAI;AAG3D,cAAAiD,EAAW,MAAM,GACjBC;AAEA,oBAAM2C,IAAmBR,EAAW;AAAA,gBAClC,CAACC,GAAUC,MACFD,EAAIM,CAAS,KAAK,CAAC;AAAA,cAE9B;AAEO,qBAAApC;AAAA,gBACLqC;AAAA,gBACA,CAAC,GAAG7F,GAAM,OAAO4F,CAAS;AAAA,gBAC1B7B;AAAA,cACF;AAAA,YACF;AAGF,cAAIO,MAAS;AACJ,mBAAA,CACLvH,GACA+I,MACG;AACH,oBAAMC,IAAapI,EAAa,UAAU,CAAC0F,MAClCA,EAAItG,CAAO,MAAM+I,CACzB;AAEG,kBAAAC,MAAe,GAAW;AACxB,oBAAAC,IAAarI,EAAaoI,CAAU,GACpCE,IAAU,CAAC,GAAGjG,GAAM+F,EAAW,UAAU;AAO/C,qBAAA9C,EAAW,MAAM,GACjBC,KAGOM,EAAkBwC,GAAYC,CAAO;AAAA,YAC9C;AAGF,cAAI3B,MAAS;AACX,mBAAO,CAACiB,MAAkB;AAClB,oBAAAW,IAAavI,EAAa4H,CAAK;AAC9B,qBAAA/B,EAAkB0C,GAAY,CAAC,GAAGlG,GAAMuF,EAAM,SAAA,CAAU,CAAC;AAAA,YAClE;AAEF,cAAIjB,MAAS;AAEX,mBAAO,MAAM;AACX,oBAAM6B,IAAe9L,EAClB,SACA,EAAA,eAAeH,GAAU8F,CAAI;AAC5B,kBAAAmG,EAAa,WAAW,EAAU;AAChC,oBAAAC,IAAYD,EAAa,SAAS,GAClCE,IAAYF,EAAaC,CAAS,GAClCH,IAAU,CAAC,GAAGjG,GAAMoG,EAAU,UAAU;AAGvC,qBAAA5C,EAAkB6C,GAAWJ,CAAO;AAAA,YAC7C;AAEF,cAAI3B,MAAS;AACX,mBAAO,CAACjE,OAEN8C,EAAoBnD,CAAI,GACfsG,GAAArI,GAAmBoC,GAASL,GAAM9F,CAAQ,GAC5CsJ;AAAA,cACLnJ,EAAe,SAAW,EAAA,eAAeH,GAAU8F,CAAI;AAAA,cACvDA;AAAA,YACF;AAIJ,cAAIsE,MAAS;AACJ,mBAAA,CACLjE,GACAkG,GACAC,MACG;AACH,oBAAML,IAAe9L,EAClB,SACA,EAAA,eAAeH,GAAU8F,CAAI,GAC1Ba,IAAW3D,EAAcmD,CAAO,IAClCA,EAAQ8F,CAAmB,IAC1B9F;AAEL,kBAAIoG,IAAmB;AAkBvB,kBAjBiB,CAACN,EAAa,KAAK,CAAClB,MAAS;AAC5C,oBAAIsB,GAAQ;AACV,wBAAMG,IAAUH,EAAO;AAAA,oBAAM,CAAC1C,MAC5B9I,EAAYkK,EAAKpB,CAAK,GAAGhD,EAASgD,CAAK,CAAC;AAAA,kBAC1C;AACA,yBAAI6C,MACYD,IAAAxB,IAETyB;AAAAA,gBAAA;AAEH,sBAAAA,IAAU3L,EAAYkK,GAAMpE,CAAQ;AAC1C,uBAAI6F,MACYD,IAAAxB,IAETyB;AAAA,cAAA,CACR;AAGC,gBAAAvD,EAAoBnD,CAAI,GACfsG,GAAArI,GAAmB4C,GAAUb,GAAM9F,CAAQ;AAAA,uBAC3CsM,KAAWC,GAAa;AAC3B,sBAAAE,IAAcH,EAAQC,CAAW,GACjCG,IAAeT,EAAa;AAAA,kBAAI,CAAClB,MACrClK,EAAYkK,GAAMwB,CAAW,IAAIE,IAAc1B;AAAA,gBACjD;AACA,gBAAA9B,EAAoBnD,CAAI,GACf6G,EAAA5I,GAAmB2I,GAAqB5G,CAAI;AAAA,cAAA;AAAA,YAEzD;AAGF,cAAIsE,MAAS;AACJ,mBAAA,CAACiB,GAAe9K,MAAwC;AAC7D,kBAAI,CAAAA,GAAS;AAEb,uBAAA0I,EAAoBnD,CAAI,GAChB8G,EAAA7I,GAAmB+B,GAAM9F,GAAUqL,CAAK,GACzC/B;AAAA,kBACLnJ,EAAe,SAAW,EAAA,eAAeH,GAAU8F,CAAI;AAAA,kBACvDA;AAAA,gBACF;AAAA,YACF;AAEF,cAAIsE,MAAS;AACX,mBAAO,CAACyC,MAAqC;AAC3C,uBAASxB,IAAQ,GAAGA,IAAQ5H,EAAa,QAAQ4H;AAC3C,gBAAA5H,EAAa4H,CAAK,MAAMwB,KAClBD,EAAA7I,GAAmB+B,GAAM9F,GAAUqL,CAAK;AAAA,YAGtD;AAEF,cAAIjB,MAAS;AACX,mBAAO,CAACyC,MAAqC;AAC3C,oBAAMxB,IAAQ5H,EAAa,UAAU,CAACsH,MAASA,MAAS8B,CAAK;AAC7D,cAAIxB,IAAQ,KAEFuB,EAAA7I,GAAmB+B,GAAM9F,GAAUqL,CAAK,IAGvCe,GAAArI,GAAmB8I,GAAc/G,GAAM9F,CAAQ;AAAA,YAE5D;AAGF,cAAIoK,MAAS;AACX,mBAAO,CACLY,MAIG;AACH,oBAAM8B,IAASrJ,EAAa,IAAI,CAAC2D,GAAQ0D,OAAe;AAAA,gBACtD,GAAG1D;AAAA,gBACH,aAAa0D,EAAE,SAAS;AAAA,cAAA,EACxB,GAEIiC,IAAyB,CAAC,GAC1BC,IAA6C,CAAC;AAEpD,uBAASlC,IAAI,GAAGA,IAAIgC,EAAO,QAAQhC;AACjC,gBAAIE,EAAW8B,EAAOhC,CAAC,GAAGA,CAAC,MACzBiC,EAAa,KAAKjC,CAAC,GACLkC,EAAA,KAAKF,EAAOhC,CAAC,CAAC;AAKhC,qBAAA/B,EAAW,MAAM,GACjBC,KAGOM,EAAkB0D,GAAsBlH,GAAM;AAAA,gBACnD,UAAU,CAAC,GAAI+D,GAAM,YAAY,CAAA,GAAK/D,CAAI;AAAA,gBAC1C,cAAAiH;AAAA;AAAA,cAAA,CACD;AAAA,YACH;AAAA,QACF;AAEF,cAAME,IAAkBnH,EAAKA,EAAK,SAAS,CAAC;AAC5C,YAAI,CAAC,MAAM,OAAOmH,CAAe,CAAC,GAAG;AACnC,gBAAM/E,IAAapC,EAAK,MAAM,GAAG,EAAE,GAC7BoH,IAAc/M,EACjB,SACA,EAAA,eAAeH,GAAUkI,CAAU;AAEtC,cAAI,MAAM,QAAQgF,CAAW,KAAK9C,MAAS;AACzC,mBAAO,MACLwC;AAAA,cACE7I;AAAA,cACAmE;AAAA,cACAlI;AAAA,cACA,OAAOiN,CAAe;AAAA,YACxB;AAAA,QACJ;AAGF,YAAI7C,MAAS;AACX,iBAAO,MAAMjK,EAAe,SAAA,EAAW,eAAeH,GAAU8F,CAAI;AAEtE,YAAIsE,MAAS;AACJ,iBAAA,CAAC+C,MACNC,GAAY;AAAA,YACV,WAAWpN;AAAA,YACX,OAAO8F;AAAA,YACP,SAASqH,EAAG,SAAS;AAAA,UAAA,CACtB;AAGL,YAAI/C,MAAS;AACJ,iBAAA,CAAC+C,MACNC,GAAY;AAAA,YACV,WAAWpN;AAAA,YACX,OAAO8F;AAAA,YACP,SAASqH,EAAG,SAAS;AAAA,UAAA,CACtB;AAGL,YAAI/C,MAAS;AACX,iBAAO,MACLgD,GAAY;AAAA,YACV,WAAWpN;AAAA,YACX,OAAO8F;AAAA,UAAA,CACR;AAEL,YAAIsE,MAAS,cAAc;AACzB,gBAAM3E,IAAU,GAAGzF,CAAQ,IAAI8F,EAAK,KAAK,GAAG,CAAC;AAC7C,iBAAO3F,EAAe,WAAW,YAAYsF,CAAO;AAAA,QAAA;AAGtD,YAAI2E,KAAQ;AACV,iBAAO,CAACxJ,MACNyC,GAAqBN,IAAY,MAAM/C,IAAW,MAAMY,CAAG;AAE/D,YAAIwJ,MAAS,aAAa;AACxB,gBAAMlC,IAAapC,EAAK,MAAM,GAAG,EAAE,GAC7BuH,IAAYnF,EAAW,KAAK,GAAG,GAC/BnB,IAAS5G,EACZ,SACA,EAAA,eAAeH,GAAUkI,CAAU;AAClC,iBAAA,MAAM,QAAQnB,CAAM,IACD,OAAOjB,EAAKA,EAAK,SAAS,CAAC,CAAC,MAG/C3F,EAAe,SAAW,EAAA,iBAAiBH,GAAUqN,CAAS,IAG3D;AAAA,QAAA;AAET,YAAIjD,MAAS;AACX,iBAAO,CAACyC,MAAmB;AACzB,kBAAM3E,IAAapC,EAAK,MAAM,GAAG,EAAE,GAC7BwF,IAAY,OAAOxF,EAAKA,EAAK,SAAS,CAAC,CAAC,GACxCuH,IAAYnF,EAAW,KAAK,GAAG;AAErC,YAAI2E,IACF1M,EACG,SAAS,EACT,iBAAiBH,GAAUqN,GAAW/B,CAAS,IAElDnL,EACG,SAAS,EACT,iBAAiBH,GAAUqN,GAAW,MAAS;AAG9C,kBAAAC,IAASnN,EACZ,SAAS,EACT,eAAeH,GAAU,CAAC,GAAGkI,CAAU,CAAC;AAClC,YAAAyE,EAAA5I,GAAmBuJ,GAAQpF,CAAU,GAG9Ce,EAAoBf,CAAU;AAAA,UAChC;AAEF,YAAIkC,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMlC,IAAapC,EAAK,MAAM,GAAG,EAAE,GAC7BwF,IAAY,OAAOxF,EAAKA,EAAK,SAAS,CAAC,CAAC,GACxCuH,IAAYnF,EAAW,KAAK,GAAG,GAC/ByC,IAAgBxK,EACnB,SACA,EAAA,iBAAiBH,GAAUqN,CAAS;AAEvC,YAAAlN,EACG,WACA;AAAA,cACCH;AAAA,cACAqN;AAAA,cACA1C,MAAkBW,IAAY,SAAYA;AAAA,YAC5C;AACI,kBAAAgC,IAASnN,EACZ,SAAS,EACT,eAAeH,GAAU,CAAC,GAAGkI,CAAU,CAAC;AAClC,YAAAyE,EAAA5I,GAAmBuJ,GAAQpF,CAAU,GAG9Ce,EAAoBf,CAAU;AAAA,UAChC;AAEE,YAAApC,EAAK,UAAU,GAAG;AACpB,cAAIsE,MAAS;AACX,mBAAO,MAAM;AACX,oBAAMhB,IAAOjJ,EACV,SACA,EAAA,kBAAkBH,CAAQ,GAAG,YAC1ByC,IACJtC,EAAe,SAAA,EAAW;AAExB,kBAAA,CAACiJ,GAAM;AACH,sBAAA,IAAI,MAAM,sBAAsB;AAGpC,kBAAA,CAACA,GAAM;AACH,sBAAA,IAAI,MAAM,0BAA0B;AAE5C,cAAA1G,EAAsB0G,EAAK,GAAG;AAC9B,oBAAMmE,IACJpN,EAAe,SAAS,EAAE,eAAeH,CAAQ;AAE/C,kBAAA;AAGF,sBAAMwN,IAAiBrN,EACpB,SACA,EAAA,oBAAoBiJ,EAAK,GAAG;AAC3B,gBAAAoE,KAAkBA,EAAe,SAAS,KAC5CA,EAAe,QAAQ,CAAC,CAAChD,CAAS,MAAM;AACtC,kBAAIA,KAAaA,EAAU,WAAWpB,EAAK,GAAI,KAC7C1G,EAAsB8H,CAAS;AAAA,gBACjC,CACD;AAIH,sBAAMiD,IAASrE,EAAK,UAAU,UAAUmE,CAAU;AAE9C,uBAACE,EAAO,UAqBL,MAnBaA,EAAO,MAAM,OAErB,QAAQ,CAACjK,MAAU;AAC3B,wBAAMgH,IAAYhH,EAAM,MAClBkK,IAAelK,EAAM,SAIrBmK,IAAgB,CAACvE,EAAK,KAAK,GAAGoB,CAAS,EAAE,KAAK,GAAG;AAGvD/H,kBAAAA,EAAmBkL,GAAeD,CAAY;AAAA,gBAAA,CAC/C,GAEDxL,GAAiBlC,CAAQ,GAElB;AAAA,uBAIFwD,GAAO;AACN,+BAAA,MAAM,gCAAgCA,CAAK,GAC5C;AAAA,cAAA;AAAA,YAEX;AAEE,cAAA4G,MAAS,eAAuB,QAAA5I;AACpC,cAAI4I,MAAS;AACX,mBAAO,MAAMjK,EAAiB,EAAA,gBAAgB,IAAIH,CAAQ;AAE5D,cAAIoK,MAAS;AACX,mBAAO,MACEwD,GAAa,WAAW,sBAAsB5N,CAAQ;AAIjE,cAAIoK,MAAS;AACX,mBAAOjK,EAAe,WAAW,mBAAmBH,CAAQ;AAC9D,cAAIoK,MAAS;AACX,mBAAOjK,EAAe,WAAW,YAAYH,CAAQ;AACvD,cAAIoK,MAAS;AACX,mBAAOjK,EAAe,WAAW,gBAAgBH,CAAQ;AAC3D,cAAIoK,MAAS;AACX,mBAAOlB,EAAQ;AACb,cAAAkB,MAAS,qBAAsB,QAAOlB,EAAQ;AAC9C,cAAAkB,MAAS,mBAAoB,QAAOlB,EAAQ;AAAA,QAAA;AAElD,YAAIkB,MAAS;AACX,iBAAO,MACEwD,GACJ,SACA,EAAA,WAAW5N,IAAW,MAAM8F,EAAK,KAAK,GAAG,CAAC;AAIjD,YAAIsE,MAAS;AACX,iBAAO,CAAC;AAAA,YACN,UAAAyD;AAAA,YACA,aAAAC;AAAA,UAAA,MAKA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,UACEF,IAAc,EAAE,YAAY,EAAE,SAAS,SAAS;AAAA,cAElD,MAAAhI;AAAA,cACA,eACE3F,EAAe,WAAW,kBAAkBH,CAAQ,GAChD,YAAY,OAAO;AAAA,cAEzB,UAAAA;AAAA,cACA,cAAc6J,GAAM;AAAA,cAEnB,UAAAgE;AAAA,YAAA;AAAA,UACH;AAIA,YAAAzD,MAAS,YAAoB,QAAApK;AAC7B,YAAAoK,MAAS,QAAgB,QAAAtE;AACzB,YAAAsE,MAAS,kBAAmB,QAAOlB,EAAQ;AAE/C,YAAIkB,MAAS;AACJ,iBAAA,CAACjE,GAAuB8H,MAAyB;AAEtD,gBAAIA,GAAM;AACR,cAAAC,GAAS,MAAM;AACJ,gBAAAvB,EAAA5I,GAAmBoC,GAASL,GAAM,EAAE;AAC7C,sBAAMa,IAAWxG,EACd,SACA,EAAA,eAAeH,GAAU8F,CAAI;AAChC,gBAAImI,GAAM,eAAkBA,EAAA,YAAYtH,CAAQ;AAAA,cAAA,GAC/CsH,EAAK,QAAQ;AAAA,iBACX;AACI,cAAAtB,EAAA5I,GAAmBoC,GAASL,GAAM,EAAE;AAC7C,oBAAMa,IAAWxG,EACd,SACA,EAAA,eAAeH,GAAU8F,CAAI;AAChC,cAAImI,GAAM,eAAkBA,EAAA,YAAYtH,CAAQ;AAAA,YAAA;AAElD,YAAAsC,EAAoBnD,CAAI;AAAA,UAC1B;AAGF,YAAIsE,MAAS;AACJ,iBAAA,CAAC+D,GAAuBC,MAE3B,gBAAAL;AAAA,YAACM;AAAA,YAAA;AAAA,cACC,UAAUtK;AAAA,cACV,UAAA/D;AAAA,cACA,MAAA8F;AAAA,cACA,OAAAqI;AAAA,cACA,UAAAC;AAAA,YAAA;AAAA,UACF;AAKN,cAAME,IAAW,CAAC,GAAGxI,GAAMsE,CAAI,GACzBmE,IAAYpO,EACf,SACA,EAAA,eAAeH,GAAUsO,CAAQ;AAC7B,eAAAhF,EAAkBiF,GAAWD,GAAUzE,CAAI;AAAA,MAAA;AAAA,IAEtD,GAEM2E,IAAgB,IAAI,MAAMzE,GAAcC,CAAO;AAErD,WAAAjB,EAAW,IAAIe,GAAU;AAAA,MACvB,OAAO0E;AAAA,MACP,cAAAxF;AAAA,IAAA,CACD,GAEMwF;AAAA,EAAA;AAGF,SAAAlF;AAAA,IACLnJ,EAAe,SAAS,EAAE,eAAeH,GAAU,CAAE,CAAA;AAAA,EACvD;AACF;AAEO,SAASoN,GAAYqB,GAIzB;AACD,SAAOjD,EAAckD,IAAgB,EAAE,OAAAD,GAAO;AAChD;AAEA,SAAShD,GAAkB;AAAA,EACzB,OAAAgD;AAAA,EAEA,mBAAAnF;AACF,GAkBG;AACD,QAAMuD,IAAQ1M,IAAiB,eAAesO,EAAM,WAAWA,EAAM,KAAK;AAE1E,SAAK,MAAM,QAAQ5B,CAAK,IAGJvD;AAAA,IAClBuD;AAAA,IACA4B,EAAM;AAAA,EACR,EAEmB;AAAA,IACjB,CAAC1D,GAAM4D,GAAQtD,GAAOwB,GAAO+B,MAEpBH,EAAM,OAAO1D,GAAM4D,GAAQtD,GAAOwB,GAAO+B,CAAW;AAAA,EAE/D,IAZS;AAaX;AACA,SAASF,GAAe;AAAA,EACtB,OAAAD;AACF,GAMG;AACK,QAAAI,IAAazJ,EAAwB,IAAI,GACzCgB,IAAW,GAAGqI,EAAM,SAAS,IAAIA,EAAM,MAAM,KAAK,GAAG,CAAC;AAE5D,SAAAlJ,GAAU,MAAM;AACd,UAAMuJ,IAAUD,EAAW;AAC3B,QAAI,CAACC,KAAW,CAACA,EAAQ,cAAe;AAExC,UAAMC,IAAgBD,EAAQ,eAExBjI,IADa,MAAM,KAAKkI,EAAc,UAAU,EAC1B,QAAQD,CAAO;AAEvC,QAAAlI,IAAWmI,EAAc,aAAa,gBAAgB;AAC1D,IAAKnI,MACQA,IAAA,UAAU,OAAO,WAAY,CAAA,IAC1BmI,EAAA,aAAa,kBAAkBnI,CAAQ;AAIvD,UAAMoI,IAAc;AAAA,MAClB,YAFiB,YAAY,OAAO,WAAY,CAAA;AAAA,MAGhD,UAAApI;AAAA,MACA,UAAAC;AAAA,MACA,QAAQ4H,EAAM;AAAA,IAChB;AAEA,IAAAtO,EAAe,SAAS,EAAE,iBAAiBiG,GAAU4I,CAAW;AAG1D,UAAAnC,IAAQ1M,EACX,SAAS,EACT,eAAesO,EAAM,WAAWA,EAAM,KAAK;AAE1C,QAAAxH;AACJ,QAAIwH,EAAM;AACJ,UAAA;AACF,QAAAxH,IAAe,IAAI;AAAA,UACjB;AAAA,UACA,WAAWwH,EAAM,OAAO;AAAA,UACxB5B,CAAK;AAAA,eACAoC,GAAK;AACJ,gBAAA,MAAM,kDAAkDA,CAAG,GACpDhI,IAAA4F;AAAA,MAAA;AAAA;AAGF,MAAA5F,IAAA4F;AAGjB,IAAI5F,MAAiB,QAAQ,OAAOA,KAAiB,aACpCA,IAAA,KAAK,UAAUA,CAAY;AAG5C,UAAMiI,IAAW,SAAS,eAAe,OAAOjI,CAAY,CAAC;AAC7D,IAAA6H,EAAQ,YAAYI,CAAQ;AAAA,EAAA,GAC3B,CAACT,EAAM,WAAWA,EAAM,MAAM,KAAK,GAAG,GAAGA,EAAM,OAAO,CAAC,GAEnDjD,EAAc,QAAQ;AAAA,IAC3B,KAAKqD;AAAA,IACL,OAAO,EAAE,SAAS,OAAO;AAAA,IACzB,kBAAkBzI;AAAA,EAAA,CACnB;AACH;AACO,SAAS+I,GAAiBV,GAG9B;AACD,QAAM5B,IAAQuC;AAAA,IACZ,CAACC,MAAW;AACJ,YAAAnL,IAAa/D,EAChB,SAAS,EACT,gBAAgB,IAAIsO,EAAM,SAAS,KAAK;AAAA,QACzC,gCAAgB,IAAI;AAAA,MACtB;AACW,aAAAvK,EAAA,WAAW,IAAIuK,EAAM,WAAW;AAAA,QACzC,aAAaY;AAAA,QACb,2BAAW,IAAI,CAACZ,EAAM,MAAM,KAAK,GAAG,CAAC,CAAC;AAAA,MAAA,CACvC,GACM,MAAMvK,EAAW,WAAW,OAAOuK,EAAM,SAAS;AAAA,IAC3D;AAAA,IACA,MAAMtO,EAAe,WAAW,eAAesO,EAAM,WAAWA,EAAM,KAAK;AAAA,EAC7E;AACA,SAAOjD,EAAc,QAAQ,CAAI,GAAA,OAAOqB,CAAK,CAAC;AAChD;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.160",
3
+ "version": "0.5.161",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",