cogsbox-state 0.5.221 → 0.5.223

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.
@@ -510,11 +510,12 @@ function re(e, i, v, u) {
510
510
  "middleware"
511
511
  ]);
512
512
  if (c !== "then" && !c.startsWith("$") && c !== "stateMapNoRender" && !K.has(c)) {
513
- console.log("adding path start", n, c);
514
- const l = `${e}////${v}`, t = r.getState().stateComponents.get(e);
513
+ const l = `${e}////${v}`;
514
+ console.log("adding path", l, n, c);
515
+ const t = r.getState().stateComponents.get(e);
515
516
  if (t) {
516
517
  const a = t.components.get(l);
517
- if (a && !a.paths.has("")) {
518
+ if (a && !a.pathsInitialized && (a.pathsInitialized = !0, !a.paths.has(""))) {
518
519
  const o = n.join(".");
519
520
  let d = !0;
520
521
  for (const I of a.paths)
@@ -522,7 +523,12 @@ function re(e, i, v, u) {
522
523
  d = !1;
523
524
  break;
524
525
  }
525
- d && (console.log("adding path addimg", o, c), a.paths.add(o));
526
+ d && (console.log(
527
+ "adding path actualyl adding",
528
+ l,
529
+ n,
530
+ c
531
+ ), a.paths.add(o));
526
532
  }
527
533
  }
528
534
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["\"use client\";\r\n\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\nimport { applyPatch } from \"fast-json-patch\";\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 stateFind: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => boolean\r\n ) => StateObject<InferArrayElement<TShape>> | undefined;\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 applyJsonPatch: (patches: any[]) => void;\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 serverState?: {\r\n id?: string | number;\r\n data?: T;\r\n status?: \"pending\" | \"error\" | \"success\";\r\n };\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 serverState: options?.serverState,\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 lastSyncedWithServer?: number\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 storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n // Get existing data to preserve lastSyncedWithServer if not explicitly updating it\r\n let existingLastSynced: number | undefined;\r\n try {\r\n const existing = loadFromLocalStorage(storageKey);\r\n existingLastSynced = existing?.lastSyncedWithServer;\r\n } catch {\r\n // Ignore errors, will use undefined\r\n }\r\n\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer: lastSyncedWithServer ?? existingLastSynced,\r\n };\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\nconst getUpdateValues = (\r\n updateType: string,\r\n prevValue: any,\r\n payload: any,\r\n path: string[]\r\n) => {\r\n switch (updateType) {\r\n case \"update\":\r\n return {\r\n oldValue: getNestedValue(prevValue, path),\r\n newValue: getNestedValue(payload, path),\r\n };\r\n case \"insert\":\r\n return {\r\n oldValue: null, // or undefined\r\n newValue: getNestedValue(payload, path),\r\n };\r\n case \"cut\":\r\n return {\r\n oldValue: getNestedValue(prevValue, path),\r\n newValue: null, // or undefined\r\n };\r\n default:\r\n return { oldValue: null, newValue: null };\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 reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n serverState,\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<OptionsType<TStateObject> | null>(\r\n null\r\n );\r\n latestInitialOptionsRef.current = (getInitialOptions(thisKey as string) ??\r\n null) as OptionsType<TStateObject> | null;\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 // Only proceed if initialState is provided\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 const hasServerId = options?.serverState?.id !== undefined;\r\n const hasServerData =\r\n hasServerId &&\r\n options?.serverState?.status === \"success\" &&\r\n options?.serverState?.data;\r\n\r\n const currentGloballyStoredInitialState =\r\n getGlobalStore.getState().initialStateGlobal[thisKey];\r\n\r\n const initialStateChanged =\r\n (currentGloballyStoredInitialState &&\r\n !isDeepEqual(currentGloballyStoredInitialState, initialState)) ||\r\n !currentGloballyStoredInitialState;\r\n\r\n if (!initialStateChanged && !hasServerData) {\r\n return;\r\n }\r\n\r\n let localData = null;\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(`${sessionId}-${thisKey}-${localkey}`);\r\n }\r\n\r\n let newState = initialState;\r\n let isFromServer = false;\r\n\r\n const serverTimestamp = hasServerData ? Date.now() : 0;\r\n const localTimestamp = localData?.lastUpdated || 0;\r\n const lastSyncTimestamp = localData?.lastSyncedWithServer || 0;\r\n\r\n if (hasServerData && serverTimestamp > localTimestamp) {\r\n newState = options.serverState!.data!;\r\n isFromServer = true;\r\n } else if (localData && localTimestamp > lastSyncTimestamp) {\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 // Update the global state\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 // Save to localStorage if we used server data\r\n if (isFromServer && localkey && sessionId) {\r\n saveToLocalStorage(newState, thisKey, options, sessionId, Date.now());\r\n }\r\n\r\n // Notify components of the change\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,\r\n serverState?.status,\r\n serverState?.data,\r\n ...(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: latestInitialOptionsRef.current?.middleware,\r\n });\r\n }\r\n\r\n const componentKey = `${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(componentKey, {\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 componentKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(componentKey);\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?.validation?.key) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validation?.key) +\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?.validation?.key\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validation?.key +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validation?.key\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validation?.key +\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 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 const componentsToUpdate: Array<() => void> = [];\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 componentsToUpdate.push(component.forceUpdate); // COLLECT instead of calling\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 componentsToUpdate.push(component.forceUpdate); // COLLECT instead of calling\r\n }\r\n }\r\n\r\n // BATCH all updates at once\r\n if (componentsToUpdate.length > 0) {\r\n queueMicrotask(() => {\r\n componentsToUpdate.forEach((update) => update());\r\n });\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n path = path.map((p, i) => {\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n\r\n return i === path.length - 1 &&\r\n [\"insert\", \"cut\"].includes(updateObj.updateType)\r\n ? (arrayValue.length - 1).toString()\r\n : p;\r\n });\r\n\r\n const { oldValue, newValue } = getUpdateValues(\r\n updateObj.updateType,\r\n prevValue,\r\n payload,\r\n path\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 (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current!.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, sessionId]);\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 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\r\n if (localStorage.getItem(storageKey)) {\r\n localStorage.removeItem(storageKey);\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\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\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 (meta?.validIndices && !Array.isArray(currentState)) {\r\n meta = { ...meta, validIndices: undefined };\r\n }\r\n const mutationMethods = new Set([\r\n \"insert\",\r\n \"cut\",\r\n \"cutByValue\",\r\n \"toggleByValue\",\r\n \"uniqueInsert\",\r\n \"update\",\r\n \"applyJsonPatch\",\r\n \"setSelected\",\r\n \"toggleSelected\",\r\n \"clearSelected\",\r\n \"sync\",\r\n \"validateZodSchema\",\r\n \"revertToInitialState\",\r\n \"updateInitialState\",\r\n \"removeValidation\",\r\n \"setValidation\",\r\n \"removeStorage\",\r\n \"middleware\",\r\n ]);\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\" &&\r\n !mutationMethods.has(prop) // ADD THIS CHECK\r\n ) {\r\n console.log(\"adding path start\", path, prop);\r\n // Only compute these if needed\r\n const fullComponentId = `${stateKey}////${componentId}`;\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 // If we already track root, no need to track anything else\r\n if (component.paths.has(\"\")) {\r\n } else {\r\n // Build the current path including the property being accessed\r\n const currentPath = path.join(\".\");\r\n // Check if we need to add this path\r\n let needsAdd = true;\r\n for (const existingPath of component.paths) {\r\n // If we already track this exact path or a parent of it\r\n if (\r\n currentPath.startsWith(existingPath) &&\r\n (currentPath === existingPath ||\r\n currentPath[existingPath.length] === \".\")\r\n ) {\r\n needsAdd = false;\r\n break;\r\n }\r\n }\r\n\r\n if (needsAdd) {\r\n console.log(\"adding path addimg\", currentPath, prop);\r\n component.paths.add(currentPath);\r\n }\r\n }\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\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 const getSourceArrayAndIndices = (): {\r\n item: any;\r\n originalIndex: number;\r\n }[] => {\r\n // If meta exists, we're in a chain. Use the currentState and map it to its original index.\r\n if (meta?.validIndices) {\r\n return (currentState as any[]).map((item, index) => ({\r\n item,\r\n originalIndex: meta!.validIndices![index]!,\r\n }));\r\n }\r\n // Otherwise, this is the first operation. Use the full array from the global store.\r\n const sourceArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n return sourceArray.map((item, index) => ({\r\n item,\r\n originalIndex: index,\r\n }));\r\n };\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 sourceWithIndices = getSourceArrayAndIndices();\r\n const sortedResult = [...sourceWithIndices].sort((a, b) =>\r\n compareFn(a.item, b.item)\r\n );\r\n const newCurrentState = sortedResult.map(({ item }) => item);\r\n // We construct the meta object with the CORRECT property name: `validIndices`.\r\n const newMeta = {\r\n ...meta,\r\n validIndices: sortedResult.map(\r\n ({ originalIndex }) => originalIndex\r\n ),\r\n };\r\n return rebuildStateShape(newCurrentState as any, path, newMeta);\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 sourceWithIndices = getSourceArrayAndIndices();\r\n const filteredResult = sourceWithIndices.filter(\r\n ({ item }, index) => callbackfn(item, index)\r\n );\r\n const newCurrentState = filteredResult.map(({ item }) => item);\r\n // We construct the meta object with the CORRECT property name: `validIndices`.\r\n const newMeta = {\r\n ...meta,\r\n validIndices: filteredResult.map(\r\n ({ originalIndex }) => originalIndex\r\n ),\r\n };\r\n return rebuildStateShape(newCurrentState as any, path, newMeta);\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 ) => any\r\n ) => {\r\n const arrayToMap = currentState as any[];\r\n return arrayToMap.map((item, index) => {\r\n let originalIndex: number;\r\n // We READ from the meta object using the CORRECT property name: `validIndices`.\r\n if (\r\n meta?.validIndices &&\r\n meta.validIndices[index] !== undefined\r\n ) {\r\n originalIndex = meta.validIndices[index]!;\r\n } else {\r\n originalIndex = index;\r\n }\r\n const finalPath = [...path, originalIndex.toString()];\r\n\r\n const setter = rebuildStateShape(item, finalPath, meta); // Pass meta through\r\n return callbackfn(\r\n item,\r\n setter,\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\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const arrayToMap = currentState as any[];\r\n shapeCache.clear();\r\n stateVersion++;\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any) => val[fieldName] ?? []\r\n );\r\n return rebuildStateShape(\r\n flattenedResults as any,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\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 if (prop === \"stateFind\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const found = sourceWithIndices.find(({ item }, index) =>\r\n callbackfn(item, index)\r\n );\r\n if (!found) return undefined;\r\n const finalPath = [...path, found.originalIndex.toString()];\r\n return rebuildStateShape(found.item, finalPath, meta);\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (thisKey: keyof InferArrayElement<T>, thisValue: any) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const found = sourceWithIndices.find(\r\n ({ item }) => item[thisKey] === thisValue\r\n );\r\n if (!found) return undefined;\r\n const finalPath = [...path, found.originalIndex.toString()];\r\n return rebuildStateShape(found.item, finalPath, meta);\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 invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === \"applyJsonPatch\") {\r\n return (patches: any[]) => {\r\n // This part is correct.\r\n const currentState =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n const patchResult = applyPatch(currentState, patches);\r\n const newState = patchResult.newDocument;\r\n\r\n // This is also correct.\r\n updateGlobalState(\r\n stateKey,\r\n getGlobalStore.getState().initialStateGlobal[stateKey],\r\n newState,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n\r\n // ===================================================================\r\n // REPLACE THE OLD LOGIC WITH THIS DIRECT COPY\r\n // ===================================================================\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey); // Use stateKey here\r\n\r\n if (stateEntry) {\r\n // Use `getDifferences` between the state before and after the patch.\r\n const changedPaths = getDifferences(currentState, newState);\r\n const changedPathsSet = new Set(changedPaths);\r\n\r\n // There is no single `primaryPathToCheck` for a patch, so we just check against the full set.\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 // This is the core logic that needs to be copied.\r\n // Check if any of the component's watched paths are in the set of changed paths.\r\n if (component.paths.has(\"\")) {\r\n // Always update for root listeners\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n // Direct match first (fastest)\r\n if (component.paths.has(changedPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n\r\n // Check parent paths more efficiently\r\n let dotIndex = changedPath.lastIndexOf(\".\");\r\n while (dotIndex !== -1) {\r\n const parentPath = changedPath.substring(0, dotIndex);\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n // Skip numeric segments more efficiently\r\n const lastSegment = changedPath.substring(\r\n dotIndex + 1\r\n );\r\n if (!isNaN(Number(lastSegment))) {\r\n // For array indices, check the parent collection path\r\n const parentDotIndex = parentPath.lastIndexOf(\".\");\r\n if (parentDotIndex !== -1) {\r\n const grandParentPath = parentPath.substring(\r\n 0,\r\n parentDotIndex\r\n );\r\n if (component.paths.has(grandParentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n }\r\n dotIndex = parentPath.lastIndexOf(\".\");\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 // Use `newState` (the result of the patch) for dependency checks.\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(newState);\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 };\r\n }\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","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","stateEntry","component","update","notifyComponent","fullComponentId","getUpdateValues","updateType","prevValue","payload","path","getNestedValue","stateObject","serverSync","localStorage","reactiveDeps","reactiveType","syncUpdate","dependencies","serverState","reactiveForce","forceUpdate","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","hasServerData","currentGloballyStoredInitialState","isFromServer","serverTimestamp","localTimestamp","lastSyncTimestamp","useLayoutEffect","componentKey","newStateOrFunction","updateObj","validationKey","pathKey","signalId","isArrayOperation","elements","arrayPath","arrayValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","v","length","newKey","changedPaths","getDifferences","changedPathsSet","primaryPathToCheck","componentsToUpdate","shouldUpdate","reactiveTypes","changedPath","currentPathToCheck","lastDotIndex","parentPath","depsResult","depsChanged","timeStamp","p","i","oldValue","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","mutationMethods","currentPath","needsAdd","existingPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","getSourceArrayAndIndices","item","index","selectedIndex","compareFn","sortedResult","a","b","newCurrentState","newMeta","originalIndex","callbackfn","filteredResult","finalPath","setter","createElement","SignalMapRenderer","fieldName","arrayToMap","flattenedResults","val","indexValue","currentArray","lastIndex","lastValue","newPath","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","found","thisValue","lastPathElement","parentValue","fn","$cogsSignal","parentKey","thisIndex","nested","patches","applyPatch","dotIndex","lastSegment","parentDotIndex","grandParentPath","thisObject","existingErrors","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","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\n\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\nimport { applyPatch } from \"fast-json-patch\";\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 stateFind: (\r\n callbackfn: (value: InferArrayElement<TShape>, index: number) => boolean\r\n ) => StateObject<InferArrayElement<TShape>> | undefined;\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 applyJsonPatch: (patches: any[]) => void;\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 serverState?: {\r\n id?: string | number;\r\n data?: T;\r\n status?: \"pending\" | \"error\" | \"success\";\r\n };\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 serverState: options?.serverState,\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 lastSyncedWithServer?: number\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 storageKey = `${sessionId}-${thisKey}-${key}`;\r\n\r\n // Get existing data to preserve lastSyncedWithServer if not explicitly updating it\r\n let existingLastSynced: number | undefined;\r\n try {\r\n const existing = loadFromLocalStorage(storageKey);\r\n existingLastSynced = existing?.lastSyncedWithServer;\r\n } catch {\r\n // Ignore errors, will use undefined\r\n }\r\n\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer: lastSyncedWithServer ?? existingLastSynced,\r\n };\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\nconst getUpdateValues = (\r\n updateType: string,\r\n prevValue: any,\r\n payload: any,\r\n path: string[]\r\n) => {\r\n switch (updateType) {\r\n case \"update\":\r\n return {\r\n oldValue: getNestedValue(prevValue, path),\r\n newValue: getNestedValue(payload, path),\r\n };\r\n case \"insert\":\r\n return {\r\n oldValue: null, // or undefined\r\n newValue: getNestedValue(payload, path),\r\n };\r\n case \"cut\":\r\n return {\r\n oldValue: getNestedValue(prevValue, path),\r\n newValue: null, // or undefined\r\n };\r\n default:\r\n return { oldValue: null, newValue: null };\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 reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n initialState,\r\n syncUpdate,\r\n dependencies,\r\n serverState,\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<OptionsType<TStateObject> | null>(\r\n null\r\n );\r\n latestInitialOptionsRef.current = (getInitialOptions(thisKey as string) ??\r\n null) as OptionsType<TStateObject> | null;\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 // Only proceed if initialState is provided\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 const hasServerId = options?.serverState?.id !== undefined;\r\n const hasServerData =\r\n hasServerId &&\r\n options?.serverState?.status === \"success\" &&\r\n options?.serverState?.data;\r\n\r\n const currentGloballyStoredInitialState =\r\n getGlobalStore.getState().initialStateGlobal[thisKey];\r\n\r\n const initialStateChanged =\r\n (currentGloballyStoredInitialState &&\r\n !isDeepEqual(currentGloballyStoredInitialState, initialState)) ||\r\n !currentGloballyStoredInitialState;\r\n\r\n if (!initialStateChanged && !hasServerData) {\r\n return;\r\n }\r\n\r\n let localData = null;\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(`${sessionId}-${thisKey}-${localkey}`);\r\n }\r\n\r\n let newState = initialState;\r\n let isFromServer = false;\r\n\r\n const serverTimestamp = hasServerData ? Date.now() : 0;\r\n const localTimestamp = localData?.lastUpdated || 0;\r\n const lastSyncTimestamp = localData?.lastSyncedWithServer || 0;\r\n\r\n if (hasServerData && serverTimestamp > localTimestamp) {\r\n newState = options.serverState!.data!;\r\n isFromServer = true;\r\n } else if (localData && localTimestamp > lastSyncTimestamp) {\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 // Update the global state\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 // Save to localStorage if we used server data\r\n if (isFromServer && localkey && sessionId) {\r\n saveToLocalStorage(newState, thisKey, options, sessionId, Date.now());\r\n }\r\n\r\n // Notify components of the change\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,\r\n serverState?.status,\r\n serverState?.data,\r\n ...(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: latestInitialOptionsRef.current?.middleware,\r\n });\r\n }\r\n\r\n const componentKey = `${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(componentKey, {\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 componentKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n if (stateEntry) {\r\n stateEntry.components.delete(componentKey);\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?.validation?.key) &&\r\n path\r\n ) {\r\n removeValidationError(\r\n (validationKey || latestInitialOptionsRef.current?.validation?.key) +\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?.validation?.key\r\n ) {\r\n removeValidationError(\r\n latestInitialOptionsRef.current?.validation?.key +\r\n \".\" +\r\n arrayWithoutIndex.join(\".\")\r\n );\r\n }\r\n if (\r\n updateObj.updateType === \"insert\" &&\r\n latestInitialOptionsRef.current?.validation?.key\r\n ) {\r\n let getValidation = getValidationErrors(\r\n latestInitialOptionsRef.current?.validation?.key +\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 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 const componentsToUpdate: Array<() => void> = [];\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 componentsToUpdate.push(component.forceUpdate); // COLLECT instead of calling\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 componentsToUpdate.push(component.forceUpdate); // COLLECT instead of calling\r\n }\r\n }\r\n\r\n // BATCH all updates at once\r\n if (componentsToUpdate.length > 0) {\r\n queueMicrotask(() => {\r\n componentsToUpdate.forEach((update) => update());\r\n });\r\n }\r\n }\r\n const timeStamp = Date.now();\r\n\r\n path = path.map((p, i) => {\r\n const arrayPath = path.slice(0, -1);\r\n const arrayValue = getNestedValue(payload, arrayPath);\r\n\r\n return i === path.length - 1 &&\r\n [\"insert\", \"cut\"].includes(updateObj.updateType)\r\n ? (arrayValue.length - 1).toString()\r\n : p;\r\n });\r\n\r\n const { oldValue, newValue } = getUpdateValues(\r\n updateObj.updateType,\r\n prevValue,\r\n payload,\r\n path\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 (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current!.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, sessionId]);\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 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\r\n if (localStorage.getItem(storageKey)) {\r\n localStorage.removeItem(storageKey);\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\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\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 (meta?.validIndices && !Array.isArray(currentState)) {\r\n meta = { ...meta, validIndices: undefined };\r\n }\r\n const mutationMethods = new Set([\r\n \"insert\",\r\n \"cut\",\r\n \"cutByValue\",\r\n \"toggleByValue\",\r\n \"uniqueInsert\",\r\n \"update\",\r\n \"applyJsonPatch\",\r\n \"setSelected\",\r\n \"toggleSelected\",\r\n \"clearSelected\",\r\n \"sync\",\r\n \"validateZodSchema\",\r\n \"revertToInitialState\",\r\n \"updateInitialState\",\r\n \"removeValidation\",\r\n \"setValidation\",\r\n \"removeStorage\",\r\n \"middleware\",\r\n ]);\r\n if (\r\n prop !== \"then\" &&\r\n !prop.startsWith(\"$\") &&\r\n prop !== \"stateMapNoRender\" &&\r\n !mutationMethods.has(prop)\r\n ) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n console.log(\"adding path\", fullComponentId, path, prop);\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 && !component.pathsInitialized) {\r\n // Mark as initialized immediately to prevent re-processing\r\n component.pathsInitialized = true;\r\n\r\n // Now do the path tracking logic ONCE\r\n if (!component.paths.has(\"\")) {\r\n const currentPath = path.join(\".\");\r\n\r\n let needsAdd = true;\r\n for (const existingPath of component.paths) {\r\n if (\r\n currentPath.startsWith(existingPath) &&\r\n (currentPath === existingPath ||\r\n currentPath[existingPath.length] === \".\")\r\n ) {\r\n needsAdd = false;\r\n break;\r\n }\r\n }\r\n\r\n if (needsAdd) {\r\n console.log(\r\n \"adding path actualyl adding\",\r\n fullComponentId,\r\n path,\r\n prop\r\n );\r\n component.paths.add(currentPath);\r\n }\r\n }\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\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 const getSourceArrayAndIndices = (): {\r\n item: any;\r\n originalIndex: number;\r\n }[] => {\r\n // If meta exists, we're in a chain. Use the currentState and map it to its original index.\r\n if (meta?.validIndices) {\r\n return (currentState as any[]).map((item, index) => ({\r\n item,\r\n originalIndex: meta!.validIndices![index]!,\r\n }));\r\n }\r\n // Otherwise, this is the first operation. Use the full array from the global store.\r\n const sourceArray = getGlobalStore\r\n .getState()\r\n .getNestedState(stateKey, path) as any[];\r\n return sourceArray.map((item, index) => ({\r\n item,\r\n originalIndex: index,\r\n }));\r\n };\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 sourceWithIndices = getSourceArrayAndIndices();\r\n const sortedResult = [...sourceWithIndices].sort((a, b) =>\r\n compareFn(a.item, b.item)\r\n );\r\n const newCurrentState = sortedResult.map(({ item }) => item);\r\n // We construct the meta object with the CORRECT property name: `validIndices`.\r\n const newMeta = {\r\n ...meta,\r\n validIndices: sortedResult.map(\r\n ({ originalIndex }) => originalIndex\r\n ),\r\n };\r\n return rebuildStateShape(newCurrentState as any, path, newMeta);\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 sourceWithIndices = getSourceArrayAndIndices();\r\n const filteredResult = sourceWithIndices.filter(\r\n ({ item }, index) => callbackfn(item, index)\r\n );\r\n const newCurrentState = filteredResult.map(({ item }) => item);\r\n // We construct the meta object with the CORRECT property name: `validIndices`.\r\n const newMeta = {\r\n ...meta,\r\n validIndices: filteredResult.map(\r\n ({ originalIndex }) => originalIndex\r\n ),\r\n };\r\n return rebuildStateShape(newCurrentState as any, path, newMeta);\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 ) => any\r\n ) => {\r\n const arrayToMap = currentState as any[];\r\n return arrayToMap.map((item, index) => {\r\n let originalIndex: number;\r\n // We READ from the meta object using the CORRECT property name: `validIndices`.\r\n if (\r\n meta?.validIndices &&\r\n meta.validIndices[index] !== undefined\r\n ) {\r\n originalIndex = meta.validIndices[index]!;\r\n } else {\r\n originalIndex = index;\r\n }\r\n const finalPath = [...path, originalIndex.toString()];\r\n\r\n const setter = rebuildStateShape(item, finalPath, meta); // Pass meta through\r\n return callbackfn(\r\n item,\r\n setter,\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\r\n if (prop === \"stateFlattenOn\") {\r\n return (fieldName: string) => {\r\n const arrayToMap = currentState as any[];\r\n shapeCache.clear();\r\n stateVersion++;\r\n const flattenedResults = arrayToMap.flatMap(\r\n (val: any) => val[fieldName] ?? []\r\n );\r\n return rebuildStateShape(\r\n flattenedResults as any,\r\n [...path, \"[*]\", fieldName],\r\n meta\r\n );\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 if (prop === \"stateFind\") {\r\n return (\r\n callbackfn: (\r\n value: InferArrayElement<T>,\r\n index: number\r\n ) => boolean\r\n ) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const found = sourceWithIndices.find(({ item }, index) =>\r\n callbackfn(item, index)\r\n );\r\n if (!found) return undefined;\r\n const finalPath = [...path, found.originalIndex.toString()];\r\n return rebuildStateShape(found.item, finalPath, meta);\r\n };\r\n }\r\n\r\n if (prop === \"findWith\") {\r\n return (thisKey: keyof InferArrayElement<T>, thisValue: any) => {\r\n const sourceWithIndices = getSourceArrayAndIndices();\r\n const found = sourceWithIndices.find(\r\n ({ item }) => item[thisKey] === thisValue\r\n );\r\n if (!found) return undefined;\r\n const finalPath = [...path, found.originalIndex.toString()];\r\n return rebuildStateShape(found.item, finalPath, meta);\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 invalidateCachePath(parentPath);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === \"applyJsonPatch\") {\r\n return (patches: any[]) => {\r\n // This part is correct.\r\n const currentState =\r\n getGlobalStore.getState().cogsStateStore[stateKey];\r\n const patchResult = applyPatch(currentState, patches);\r\n const newState = patchResult.newDocument;\r\n\r\n // This is also correct.\r\n updateGlobalState(\r\n stateKey,\r\n getGlobalStore.getState().initialStateGlobal[stateKey],\r\n newState,\r\n effectiveSetState,\r\n componentId,\r\n sessionId\r\n );\r\n\r\n // ===================================================================\r\n // REPLACE THE OLD LOGIC WITH THIS DIRECT COPY\r\n // ===================================================================\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .stateComponents.get(stateKey); // Use stateKey here\r\n\r\n if (stateEntry) {\r\n // Use `getDifferences` between the state before and after the patch.\r\n const changedPaths = getDifferences(currentState, newState);\r\n const changedPathsSet = new Set(changedPaths);\r\n\r\n // There is no single `primaryPathToCheck` for a patch, so we just check against the full set.\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 // This is the core logic that needs to be copied.\r\n // Check if any of the component's watched paths are in the set of changed paths.\r\n if (component.paths.has(\"\")) {\r\n // Always update for root listeners\r\n shouldUpdate = true;\r\n }\r\n\r\n if (!shouldUpdate) {\r\n for (const changedPath of changedPathsSet) {\r\n // Direct match first (fastest)\r\n if (component.paths.has(changedPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n\r\n // Check parent paths more efficiently\r\n let dotIndex = changedPath.lastIndexOf(\".\");\r\n while (dotIndex !== -1) {\r\n const parentPath = changedPath.substring(0, dotIndex);\r\n if (component.paths.has(parentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n // Skip numeric segments more efficiently\r\n const lastSegment = changedPath.substring(\r\n dotIndex + 1\r\n );\r\n if (!isNaN(Number(lastSegment))) {\r\n // For array indices, check the parent collection path\r\n const parentDotIndex = parentPath.lastIndexOf(\".\");\r\n if (parentDotIndex !== -1) {\r\n const grandParentPath = parentPath.substring(\r\n 0,\r\n parentDotIndex\r\n );\r\n if (component.paths.has(grandParentPath)) {\r\n shouldUpdate = true;\r\n break;\r\n }\r\n }\r\n }\r\n dotIndex = parentPath.lastIndexOf(\".\");\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 // Use `newState` (the result of the patch) for dependency checks.\r\n if (component.depsFunction) {\r\n const depsResult = component.depsFunction(newState);\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 };\r\n }\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","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","updateGlobalState","newState","effectiveSetState","updates","createProxyHandler","stateEntry","component","update","notifyComponent","fullComponentId","getUpdateValues","updateType","prevValue","payload","path","getNestedValue","stateObject","serverSync","localStorage","reactiveDeps","reactiveType","syncUpdate","dependencies","serverState","reactiveForce","forceUpdate","noStateKey","stateLog","componentUpdatesRef","useRef","componentIdRef","latestInitialOptionsRef","useEffect","prevState","syncKey","hasServerData","currentGloballyStoredInitialState","isFromServer","serverTimestamp","localTimestamp","lastSyncTimestamp","useLayoutEffect","componentKey","newStateOrFunction","updateObj","validationKey","pathKey","signalId","isArrayOperation","elements","arrayPath","arrayValue","arraySignalId","newValue","parentId","position","effect","parent","childNodes","displayValue","arrayWithoutIndex","v","length","newKey","changedPaths","getDifferences","changedPathsSet","primaryPathToCheck","componentsToUpdate","shouldUpdate","reactiveTypes","changedPath","currentPathToCheck","lastDotIndex","parentPath","depsResult","depsChanged","timeStamp","p","i","oldValue","newUpdate","prevLogs","aggregatedLogs","acc","log","uniqueKey","existing","serverStateStore","updaterFinal","useMemo","shapeCache","stateVersion","invalidateCachePath","baseObj","obj","init","newProxy","rebuildStateShape","initalOptionsGet","localKey","newUpdaterState","startTransition","field","meta","cacheKey","baseFunction","handler","target","thisArg","args","prop","mutationMethods","currentPath","needsAdd","existingPath","sync","response","errorPath","thisReactiveState","initialStateAtPath","getSourceArrayAndIndices","item","index","selectedIndex","compareFn","sortedResult","a","b","newCurrentState","newMeta","originalIndex","callbackfn","filteredResult","finalPath","setter","createElement","SignalMapRenderer","fieldName","arrayToMap","flattenedResults","val","indexValue","currentArray","lastIndex","lastValue","newPath","pushFunc","fields","onMatch","matchedItem","isMatch","updatedItem","updatedArray","updateFn","cutFunc","value","found","thisValue","lastPathElement","parentValue","fn","$cogsSignal","parentKey","thisIndex","nested","patches","applyPatch","dotIndex","lastSegment","parentDotIndex","grandParentPath","thisObject","existingErrors","result","errorMessage","fullErrorPath","formRefStore","children","hideMessage","jsx","ValidationWrapper","opts","debounce","child","formOpts","FormControlComponent","nextPath","nextValue","proxyInstance","proxy","SignalRenderer","arraysetter","elementRef","element","parentElement","elementInfo","err","textNode","$cogsSignalStore","useSyncExternalStore","notify"],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -18,6 +18,7 @@ export type ComponentsType = {
18
18
  deps?: any[];
19
19
  depsFunction?: (state: any) => any[] | true;
20
20
  reactiveType: ReactivityType[] | ReactivityType;
21
+ pathsInitialized?: boolean;
21
22
  }>;
22
23
  };
23
24
  export type FormRefStoreState = {
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n StateKeys,\r\n SyncActionsType,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from \"./CogsState.js\";\r\n\r\ntype StateUpdater<StateValue> =\r\n | StateValue\r\n | ((prevValue: StateValue) => StateValue);\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype SyncLogType = {\r\n timeStamp: number;\r\n};\r\ntype StateValue = any;\r\n\r\nexport type ComponentsType = {\r\n components: Map<\r\n string,\r\n {\r\n forceUpdate: () => void;\r\n paths: Set<string>;\r\n deps?: any[];\r\n depsFunction?: (state: any) => any[] | true;\r\n reactiveType: ReactivityType[] | ReactivityType;\r\n }\r\n >;\r\n};\r\nexport type FormRefStoreState = {\r\n formRefs: Map<string, React.RefObject<any>>;\r\n registerFormRef: (id: string, ref: React.RefObject<any>) => void;\r\n getFormRef: (id: string) => React.RefObject<any> | undefined;\r\n removeFormRef: (id: string) => void;\r\n // New method to get all refs for a stateKey\r\n getFormRefsByStateKey: (\r\n stateKey: string\r\n ) => Map<string, React.RefObject<any>>;\r\n};\r\n\r\nexport const formRefStore = create<FormRefStoreState>((set, get) => ({\r\n formRefs: new Map(),\r\n\r\n registerFormRef: (id, ref) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.set(id, ref);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRef: (id) => get().formRefs.get(id),\r\n\r\n removeFormRef: (id) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.delete(id);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n // Get all refs that start with the stateKey prefix\r\n getFormRefsByStateKey: (stateKey) => {\r\n const allRefs = get().formRefs;\r\n const stateKeyPrefix = stateKey + \".\";\r\n const filteredRefs = new Map();\r\n\r\n allRefs.forEach((ref, id) => {\r\n if (id.startsWith(stateKeyPrefix) || id === stateKey) {\r\n filteredRefs.set(id, ref);\r\n }\r\n });\r\n\r\n return filteredRefs;\r\n },\r\n}));\r\nexport type CogsGlobalState = {\r\n selectedIndicesMap: Map<string, Map<string, number>>; // stateKey -> (parentPath -> selectedIndex)\r\n\r\n // Add these new methods\r\n getSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string\r\n ) => number | undefined;\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => void;\r\n clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => void;\r\n clearSelectedIndexesForState: (stateKey: string) => void;\r\n updaterState: { [key: string]: any };\r\n initialStateOptions: { [key: string]: OptionsType };\r\n cogsStateStore: { [key: string]: StateValue };\r\n isLoadingGlobal: { [key: string]: boolean };\r\n\r\n initialStateGlobal: { [key: string]: StateValue };\r\n iniitialCreatedState: { [key: string]: StateValue };\r\n validationErrors: Map<string, string[]>;\r\n\r\n serverState: { [key: string]: StateValue };\r\n serverSyncActions: { [key: string]: SyncActionsType<any> };\r\n\r\n serverSyncLog: { [key: string]: SyncLogType[] };\r\n serverSideOrNot: { [key: string]: boolean };\r\n setServerSyncLog: (key: string, newValue: SyncLogType) => void;\r\n\r\n setServerSideOrNot: (key: string, value: boolean) => void;\r\n getServerSideOrNot: (key: string) => boolean | undefined;\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => void;\r\n\r\n getThisLocalUpdate: (key: string) => UpdateTypeDetail[] | undefined;\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => void;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n updateInitialCreatedState: (key: string, newState: StateValue) => void;\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n getUpdaterState: (key: string) => StateUpdater<StateValue>;\r\n setUpdaterState: (key: string, newUpdater: any) => void;\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => StateValue;\r\n getNestedState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n path: string[]\r\n ) => StateValue;\r\n setState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateUpdater<StateValue>\r\n ) => void;\r\n setInitialStates: (initialState: StateValue) => void;\r\n setCreatedState: (initialState: StateValue) => void;\r\n stateLog: { [key: string]: UpdateTypeDetail[] };\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setIsLoadingGlobal: (key: string, value: boolean) => void;\r\n\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n removeValidationError: (path: string) => void;\r\n signalDomElements: Map<\r\n string,\r\n Set<{\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }>\r\n >;\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: {\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }\r\n ) => void;\r\n removeSignalElement: (signalId: string, instanceId: string) => void;\r\n reRenderTriggerPrevValue: Record<string, any>;\r\n\r\n reactiveDeps: Record<\r\n string,\r\n {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n >;\r\n setReactiveDeps: (\r\n key: string,\r\n record: {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n ) => void;\r\n deleteReactiveDeps: (key: string) => void;\r\n subscribe: (listener: () => void) => () => void;\r\n\r\n stateComponents: Map<string, ComponentsType>;\r\n syncInfoStore: Map<string, SyncInfo>;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\n\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n selectedIndicesMap: new Map<string, Map<string, number>>(),\r\n\r\n // Add the new methods\r\n getSelectedIndex: (stateKey: string, parentPath: string) => {\r\n const stateMap = get().selectedIndicesMap.get(stateKey);\r\n if (!stateMap) return undefined;\r\n return stateMap.get(parentPath);\r\n },\r\n\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n let stateMap = newMap.get(stateKey);\r\n\r\n if (!stateMap) {\r\n stateMap = new Map<string, number>();\r\n newMap.set(stateKey, stateMap);\r\n }\r\n\r\n if (index === undefined) {\r\n stateMap.delete(parentPath);\r\n } else {\r\n stateMap.set(parentPath, index);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n const stateMap = newMap.get(stateKey);\r\n if (!stateMap) return state;\r\n const parentPath = path.join(\".\");\r\n stateMap.delete(parentPath);\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndexesForState: (stateKey: string) => {\r\n set((state) => {\r\n const newOuterMap = new Map(state.selectedIndicesMap);\r\n const changed = newOuterMap.delete(stateKey);\r\n if (changed) {\r\n console.log(\r\n `Cleared selected indices map entry for stateKey: ${stateKey}`\r\n );\r\n return { selectedIndicesMap: newOuterMap };\r\n } else {\r\n return {};\r\n }\r\n });\r\n },\r\n stateComponents: new Map(),\r\n subscribe: (listener: () => void) => {\r\n // zustand's subscribe returns an unsubscribe function\r\n return get().subscribe(listener);\r\n },\r\n\r\n reactiveDeps: {},\r\n setReactiveDeps: (key, record) =>\r\n set((state) => ({\r\n ...state,\r\n reactiveDeps: {\r\n ...state.reactiveDeps,\r\n [key]: record,\r\n },\r\n })),\r\n deleteReactiveDeps: (key) =>\r\n set((state) => {\r\n const { [key]: _, ...rest } = state.reactiveDeps;\r\n return {\r\n ...state,\r\n reactiveDeps: rest,\r\n };\r\n }),\r\n\r\n reRenderTriggerPrevValue: {},\r\n signalDomElements: new Map(),\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: { instanceId: string; parentId: string; position: number }\r\n ) => {\r\n const current = get().signalDomElements;\r\n if (!current.has(signalId)) {\r\n current.set(signalId, new Set());\r\n }\r\n current.get(signalId)!.add(elementInfo);\r\n\r\n set({ signalDomElements: new Map(current) }); // Create new reference to trigger update\r\n },\r\n removeSignalElement: (signalId: string, instanceId: string) => {\r\n const current = get().signalDomElements;\r\n const elements = current.get(signalId);\r\n if (elements) {\r\n elements.forEach((el) => {\r\n if (el.instanceId === instanceId) {\r\n elements.delete(el);\r\n }\r\n });\r\n }\r\n set({ signalDomElements: new Map(current) });\r\n },\r\n initialStateOptions: {},\r\n updaterState: {},\r\n stateTimeline: {},\r\n cogsStateStore: {},\r\n stateLog: {},\r\n isLoadingGlobal: {},\r\n\r\n initialStateGlobal: {},\r\n iniitialCreatedState: {},\r\n updateInitialCreatedState: (key, newState) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.iniitialCreatedState,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n\r\n validationErrors: new Map(),\r\n\r\n serverState: {},\r\n\r\n serverSyncActions: {},\r\n\r\n serverSyncLog: {},\r\n serverSideOrNot: {},\r\n setServerSyncLog: (key, newValue) => {\r\n set((state) => ({\r\n serverSyncLog: {\r\n ...state.serverSyncLog,\r\n [key]: [...(state.serverSyncLog[key] ?? []), newValue],\r\n },\r\n }));\r\n },\r\n setServerSideOrNot: (key, value) => {\r\n set((state) => ({\r\n serverSideOrNot: {\r\n ...state.serverSideOrNot,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n getServerSideOrNot: (key) => {\r\n return get().serverSideOrNot[key];\r\n },\r\n\r\n getThisLocalUpdate: (key: string) => {\r\n return get().stateLog[key];\r\n },\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => {\r\n set((prev) => ({\r\n serverState: {\r\n ...prev.serverState,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => {\r\n set((prev) => {\r\n const currentUpdates = prev.stateLog[key] ?? [];\r\n const newUpdates = updater(currentUpdates);\r\n return {\r\n stateLog: {\r\n ...prev.stateLog,\r\n [key]: newUpdates,\r\n },\r\n };\r\n });\r\n },\r\n setIsLoadingGlobal: (key: string, value: boolean) => {\r\n set((prev) => ({\r\n isLoadingGlobal: {\r\n ...prev.isLoadingGlobal,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => {\r\n set((prev) => ({\r\n serverSyncActions: {\r\n ...prev.serverSyncActions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n addValidationError: (path, message) => {\r\n console.log(\"addValidationError---\");\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n const existingMessages = updatedErrors.get(path) || [];\r\n console.log(\"addValidationError\", path, message, existingMessages);\r\n // Append the new message instead of replacing\r\n updatedErrors.set(path, [...existingMessages, message]);\r\n return { validationErrors: updatedErrors };\r\n });\r\n },\r\n removeValidationError: (path) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n let doSomething = false;\r\n const pathArray = path.split(\".\");\r\n Array.from(updatedErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n if (keyArray[i] !== pathArray[i]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n doSomething = true;\r\n updatedErrors.delete(key);\r\n }\r\n }\r\n });\r\n\r\n return doSomething ? { validationErrors: updatedErrors } : prev;\r\n });\r\n },\r\n getValidationErrors: (path: string) => {\r\n const errors: string[] = [];\r\n const valErrors = get().validationErrors;\r\n const pathArray = path.split(\".\");\r\n\r\n // Helper to check if an index matches either a wildcard or is in an array of indices\r\n const isIndexMatch = (pathSegment: string, keySegment: string) => {\r\n if (pathSegment === \"[*]\") return true;\r\n if (Array.isArray(pathSegment)) {\r\n return pathSegment.includes(parseInt(keySegment));\r\n }\r\n return pathSegment === keySegment;\r\n };\r\n\r\n Array.from(valErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const pathSegment = pathArray[i];\r\n const keySegment = keyArray[i]!;\r\n\r\n // If current path segment is a number or [*], we need special handling\r\n if (pathSegment === \"[*]\" || Array.isArray(pathSegment)) {\r\n // Key segment should be a number if we're using [*] or array indices\r\n const keyIndex = parseInt(keySegment);\r\n if (isNaN(keyIndex)) {\r\n match = false;\r\n break;\r\n }\r\n\r\n if (!isIndexMatch(pathSegment, keySegment)) {\r\n match = false;\r\n break;\r\n }\r\n } else if (pathSegment !== keySegment) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n const errorMessages = valErrors.get(key);\r\n if (errorMessages) {\r\n errors.push(...errorMessages);\r\n }\r\n }\r\n }\r\n });\r\n\r\n return errors;\r\n },\r\n getInitialOptions: (key) => {\r\n return get().initialStateOptions[key];\r\n },\r\n getNestedState: (key: string, path: string[]) => {\r\n const rootState = get().cogsStateStore[key];\r\n\r\n const getValueWithAsterisk = (obj: any, pathArray: string[]): any => {\r\n if (pathArray.length === 0) return obj;\r\n\r\n const currentPath = pathArray[0];\r\n const remainingPath = pathArray.slice(1);\r\n\r\n if (currentPath === \"[*]\") {\r\n if (!Array.isArray(obj)) {\r\n console.warn(\"Asterisk notation used on non-array value\");\r\n return undefined;\r\n }\r\n\r\n if (remainingPath.length === 0) return obj;\r\n\r\n // Get result for each array item\r\n const results = obj.map((item) =>\r\n getValueWithAsterisk(item, remainingPath)\r\n );\r\n\r\n // If the next path segment exists and returns arrays, flatten them\r\n if (Array.isArray(results[0])) {\r\n return results.flat();\r\n }\r\n\r\n return results;\r\n }\r\n\r\n const value = obj[currentPath as keyof typeof obj];\r\n if (value === undefined) return undefined;\r\n\r\n return getValueWithAsterisk(value, remainingPath);\r\n };\r\n\r\n // This will still get the value but we need to make it reactive only to specific paths\r\n return getValueWithAsterisk(rootState, path);\r\n },\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: {\r\n ...prev.initialStateOptions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: {\r\n ...prev.initialStateGlobal,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n getUpdaterState: (key) => {\r\n return get().updaterState[key];\r\n },\r\n setUpdaterState: (key, newUpdater) => {\r\n const current = get().updaterState;\r\n\r\n if (!key || !newUpdater) return;\r\n\r\n set({ updaterState: { ...(current ?? {}), [key]: newUpdater } });\r\n },\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => {\r\n return get().cogsStateStore[key];\r\n },\r\n\r\n setState: <StateKey extends StateKeys>(key: StateKey, value: StateValue) => {\r\n set((prev) => {\r\n return {\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n [key]:\r\n typeof value === \"function\"\r\n ? value(prev.cogsStateStore[key])\r\n : value,\r\n },\r\n };\r\n });\r\n },\r\n setInitialStates: <StateKey extends StateKeys>(initialState: StateValue) => {\r\n set((prev) => ({\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n setCreatedState: (initialState: StateValue) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { ...state, syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key: string) => get().syncInfoStore.get(key) || null,\r\n}));\r\n"],"names":["formRefStore","create","set","get","id","ref","state","newRefs","stateKey","allRefs","stateKeyPrefix","filteredRefs","getGlobalStore","parentPath","stateMap","index","newMap","path","newOuterMap","listener","key","record","_","rest","signalId","elementInfo","current","instanceId","elements","el","newState","prev","newValue","value","updater","currentUpdates","newUpdates","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","i","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","rootState","getValueWithAsterisk","obj","currentPath","remainingPath","results","item","newUpdater","initialState","syncInfo"],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n StateKeys,\r\n SyncActionsType,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from \"./CogsState.js\";\r\n\r\ntype StateUpdater<StateValue> =\r\n | StateValue\r\n | ((prevValue: StateValue) => StateValue);\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype SyncLogType = {\r\n timeStamp: number;\r\n};\r\ntype StateValue = any;\r\n\r\nexport type ComponentsType = {\r\n components: Map<\r\n string,\r\n {\r\n forceUpdate: () => void;\r\n paths: Set<string>;\r\n deps?: any[];\r\n depsFunction?: (state: any) => any[] | true;\r\n reactiveType: ReactivityType[] | ReactivityType;\r\n pathsInitialized?: boolean;\r\n }\r\n >;\r\n};\r\nexport type FormRefStoreState = {\r\n formRefs: Map<string, React.RefObject<any>>;\r\n registerFormRef: (id: string, ref: React.RefObject<any>) => void;\r\n getFormRef: (id: string) => React.RefObject<any> | undefined;\r\n removeFormRef: (id: string) => void;\r\n // New method to get all refs for a stateKey\r\n getFormRefsByStateKey: (\r\n stateKey: string\r\n ) => Map<string, React.RefObject<any>>;\r\n};\r\n\r\nexport const formRefStore = create<FormRefStoreState>((set, get) => ({\r\n formRefs: new Map(),\r\n\r\n registerFormRef: (id, ref) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.set(id, ref);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRef: (id) => get().formRefs.get(id),\r\n\r\n removeFormRef: (id) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.delete(id);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n // Get all refs that start with the stateKey prefix\r\n getFormRefsByStateKey: (stateKey) => {\r\n const allRefs = get().formRefs;\r\n const stateKeyPrefix = stateKey + \".\";\r\n const filteredRefs = new Map();\r\n\r\n allRefs.forEach((ref, id) => {\r\n if (id.startsWith(stateKeyPrefix) || id === stateKey) {\r\n filteredRefs.set(id, ref);\r\n }\r\n });\r\n\r\n return filteredRefs;\r\n },\r\n}));\r\nexport type CogsGlobalState = {\r\n selectedIndicesMap: Map<string, Map<string, number>>; // stateKey -> (parentPath -> selectedIndex)\r\n\r\n // Add these new methods\r\n getSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string\r\n ) => number | undefined;\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => void;\r\n clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => void;\r\n clearSelectedIndexesForState: (stateKey: string) => void;\r\n updaterState: { [key: string]: any };\r\n initialStateOptions: { [key: string]: OptionsType };\r\n cogsStateStore: { [key: string]: StateValue };\r\n isLoadingGlobal: { [key: string]: boolean };\r\n\r\n initialStateGlobal: { [key: string]: StateValue };\r\n iniitialCreatedState: { [key: string]: StateValue };\r\n validationErrors: Map<string, string[]>;\r\n\r\n serverState: { [key: string]: StateValue };\r\n serverSyncActions: { [key: string]: SyncActionsType<any> };\r\n\r\n serverSyncLog: { [key: string]: SyncLogType[] };\r\n serverSideOrNot: { [key: string]: boolean };\r\n setServerSyncLog: (key: string, newValue: SyncLogType) => void;\r\n\r\n setServerSideOrNot: (key: string, value: boolean) => void;\r\n getServerSideOrNot: (key: string) => boolean | undefined;\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => void;\r\n\r\n getThisLocalUpdate: (key: string) => UpdateTypeDetail[] | undefined;\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => void;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n updateInitialCreatedState: (key: string, newState: StateValue) => void;\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n getUpdaterState: (key: string) => StateUpdater<StateValue>;\r\n setUpdaterState: (key: string, newUpdater: any) => void;\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => StateValue;\r\n getNestedState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n path: string[]\r\n ) => StateValue;\r\n setState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateUpdater<StateValue>\r\n ) => void;\r\n setInitialStates: (initialState: StateValue) => void;\r\n setCreatedState: (initialState: StateValue) => void;\r\n stateLog: { [key: string]: UpdateTypeDetail[] };\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setIsLoadingGlobal: (key: string, value: boolean) => void;\r\n\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n removeValidationError: (path: string) => void;\r\n signalDomElements: Map<\r\n string,\r\n Set<{\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }>\r\n >;\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: {\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }\r\n ) => void;\r\n removeSignalElement: (signalId: string, instanceId: string) => void;\r\n reRenderTriggerPrevValue: Record<string, any>;\r\n\r\n reactiveDeps: Record<\r\n string,\r\n {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n >;\r\n setReactiveDeps: (\r\n key: string,\r\n record: {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n ) => void;\r\n deleteReactiveDeps: (key: string) => void;\r\n subscribe: (listener: () => void) => () => void;\r\n\r\n stateComponents: Map<string, ComponentsType>;\r\n syncInfoStore: Map<string, SyncInfo>;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\n\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n selectedIndicesMap: new Map<string, Map<string, number>>(),\r\n\r\n // Add the new methods\r\n getSelectedIndex: (stateKey: string, parentPath: string) => {\r\n const stateMap = get().selectedIndicesMap.get(stateKey);\r\n if (!stateMap) return undefined;\r\n return stateMap.get(parentPath);\r\n },\r\n\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n let stateMap = newMap.get(stateKey);\r\n\r\n if (!stateMap) {\r\n stateMap = new Map<string, number>();\r\n newMap.set(stateKey, stateMap);\r\n }\r\n\r\n if (index === undefined) {\r\n stateMap.delete(parentPath);\r\n } else {\r\n stateMap.set(parentPath, index);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n const stateMap = newMap.get(stateKey);\r\n if (!stateMap) return state;\r\n const parentPath = path.join(\".\");\r\n stateMap.delete(parentPath);\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndexesForState: (stateKey: string) => {\r\n set((state) => {\r\n const newOuterMap = new Map(state.selectedIndicesMap);\r\n const changed = newOuterMap.delete(stateKey);\r\n if (changed) {\r\n console.log(\r\n `Cleared selected indices map entry for stateKey: ${stateKey}`\r\n );\r\n return { selectedIndicesMap: newOuterMap };\r\n } else {\r\n return {};\r\n }\r\n });\r\n },\r\n stateComponents: new Map(),\r\n subscribe: (listener: () => void) => {\r\n // zustand's subscribe returns an unsubscribe function\r\n return get().subscribe(listener);\r\n },\r\n\r\n reactiveDeps: {},\r\n setReactiveDeps: (key, record) =>\r\n set((state) => ({\r\n ...state,\r\n reactiveDeps: {\r\n ...state.reactiveDeps,\r\n [key]: record,\r\n },\r\n })),\r\n deleteReactiveDeps: (key) =>\r\n set((state) => {\r\n const { [key]: _, ...rest } = state.reactiveDeps;\r\n return {\r\n ...state,\r\n reactiveDeps: rest,\r\n };\r\n }),\r\n\r\n reRenderTriggerPrevValue: {},\r\n signalDomElements: new Map(),\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: { instanceId: string; parentId: string; position: number }\r\n ) => {\r\n const current = get().signalDomElements;\r\n if (!current.has(signalId)) {\r\n current.set(signalId, new Set());\r\n }\r\n current.get(signalId)!.add(elementInfo);\r\n\r\n set({ signalDomElements: new Map(current) }); // Create new reference to trigger update\r\n },\r\n removeSignalElement: (signalId: string, instanceId: string) => {\r\n const current = get().signalDomElements;\r\n const elements = current.get(signalId);\r\n if (elements) {\r\n elements.forEach((el) => {\r\n if (el.instanceId === instanceId) {\r\n elements.delete(el);\r\n }\r\n });\r\n }\r\n set({ signalDomElements: new Map(current) });\r\n },\r\n initialStateOptions: {},\r\n updaterState: {},\r\n stateTimeline: {},\r\n cogsStateStore: {},\r\n stateLog: {},\r\n isLoadingGlobal: {},\r\n\r\n initialStateGlobal: {},\r\n iniitialCreatedState: {},\r\n updateInitialCreatedState: (key, newState) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.iniitialCreatedState,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n\r\n validationErrors: new Map(),\r\n\r\n serverState: {},\r\n\r\n serverSyncActions: {},\r\n\r\n serverSyncLog: {},\r\n serverSideOrNot: {},\r\n setServerSyncLog: (key, newValue) => {\r\n set((state) => ({\r\n serverSyncLog: {\r\n ...state.serverSyncLog,\r\n [key]: [...(state.serverSyncLog[key] ?? []), newValue],\r\n },\r\n }));\r\n },\r\n setServerSideOrNot: (key, value) => {\r\n set((state) => ({\r\n serverSideOrNot: {\r\n ...state.serverSideOrNot,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n getServerSideOrNot: (key) => {\r\n return get().serverSideOrNot[key];\r\n },\r\n\r\n getThisLocalUpdate: (key: string) => {\r\n return get().stateLog[key];\r\n },\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => {\r\n set((prev) => ({\r\n serverState: {\r\n ...prev.serverState,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => {\r\n set((prev) => {\r\n const currentUpdates = prev.stateLog[key] ?? [];\r\n const newUpdates = updater(currentUpdates);\r\n return {\r\n stateLog: {\r\n ...prev.stateLog,\r\n [key]: newUpdates,\r\n },\r\n };\r\n });\r\n },\r\n setIsLoadingGlobal: (key: string, value: boolean) => {\r\n set((prev) => ({\r\n isLoadingGlobal: {\r\n ...prev.isLoadingGlobal,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => {\r\n set((prev) => ({\r\n serverSyncActions: {\r\n ...prev.serverSyncActions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n addValidationError: (path, message) => {\r\n console.log(\"addValidationError---\");\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n const existingMessages = updatedErrors.get(path) || [];\r\n console.log(\"addValidationError\", path, message, existingMessages);\r\n // Append the new message instead of replacing\r\n updatedErrors.set(path, [...existingMessages, message]);\r\n return { validationErrors: updatedErrors };\r\n });\r\n },\r\n removeValidationError: (path) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n let doSomething = false;\r\n const pathArray = path.split(\".\");\r\n Array.from(updatedErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n if (keyArray[i] !== pathArray[i]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n doSomething = true;\r\n updatedErrors.delete(key);\r\n }\r\n }\r\n });\r\n\r\n return doSomething ? { validationErrors: updatedErrors } : prev;\r\n });\r\n },\r\n getValidationErrors: (path: string) => {\r\n const errors: string[] = [];\r\n const valErrors = get().validationErrors;\r\n const pathArray = path.split(\".\");\r\n\r\n // Helper to check if an index matches either a wildcard or is in an array of indices\r\n const isIndexMatch = (pathSegment: string, keySegment: string) => {\r\n if (pathSegment === \"[*]\") return true;\r\n if (Array.isArray(pathSegment)) {\r\n return pathSegment.includes(parseInt(keySegment));\r\n }\r\n return pathSegment === keySegment;\r\n };\r\n\r\n Array.from(valErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const pathSegment = pathArray[i];\r\n const keySegment = keyArray[i]!;\r\n\r\n // If current path segment is a number or [*], we need special handling\r\n if (pathSegment === \"[*]\" || Array.isArray(pathSegment)) {\r\n // Key segment should be a number if we're using [*] or array indices\r\n const keyIndex = parseInt(keySegment);\r\n if (isNaN(keyIndex)) {\r\n match = false;\r\n break;\r\n }\r\n\r\n if (!isIndexMatch(pathSegment, keySegment)) {\r\n match = false;\r\n break;\r\n }\r\n } else if (pathSegment !== keySegment) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n const errorMessages = valErrors.get(key);\r\n if (errorMessages) {\r\n errors.push(...errorMessages);\r\n }\r\n }\r\n }\r\n });\r\n\r\n return errors;\r\n },\r\n getInitialOptions: (key) => {\r\n return get().initialStateOptions[key];\r\n },\r\n getNestedState: (key: string, path: string[]) => {\r\n const rootState = get().cogsStateStore[key];\r\n\r\n const getValueWithAsterisk = (obj: any, pathArray: string[]): any => {\r\n if (pathArray.length === 0) return obj;\r\n\r\n const currentPath = pathArray[0];\r\n const remainingPath = pathArray.slice(1);\r\n\r\n if (currentPath === \"[*]\") {\r\n if (!Array.isArray(obj)) {\r\n console.warn(\"Asterisk notation used on non-array value\");\r\n return undefined;\r\n }\r\n\r\n if (remainingPath.length === 0) return obj;\r\n\r\n // Get result for each array item\r\n const results = obj.map((item) =>\r\n getValueWithAsterisk(item, remainingPath)\r\n );\r\n\r\n // If the next path segment exists and returns arrays, flatten them\r\n if (Array.isArray(results[0])) {\r\n return results.flat();\r\n }\r\n\r\n return results;\r\n }\r\n\r\n const value = obj[currentPath as keyof typeof obj];\r\n if (value === undefined) return undefined;\r\n\r\n return getValueWithAsterisk(value, remainingPath);\r\n };\r\n\r\n // This will still get the value but we need to make it reactive only to specific paths\r\n return getValueWithAsterisk(rootState, path);\r\n },\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: {\r\n ...prev.initialStateOptions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: {\r\n ...prev.initialStateGlobal,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n getUpdaterState: (key) => {\r\n return get().updaterState[key];\r\n },\r\n setUpdaterState: (key, newUpdater) => {\r\n const current = get().updaterState;\r\n\r\n if (!key || !newUpdater) return;\r\n\r\n set({ updaterState: { ...(current ?? {}), [key]: newUpdater } });\r\n },\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => {\r\n return get().cogsStateStore[key];\r\n },\r\n\r\n setState: <StateKey extends StateKeys>(key: StateKey, value: StateValue) => {\r\n set((prev) => {\r\n return {\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n [key]:\r\n typeof value === \"function\"\r\n ? value(prev.cogsStateStore[key])\r\n : value,\r\n },\r\n };\r\n });\r\n },\r\n setInitialStates: <StateKey extends StateKeys>(initialState: StateValue) => {\r\n set((prev) => ({\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n setCreatedState: (initialState: StateValue) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { ...state, syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key: string) => get().syncInfoStore.get(key) || null,\r\n}));\r\n"],"names":["formRefStore","create","set","get","id","ref","state","newRefs","stateKey","allRefs","stateKeyPrefix","filteredRefs","getGlobalStore","parentPath","stateMap","index","newMap","path","newOuterMap","listener","key","record","_","rest","signalId","elementInfo","current","instanceId","elements","el","newState","prev","newValue","value","updater","currentUpdates","newUpdates","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","i","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","rootState","getValueWithAsterisk","obj","currentPath","remainingPath","results","item","newUpdater","initialState","syncInfo"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.221",
3
+ "version": "0.5.223",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/CogsState.tsx CHANGED
@@ -1508,11 +1508,10 @@ function createProxyHandler<T>(
1508
1508
  prop !== "then" &&
1509
1509
  !prop.startsWith("$") &&
1510
1510
  prop !== "stateMapNoRender" &&
1511
- !mutationMethods.has(prop) // ADD THIS CHECK
1511
+ !mutationMethods.has(prop)
1512
1512
  ) {
1513
- console.log("adding path start", path, prop);
1514
- // Only compute these if needed
1515
1513
  const fullComponentId = `${stateKey}////${componentId}`;
1514
+ console.log("adding path", fullComponentId, path, prop);
1516
1515
  const stateEntry = getGlobalStore
1517
1516
  .getState()
1518
1517
  .stateComponents.get(stateKey);
@@ -1520,16 +1519,16 @@ function createProxyHandler<T>(
1520
1519
  if (stateEntry) {
1521
1520
  const component = stateEntry.components.get(fullComponentId);
1522
1521
 
1523
- if (component) {
1524
- // If we already track root, no need to track anything else
1525
- if (component.paths.has("")) {
1526
- } else {
1527
- // Build the current path including the property being accessed
1522
+ if (component && !component.pathsInitialized) {
1523
+ // Mark as initialized immediately to prevent re-processing
1524
+ component.pathsInitialized = true;
1525
+
1526
+ // Now do the path tracking logic ONCE
1527
+ if (!component.paths.has("")) {
1528
1528
  const currentPath = path.join(".");
1529
- // Check if we need to add this path
1529
+
1530
1530
  let needsAdd = true;
1531
1531
  for (const existingPath of component.paths) {
1532
- // If we already track this exact path or a parent of it
1533
1532
  if (
1534
1533
  currentPath.startsWith(existingPath) &&
1535
1534
  (currentPath === existingPath ||
@@ -1541,7 +1540,12 @@ function createProxyHandler<T>(
1541
1540
  }
1542
1541
 
1543
1542
  if (needsAdd) {
1544
- console.log("adding path addimg", currentPath, prop);
1543
+ console.log(
1544
+ "adding path actualyl adding",
1545
+ fullComponentId,
1546
+ path,
1547
+ prop
1548
+ );
1545
1549
  component.paths.add(currentPath);
1546
1550
  }
1547
1551
  }
package/src/store.ts CHANGED
@@ -33,6 +33,7 @@ export type ComponentsType = {
33
33
  deps?: any[];
34
34
  depsFunction?: (state: any) => any[] | true;
35
35
  reactiveType: ReactivityType[] | ReactivityType;
36
+ pathsInitialized?: boolean;
36
37
  }
37
38
  >;
38
39
  };