cogsbox-state 0.5.475 → 0.5.476

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.
@@ -3,11 +3,11 @@ import { jsx as H, Fragment as pe } from "react/jsx-runtime";
3
3
  import { pluginStore as W } from "./pluginStore.js";
4
4
  import { useState as ee, useRef as G, useCallback as Ae, useEffect as q, useLayoutEffect as Me, useMemo as ye, createElement as ue, startTransition as $e } from "react";
5
5
  import { transformStateFunc as Ve, isFunction as U, isDeepEqual as Y, isArray as Ee, getDifferences as be } from "./utility.js";
6
- import { ValidationWrapper as Te, IsolatedComponentWrapper as Pe, FormElementWrapper as Ie, MemoizedCogsItemWrapper as ke } from "./Components.jsx";
6
+ import { ValidationWrapper as Te, IsolatedComponentWrapper as Pe, FormElementWrapper as Ie, MemoizedCogsItemWrapper as ke } from "./Components.js";
7
7
  import De from "superjson";
8
8
  import { v4 as te } from "uuid";
9
9
  import { getGlobalStore as w, updateShadowTypeInfo as fe } from "./store.js";
10
- import { useCogsConfig as me } from "./CogsStateClient.jsx";
10
+ import { useCogsConfig as me } from "./CogsStateClient.js";
11
11
  import { runValidation as Ce } from "./validation.js";
12
12
  const {
13
13
  getInitialOptions: C,
@@ -1467,4 +1467,4 @@ export {
1467
1467
  vt as createCogsState,
1468
1468
  at as useCogsStateFn
1469
1469
  };
1470
- //# sourceMappingURL=CogsState.jsx.map
1470
+ //# sourceMappingURL=CogsState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CogsState.js","sources":["../src/CogsState.tsx"],"sourcesContent":["'use client';\r\nimport { pluginStore } from './pluginStore';\r\nimport { FormWrapperParams, type CogsPlugin } from './plugins';\r\nimport {\r\n createElement,\r\n startTransition,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type ReactNode,\r\n type RefObject,\r\n} from 'react';\r\n\r\nimport {\r\n transformStateFunc,\r\n isFunction,\r\n type GenericObject,\r\n isArray,\r\n getDifferences,\r\n} from './utility.js';\r\nimport {\r\n FormElementWrapper,\r\n IsolatedComponentWrapper,\r\n MemoizedCogsItemWrapper,\r\n ValidationWrapper,\r\n} from './Components.js';\r\nimport { isDeepEqual } from './utility.js';\r\nimport superjson from 'superjson';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport {\r\n getGlobalStore,\r\n updateShadowTypeInfo,\r\n ValidationError,\r\n ValidationSeverity,\r\n ValidationStatus,\r\n type ComponentsType,\r\n} from './store.js';\r\nimport { useCogsConfig } from './CogsStateClient.js';\r\nimport { Operation } from 'fast-json-patch';\r\n\r\nimport * as z3 from 'zod/v3';\r\n\r\nimport { runValidation } from './validation';\r\nimport { ZodType } from 'zod/v4';\r\n\r\nexport type Prettify<T> = T extends any ? { [K in keyof T]: T[K] } : never;\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = StateObject<T> & {\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<\r\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\r\n >\r\n ) => void;\r\n onBlur?: (\r\n event: React.FocusEvent<\r\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\r\n >\r\n ) => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\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\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type InsertParams<S> =\r\n | S\r\n | ((prevState: { state: S; uuid: string }) => S);\r\nexport type UpdateType<T> = (payload: UpdateArg<T>) => { synced: () => void };\r\n\r\nexport type InsertType<T> = (payload: InsertParams<T>, index?: number) => void;\r\nexport type InsertTypeObj<T> = (payload: InsertParams<T>) => void;\r\n\r\ntype EffectFunction<T, R> = (state: T, deps: any[]) => R;\r\nexport type PerPathFormOptsType<\r\n TState,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = Omit<FormOptsType, 'formElements'> & {\r\n formElements?: FormsElementsType<TState, TPlugins>;\r\n};\r\nexport type FormOptsType = {\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n\r\n debounceTime?: number;\r\n sync?: {\r\n allowInvalidValues?: boolean; // default: false\r\n };\r\n};\r\n\r\n// Separate type for array-element-specific methods\r\nexport type ArrayElementExtras<TParentArray = unknown> = {\r\n $cutThis: () => void;\r\n $_index: number;\r\n};\r\n\r\n// EndType - NO $cutThis here, it's purely contextual\r\nexport type EndType<\r\n T,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = {\r\n $getPluginMetaData: (pluginName: string) => Record<string, any>;\r\n $addPluginMetaData: (key: string, data: Record<string, any>) => void;\r\n $removePluginMetaData: (key: string) => void;\r\n $setOptions: (options: OptionsType<T>) => void;\r\n $addZodValidation: (\r\n errors: ValidationError[],\r\n source?: 'client' | 'sync_engine' | 'api'\r\n ) => void;\r\n $clearValidation: (paths?: string[]) => void;\r\n $applyOperation: (\r\n operation: UpdateTypeDetail,\r\n metaData?: Record<string, any>\r\n ) => void;\r\n $applyJsonPatch: (patches: any[]) => void;\r\n $update: UpdateType<T>;\r\n $_path: string[];\r\n $_stateKey: string;\r\n $isolate: {\r\n (\r\n renderFn: (state: StateObject<T, TPlugins>) => React.ReactNode\r\n ): JSX.Element;\r\n (\r\n dependencies: any[],\r\n renderFn: (state: StateObject<T, TPlugins>) => React.ReactNode\r\n ): JSX.Element;\r\n };\r\n $formElement: (\r\n control: FormControl<T>,\r\n opts?: PerPathFormOptsType<T, TPlugins>\r\n ) => JSX.Element;\r\n $get: () => T;\r\n $$get: () => T;\r\n $$derive: <R>(fn: EffectFunction<T, R>) => R;\r\n $_status: 'fresh' | 'dirty' | 'synced' | 'restored' | 'unknown';\r\n $getStatus: () => 'fresh' | 'dirty' | 'synced' | 'restored' | 'unknown';\r\n $showValidationErrors: () => string[];\r\n $setValidation: (ctx: string) => void;\r\n $removeValidation: (ctx: string) => void;\r\n $isSelected: boolean;\r\n $setSelected: (value: boolean) => void;\r\n $toggleSelected: () => void;\r\n $formInput: {\r\n setDisabled: (isDisabled: boolean) => void;\r\n focus: () => void;\r\n blur: () => void;\r\n scrollIntoView: (options?: ScrollIntoViewOptions) => void;\r\n click: () => void;\r\n selectText: () => void;\r\n };\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};\r\n\r\n// Helper type for element returned from array methods\r\nexport type ArrayElementState<\r\n TElement,\r\n TParentArray,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = StateObject<TElement, TPlugins> & ArrayElementExtras<TParentArray>;\r\n\r\nexport type ArrayEndType<\r\n TShape extends unknown,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[],\r\n> = {\r\n (): TShape;\r\n (newValue: TShape | ((prev: TShape) => TShape)): void;\r\n\r\n $findWith: <K extends keyof Prettify<InferArrayElement<TShape>>>(\r\n key: K,\r\n value: Prettify<InferArrayElement<TShape>>[K]\r\n ) =>\r\n | ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>\r\n | undefined;\r\n\r\n // Returns element WITH $cutThis\r\n $index: (\r\n index: number\r\n ) => ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>;\r\n\r\n $insert: InsertType<Prettify<InferArrayElement<TShape>>>;\r\n $insertMany: (payload: InferArrayElement<TShape>[]) => void;\r\n $cut: CutFunctionType<TShape>;\r\n $cutSelected: () => void;\r\n $cutByValue: (value: string | number | boolean) => void;\r\n $toggleByValue: (value: string | number | boolean) => void;\r\n\r\n // Returns array StateObject (chainable)\r\n $sort: (\r\n compareFn: (\r\n a: Prettify<InferArrayElement<TShape>>,\r\n b: Prettify<InferArrayElement<TShape>>\r\n ) => number\r\n ) => StateObject<TShape, TPlugins>;\r\n\r\n // Callback receives element WITH $cutThis\r\n $list: (\r\n callbackfn: (\r\n setter: ArrayElementState<\r\n Prettify<InferArrayElement<TShape>>,\r\n TShape,\r\n TPlugins\r\n >,\r\n index: number,\r\n arraySetter: StateObject<TShape, TPlugins>\r\n ) => void\r\n ) => any;\r\n\r\n $map: <U>(\r\n callbackfn: (\r\n setter: ArrayElementState<\r\n Prettify<InferArrayElement<TShape>>,\r\n TShape,\r\n TPlugins\r\n >,\r\n index: number,\r\n arraySetter: StateObject<TShape, TPlugins>\r\n ) => U\r\n ) => U[];\r\n\r\n $stateFlattenOn: <K extends keyof Prettify<InferArrayElement<TShape>>>(\r\n field: K\r\n ) => StateObject<\r\n InferArrayElement<Prettify<InferArrayElement<TShape>>[K]>[],\r\n TPlugins\r\n >;\r\n\r\n $uniqueInsert: (\r\n payload: InsertParams<Prettify<InferArrayElement<TShape>>>,\r\n fields?: (keyof Prettify<InferArrayElement<TShape>>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n\r\n // Returns element WITH $cutThis\r\n $find: (\r\n callbackfn: (\r\n value: Prettify<InferArrayElement<TShape>>,\r\n index: number\r\n ) => boolean\r\n ) =>\r\n | ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>\r\n | undefined;\r\n\r\n // Returns array StateObject (chainable)\r\n $filter: (\r\n callbackfn: (\r\n value: Prettify<InferArrayElement<TShape>>,\r\n index: number\r\n ) => boolean\r\n ) => StateObject<TShape, TPlugins>;\r\n\r\n // Returns element WITH $cutThis\r\n $getSelected: () =>\r\n | ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>\r\n | undefined;\r\n\r\n $clearSelected: () => void;\r\n $getSelectedIndex: () => number;\r\n\r\n // Returns element WITH $cutThis\r\n $last: () =>\r\n | ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>\r\n | undefined;\r\n} & EndType<TShape, TPlugins>; // NO $cutThis on arrays themselves\r\n\r\nexport type StateObject<\r\n T,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = {\r\n (): T;\r\n (newValue: T | ((prev: T) => T)): void;\r\n} & (T extends any[]\r\n ? ArrayEndType<T, TPlugins>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K], TPlugins> }\r\n : EndType<T, TPlugins>) & // primitives just get EndType\r\n EndType<T, TPlugins> & {\r\n // NO third param = no $cutThis\r\n $toggle: T extends boolean ? () => void : never;\r\n $validate: () => { success: boolean; data?: T; error?: any };\r\n $_componentId: string | null;\r\n $getComponents: () => ComponentsType;\r\n $_initialState: T;\r\n $updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n $initializeAndMergeShadowState: (newState: any | null) => void;\r\n $_isLoading: boolean;\r\n $_serverState: T;\r\n $revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n $middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n $getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\ntype EffectiveSetStateArg<\r\n T,\r\n UpdateType extends 'update' | 'insert' | 'cut',\r\n> = UpdateType extends 'insert'\r\n ? T extends any[]\r\n ? InsertParams<InferArrayElement<T>>\r\n : never\r\n : UpdateArg<T>;\r\n\r\ntype UpdateOptions = {\r\n updateType: 'insert' | 'cut' | 'update' | 'insert_many';\r\n validationTrigger?: 'onBlur' | 'onChange' | 'programmatic';\r\n itemId?: string;\r\n index?: number;\r\n metaData?: Record<string, any>;\r\n};\r\ntype EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | EffectiveSetStateArg<TStateObject, 'update'>\r\n | EffectiveSetStateArg<TStateObject, 'insert'>\r\n | null,\r\n path: string[],\r\n updateObj: UpdateOptions, // Now includes itemId\r\n validationKey?: string\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: 'update' | 'insert' | 'cut' | 'insert_many';\r\n path: string[];\r\n status: 'new' | 'sent' | 'synced';\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n itemId?: string;\r\n insertAfterId?: string;\r\n metaData?: Record<string, any>;\r\n};\r\nexport type ReactivityUnion = 'none' | 'component' | 'deps' | 'all';\r\nexport type ReactivityType =\r\n | 'none'\r\n | 'component'\r\n | 'deps'\r\n | 'all'\r\n | Array<Prettify<'none' | 'component' | 'deps' | 'all'>>;\r\n\r\n// Define the return type of the sync hook locally\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchemaV3?: z3.ZodType<any, any, any>;\r\n zodSchemaV4?: ZodType;\r\n onBlur?: 'error' | 'warning';\r\n onChange?: 'error' | 'warning';\r\n blockSync?: boolean;\r\n};\r\n\r\ntype SyncOptionsType<TApiParams> = {\r\n apiParams: TApiParams;\r\n stateKey?: string;\r\n stateRoom:\r\n | number\r\n | string\r\n | (({ clientId }: { clientId: string }) => string | null);\r\n connect?: boolean;\r\n inMemoryState?: boolean;\r\n};\r\n\r\nexport type CreateStateOptionsType<\r\n T extends unknown = unknown,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = {\r\n formElements?: FormsElementsType<T, TPlugins>;\r\n validation?: ValidationOptionsType;\r\n plugins?: TPlugins;\r\n};\r\nexport type OptionsType<\r\n T extends unknown = unknown,\r\n TApiParams = never,\r\n> = CreateStateOptionsType & {\r\n log?: boolean;\r\n componentId?: string;\r\n syncOptions?: SyncOptionsType<TApiParams>;\r\n\r\n serverState?: {\r\n id?: string | number;\r\n data?: T;\r\n status?: 'pending' | 'error' | 'success' | 'loading';\r\n timestamp?: number;\r\n merge?:\r\n | boolean\r\n | {\r\n strategy: 'append' | 'prepend' | 'diff';\r\n key?: string;\r\n };\r\n };\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?: ({ update }: { update: UpdateTypeDetail }) => void;\r\n\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n defaultState?: T;\r\n\r\n dependencies?: any[];\r\n};\r\ntype ScopedPluginApi<THookReturn, TFieldMetaData> = {\r\n hookData: THookReturn;\r\n getFieldMetaData: () => TFieldMetaData | undefined;\r\n setFieldMetaData: (data: Partial<TFieldMetaData>) => void;\r\n // Add any other scoped functions or data a plugin might need here\r\n};\r\nexport type FormsElementsType<\r\n TState,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = {\r\n // These optional, built-in wrappers are unchanged.\r\n validation?: (options: {\r\n children: React.ReactNode;\r\n status: ValidationStatus;\r\n severity: ValidationSeverity;\r\n hasErrors: boolean;\r\n hasWarnings: boolean;\r\n allErrors: ValidationError[];\r\n path: string[];\r\n message?: string;\r\n getData?: () => TState;\r\n plugins: {\r\n // It maps over the plugins...\r\n [P in TPlugins[number] as P['name']]: P extends CogsPlugin<\r\n any,\r\n any,\r\n infer THookReturn,\r\n any,\r\n infer TFieldMetaData\r\n >\r\n ? // ...and provides the scoped API for each one.\r\n ScopedPluginApi<THookReturn, TFieldMetaData>\r\n : never;\r\n };\r\n }) => React.ReactNode;\r\n syncRender?: (options: {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: TState;\r\n key?: string;\r\n }) => React.ReactNode;\r\n};\r\nexport type CogsInitialState<T> =\r\n | {\r\n initialState: T;\r\n }\r\n | CreateStateOptionsType<T>;\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\nconst {\r\n getInitialOptions,\r\n updateInitialStateGlobal,\r\n getShadowMetadata,\r\n setShadowMetadata,\r\n getShadowValue,\r\n initializeShadowState,\r\n initializeAndMergeShadowState,\r\n updateShadowAtPath,\r\n insertShadowArrayElement,\r\n insertManyShadowArrayElements,\r\n removeShadowArrayElement,\r\n setInitialStateOptions,\r\n setServerStateUpdate,\r\n markAsDirty,\r\n addPathComponent,\r\n clearSelectedIndexesForState,\r\n addStateLog,\r\n clearSelectedIndex,\r\n getSyncInfo,\r\n notifyPathSubscribers,\r\n getPluginMetaDataMap,\r\n setPluginMetaData,\r\n removePluginMetaData,\r\n} = getGlobalStore.getState();\r\n\r\nconst { notifyUpdate } = pluginStore.getState();\r\n\r\nfunction getArrayData(stateKey: string, path: string[], meta?: MetaData) {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n const isArray = !!shadowMeta?.arrayKeys;\r\n\r\n if (!isArray) {\r\n const value = getGlobalStore.getState().getShadowValue(stateKey, path);\r\n return { isArray: false, value, keys: [] };\r\n }\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey] ?? shadowMeta.arrayKeys;\r\n\r\n // FIX: If the derived view is empty, return an empty array and keys.\r\n if (Array.isArray(viewIds) && viewIds.length === 0) {\r\n return { isArray: true, value: [], keys: [] };\r\n }\r\n\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path, viewIds);\r\n\r\n return { isArray: true, value, keys: viewIds ?? [] };\r\n}\r\n\r\nfunction findArrayItem(\r\n array: any[],\r\n keys: string[],\r\n predicate: (item: any, index: number) => boolean\r\n): { key: string; index: number; value: any } | null {\r\n for (let i = 0; i < array.length; i++) {\r\n if (predicate(array[i], i)) {\r\n const key = keys[i];\r\n if (key) {\r\n return { key, index: i, value: array[i] };\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n const mergedOptions = {\r\n ...initialOptions,\r\n ...newOptions,\r\n };\r\n\r\n // FIX: Apply the same default onBlur logic here too\r\n if (\r\n (mergedOptions.validation?.zodSchemaV4 ||\r\n mergedOptions.validation?.zodSchemaV3) &&\r\n !mergedOptions.validation?.onBlur\r\n ) {\r\n mergedOptions.validation.onBlur = 'error';\r\n }\r\n\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n\r\n let mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n let needToAdd = false;\r\n\r\n if (options) {\r\n const deepMerge = (target: any, source: any) => {\r\n for (const key in source) {\r\n if (source.hasOwnProperty(key)) {\r\n if (\r\n source[key] instanceof Object &&\r\n !Array.isArray(source[key]) &&\r\n target[key] instanceof Object\r\n ) {\r\n if (!isDeepEqual(target[key], source[key])) {\r\n deepMerge(target[key], source[key]);\r\n needToAdd = true;\r\n }\r\n } else {\r\n if (target[key] !== source[key]) {\r\n target[key] = source[key];\r\n needToAdd = true;\r\n }\r\n }\r\n }\r\n }\r\n return target;\r\n };\r\n\r\n mergedOptions = deepMerge(mergedOptions, options);\r\n }\r\n\r\n // Set default onBlur\r\n if (mergedOptions.validation) {\r\n const onBlurProvided =\r\n options?.validation?.hasOwnProperty('onBlur') ||\r\n initialOptions?.validation?.hasOwnProperty('onBlur') ||\r\n initialOptionsPartState?.validation?.hasOwnProperty('onBlur');\r\n\r\n if (!onBlurProvided) {\r\n mergedOptions.validation.onBlur = 'error';\r\n needToAdd = true;\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n\r\n // NEW: Update type info if validation schema was added\r\n const hadSchema =\r\n initialOptions?.validation?.zodSchemaV4 ||\r\n initialOptions?.validation?.zodSchemaV3;\r\n const hasNewSchemaV4 =\r\n mergedOptions.validation?.zodSchemaV4 &&\r\n !initialOptions?.validation?.zodSchemaV4;\r\n const hasNewSchemaV3 =\r\n mergedOptions.validation?.zodSchemaV3 &&\r\n !initialOptions?.validation?.zodSchemaV3;\r\n\r\n if (!hadSchema && (hasNewSchemaV4 || hasNewSchemaV3)) {\r\n if (hasNewSchemaV4) {\r\n updateShadowTypeInfo(\r\n stateKey as string,\r\n mergedOptions.validation.zodSchemaV4,\r\n 'zod4'\r\n );\r\n } else if (hasNewSchemaV3) {\r\n updateShadowTypeInfo(\r\n stateKey as string,\r\n mergedOptions.validation.zodSchemaV3,\r\n 'zod3'\r\n );\r\n }\r\n\r\n // Notify components to re-render with updated validation\r\n notifyComponents(stateKey as string);\r\n }\r\n }\r\n\r\n return mergedOptions;\r\n}\r\nexport function addStateOptions<T>(\r\n initialState: T,\r\n options: CreateStateOptionsType<T>\r\n) {\r\n return {\r\n ...options,\r\n initialState,\r\n _addStateOptions: true,\r\n };\r\n}\r\nexport type PluginData = {\r\n plugin: CogsPlugin<any, any, any, any, any>;\r\n options: any;\r\n hookData?: any;\r\n};\r\n\r\n////////////////////////////////\r\n\r\nexport const createCogsState = <\r\n State extends Record<string, unknown>,\r\n const TPlugins extends readonly CogsPlugin<string, any, any, any, any>[] = [],\r\n>(\r\n initialState: State,\r\n opt?: {\r\n plugins?: TPlugins;\r\n formElements?: FormsElementsType<State, TPlugins>;\r\n validation?: ValidationOptionsType;\r\n }\r\n) => {\r\n type PluginOptions = {\r\n [K in TPlugins[number] as K['name']]?: K extends CogsPlugin<\r\n string,\r\n infer O,\r\n any,\r\n any,\r\n any\r\n >\r\n ? O\r\n : never;\r\n };\r\n\r\n if (opt?.plugins) {\r\n pluginStore.getState().setRegisteredPlugins(opt.plugins as any);\r\n }\r\n\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(initialState);\r\n\r\n // FIX: Store options INCLUDING validation for each state key\r\n Object.keys(statePart).forEach((key) => {\r\n let existingOptions = initialOptionsPart[key] || {};\r\n\r\n const mergedOptions: any = {\r\n ...existingOptions,\r\n };\r\n\r\n if (opt?.formElements) {\r\n mergedOptions.formElements = {\r\n ...opt.formElements,\r\n ...(existingOptions.formElements || {}),\r\n };\r\n }\r\n\r\n mergedOptions.validation = {\r\n onBlur: 'error',\r\n ...opt?.validation,\r\n ...(existingOptions.validation || {}),\r\n };\r\n\r\n if (opt?.validation?.key && !existingOptions.validation?.key) {\r\n mergedOptions.validation.key = `${opt.validation.key}.${key}`;\r\n }\r\n\r\n const existingGlobalOptions = getInitialOptions(key);\r\n\r\n const finalOptions = existingGlobalOptions\r\n ? {\r\n ...existingGlobalOptions,\r\n ...mergedOptions,\r\n formElements: {\r\n ...existingGlobalOptions.formElements,\r\n ...mergedOptions.formElements,\r\n },\r\n validation: {\r\n ...existingGlobalOptions.validation,\r\n ...mergedOptions.validation,\r\n },\r\n }\r\n : mergedOptions;\r\n\r\n setInitialStateOptions(key, finalOptions);\r\n });\r\n\r\n Object.keys(statePart).forEach((key) => {\r\n initializeShadowState(key, statePart[key]);\r\n });\r\n type Prettify<T> = {\r\n [K in keyof T]: T[K];\r\n } & {};\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: Prettify<\r\n OptionsType<(typeof statePart)[StateKey], never> & {\r\n [PName in keyof PluginOptions]?: PluginOptions[PName] extends infer P\r\n ? P extends Record<string, any>\r\n ? {\r\n [K in keyof P]: P[K] extends { __key: 'keyed'; map: infer TMap }\r\n ? StateKey extends keyof TMap\r\n ? TMap[StateKey]\r\n : never\r\n : P[K];\r\n }\r\n : P\r\n : never;\r\n }\r\n >\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n const currentOptions = setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const optionsRef = useRef(currentOptions);\r\n optionsRef.current = currentOptions;\r\n\r\n const thiState =\r\n getShadowValue(stateKey as string, []) || statePart[stateKey as string];\r\n\r\n const updater = useCogsStateFn<(typeof statePart)[StateKey], TPlugins>(\r\n thiState,\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 reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n defaultState: options?.defaultState as any,\r\n dependencies: options?.dependencies,\r\n serverState: options?.serverState,\r\n }\r\n );\r\n\r\n useEffect(() => {\r\n if (options) {\r\n pluginStore\r\n .getState()\r\n .setPluginOptionsForState(stateKey as string, options);\r\n }\r\n }, [stateKey, options]);\r\n useEffect(() => {\r\n pluginStore\r\n .getState()\r\n .stateHandlers.set(stateKey as string, updater as any);\r\n\r\n return () => {\r\n pluginStore.getState().stateHandlers.delete(stateKey as string);\r\n };\r\n }, [stateKey, updater]);\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptionsByKey<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: CreateStateOptionsType<(typeof statePart)[StateKey], TPlugins> &\r\n Omit<\r\n OptionsType<(typeof statePart)[StateKey]>,\r\n keyof CreateStateOptionsType\r\n >\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart } as any);\r\n\r\n if (options.localStorage) {\r\n loadAndApplyLocalStorage(stateKey as string, options);\r\n }\r\n if (options.formElements) {\r\n const currentPlugins = pluginStore.getState().registeredPlugins;\r\n\r\n const updatedPlugins = currentPlugins.map((plugin) => {\r\n // Use `options.formElements` as the source\r\n if (options.formElements!.hasOwnProperty(plugin.name)) {\r\n return {\r\n ...plugin,\r\n formWrapper: (options.formElements as any)[plugin.name],\r\n };\r\n }\r\n return plugin;\r\n });\r\n\r\n pluginStore.getState().setRegisteredPlugins(updatedPlugins as any);\r\n }\r\n notifyComponents(stateKey as string);\r\n }\r\n function setCogsOptions(\r\n // The type allows any valid options, but uses a generic `unknown` for the\r\n // state type because it applies to multiple different state shapes.\r\n // The `TPlugins` generic is correctly preserved.\r\n globalOptions: CreateStateOptionsType<unknown, TPlugins> &\r\n Omit<OptionsType<unknown>, keyof CreateStateOptionsType>\r\n ) {\r\n // Get all the state keys that this instance manages\r\n const allStateKeys = Object.keys(statePart) as StateKeys[];\r\n\r\n // Loop through every state key and apply the provided options\r\n allStateKeys.forEach((key) => {\r\n // We use `as any` here because we are intentionally applying a single\r\n // generic options object to many differently-typed state slices.\r\n // The internal logic of setCogsOptionsByKey handles the merging correctly.\r\n setCogsOptionsByKey(key, globalOptions as any);\r\n });\r\n }\r\n\r\n return {\r\n useCogsState,\r\n setCogsOptionsByKey,\r\n setCogsOptions,\r\n };\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string,\r\n 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 const shadowMeta = getShadowMetadata(thisKey, []);\r\n\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer: lastSyncedWithServer ?? existingLastSynced,\r\n stateSource: shadowMeta?.stateSource,\r\n baseServerState: shadowMeta?.baseServerState,\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 = getShadowValue(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 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; // Keep reference to what server state this is based on\r\n stateSource?: 'default' | 'server' | 'localStorage'; // Track origin\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getShadowMetadata(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\nfunction markEntireStateAsServerSynced(\r\n stateKey: string,\r\n path: string[],\r\n data: any,\r\n timestamp: number\r\n) {\r\n // Mark current path as synced\r\n const currentMeta = getShadowMetadata(stateKey, path);\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync: timestamp || Date.now(),\r\n });\r\n\r\n // If it's an array, mark each item as synced\r\n if (Array.isArray(data)) {\r\n const arrayMeta = getShadowMetadata(stateKey, path);\r\n if (arrayMeta?.arrayKeys) {\r\n arrayMeta.arrayKeys.forEach((itemKey, index) => {\r\n // Fix: Don't split the itemKey, just use it directly\r\n const itemPath = [...path, itemKey];\r\n const itemData = data[index];\r\n if (itemData !== undefined) {\r\n markEntireStateAsServerSynced(\r\n stateKey,\r\n itemPath,\r\n itemData,\r\n timestamp\r\n );\r\n }\r\n });\r\n }\r\n }\r\n // If it's an object, mark each field as synced\r\n else if (data && typeof data === 'object' && data.constructor === Object) {\r\n Object.keys(data).forEach((key) => {\r\n const fieldPath = [...path, key];\r\n const fieldData = data[key];\r\n markEntireStateAsServerSynced(stateKey, fieldPath, fieldData, timestamp);\r\n });\r\n }\r\n}\r\n// 5. Batch queue\r\nlet updateBatchQueue: any[] = [];\r\nlet isFlushScheduled = false;\r\n\r\nfunction scheduleFlush() {\r\n if (!isFlushScheduled) {\r\n isFlushScheduled = true;\r\n queueMicrotask(() => {\r\n flushQueue();\r\n });\r\n }\r\n}\r\n\r\n// 2. Update signals\r\nfunction updateSignals(shadowMeta: any, displayValue: any) {\r\n if (!shadowMeta?.signals?.length) return;\r\n\r\n shadowMeta.signals.forEach(({ parentId, position, effect }: any) => {\r\n const parent = document.querySelector(`[data-parent-id=\"${parentId}\"]`);\r\n if (!parent) return;\r\n\r\n const childNodes = Array.from(parent.childNodes);\r\n if (!childNodes[position]) return;\r\n\r\n let finalDisplayValue = displayValue;\r\n if (effect && displayValue !== null) {\r\n try {\r\n finalDisplayValue = new Function('state', `return (${effect})(state)`)(\r\n displayValue\r\n );\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n }\r\n }\r\n\r\n if (finalDisplayValue !== null && typeof finalDisplayValue === 'object') {\r\n finalDisplayValue = JSON.stringify(finalDisplayValue);\r\n }\r\n\r\n childNodes[position].textContent = String(finalDisplayValue ?? '');\r\n });\r\n}\r\n\r\nfunction getComponentNotifications(\r\n stateKey: string,\r\n path: string[],\r\n result: any\r\n): Set<any> {\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n\r\n if (!rootMeta?.components) {\r\n return new Set();\r\n }\r\n\r\n const componentsToNotify = new Set<any>();\r\n\r\n // --- PASS 1: Notify specific subscribers based on update type ---\r\n\r\n if (result.type === 'update') {\r\n // --- Bubble-up Notification ---\r\n // An update to `user.address.street` notifies listeners of `street`, `address`, and `user`.\r\n let currentPath = [...path];\r\n while (true) {\r\n const pathMeta = getShadowMetadata(stateKey, currentPath);\r\n\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set instead of calling forceUpdate()\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n if (!reactiveTypes.includes('none')) {\r\n componentsToNotify.add(component);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop(); // Go up one level\r\n }\r\n\r\n // --- Deep Object Change Notification ---\r\n // If the new value is an object, notify components subscribed to sub-paths that changed.\r\n if (\r\n result.newValue &&\r\n typeof result.newValue === 'object' &&\r\n !isArray(result.newValue)\r\n ) {\r\n const changedSubPaths = getDifferences(result.newValue, result.oldValue);\r\n\r\n changedSubPaths.forEach((subPathString: string) => {\r\n const subPath = subPathString.split('.');\r\n const fullSubPath = [...path, ...subPath];\r\n const subPathMeta = getShadowMetadata(stateKey, fullSubPath);\r\n\r\n if (subPathMeta?.pathComponents) {\r\n subPathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n if (!reactiveTypes.includes('none')) {\r\n componentsToNotify.add(component);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n } else if (\r\n result.type === 'insert' ||\r\n result.type === 'cut' ||\r\n result.type === 'insert_many'\r\n ) {\r\n // This path is the array itself (e.g., ['pets'])\r\n const parentArrayPath = result.type === 'insert' ? path : path.slice(0, -1);\r\n\r\n // --- FIX: ADD BUBBLE-UP LOGIC HERE ---\r\n // Start from the array's path and go up to the root\r\n let currentPath = [...parentArrayPath];\r\n while (true) {\r\n const pathMeta = getShadowMetadata(stateKey, currentPath);\r\n\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n componentsToNotify.add(component);\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop(); // Go up one level\r\n }\r\n // --- END FIX ---\r\n }\r\n\r\n // --- PASS 2: Handle 'all' and 'deps' reactivity types ---\r\n // Iterate over all components for this stateKey that haven't been notified yet.\r\n // rootMeta.components.forEach((component, componentId) => {\r\n // // If we've already added this component, skip it.\r\n // if (componentsToNotify.has(component)) {\r\n // return;\r\n // }\r\n\r\n // const reactiveTypes = Array.isArray(component.reactiveType)\r\n // ? component.reactiveType\r\n // : [component.reactiveType || 'component'];\r\n\r\n // if (reactiveTypes.includes('all')) {\r\n // componentsToNotify.add(component);\r\n // } else if (reactiveTypes.includes('deps') && component.depsFunction) {\r\n // const currentState = getShadowValue(stateKey, []);\r\n // const newDeps = component.depsFunction(currentState);\r\n\r\n // if (\r\n // newDeps === true ||\r\n // (Array.isArray(newDeps) && !isDeepEqual(component.prevDeps, newDeps))\r\n // ) {\r\n // component.prevDeps = newDeps as any; // Update the dependencies for the next check\r\n // componentsToNotify.add(component);\r\n // }\r\n // }\r\n // });\r\n\r\n return componentsToNotify;\r\n}\r\n\r\nfunction handleUpdate(\r\n stateKey: string,\r\n path: string[],\r\n payload: any\r\n): { type: 'update'; oldValue: any; newValue: any; shadowMeta: any } | null {\r\n // ✅ FIX: Get the old value before the update.\r\n const oldValue = getGlobalStore.getState().getShadowValue(stateKey, path);\r\n\r\n const newValue = isFunction(payload) ? payload(oldValue) : payload;\r\n if (isDeepEqual(oldValue, newValue)) {\r\n return null; // <-- Abort the update\r\n }\r\n\r\n // ✅ FIX: The new `updateShadowAtPath` handles metadata preservation automatically.\r\n // The manual loop has been removed.\r\n updateShadowAtPath(stateKey, path, newValue);\r\n\r\n markAsDirty(stateKey, path, { bubble: true });\r\n\r\n // Return the metadata of the node *after* the update.\r\n const newShadowMeta = getShadowMetadata(stateKey, path);\r\n\r\n return {\r\n type: 'update',\r\n oldValue: oldValue,\r\n newValue,\r\n shadowMeta: newShadowMeta,\r\n };\r\n}\r\nfunction handleInsertMany(\r\n stateKey: string,\r\n path: string[],\r\n payload: any[]\r\n): {\r\n type: 'insert_many';\r\n count: number;\r\n shadowMeta: any;\r\n path: string[];\r\n} {\r\n // Use the existing, optimized global store function to perform the state update\r\n insertManyShadowArrayElements(stateKey, path, payload);\r\n\r\n markAsDirty(stateKey, path, { bubble: true });\r\n const updatedMeta = getShadowMetadata(stateKey, path);\r\n\r\n return {\r\n type: 'insert_many',\r\n count: payload.length,\r\n shadowMeta: updatedMeta,\r\n path: path,\r\n };\r\n}\r\nfunction handleInsert(\r\n stateKey: string,\r\n path: string[],\r\n payload: any,\r\n index?: number,\r\n itemId?: string\r\n): {\r\n type: 'insert';\r\n newValue: any;\r\n shadowMeta: any;\r\n path: string[];\r\n itemId: string;\r\n insertAfterId?: string;\r\n} {\r\n let newValue;\r\n\r\n if (isFunction(payload)) {\r\n const { value: currentValue } = getScopedData(stateKey, path);\r\n newValue = payload({ state: currentValue });\r\n } else {\r\n newValue = payload;\r\n }\r\n //console.time('insertShadowArrayElement');\r\n // Pass itemId to insertShadowArrayElement\r\n const actualItemId = insertShadowArrayElement(\r\n stateKey,\r\n path,\r\n newValue,\r\n index,\r\n itemId\r\n );\r\n //console.timeEnd('insertShadowArrayElement');\r\n\r\n markAsDirty(stateKey, path, { bubble: true });\r\n\r\n const updatedMeta = getShadowMetadata(stateKey, path);\r\n\r\n let insertAfterId: string | undefined;\r\n if (updatedMeta?.arrayKeys && index !== undefined && index > 0) {\r\n insertAfterId = updatedMeta.arrayKeys[index - 1];\r\n }\r\n\r\n return {\r\n type: 'insert',\r\n newValue,\r\n shadowMeta: updatedMeta,\r\n path: path,\r\n itemId: actualItemId,\r\n insertAfterId: insertAfterId,\r\n };\r\n}\r\n\r\nfunction handleCut(\r\n stateKey: string,\r\n path: string[]\r\n): { type: 'cut'; oldValue: any; parentPath: string[] } {\r\n const parentArrayPath = path.slice(0, -1);\r\n const oldValue = getShadowValue(stateKey, path);\r\n removeShadowArrayElement(stateKey, path);\r\n markAsDirty(stateKey, parentArrayPath, { bubble: true });\r\n return { type: 'cut', oldValue: oldValue, parentPath: parentArrayPath };\r\n}\r\n\r\nfunction flushQueue() {\r\n const allComponentsToNotify = new Set<any>();\r\n const signalUpdates: { shadowMeta: any; displayValue: any }[] = [];\r\n\r\n const logsToAdd: UpdateTypeDetail[] = [];\r\n\r\n for (const item of updateBatchQueue) {\r\n if (item.status && item.updateType) {\r\n logsToAdd.push(item as UpdateTypeDetail);\r\n continue;\r\n }\r\n\r\n const result = item;\r\n\r\n const displayValue = result.type === 'cut' ? null : result.newValue;\r\n if (result.shadowMeta?.signals?.length > 0) {\r\n signalUpdates.push({ shadowMeta: result.shadowMeta, displayValue });\r\n }\r\n // console.time('getComponentNotifications');\r\n const componentNotifications = getComponentNotifications(\r\n result.stateKey,\r\n result.path,\r\n result\r\n );\r\n\r\n componentNotifications.forEach((component) => {\r\n allComponentsToNotify.add(component);\r\n });\r\n // console.timeEnd('getComponentNotifications');\r\n }\r\n //console.time('logs');\r\n if (logsToAdd.length > 0) {\r\n addStateLog(logsToAdd);\r\n }\r\n //console.timeEnd('logs');\r\n signalUpdates.forEach(({ shadowMeta, displayValue }) => {\r\n updateSignals(shadowMeta, displayValue);\r\n });\r\n\r\n // console.time('updateComponents');\r\n allComponentsToNotify.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n //console.timeEnd('updateComponents');\r\n\r\n // --- Step 3: CLEANUP ---\r\n // Clear the queue for the next batch of updates.\r\n updateBatchQueue = [];\r\n isFlushScheduled = false;\r\n}\r\nfunction createEffectiveSetState<T>(\r\n thisKey: string,\r\n sessionId: string | undefined,\r\n latestInitialOptionsRef: React.MutableRefObject<OptionsType<T> | null>\r\n): EffectiveSetState<T> {\r\n return (newStateOrFunction, path, updateObj) => {\r\n executeUpdate(thisKey, path, newStateOrFunction, updateObj);\r\n };\r\n\r\n function executeUpdate(\r\n stateKey: string,\r\n path: string[],\r\n payload: any,\r\n options: UpdateOptions // Now includes itemId\r\n ) {\r\n let result: any;\r\n switch (options.updateType) {\r\n case 'update':\r\n result = handleUpdate(stateKey, path, payload);\r\n break;\r\n case 'insert':\r\n result = handleInsert(\r\n stateKey,\r\n path,\r\n payload,\r\n options.index,\r\n options.itemId\r\n );\r\n break;\r\n case 'insert_many':\r\n result = handleInsertMany(stateKey, path, payload);\r\n break;\r\n case 'cut':\r\n result = handleCut(stateKey, path);\r\n break;\r\n }\r\n\r\n if (result === null) {\r\n return;\r\n }\r\n result.stateKey = stateKey;\r\n result.path = path;\r\n updateBatchQueue.push(result);\r\n scheduleFlush();\r\n\r\n const newUpdate: UpdateTypeDetail = {\r\n timeStamp: Date.now(),\r\n stateKey,\r\n path,\r\n updateType: options.updateType,\r\n status: 'new',\r\n oldValue: result.oldValue,\r\n newValue: result.newValue ?? null,\r\n itemId: result.itemId,\r\n insertAfterId: result.insertAfterId,\r\n metaData: options.metaData,\r\n };\r\n\r\n updateBatchQueue.push(newUpdate);\r\n\r\n if (result.newValue !== undefined) {\r\n saveToLocalStorage(\r\n result.newValue,\r\n stateKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n }\r\n\r\n if (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current.middleware({ update: newUpdate });\r\n }\r\n runValidation(newUpdate, options.validationTrigger || 'programmatic');\r\n notifyUpdate(newUpdate);\r\n }\r\n}\r\n\r\nexport function useCogsStateFn<\r\n TStateObject extends unknown,\r\n const TPlugins extends readonly CogsPlugin<any, any, any, any, any>[],\r\n>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n localStorage,\r\n formElements,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n defaultState,\r\n dependencies,\r\n serverState,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n defaultState?: TStateObject;\r\n syncOptions?: SyncOptionsType<any>;\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 let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\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 const resolveInitialState = useCallback(\r\n (\r\n overrideOptions?: OptionsType<TStateObject>\r\n ): {\r\n value: TStateObject;\r\n source: 'default' | 'server' | 'localStorage';\r\n timestamp: number;\r\n } => {\r\n // If we pass in options, use them. Otherwise, get from the global store.\r\n const optionsToUse = overrideOptions\r\n ? { ...getInitialOptions(thisKey as string), ...overrideOptions }\r\n : getInitialOptions(thisKey as string);\r\n\r\n const currentOptions = optionsToUse;\r\n const finalDefaultState =\r\n currentOptions?.defaultState || defaultState || stateObject;\r\n\r\n // 1. Check server state\r\n const hasValidServerData =\r\n currentOptions?.serverState?.status === 'success' &&\r\n currentOptions?.serverState?.data !== undefined;\r\n\r\n if (hasValidServerData) {\r\n return {\r\n value: currentOptions.serverState!.data! as any,\r\n source: 'server',\r\n timestamp: currentOptions.serverState!.timestamp || Date.now(),\r\n };\r\n }\r\n // 2. Check localStorage\r\n if (currentOptions?.localStorage?.key && sessionId) {\r\n const localKey = isFunction(currentOptions.localStorage.key)\r\n ? currentOptions.localStorage.key(finalDefaultState)\r\n : currentOptions.localStorage.key;\r\n\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${thisKey}-${localKey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (currentOptions?.serverState?.timestamp || 0)\r\n ) {\r\n return {\r\n value: localData.state,\r\n source: 'localStorage',\r\n timestamp: localData.lastUpdated,\r\n };\r\n }\r\n }\r\n\r\n // 3. Use default state\r\n return {\r\n value: finalDefaultState || (stateObject as any),\r\n source: 'default',\r\n timestamp: Date.now(),\r\n };\r\n },\r\n [thisKey, defaultState, stateObject, sessionId]\r\n );\r\n\r\n // Effect 1: When this component's serverState prop changes, broadcast it\r\n useEffect(() => {\r\n if (!serverState) return;\r\n\r\n // Only broadcast if we have valid server data\r\n if (serverState.status === 'success' && serverState.data !== undefined) {\r\n setServerStateUpdate(thisKey, serverState);\r\n }\r\n }, [serverState, thisKey]);\r\n // Effect 2: Listen for server state updates from ANY component\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(thisKey, (event) => {\r\n if (event?.type === 'SERVER_STATE_UPDATE') {\r\n const serverStateData = event.serverState;\r\n\r\n if (\r\n serverStateData?.status !== 'success' ||\r\n serverStateData.data === undefined\r\n ) {\r\n return; // Ignore if no valid data\r\n }\r\n\r\n // Store the server state in options for future reference\r\n setAndMergeOptions(thisKey, { serverState: serverStateData });\r\n\r\n const mergeConfig =\r\n typeof serverStateData.merge === 'object'\r\n ? serverStateData.merge\r\n : serverStateData.merge === true\r\n ? { strategy: 'append' as const, key: 'id' }\r\n : null;\r\n\r\n const currentState = getShadowValue(thisKey, []);\r\n const incomingData = serverStateData.data;\r\n\r\n if (\r\n mergeConfig &&\r\n mergeConfig.strategy === 'append' &&\r\n 'key' in mergeConfig &&\r\n Array.isArray(currentState) &&\r\n Array.isArray(incomingData)\r\n ) {\r\n const keyField = mergeConfig.key;\r\n if (!keyField) {\r\n console.error(\r\n \"CogsState: Merge strategy 'append' requires a 'key' field.\"\r\n );\r\n return;\r\n }\r\n\r\n // Get existing IDs to check for duplicates\r\n const existingIds = new Set(\r\n currentState.map((item: any) => item[keyField])\r\n );\r\n\r\n // Filter out duplicates from incoming data\r\n const newUniqueItems = incomingData.filter(\r\n (item: any) => !existingIds.has(item[keyField])\r\n );\r\n\r\n if (newUniqueItems.length > 0) {\r\n // Insert only the new unique items\r\n insertManyShadowArrayElements(thisKey, [], newUniqueItems);\r\n }\r\n\r\n // Mark the entire merged state as synced\r\n const finalState = getShadowValue(thisKey, []);\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n finalState,\r\n serverStateData.timestamp || Date.now()\r\n );\r\n } else {\r\n // Replace strategy (default) - completely replace the state\r\n initializeShadowState(thisKey, incomingData);\r\n\r\n // Mark as synced from server\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n incomingData,\r\n serverStateData.timestamp || Date.now()\r\n );\r\n }\r\n\r\n // Notify all components subscribed to this state\r\n notifyComponents(thisKey);\r\n }\r\n });\r\n\r\n return unsubscribe;\r\n }, [thisKey]);\r\n useEffect(() => {\r\n const existingMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, []);\r\n\r\n // Skip if already initialized\r\n if (existingMeta && existingMeta.stateSource) {\r\n return;\r\n }\r\n\r\n const options = getInitialOptions(thisKey as string);\r\n\r\n const features = {\r\n localStorageEnabled: !!options?.localStorage?.key,\r\n };\r\n\r\n setShadowMetadata(thisKey, [], {\r\n ...existingMeta,\r\n features,\r\n });\r\n\r\n if (options?.defaultState !== undefined || defaultState !== undefined) {\r\n const finalDefaultState = options?.defaultState || defaultState;\r\n if (!options?.defaultState) {\r\n setAndMergeOptions(thisKey as string, {\r\n defaultState: finalDefaultState,\r\n });\r\n }\r\n }\r\n\r\n const { value: resolvedState, source, timestamp } = resolveInitialState();\r\n initializeShadowState(thisKey, resolvedState);\r\n setShadowMetadata(thisKey, [], {\r\n stateSource: source,\r\n lastServerSync: source === 'server' ? timestamp : undefined,\r\n isDirty: source === 'server' ? false : undefined,\r\n baseServerState: source === 'server' ? resolvedState : undefined,\r\n });\r\n\r\n if (source === 'server' && serverState) {\r\n setServerStateUpdate(thisKey, serverState);\r\n }\r\n\r\n notifyComponents(thisKey);\r\n }, [thisKey, ...(dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n formElements,\r\n defaultState,\r\n localStorage,\r\n middleware: latestInitialOptionsRef.current?.middleware,\r\n });\r\n }\r\n\r\n const componentKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n // Register component in shadow metadata at root level\r\n const rootMeta = getShadowMetadata(thisKey, []);\r\n const components = rootMeta?.components || new Map();\r\n\r\n components.set(componentKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n reactiveType: reactiveType ?? ['component'],\r\n paths: new Set(),\r\n depsFunction: reactiveDeps || undefined,\r\n deps: reactiveDeps ? reactiveDeps(getShadowValue(thisKey, [])) : [],\r\n prevDeps: reactiveDeps // Initialize prevDeps with the same initial value\r\n ? reactiveDeps(getShadowValue(thisKey, []))\r\n : [],\r\n });\r\n\r\n setShadowMetadata(thisKey, [], {\r\n ...rootMeta,\r\n components,\r\n });\r\n forceUpdate({});\r\n return () => {\r\n const meta = getShadowMetadata(thisKey, []);\r\n const component = meta?.components?.get(componentKey);\r\n\r\n // Remove from each path we registered to\r\n if (component?.paths) {\r\n component.paths.forEach((fullPath) => {\r\n // fullPath is like \"todos.0.name\", need to split and remove stateKey\r\n const pathParts = fullPath.split('.');\r\n const path = pathParts.slice(1); // Remove stateKey part\r\n\r\n const pathMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, path);\r\n if (pathMeta?.pathComponents) {\r\n // Optionally clean up empty Sets\r\n\r\n if (pathMeta.pathComponents.size === 0) {\r\n delete pathMeta.pathComponents;\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(thisKey, path, pathMeta);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Remove from root components\r\n if (meta?.components) {\r\n setShadowMetadata(thisKey, [], meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = createEffectiveSetState(\r\n thisKey,\r\n\r\n sessionId,\r\n latestInitialOptionsRef\r\n );\r\n\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n const handler = createProxyHandler<TStateObject, TPlugins>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n return handler;\r\n }, [thisKey, sessionId]);\r\n\r\n return updaterFinal;\r\n}\r\n\r\ntype MetaData = {\r\n // Map array paths to their filtered/sorted ID order\r\n arrayViews?: {\r\n [arrayPath: string]: string[]; // e.g. { \"todos\": [\"id:xxx\", \"id:yyy\"], \"todos.id:xxx.subtasks\": [\"id:aaa\"] }\r\n };\r\n transforms?: Array<{\r\n type: 'filter' | 'sort';\r\n fn: Function;\r\n path: string[]; // Which array this transform applies to\r\n }>;\r\n serverStateIsUpStream?: boolean;\r\n};\r\n\r\nconst applyTransforms = (\r\n stateKey: string,\r\n path: string[],\r\n meta?: MetaData\r\n): string[] => {\r\n let ids = getShadowMetadata(stateKey, path)?.arrayKeys || [];\r\n const transforms = meta?.transforms;\r\n if (!transforms || transforms.length === 0) {\r\n return ids;\r\n }\r\n\r\n // Apply each transform using just IDs\r\n for (const transform of transforms) {\r\n if (transform.type === 'filter') {\r\n const filtered: any[] = [];\r\n ids.forEach((id, index) => {\r\n const value = getShadowValue(stateKey, [...path, id]);\r\n\r\n if (transform.fn(value, index)) {\r\n filtered.push(id);\r\n }\r\n });\r\n ids = filtered;\r\n } else if (transform.type === 'sort') {\r\n ids.sort((a, b) => {\r\n const aValue = getShadowValue(stateKey, [...path, a]);\r\n const bValue = getShadowValue(stateKey, [...path, b]);\r\n return transform.fn(aValue, bValue);\r\n });\r\n }\r\n }\r\n\r\n return ids;\r\n};\r\nconst registerComponentDependency = (\r\n stateKey: string,\r\n componentId: string,\r\n dependencyPath: string[]\r\n) => {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n const component = rootMeta?.components?.get(fullComponentId);\r\n\r\n if (\r\n !component ||\r\n component.reactiveType === 'none' ||\r\n !(\r\n Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType]\r\n ).includes('component')\r\n ) {\r\n return;\r\n }\r\n\r\n addPathComponent(stateKey, dependencyPath, fullComponentId);\r\n};\r\nconst notifySelectionComponents = (\r\n stateKey: string,\r\n parentPath: string[],\r\n currentSelected?: string | undefined\r\n) => {\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n const notifiedComponents = new Set<string>();\r\n\r\n // Handle \"all\" reactive components first\r\n if (rootMeta?.components) {\r\n rootMeta.components.forEach((component, componentId) => {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (reactiveTypes.includes('all')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n });\r\n }\r\n\r\n getShadowMetadata(stateKey, [\r\n ...parentPath,\r\n 'getSelected',\r\n ])?.pathComponents?.forEach((componentId) => {\r\n const thisComp = rootMeta?.components?.get(componentId);\r\n thisComp?.forceUpdate();\r\n });\r\n\r\n const parentMeta = getShadowMetadata(stateKey, parentPath);\r\n for (let arrayKey of parentMeta?.arrayKeys || []) {\r\n const key = arrayKey + '.selected';\r\n const selectedItem = getShadowMetadata(stateKey, key.split('.').slice(1));\r\n if (arrayKey == currentSelected) {\r\n selectedItem?.pathComponents?.forEach((componentId) => {\r\n const thisComp = rootMeta?.components?.get(componentId);\r\n thisComp?.forceUpdate();\r\n });\r\n }\r\n }\r\n};\r\nfunction getScopedData(stateKey: string, path: string[], meta?: MetaData) {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const arrayKeys = meta?.arrayViews?.[arrayPathKey];\r\n\r\n // FIX: If the derived view is empty, return an empty array directly.\r\n if (Array.isArray(arrayKeys) && arrayKeys.length === 0) {\r\n return {\r\n shadowMeta,\r\n value: [],\r\n arrayKeys: shadowMeta?.arrayKeys,\r\n };\r\n }\r\n\r\n const value = getShadowValue(stateKey, path, arrayKeys);\r\n\r\n return {\r\n shadowMeta,\r\n value,\r\n arrayKeys: shadowMeta?.arrayKeys,\r\n };\r\n}\r\n\r\nfunction createProxyHandler<\r\n T,\r\n const TPlugins extends readonly CogsPlugin<any, any, any, any, any>[],\r\n>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n outerComponentId: string,\r\n sessionId?: string\r\n): StateObject<T, TPlugins> {\r\n const proxyCache = new Map<string, any>();\r\n\r\n function rebuildStateShape({\r\n path = [],\r\n meta,\r\n componentId,\r\n }: {\r\n path: string[];\r\n componentId: string;\r\n meta?: MetaData;\r\n }): any {\r\n const derivationSignature = meta\r\n ? JSON.stringify(meta.arrayViews || meta.transforms)\r\n : '';\r\n\r\n const cacheKey =\r\n path.join('.') + ':' + componentId + ':' + derivationSignature;\r\n if (proxyCache.has(cacheKey)) {\r\n return proxyCache.get(cacheKey);\r\n }\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n\r\n const proxyTarget = () => {};\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any) {\r\n if (args.length === 0) {\r\n // FIX: Calculate viewIds from meta so filters/sorts are respected\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n // Pass viewIds to getShadowValue to get the filtered/sorted data\r\n registerComponentDependency(stateKey, componentId, path);\r\n return getShadowValue(stateKey, path, viewIds);\r\n }\r\n\r\n // Setter: state.count(5)\r\n const newValue = args[0];\r\n effectiveSetState(newValue, path, { updateType: 'update' });\r\n return true;\r\n },\r\n\r\n get(target: any, prop: string, receiver: any) {\r\n // === ADD SYMBOL HANDLERS FIRST (before string checks) ===\r\n\r\n // Handle Symbol.toPrimitive - critical for React DevTools\r\n if (prop === (Symbol.toPrimitive as any)) {\r\n return (hint: string) => {\r\n if (hint === 'number') return NaN;\r\n if (hint === 'string') {\r\n const pathStr = path.join('.');\r\n return `[CogsState: ${pathStr || 'root'}]`;\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n // Handle Symbol.toStringTag - used by Object.prototype.toString\r\n if (prop === (Symbol.toStringTag as any)) {\r\n return 'CogsState';\r\n }\r\n\r\n // Handle Symbol.iterator for arrays\r\n if (prop === (Symbol.iterator as any)) {\r\n const { value } = getScopedData(stateKey, path, meta);\r\n if (Array.isArray(value)) {\r\n return function* () {\r\n for (let i = 0; i < value.length; i++) {\r\n yield value[i];\r\n }\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n if (prop === 'call' || prop === 'apply' || prop === 'bind') {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n\r\n if (typeof prop !== 'string') {\r\n return Reflect.get(target, prop);\r\n }\r\n if (path.length === 0 && prop in rootLevelMethods) {\r\n return rootLevelMethods[prop as keyof typeof rootLevelMethods];\r\n }\r\n\r\n if (typeof prop === 'string' && !prop.startsWith('$')) {\r\n const nextPath = [...path, prop];\r\n return rebuildStateShape({\r\n path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n if (prop === '$_rebuildStateShape') {\r\n return rebuildStateShape;\r\n }\r\n\r\n if (prop === '$sync' && path.length === 0) {\r\n return async function () {\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 const state = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, []);\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n const response = await sync.action(state);\r\n if (\r\n response &&\r\n !response.success &&\r\n response.errors &&\r\n validationKey\r\n ) {\r\n // getGlobalStore.getState().removeValidationError(validationKey);\r\n // response.errors.forEach((error) => {\r\n // const errorPath = [validationKey, ...error.path].join('.');\r\n // getGlobalStore\r\n // .getState()\r\n // .addValidationError(errorPath, error.message);\r\n // });\r\n // notifyComponents(stateKey);\r\n }\r\n\r\n if (response?.success) {\r\n // Mark as synced and not dirty\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n setShadowMetadata(stateKey, [], {\r\n ...shadowMeta,\r\n isDirty: false,\r\n lastServerSync: Date.now(),\r\n stateSource: 'server',\r\n baseServerState: state, // Update base server state\r\n });\r\n\r\n if (sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n }\r\n } else if (!response?.success && sync.onError)\r\n sync.onError(response.error);\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) sync.onError(error);\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n // Fixed getStatus function in createProxyHandler\r\n if (prop === '$_status' || prop === '$getStatus') {\r\n const getStatusFunc = () => {\r\n // ✅ Use the optimized helper to get all data in one efficient call\r\n const { shadowMeta, value } = getScopedData(stateKey, path, meta);\r\n\r\n if (shadowMeta?.isDirty === true) {\r\n return 'dirty';\r\n }\r\n\r\n if (\r\n shadowMeta?.stateSource === 'server' ||\r\n shadowMeta?.isDirty === false\r\n ) {\r\n return 'synced';\r\n }\r\n\r\n if (shadowMeta?.stateSource === 'localStorage') {\r\n return 'restored';\r\n }\r\n\r\n if (shadowMeta?.stateSource === 'default') {\r\n return 'fresh';\r\n }\r\n\r\n if (value !== undefined) {\r\n return 'fresh';\r\n }\r\n\r\n // Fallback if no other condition is met.\r\n return 'unknown';\r\n };\r\n\r\n // This part remains the same\r\n return prop === '$_status' ? getStatusFunc() : getStatusFunc;\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 const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n if (storageKey) localStorage.removeItem(storageKey);\r\n };\r\n }\r\n\r\n if (prop === '$validate') {\r\n return () => {\r\n const store = getGlobalStore.getState();\r\n\r\n // 1. Get Data & Schema\r\n const { value } = getScopedData(stateKey, path, meta);\r\n const opts = store.getInitialOptions(stateKey);\r\n const schema =\r\n opts?.validation?.zodSchemaV4 || opts?.validation?.zodSchemaV3;\r\n\r\n // If no schema, assume valid\r\n if (!schema) {\r\n return { success: true, data: value };\r\n }\r\n\r\n // 2. Run Zod Validation\r\n const result = (schema as any).safeParse(value);\r\n\r\n // 3. Update State Logic\r\n if (result.success) {\r\n const currentMeta = store.getShadowMetadata(stateKey, path) || {};\r\n store.setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID',\r\n errors: [],\r\n lastValidated: Date.now(),\r\n },\r\n });\r\n } else {\r\n // Zod v4 uses 'issues', Zod v3 uses 'errors'\r\n const zodErrors =\r\n result.error?.issues || result.error?.errors || [];\r\n\r\n zodErrors.forEach((error: any) => {\r\n const errorPath = [...path, ...error.path.map(String)];\r\n const currentMeta =\r\n store.getShadowMetadata(stateKey, errorPath) || {};\r\n\r\n store.setShadowMetadata(stateKey, errorPath, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'INVALID',\r\n errors: [\r\n {\r\n source: 'client',\r\n message: error.message,\r\n severity: 'error',\r\n code: error.code,\r\n },\r\n ],\r\n lastValidated: Date.now(),\r\n validatedValue: store.getShadowValue(stateKey, errorPath),\r\n },\r\n });\r\n });\r\n }\r\n\r\n notifyComponents(stateKey);\r\n\r\n return result;\r\n };\r\n }\r\n if (prop === '$showValidationErrors') {\r\n return () => {\r\n const { shadowMeta } = getScopedData(stateKey, path, meta);\r\n if (\r\n shadowMeta?.validation?.status === 'INVALID' &&\r\n shadowMeta.validation.errors.length > 0\r\n ) {\r\n // Return only error-severity messages (not warnings)\r\n return shadowMeta.validation.errors\r\n .filter((err) => err.severity === 'error')\r\n .map((err) => err.message);\r\n }\r\n return [];\r\n };\r\n }\r\n\r\n if (prop === '$getSelected') {\r\n return () => {\r\n const arrayKey = [stateKey, ...path].join('.');\r\n registerComponentDependency(stateKey, componentId, [\r\n ...path,\r\n 'getSelected',\r\n ]);\r\n\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n if (!selectedItemKey) {\r\n return undefined;\r\n }\r\n\r\n const viewKey = path.join('.');\r\n const currentViewIds = meta?.arrayViews?.[viewKey];\r\n const selectedItemId = selectedItemKey.split('.').pop();\r\n\r\n // FIX: Only return the selected item if it exists in the current filtered/sorted view.\r\n if (currentViewIds && !currentViewIds.includes(selectedItemId!)) {\r\n return undefined;\r\n }\r\n\r\n const value = getShadowValue(\r\n stateKey,\r\n selectedItemKey.split('.').slice(1)\r\n );\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n\r\n return rebuildStateShape({\r\n path: selectedItemKey.split('.').slice(1) as string[],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === '$getSelectedIndex') {\r\n return () => {\r\n // Key for the array in the global selection map (e.g., \"myState.products\")\r\n const arrayKey = stateKey + '.' + path.join('.');\r\n // Key for this specific view in the meta object (e.g., \"products\")\r\n const viewKey = path.join('.');\r\n\r\n // Get the full path of the selected item (e.g., \"myState.products.id:abc\")\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n\r\n if (!selectedItemKey) {\r\n return -1; // Nothing is selected for this array.\r\n }\r\n\r\n // Get the list of item IDs for the current filtered/sorted view.\r\n const { keys: viewIds } = getArrayData(stateKey, path, meta);\r\n\r\n if (!viewIds) {\r\n return -1; // Should not happen if it's an array, but a safe guard.\r\n }\r\n\r\n // FIX: Extract just the ID from the full selected item path.\r\n const selectedId = selectedItemKey.split('.').pop();\r\n\r\n // Return the index of that ID within the current view's list of IDs.\r\n return (viewIds as string[]).indexOf(selectedId as string);\r\n };\r\n }\r\n if (prop === '$clearSelected') {\r\n notifySelectionComponents(stateKey, path);\r\n return () => {\r\n clearSelectedIndex({\r\n arrayKey: stateKey + '.' + path.join('.'),\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$map') {\r\n return (\r\n callbackfn: (setter: any, index: number, arraySetter: any) => void\r\n ) => {\r\n // FIX: Use getArrayData to reliably get both the value and the keys of the current view.\r\n const { value: shadowValue, keys: arrayKeys } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n registerComponentDependency(stateKey, componentId, path);\r\n if (!arrayKeys || !Array.isArray(shadowValue)) {\r\n return []; // It's valid to map over an empty array.\r\n }\r\n\r\n const arraySetter = rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return shadowValue.map((_item, index) => {\r\n const itemKey = arrayKeys[index];\r\n if (!itemKey) return undefined;\r\n\r\n // FIX: Construct the correct path to the item in the original store.\r\n // The path is the array's path plus the specific item's unique key.\r\n const itemPath = [...path, itemKey];\r\n\r\n const itemSetter = rebuildStateShape({\r\n path: itemPath, // This now correctly points to the item in the shadow store.\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return callbackfn(itemSetter, index, arraySetter);\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$filter') {\r\n return (callbackfn: (value: any, index: number) => boolean) => {\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n // ✅ FIX: Get keys from `getArrayData` which correctly resolves them from meta or the full list.\r\n const { keys: currentViewIds, value: array } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!Array.isArray(array)) {\r\n throw new Error('filter can only be used on arrays');\r\n }\r\n\r\n // Filter the array and collect the IDs of the items that pass\r\n const filteredIds: string[] = [];\r\n array.forEach((item, index) => {\r\n if (callbackfn(item, index)) {\r\n // currentViewIds[index] is the original ID before filtering\r\n const id = currentViewIds[index];\r\n if (id) {\r\n filteredIds.push(id);\r\n }\r\n }\r\n });\r\n\r\n // The rest is the same...\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: filteredIds,\r\n },\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'filter', fn: callbackfn, path },\r\n ],\r\n },\r\n });\r\n };\r\n }\r\n if (prop === '$sort') {\r\n return (compareFn: (a: any, b: any) => number) => {\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n // FIX: Use the more robust `getArrayData` which always correctly resolves the keys for a view.\r\n const { value: currentArray, keys: currentViewIds } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!Array.isArray(currentArray) || !currentViewIds) {\r\n throw new Error('No array keys found for sorting');\r\n }\r\n\r\n // ... (rest of the function is the same and now works)\r\n const itemsWithIds = currentArray.map((item, index) => ({\r\n item,\r\n key: currentViewIds[index],\r\n }));\r\n itemsWithIds.sort((a, b) => compareFn(a.item, b.item));\r\n const sortedIds = itemsWithIds.map((i) => i.key as string);\r\n\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: sortedIds,\r\n },\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'sort', fn: compareFn, path },\r\n ],\r\n },\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$list') {\r\n return (\r\n callbackfn: (\r\n setter: any,\r\n index: number,\r\n arraySetter: any\r\n ) => ReactNode\r\n ) => {\r\n const ListWrapper = () => {\r\n const componentIdsRef = useRef<Map<string, string>>(new Map());\r\n\r\n const [updateTrigger, forceUpdate] = useState({});\r\n\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n const validIds = applyTransforms(stateKey, path, meta);\r\n\r\n // Memoize the updated meta to prevent creating new objects on every render\r\n const updatedMeta = useMemo(() => {\r\n return {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: validIds,\r\n },\r\n };\r\n }, [meta, arrayPathKey, validIds]);\r\n\r\n // Now use the updated meta when getting array data\r\n const { value: arrayValues } = getArrayData(\r\n stateKey,\r\n path,\r\n updatedMeta\r\n );\r\n\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (e) => {\r\n if (e.type === 'GET_SELECTED') {\r\n return;\r\n }\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n const caches = shadowMeta?.transformCaches;\r\n if (caches) {\r\n // Iterate over ALL keys in the cache map.\r\n for (const key of caches.keys()) {\r\n // If the key belongs to this component instance, delete it.\r\n // This purges caches for 'sort by name', 'sort by score', etc.\r\n if (key.startsWith(componentId)) {\r\n caches.delete(key);\r\n }\r\n }\r\n }\r\n\r\n if (\r\n e.type === 'INSERT' ||\r\n e.type === 'INSERT_MANY' ||\r\n e.type === 'REMOVE' ||\r\n e.type === 'CLEAR_SELECTION' ||\r\n (e.type === 'SERVER_STATE_UPDATE' &&\r\n !meta?.serverStateIsUpStream)\r\n ) {\r\n forceUpdate({});\r\n }\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n\r\n // This effect's logic now depends on the componentId to perform the purge.\r\n }, [componentId, stateKeyPathKey]);\r\n\r\n if (!Array.isArray(arrayValues)) {\r\n return null;\r\n }\r\n\r\n // Continue using updatedMeta for the rest of your logic instead of meta\r\n const arraySetter = rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: updatedMeta, // Use updated meta here\r\n });\r\n\r\n const returnValue = arrayValues.map((item, localIndex) => {\r\n const itemKey = validIds[localIndex];\r\n\r\n if (!itemKey) {\r\n return null;\r\n }\r\n\r\n let itemComponentId = componentIdsRef.current.get(itemKey);\r\n if (!itemComponentId) {\r\n itemComponentId = uuidv4();\r\n componentIdsRef.current.set(itemKey, itemComponentId);\r\n }\r\n\r\n const itemPath = [...path, itemKey];\r\n\r\n return createElement(MemoizedCogsItemWrapper, {\r\n key: itemKey,\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n localIndex,\r\n arraySetter,\r\n rebuildStateShape,\r\n renderFn: callbackfn,\r\n });\r\n });\r\n\r\n return <>{returnValue}</>;\r\n };\r\n\r\n return <ListWrapper />;\r\n };\r\n }\r\n if (prop === '$stateFlattenOn') {\r\n return (fieldName: string) => {\r\n // FIX: Get the definitive list of IDs for the current view from meta.arrayViews.\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n const currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path, viewIds);\r\n\r\n if (!Array.isArray(currentState)) return [];\r\n\r\n return rebuildStateShape({\r\n path: [...path, '[*]', fieldName],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === '$index') {\r\n return (index: number) => {\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n if (viewIds) {\r\n const itemId = viewIds[index];\r\n if (!itemId) return undefined;\r\n return rebuildStateShape({\r\n path: [...path, itemId],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n\r\n // ✅ FIX: Get the metadata and use the `arrayKeys` property.\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n if (!shadowMeta?.arrayKeys) return undefined;\r\n\r\n const itemId = shadowMeta.arrayKeys[index];\r\n if (!itemId) return undefined;\r\n\r\n return rebuildStateShape({\r\n path: [...path, itemId],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === '$last') {\r\n return () => {\r\n const { keys: currentViewIds } = getArrayData(stateKey, path, meta);\r\n if (!currentViewIds || currentViewIds.length === 0) {\r\n return undefined;\r\n }\r\n const lastItemKey = currentViewIds[currentViewIds.length - 1];\r\n\r\n if (!lastItemKey) {\r\n return undefined;\r\n }\r\n const newPath = [...path, lastItemKey];\r\n\r\n return rebuildStateShape({\r\n path: newPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === '$insert') {\r\n return (\r\n payload: InsertParams<InferArrayElement<T>>,\r\n index?: number\r\n ) => {\r\n effectiveSetState(payload as any, path, {\r\n updateType: 'insert',\r\n index,\r\n });\r\n };\r\n }\r\n if (prop === '$insertMany') {\r\n return (payload: InferArrayElement<T>[]) => {\r\n // Call the one true path for all state changes.\r\n effectiveSetState(payload as any, path, {\r\n updateType: 'insert_many',\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 { value: currentArray } = getScopedData(\r\n stateKey,\r\n path,\r\n meta\r\n ) as {\r\n value: any[];\r\n };\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 const isMatch = fields\r\n ? fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n )\r\n : isDeepEqual(item, newValue);\r\n if (isMatch) matchedItem = item;\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n effectiveSetState(newValue, path, { updateType: 'insert' });\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\r\n effectiveSetState(updatedArray as any, path, {\r\n updateType: 'update',\r\n });\r\n }\r\n };\r\n }\r\n if (prop === '$cut') {\r\n return (index?: number, options?: { waitForSync?: boolean }) => {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n\r\n if (!shadowMeta?.arrayKeys || shadowMeta.arrayKeys.length === 0)\r\n return;\r\n\r\n const indexToCut =\r\n index === -1\r\n ? shadowMeta.arrayKeys.length - 1\r\n : index !== undefined\r\n ? index\r\n : shadowMeta.arrayKeys.length - 1;\r\n\r\n const idToCut = shadowMeta.arrayKeys[indexToCut];\r\n if (!idToCut) return;\r\n effectiveSetState(null, [...path, idToCut], {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === '$cutSelected') {\r\n return () => {\r\n const arrayKey = [stateKey, ...path].join('.');\r\n\r\n const { keys: currentViewIds } = getArrayData(stateKey, path, meta);\r\n if (!currentViewIds || currentViewIds.length === 0) {\r\n return;\r\n }\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n\r\n if (!selectedItemKey) {\r\n return;\r\n }\r\n const selectedId = selectedItemKey.split('.').pop() as string;\r\n\r\n if (!(currentViewIds as any[]).includes(selectedId!)) {\r\n return;\r\n }\r\n const pathForCut = selectedItemKey.split('.').slice(1);\r\n getGlobalStore.getState().clearSelectedIndex({ arrayKey });\r\n\r\n const parentPath = pathForCut.slice(0, -1);\r\n notifySelectionComponents(stateKey, parentPath);\r\n\r\n effectiveSetState(null, pathForCut, {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === '$cutByValue') {\r\n return (value: string | number | boolean) => {\r\n const {\r\n isArray,\r\n value: array,\r\n keys,\r\n } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) return;\r\n\r\n const found = findArrayItem(array, keys, (item) => item === value);\r\n if (found) {\r\n effectiveSetState(null, [...path, found.key], {\r\n updateType: 'cut',\r\n });\r\n }\r\n };\r\n }\r\n\r\n if (prop === '$toggleByValue') {\r\n return (value: string | number | boolean) => {\r\n const {\r\n isArray,\r\n value: array,\r\n keys,\r\n } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) return;\r\n\r\n const found = findArrayItem(array, keys, (item) => item === value);\r\n\r\n if (found) {\r\n const pathForItem = [...path, found.key];\r\n\r\n effectiveSetState(null, pathForItem, {\r\n updateType: 'cut',\r\n });\r\n } else {\r\n effectiveSetState(value as any, path, { updateType: 'insert' });\r\n }\r\n };\r\n }\r\n if (prop === '$findWith') {\r\n return (searchKey: string, searchValue: any) => {\r\n const { isArray, value, keys } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) {\r\n throw new Error('findWith can only be used on arrays');\r\n }\r\n\r\n const found = findArrayItem(\r\n value,\r\n keys,\r\n (item) => item?.[searchKey] === searchValue\r\n );\r\n\r\n if (found) {\r\n return rebuildStateShape({\r\n path: [...path, found.key],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n if (prop === '$cutThis') {\r\n const { value: shadowValue } = getScopedData(stateKey, path, meta);\r\n const parentPath = path.slice(0, -1);\r\n notifySelectionComponents(stateKey, parentPath);\r\n return () => {\r\n effectiveSetState(shadowValue, path, { updateType: 'cut' });\r\n };\r\n }\r\n\r\n if (prop === '$get') {\r\n return () => {\r\n registerComponentDependency(stateKey, componentId, path);\r\n const { value } = getScopedData(stateKey, path, meta);\r\n return value;\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 _meta: meta,\r\n });\r\n }\r\n\r\n if (prop === '$$get') {\r\n return () =>\r\n $cogsSignal({ _stateKey: stateKey, _path: path, _meta: meta });\r\n }\r\n\r\n if (prop === '$lastSynced') {\r\n const syncKey = `${stateKey}:${path.join('.')}`;\r\n return getSyncInfo(syncKey);\r\n }\r\n if (prop == 'getLocalStorage') {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + '-' + stateKey + '-' + key);\r\n }\r\n if (prop === '$isSelected') {\r\n const parentPathArray = path.slice(0, -1);\r\n const parentMeta = getShadowMetadata(stateKey, parentPathArray);\r\n\r\n if (parentMeta?.arrayKeys) {\r\n const fullParentKey = stateKey + '.' + parentPathArray.join('.');\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n return selectedItemKey === fullItemKey;\r\n }\r\n return undefined;\r\n }\r\n\r\n if (prop === '$setSelected') {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const fullParentKey = stateKey + '.' + parentPath.join('.');\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n notifySelectionComponents(stateKey, parentPath, undefined);\r\n\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(fullParentKey, fullItemKey);\r\n }\r\n };\r\n }\r\n\r\n if (prop === '$toggleSelected') {\r\n return () => {\r\n const parentPath = path.slice(0, -1);\r\n const fullParentKey = stateKey + '.' + parentPath.join('.');\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n const currentSelected = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n if (currentSelected === fullItemKey) {\r\n getGlobalStore\r\n .getState()\r\n .clearSelectedIndex({ arrayKey: fullParentKey });\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(fullParentKey, fullItemKey);\r\n }\r\n notifySelectionComponents(stateKey, parentPath);\r\n };\r\n }\r\n\r\n if (prop === '$clearValidation') {\r\n return (subPath?: string[]) => {\r\n const targetPath = subPath ? [...path, ...subPath] : path;\r\n const store = getGlobalStore.getState();\r\n\r\n // 1. Get the node where we want to start clearing\r\n const startNode = store.getShadowNode(stateKey, targetPath);\r\n console.log('startNode ', startNode);\r\n if (!startNode) return;\r\n\r\n // 2. Define a stack for iterative traversal (avoids recursion depth issues)\r\n // Stack items: [currentNode, currentPathArray]\r\n const stack: [any, string[]][] = [[startNode, targetPath]];\r\n console.log('stack ', stack);\r\n while (stack.length > 0) {\r\n const [node, currPath] = stack.pop()!;\r\n console.log('while (stack.length ', node, currPath);\r\n if (!node || typeof node !== 'object') continue;\r\n\r\n // 3. Clear validation on the current node if it exists\r\n if (node._meta?.validation) {\r\n // Reset the validation object\r\n node._meta.validation = {\r\n status: 'NOT_VALIDATED',\r\n errors: [],\r\n lastValidated: Date.now(),\r\n validatedValue: undefined,\r\n };\r\n\r\n // 4. Notify specific path subscribers so isolated fields update\r\n const fullPathKey = [stateKey, ...currPath].join('.');\r\n store.notifyPathSubscribers(fullPathKey, {\r\n type: 'VALIDATION_CLEAR',\r\n });\r\n }\r\n\r\n // 5. Add children to stack to continue traversal\r\n const keys = Object.keys(node);\r\n for (const key of keys) {\r\n if (key !== '_meta') {\r\n stack.push([node[key], [...currPath, key]]);\r\n }\r\n }\r\n }\r\n\r\n // 6. Notify root components\r\n notifyComponents(stateKey);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === '$_componentId') {\r\n return componentId;\r\n }\r\n if (prop === '$setOptions') {\r\n return (options: OptionsType<T>) => {\r\n setOptions({ stateKey, options, initialOptionsPart: {} });\r\n };\r\n }\r\n\r\n if (prop === '$_applyUpdate') {\r\n return (\r\n value: any,\r\n path: string[],\r\n updateType: 'update' | 'insert' | 'cut' = 'update'\r\n ) => {\r\n effectiveSetState(value, path, { updateType });\r\n };\r\n }\r\n\r\n if (prop === '$_getEffectiveSetState') {\r\n return effectiveSetState;\r\n }\r\n if (prop === '$getPluginMetaData') {\r\n return (pluginName: string) =>\r\n getPluginMetaDataMap(stateKey, path)?.get(pluginName);\r\n }\r\n if (prop === '$addPluginMetaData') {\r\n return (pluginName: string, data: Record<string, any>) =>\r\n setPluginMetaData(stateKey, path, pluginName, data);\r\n }\r\n if (prop === '$removePluginMetaData') {\r\n return (pluginName: string) =>\r\n removePluginMetaData(stateKey, path, pluginName);\r\n }\r\n if (prop === '$addZodValidation') {\r\n return (\r\n zodErrors: any[],\r\n source: 'client' | 'sync_engine' | 'api'\r\n ) => {\r\n zodErrors.forEach((error) => {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, error.path) || {};\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(stateKey, error.path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'INVALID',\r\n errors: [\r\n {\r\n source: source || 'client',\r\n message: error.message,\r\n severity: 'error',\r\n code: error.code,\r\n },\r\n ],\r\n lastValidated: Date.now(),\r\n validatedValue: undefined,\r\n },\r\n });\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$applyOperation') {\r\n return (\r\n operation: UpdateTypeDetail & {\r\n validation?: any[];\r\n version?: string;\r\n },\r\n metaData?: Record<string, any>\r\n ) => {\r\n let index: number | undefined;\r\n if (\r\n operation.insertAfterId &&\r\n operation.updateType === 'insert'\r\n ) {\r\n const shadowMeta = getShadowMetadata(stateKey, operation.path);\r\n if (shadowMeta?.arrayKeys) {\r\n const afterIndex = shadowMeta.arrayKeys.indexOf(\r\n operation.insertAfterId\r\n );\r\n if (afterIndex !== -1) {\r\n index = afterIndex + 1; // Insert after the found item\r\n }\r\n }\r\n }\r\n\r\n effectiveSetState(operation.newValue, operation.path, {\r\n updateType: operation.updateType,\r\n itemId: operation.itemId,\r\n index, // Pass the calculated index\r\n metaData,\r\n });\r\n };\r\n }\r\n if (prop === '$applyJsonPatch') {\r\n return (patches: Operation[]) => {\r\n const store = getGlobalStore.getState();\r\n const rootMeta = store.getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.components) return;\r\n\r\n const convertPath = (jsonPath: string): string[] => {\r\n if (!jsonPath || jsonPath === '/') return [];\r\n return jsonPath\r\n .split('/')\r\n .slice(1)\r\n .map((p) => p.replace(/~1/g, '/').replace(/~0/g, '~'));\r\n };\r\n\r\n const notifiedComponents = new Set<string>();\r\n\r\n for (const patch of patches) {\r\n const relativePath = convertPath(patch.path);\r\n\r\n switch (patch.op) {\r\n case 'add':\r\n case 'replace': {\r\n const { value } = patch as {\r\n op: 'add' | 'replace';\r\n path: string;\r\n value: any;\r\n };\r\n store.updateShadowAtPath(stateKey, relativePath, value);\r\n\r\n store.markAsDirty(stateKey, relativePath, { bubble: true });\r\n\r\n // Bubble up - notify components at this path and all parent paths\r\n let currentPath = [...relativePath];\r\n while (true) {\r\n const pathMeta = store.getShadowMetadata(\r\n stateKey,\r\n currentPath\r\n );\r\n\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component =\r\n rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop(); // Go up one level\r\n }\r\n break;\r\n }\r\n case 'remove': {\r\n const parentPath = relativePath.slice(0, -1);\r\n store.removeShadowArrayElement(stateKey, relativePath);\r\n store.markAsDirty(stateKey, parentPath, { bubble: true });\r\n\r\n // Bubble up from parent path\r\n let currentPath = [...parentPath];\r\n while (true) {\r\n const pathMeta = store.getShadowMetadata(\r\n stateKey,\r\n currentPath\r\n );\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component =\r\n rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop();\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n if (prop === '$getComponents')\r\n return () => getShadowMetadata(stateKey, [])?.components;\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 stateKey={stateKey}\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 === '$update') {\r\n return (payload: UpdateArg<T>) => {\r\n effectiveSetState(payload as any, path, { updateType: 'update' });\r\n\r\n return {\r\n synced: () => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n setShadowMetadata(stateKey, path, {\r\n ...shadowMeta,\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync: Date.now(),\r\n });\r\n\r\n const fullPath = [stateKey, ...path].join('.');\r\n notifyPathSubscribers(fullPath, {\r\n type: 'SYNC_STATUS_CHANGE',\r\n isDirty: false,\r\n });\r\n },\r\n };\r\n };\r\n }\r\n if (prop === '$toggle') {\r\n const { value: currentValueAtPath } = getScopedData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (typeof currentValueAtPath != 'boolean') {\r\n throw new Error('toggle() can only be used on boolean values');\r\n }\r\n return () => {\r\n effectiveSetState(!currentValueAtPath as any, path, {\r\n updateType: 'update',\r\n });\r\n };\r\n }\r\n if (prop === '$isolate') {\r\n // We accept (renderFn) OR (deps, renderFn)\r\n return (\r\n arg1: any[] | ((state: any) => React.ReactNode),\r\n arg2?: (state: any) => React.ReactNode\r\n ) => {\r\n // Check if the first argument is the dependency array\r\n const hasDependencies = Array.isArray(arg1);\r\n\r\n // Normalize arguments\r\n const dependencies = hasDependencies ? arg1 : undefined;\r\n const renderFn = hasDependencies ? arg2 : arg1;\r\n\r\n if (!renderFn || typeof renderFn !== 'function') {\r\n throw new Error(\r\n 'CogsState: $isolate requires a render function.'\r\n );\r\n }\r\n\r\n return (\r\n <IsolatedComponentWrapper\r\n stateKey={stateKey}\r\n path={path} // The path of the node calling $isolate (e.g. \"form\")\r\n dependencies={dependencies} // Pass the specific parts to watch\r\n rebuildStateShape={rebuildStateShape}\r\n renderFn={renderFn}\r\n />\r\n );\r\n };\r\n }\r\n if (prop === '$formElement') {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormElementWrapper\r\n stateKey={stateKey}\r\n path={path}\r\n rebuildStateShape={rebuildStateShape}\r\n setState={effectiveSetState}\r\n formOpts={formOpts}\r\n renderFn={child as any}\r\n />\r\n );\r\n };\r\n }\r\n const nextPath = [...path, prop];\r\n return rebuildStateShape({\r\n path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(proxyTarget, handler);\r\n proxyCache.set(cacheKey, proxyInstance);\r\n\r\n return proxyInstance;\r\n }\r\n\r\n // ... (rest of the function: rootLevelMethods, returnShape, etc.)\r\n const rootLevelMethods = {\r\n $revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n let revertState;\r\n\r\n if (shadowMeta?.stateSource === 'server' && shadowMeta.baseServerState) {\r\n revertState = shadowMeta.baseServerState;\r\n } else {\r\n revertState = getGlobalStore.getState().initialStateGlobal[stateKey];\r\n }\r\n\r\n clearSelectedIndexesForState(stateKey);\r\n initializeShadowState(stateKey, revertState);\r\n\r\n rebuildStateShape({\r\n path: [],\r\n componentId: outerComponentId!,\r\n });\r\n\r\n // Handle localStorage side-effects\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(revertState)\r\n : initalOptionsGet?.localStorage?.key;\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n notifyComponents(stateKey);\r\n\r\n return revertState;\r\n },\r\n $initializeAndMergeShadowState: (newState: T) => {\r\n initializeAndMergeShadowState(stateKey, newState);\r\n notifyComponents(stateKey);\r\n },\r\n $updateInitialState: (newState: T) => {\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n outerComponentId,\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 initializeShadowState(stateKey, newState);\r\n // initializeShadowStateNEW(stateKey, newState);\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(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() as any)[field],\r\n };\r\n },\r\n };\r\n\r\n const returnShape = rebuildStateShape({\r\n componentId: outerComponentId,\r\n path: [],\r\n });\r\n\r\n return returnShape;\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 _meta?: MetaData;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\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 _meta?: MetaData;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const instanceIdRef = useRef<string | null>(null);\r\n const isSetupRef = useRef(false);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join('.')}`;\r\n\r\n const arrayPathKey = proxy._path.length > 0 ? proxy._path.join('.') : 'root';\r\n const viewIds = proxy._meta?.arrayViews?.[arrayPathKey];\r\n\r\n const value = getShadowValue(proxy._stateKey, proxy._path, viewIds);\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || isSetupRef.current) return;\r\n\r\n const timeoutId = setTimeout(() => {\r\n if (!element.parentElement) {\r\n console.warn('Parent element not found for signal', signalId);\r\n return;\r\n }\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 instanceIdRef.current = `instance-${crypto.randomUUID()}`;\r\n\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n const signals = currentMeta.signals || [];\r\n signals.push({\r\n instanceId: instanceIdRef.current,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n });\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, {\r\n ...currentMeta,\r\n signals,\r\n });\r\n\r\n let displayValue = value;\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:', err);\r\n }\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === 'object') {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n const textNode = document.createTextNode(String(displayValue ?? ''));\r\n element.replaceWith(textNode);\r\n isSetupRef.current = true;\r\n }, 0);\r\n\r\n return () => {\r\n clearTimeout(timeoutId);\r\n if (instanceIdRef.current) {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n if (currentMeta.signals) {\r\n currentMeta.signals = currentMeta.signals.filter(\r\n (s) => s.instanceId !== instanceIdRef.current\r\n );\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, currentMeta);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n return createElement('span', {\r\n ref: elementRef,\r\n style: { display: 'contents' },\r\n 'data-signal-id': signalId,\r\n });\r\n}\r\n"],"names":["getInitialOptions","updateInitialStateGlobal","getShadowMetadata","setShadowMetadata","getShadowValue","initializeShadowState","initializeAndMergeShadowState","updateShadowAtPath","insertShadowArrayElement","insertManyShadowArrayElements","removeShadowArrayElement","setInitialStateOptions","setServerStateUpdate","markAsDirty","addPathComponent","clearSelectedIndexesForState","addStateLog","clearSelectedIndex","getSyncInfo","notifyPathSubscribers","getPluginMetaDataMap","setPluginMetaData","removePluginMetaData","getGlobalStore","notifyUpdate","pluginStore","getArrayData","stateKey","path","meta","shadowMeta","arrayPathKey","viewIds","findArrayItem","array","keys","predicate","i","key","setAndMergeOptions","newOptions","mergedOptions","setOptions","options","initialOptionsPart","initialOptions","initialOptionsPartState","needToAdd","deepMerge","target","source","isDeepEqual","hadSchema","hasNewSchemaV4","hasNewSchemaV3","updateShadowTypeInfo","notifyComponents","addStateOptions","initialState","createCogsState","opt","statePart","transformStateFunc","existingOptions","existingGlobalOptions","finalOptions","useCogsState","componentId","useState","uuidv4","currentOptions","optionsRef","useRef","thiState","updater","useCogsStateFn","useEffect","setCogsOptionsByKey","loadAndApplyLocalStorage","updatedPlugins","plugin","setCogsOptions","globalOptions","saveToLocalStorage","state","thisKey","currentInitialOptions","sessionId","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","stateEntry","updates","component","update","markEntireStateAsServerSynced","timestamp","currentMeta","arrayMeta","itemKey","index","itemPath","itemData","fieldPath","fieldData","updateBatchQueue","isFlushScheduled","scheduleFlush","flushQueue","updateSignals","displayValue","parentId","position","effect","parent","childNodes","finalDisplayValue","err","getComponentNotifications","result","rootMeta","componentsToNotify","currentPath","pathMeta","isArray","getDifferences","subPathString","subPath","fullSubPath","subPathMeta","handleUpdate","payload","oldValue","newValue","newShadowMeta","handleInsertMany","updatedMeta","handleInsert","itemId","currentValue","getScopedData","actualItemId","insertAfterId","handleCut","parentArrayPath","allComponentsToNotify","signalUpdates","logsToAdd","item","createEffectiveSetState","latestInitialOptionsRef","newStateOrFunction","updateObj","executeUpdate","newUpdate","runValidation","stateObject","localStorage","formElements","reactiveDeps","reactiveType","defaultState","dependencies","serverState","reactiveForce","forceUpdate","noStateKey","componentIdRef","resolveInitialState","useCallback","overrideOptions","finalDefaultState","localKey","event","serverStateData","mergeConfig","incomingData","keyField","existingIds","newUniqueItems","finalState","existingMeta","features","resolvedState","useLayoutEffect","componentKey","components","fullPath","effectiveSetState","useMemo","createProxyHandler","applyTransforms","ids","transforms","transform","filtered","id","value","a","b","aValue","bValue","registerComponentDependency","dependencyPath","fullComponentId","notifySelectionComponents","parentPath","currentSelected","notifiedComponents","parentMeta","arrayKey","selectedItem","arrayKeys","outerComponentId","proxyCache","rebuildStateShape","derivationSignature","cacheKey","stateKeyPathKey","proxyTarget","handler","thisArg","args","prop","receiver","hint","rootLevelMethods","nextPath","sync","validationKey","response","getStatusFunc","initalOptionsGet","store","opts","schema","errorPath","selectedItemKey","viewKey","currentViewIds","selectedItemId","selectedId","callbackfn","shadowValue","arraySetter","_item","itemSetter","filteredIds","compareFn","currentArray","itemsWithIds","sortedIds","componentIdsRef","updateTrigger","validIds","arrayValues","unsubscribe","e","caches","returnValue","localIndex","itemComponentId","createElement","MemoizedCogsItemWrapper","fieldName","lastItemKey","newPath","fields","onMatch","matchedItem","isMatch","field","updatedItem","updatedArray","indexToCut","idToCut","pathForCut","found","pathForItem","searchKey","searchValue","fn","$cogsSignal","syncKey","parentPathArray","fullParentKey","fullItemKey","targetPath","startNode","stack","node","currPath","fullPathKey","updateType","pluginName","zodErrors","operation","metaData","afterIndex","patches","convertPath","jsonPath","patch","relativePath","children","hideMessage","jsx","ValidationWrapper","currentValueAtPath","arg1","arg2","hasDependencies","renderFn","IsolatedComponentWrapper","child","formOpts","FormElementWrapper","proxyInstance","obj","revertState","newState","newUpdaterState","startTransition","proxy","SignalRenderer","elementRef","instanceIdRef","isSetupRef","signalId","element","timeoutId","parentElement","signals","textNode","s"],"mappings":";;;;;;;;;;;AAogBA,MAAM;AAAA,EACJ,mBAAAA;AAAA,EACA,0BAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,+BAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,+BAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,8BAAAC;AAAA,EACA,aAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,sBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,sBAAAC;AACF,IAAIC,EAAe,SAAA,GAEb,EAAE,cAAAC,GAAA,IAAiBC,EAAY,SAAA;AAErC,SAASC,EAAaC,GAAkBC,GAAgBC,GAAiB;AACvE,QAAMC,IAAa5B,EAAkByB,GAAUC,CAAI;AAGnD,MAAI,CAFY,CAAC,CAACE,GAAY;AAI5B,WAAO,EAAE,SAAS,IAAO,OADXP,EAAe,SAAA,EAAW,eAAeI,GAAUC,CAAI,GACrC,MAAM,GAAC;AAEzC,QAAMG,IAAeH,EAAK,SAAS,IAAIA,EAAK,KAAK,GAAG,IAAI,QAClDI,IAAUH,GAAM,aAAaE,CAAY,KAAKD,EAAW;AAG/D,SAAI,MAAM,QAAQE,CAAO,KAAKA,EAAQ,WAAW,IACxC,EAAE,SAAS,IAAM,OAAO,CAAA,GAAI,MAAM,GAAC,IAOrC,EAAE,SAAS,IAAM,OAJVT,EACX,SAAA,EACA,eAAeI,GAAUC,GAAMI,CAAO,GAEV,MAAMA,KAAW,GAAC;AACnD;AAEA,SAASC,GACPC,GACAC,GACAC,GACmD;AACnD,WAASC,IAAI,GAAGA,IAAIH,EAAM,QAAQG;AAChC,QAAID,EAAUF,EAAMG,CAAC,GAAGA,CAAC,GAAG;AAC1B,YAAMC,IAAMH,EAAKE,CAAC;AAClB,UAAIC;AACF,eAAO,EAAE,KAAAA,GAAK,OAAOD,GAAG,OAAOH,EAAMG,CAAC,EAAA;AAAA,IAE1C;AAEF,SAAO;AACT;AAEA,SAASE,GAAmBZ,GAAkBa,GAA8B;AAG1E,QAAMC,IAAgB;AAAA,IACpB,GAHqBzC,EAAkB2B,CAAkB,KAAK,CAAA;AAAA,IAI9D,GAAGa;AAAA,EAAA;AAIL,GACGC,EAAc,YAAY,eACzBA,EAAc,YAAY,gBAC5B,CAACA,EAAc,YAAY,WAE3BA,EAAc,WAAW,SAAS,UAGpC9B,GAAuBgB,GAAoBc,CAAa;AAC1D;AAEA,SAASC,GAA0B;AAAA,EACjC,UAAAf;AAAA,EACA,SAAAgB;AAAA,EACA,oBAAAC;AACF,GAIG;AACD,QAAMC,IAAiB7C,EAAkB2B,CAAkB,KAAK,CAAA,GAC1DmB,IAA0BF,EAAmBjB,CAAkB,KAAK,CAAA;AAE1E,MAAIc,IAAgB,EAAE,GAAGK,GAAyB,GAAGD,EAAA,GACjDE,IAAY;AAEhB,MAAIJ,GAAS;AACX,UAAMK,IAAY,CAACC,GAAaC,MAAgB;AAC9C,iBAAWZ,KAAOY;AAChB,QAAIA,EAAO,eAAeZ,CAAG,MAEzBY,EAAOZ,CAAG,aAAa,UACvB,CAAC,MAAM,QAAQY,EAAOZ,CAAG,CAAC,KAC1BW,EAAOX,CAAG,aAAa,SAElBa,EAAYF,EAAOX,CAAG,GAAGY,EAAOZ,CAAG,CAAC,MACvCU,EAAUC,EAAOX,CAAG,GAAGY,EAAOZ,CAAG,CAAC,GAClCS,IAAY,MAGVE,EAAOX,CAAG,MAAMY,EAAOZ,CAAG,MAC5BW,EAAOX,CAAG,IAAIY,EAAOZ,CAAG,GACxBS,IAAY;AAKpB,aAAOE;AAAA,IACT;AAEA,IAAAR,IAAgBO,EAAUP,GAAeE,CAAO;AAAA,EAClD;AAeA,MAZIF,EAAc,eAEdE,GAAS,YAAY,eAAe,QAAQ,KAC5CE,GAAgB,YAAY,eAAe,QAAQ,KACnDC,GAAyB,YAAY,eAAe,QAAQ,MAG5DL,EAAc,WAAW,SAAS,SAClCM,IAAY,MAIZA,GAAW;AACb,IAAApC,GAAuBgB,GAAoBc,CAAa;AAGxD,UAAMW,IACJP,GAAgB,YAAY,eAC5BA,GAAgB,YAAY,aACxBQ,IACJZ,EAAc,YAAY,eAC1B,CAACI,GAAgB,YAAY,aACzBS,IACJb,EAAc,YAAY,eAC1B,CAACI,GAAgB,YAAY;AAE/B,IAAI,CAACO,MAAcC,KAAkBC,OAC/BD,IACFE;AAAA,MACE5B;AAAA,MACAc,EAAc,WAAW;AAAA,MACzB;AAAA,IAAA,IAEOa,KACTC;AAAA,MACE5B;AAAA,MACAc,EAAc,WAAW;AAAA,MACzB;AAAA,IAAA,GAKJe,EAAiB7B,CAAkB;AAAA,EAEvC;AAEA,SAAOc;AACT;AACO,SAASgB,GACdC,GACAf,GACA;AACA,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,cAAAe;AAAA,IACA,kBAAkB;AAAA,EAAA;AAEtB;AASO,MAAMC,KAAkB,CAI7BD,GACAE,MAKG;AAaH,EAAIA,GAAK,WACPnC,EAAY,SAAA,EAAW,qBAAqBmC,EAAI,OAAc;AAGhE,QAAM,CAACC,GAAWjB,CAAkB,IAClCkB,GAA0BJ,CAAY;AAGxC,SAAO,KAAKG,CAAS,EAAE,QAAQ,CAACvB,MAAQ;AACtC,QAAIyB,IAAkBnB,EAAmBN,CAAG,KAAK,CAAA;AAEjD,UAAMG,IAAqB;AAAA,MACzB,GAAGsB;AAAA,IAAA;AAGL,IAAIH,GAAK,iBACPnB,EAAc,eAAe;AAAA,MAC3B,GAAGmB,EAAI;AAAA,MACP,GAAIG,EAAgB,gBAAgB,CAAA;AAAA,IAAC,IAIzCtB,EAAc,aAAa;AAAA,MACzB,QAAQ;AAAA,MACR,GAAGmB,GAAK;AAAA,MACR,GAAIG,EAAgB,cAAc,CAAA;AAAA,IAAC,GAGjCH,GAAK,YAAY,OAAO,CAACG,EAAgB,YAAY,QACvDtB,EAAc,WAAW,MAAM,GAAGmB,EAAI,WAAW,GAAG,IAAItB,CAAG;AAG7D,UAAM0B,IAAwBhE,EAAkBsC,CAAG,GAE7C2B,IAAeD,IACjB;AAAA,MACE,GAAGA;AAAA,MACH,GAAGvB;AAAA,MACH,cAAc;AAAA,QACZ,GAAGuB,EAAsB;AAAA,QACzB,GAAGvB,EAAc;AAAA,MAAA;AAAA,MAEnB,YAAY;AAAA,QACV,GAAGuB,EAAsB;AAAA,QACzB,GAAGvB,EAAc;AAAA,MAAA;AAAA,IACnB,IAEFA;AAEJ,IAAA9B,GAAuB2B,GAAK2B,CAAY;AAAA,EAC1C,CAAC,GAED,OAAO,KAAKJ,CAAS,EAAE,QAAQ,CAACvB,MAAQ;AACtC,IAAAjC,EAAsBiC,GAAKuB,EAAUvB,CAAG,CAAC;AAAA,EAC3C,CAAC;AAMD,QAAM4B,IAAe,CACnBvC,GACAgB,MAeG;AACH,UAAM,CAACwB,CAAW,IAAIC,GAASzB,GAAS,eAAe0B,IAAQ,GAEzDC,IAAiB5B,GAAW;AAAA,MAChC,UAAAf;AAAA,MACA,SAAAgB;AAAA,MACA,oBAAAC;AAAA,IAAA,CACD,GAEK2B,IAAaC,EAAOF,CAAc;AACxC,IAAAC,EAAW,UAAUD;AAErB,UAAMG,IACJrE,EAAeuB,GAAoB,CAAA,CAAE,KAAKkC,EAAUlC,CAAkB,GAElE+C,IAAUC;AAAA,MACdF;AAAA,MACA;AAAA,QACE,UAAA9C;AAAA,QACA,YAAYgB,GAAS;AAAA,QACrB,aAAAwB;AAAA,QACA,cAAcxB,GAAS;AAAA,QACvB,YAAYA,GAAS;AAAA,QACrB,cAAcA,GAAS;AAAA,QACvB,cAAcA,GAAS;AAAA,QACvB,cAAcA,GAAS;AAAA,QACvB,cAAcA,GAAS;AAAA,QACvB,aAAaA,GAAS;AAAA,MAAA;AAAA,IACxB;AAGF,WAAAiC,EAAU,MAAM;AACd,MAAIjC,KACFlB,EACG,SAAA,EACA,yBAAyBE,GAAoBgB,CAAO;AAAA,IAE3D,GAAG,CAAChB,GAAUgB,CAAO,CAAC,GACtBiC,EAAU,OACRnD,EACG,SAAA,EACA,cAAc,IAAIE,GAAoB+C,CAAc,GAEhD,MAAM;AACX,MAAAjD,EAAY,SAAA,EAAW,cAAc,OAAOE,CAAkB;AAAA,IAChE,IACC,CAACA,GAAU+C,CAAO,CAAC,GAEfA;AAAA,EACT;AAEA,WAASG,EACPlD,GACAgB,GAKA;AAMA,QALAD,GAAW,EAAE,UAAAf,GAAU,SAAAgB,GAAS,oBAAAC,EAAA,CAA2B,GAEvDD,EAAQ,gBACVmC,GAAyBnD,GAAoBgB,CAAO,GAElDA,EAAQ,cAAc;AAGxB,YAAMoC,IAFiBtD,EAAY,SAAA,EAAW,kBAER,IAAI,CAACuD,MAErCrC,EAAQ,aAAc,eAAeqC,EAAO,IAAI,IAC3C;AAAA,QACL,GAAGA;AAAA,QACH,aAAcrC,EAAQ,aAAqBqC,EAAO,IAAI;AAAA,MAAA,IAGnDA,CACR;AAED,MAAAvD,EAAY,SAAA,EAAW,qBAAqBsD,CAAqB;AAAA,IACnE;AACA,IAAAvB,EAAiB7B,CAAkB;AAAA,EACrC;AACA,WAASsD,EAIPC,GAEA;AAKA,IAHqB,OAAO,KAAKrB,CAAS,EAG7B,QAAQ,CAACvB,MAAQ;AAI5B,MAAAuC,EAAoBvC,GAAK4C,CAAoB;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,cAAAhB;AAAA,IACA,qBAAAW;AAAA,IACA,gBAAAI;AAAA,EAAA;AAEJ,GAEME,KAAqB,CACzBC,GACAC,GACAC,GACAC,GACAC,MACG;AACH,EAAIF,GAAuB,OACzB,QAAQ;AAAA,IACN;AAAA,IACAD;AAAA,IACAC,EAAsB,cAAc;AAAA,IACpCC;AAAA,EAAA;AAIJ,QAAMjD,IAAMmD,EAAWH,GAAuB,cAAc,GAAG,IAC3DA,EAAsB,cAAc,IAAIF,CAAK,IAC7CE,GAAuB,cAAc;AAEzC,MAAIhD,KAAOiD,GAAW;AACpB,UAAMG,IAAa,GAAGH,CAAS,IAAIF,CAAO,IAAI/C,CAAG;AAGjD,QAAIqD;AACJ,QAAI;AAEF,MAAAA,IADiBC,GAAqBF,CAAU,GACjB;AAAA,IACjC,QAAQ;AAAA,IAER;AACA,UAAM5D,IAAa5B,EAAkBmF,GAAS,EAAE,GAE1CQ,IAA4B;AAAA,MAChC,OAAAT;AAAA,MACA,aAAa,KAAK,IAAA;AAAA,MAClB,sBAA8CO;AAAA,MAC9C,aAAa7D,GAAY;AAAA,MACzB,iBAAiBA,GAAY;AAAA,IAAA,GAIzBgE,IAAkBC,GAAU,UAAUF,CAAI;AAChD,WAAO,aAAa;AAAA,MAClBH;AAAA,MACA,KAAK,UAAUI,EAAgB,IAAI;AAAA,IAAA;AAAA,EAEvC;AACF,GAEMF,KAAuB,CAACI,MAA4B;AACxD,MAAI,CAACA,EAAiB,QAAO;AAE7B,MAAI;AACF,UAAMC,IAAa,OAAO,aAAa,QAAQD,CAAe;AAC9D,WAAKC,IAGc,KAAK,MAAMA,CAAU,IAHhB;AAAA,EAM1B,SAASC,GAAO;AACd,mBAAQ,MAAM,oCAAoCA,CAAK,GAChD;AAAA,EACT;AACF,GACMpB,KAA2B,CAACnD,GAAkBgB,MAAiB;AACnE,QAAMwD,IAAe/F,EAAeuB,GAAU,EAAE,GAC1C,EAAE,WAAA4D,EAAA,IAAca,GAAA,GAChBC,IAAWZ,EAAW9C,GAAS,cAAc,GAAG,IAClDA,EAAQ,aAAa,IAAIwD,CAAY,IACrCxD,GAAS,cAAc;AAE3B,MAAI0D,KAAYd,GAAW;AACzB,UAAMe,IAAYV;AAAA,MAChB,GAAGL,CAAS,IAAI5D,CAAQ,IAAI0E,CAAQ;AAAA,IAAA;AAGtC,QACEC,KACAA,EAAU,eAAeA,EAAU,wBAAwB;AAE3D,aAAA9C,EAAiB7B,CAAQ,GAClB;AAAA,EAEX;AACA,SAAO;AACT,GAUM6B,IAAmB,CAAC6B,MAAoB;AAC5C,QAAMkB,IAAarG,EAAkBmF,GAAS,EAAE;AAChD,MAAI,CAACkB,EAAY;AAGjB,QAAMC,wBAAc,IAAA;AACpB,EAAAD,GAAY,YAAY,QAAQ,CAACE,MAAc;AAM7C,KALsBA,IAClB,MAAM,QAAQA,EAAU,YAAY,IAClCA,EAAU,eACV,CAACA,EAAU,gBAAgB,WAAW,IACxC,OACgB,SAAS,MAAM,KACjCD,EAAQ,IAAI,MAAMC,EAAU,YAAA,CAAa;AAAA,EAE7C,CAAC,GAGD,eAAe,MAAM;AACnB,IAAAD,EAAQ,QAAQ,CAACE,MAAWA,EAAA,CAAQ;AAAA,EACtC,CAAC;AACH;AAEA,SAASC,GACPhF,GACAC,GACAiE,GACAe,GACA;AAEA,QAAMC,IAAc3G,EAAkByB,GAAUC,CAAI;AASpD,MARAzB,EAAkBwB,GAAUC,GAAM;AAAA,IAChC,GAAGiF;AAAA,IACH,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgBD,KAAa,KAAK,IAAA;AAAA,EAAI,CACvC,GAGG,MAAM,QAAQf,CAAI,GAAG;AACvB,UAAMiB,IAAY5G,EAAkByB,GAAUC,CAAI;AAClD,IAAIkF,GAAW,aACbA,EAAU,UAAU,QAAQ,CAACC,GAASC,MAAU;AAE9C,YAAMC,IAAW,CAAC,GAAGrF,GAAMmF,CAAO,GAC5BG,IAAWrB,EAAKmB,CAAK;AAC3B,MAAIE,MAAa,UACfP;AAAA,QACEhF;AAAA,QACAsF;AAAA,QACAC;AAAA,QACAN;AAAA,MAAA;AAAA,IAGN,CAAC;AAAA,EAEL,OAESf,KAAQ,OAAOA,KAAS,YAAYA,EAAK,gBAAgB,UAChE,OAAO,KAAKA,CAAI,EAAE,QAAQ,CAACvD,MAAQ;AACjC,UAAM6E,IAAY,CAAC,GAAGvF,GAAMU,CAAG,GACzB8E,IAAYvB,EAAKvD,CAAG;AAC1B,IAAAqE,GAA8BhF,GAAUwF,GAAWC,GAAWR,CAAS;AAAA,EACzE,CAAC;AAEL;AAEA,IAAIS,KAA0B,CAAA,GAC1BC,KAAmB;AAEvB,SAASC,KAAgB;AACvB,EAAKD,OACHA,KAAmB,IACnB,eAAe,MAAM;AACnB,IAAAE,GAAA;AAAA,EACF,CAAC;AAEL;AAGA,SAASC,GAAc3F,GAAiB4F,GAAmB;AACzD,EAAK5F,GAAY,SAAS,UAE1BA,EAAW,QAAQ,QAAQ,CAAC,EAAE,UAAA6F,GAAU,UAAAC,GAAU,QAAAC,QAAkB;AAClE,UAAMC,IAAS,SAAS,cAAc,oBAAoBH,CAAQ,IAAI;AACtE,QAAI,CAACG,EAAQ;AAEb,UAAMC,IAAa,MAAM,KAAKD,EAAO,UAAU;AAC/C,QAAI,CAACC,EAAWH,CAAQ,EAAG;AAE3B,QAAII,IAAoBN;AACxB,QAAIG,KAAUH,MAAiB;AAC7B,UAAI;AACF,QAAAM,IAAoB,IAAI,SAAS,SAAS,WAAWH,CAAM,UAAU;AAAA,UACnEH;AAAA,QAAA;AAAA,MAEJ,SAASO,GAAK;AACZ,gBAAQ,MAAM,qCAAqCA,CAAG;AAAA,MACxD;AAGF,IAAID,MAAsB,QAAQ,OAAOA,KAAsB,aAC7DA,IAAoB,KAAK,UAAUA,CAAiB,IAGtDD,EAAWH,CAAQ,EAAE,cAAc,OAAOI,KAAqB,EAAE;AAAA,EACnE,CAAC;AACH;AAEA,SAASE,GACPvG,GACAC,GACAuG,GACU;AACV,QAAMC,IAAWlI,EAAkByB,GAAU,EAAE;AAE/C,MAAI,CAACyG,GAAU;AACb,+BAAW,IAAA;AAGb,QAAMC,wBAAyB,IAAA;AAI/B,MAAIF,EAAO,SAAS,UAAU;AAG5B,QAAIG,IAAc,CAAC,GAAG1G,CAAI;AAC1B,eAAa;AACX,YAAM2G,IAAWrI,EAAkByB,GAAU2G,CAAW;AAiBxD,UAfIC,GAAU,kBACZA,EAAS,eAAe,QAAQ,CAACpE,MAAwB;AACvD,cAAMsC,IAAY2B,EAAS,YAAY,IAAIjE,CAAW;AAEtD,QAAIsC,OACoB,MAAM,QAAQA,EAAU,YAAY,IACtDA,EAAU,eACV,CAACA,EAAU,gBAAgB,WAAW,GACvB,SAAS,MAAM,KAChC4B,EAAmB,IAAI5B,CAAS;AAAA,MAGtC,CAAC,GAGC6B,EAAY,WAAW,EAAG;AAC9B,MAAAA,EAAY,IAAA;AAAA,IACd;AAIA,IACEH,EAAO,YACP,OAAOA,EAAO,YAAa,YAC3B,CAACK,GAAQL,EAAO,QAAQ,KAEAM,GAAeN,EAAO,UAAUA,EAAO,QAAQ,EAEvD,QAAQ,CAACO,MAA0B;AACjD,YAAMC,IAAUD,EAAc,MAAM,GAAG,GACjCE,IAAc,CAAC,GAAGhH,GAAM,GAAG+G,CAAO,GAClCE,IAAc3I,EAAkByB,GAAUiH,CAAW;AAE3D,MAAIC,GAAa,kBACfA,EAAY,eAAe,QAAQ,CAAC1E,MAAwB;AAC1D,cAAMsC,IAAY2B,EAAS,YAAY,IAAIjE,CAAW;AAEtD,QAAIsC,OACoB,MAAM,QAAQA,EAAU,YAAY,IACtDA,EAAU,eACV,CAACA,EAAU,gBAAgB,WAAW,GACvB,SAAS,MAAM,KAChC4B,EAAmB,IAAI5B,CAAS;AAAA,MAGtC,CAAC;AAAA,IAEL,CAAC;AAAA,EAEL,WACE0B,EAAO,SAAS,YAChBA,EAAO,SAAS,SAChBA,EAAO,SAAS,eAChB;AAMA,QAAIG,IAAc,CAAC,GAJKH,EAAO,SAAS,WAAWvG,IAAOA,EAAK,MAAM,GAAG,EAAE,CAIrC;AACrC,eAAa;AACX,YAAM2G,IAAWrI,EAAkByB,GAAU2G,CAAW;AAWxD,UATIC,GAAU,kBACZA,EAAS,eAAe,QAAQ,CAACpE,MAAwB;AACvD,cAAMsC,IAAY2B,EAAS,YAAY,IAAIjE,CAAW;AACtD,QAAIsC,KACF4B,EAAmB,IAAI5B,CAAS;AAAA,MAEpC,CAAC,GAGC6B,EAAY,WAAW,EAAG;AAC9B,MAAAA,EAAY,IAAA;AAAA,IACd;AAAA,EAEF;AA8BA,SAAOD;AACT;AAEA,SAASS,GACPnH,GACAC,GACAmH,GAC0E;AAE1E,QAAMC,IAAWzH,EAAe,SAAA,EAAW,eAAeI,GAAUC,CAAI,GAElEqH,IAAWxD,EAAWsD,CAAO,IAAIA,EAAQC,CAAQ,IAAID;AAC3D,MAAI5F,EAAY6F,GAAUC,CAAQ;AAChC,WAAO;AAKT,EAAA1I,GAAmBoB,GAAUC,GAAMqH,CAAQ,GAE3CpI,GAAYc,GAAUC,GAAM,EAAE,QAAQ,IAAM;AAG5C,QAAMsH,IAAgBhJ,EAAkByB,GAAUC,CAAI;AAEtD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAAoH;AAAA,IACA,UAAAC;AAAA,IACA,YAAYC;AAAA,EAAA;AAEhB;AACA,SAASC,GACPxH,GACAC,GACAmH,GAMA;AAEA,EAAAtI,GAA8BkB,GAAUC,GAAMmH,CAAO,GAErDlI,GAAYc,GAAUC,GAAM,EAAE,QAAQ,IAAM;AAC5C,QAAMwH,IAAclJ,EAAkByB,GAAUC,CAAI;AAEpD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAOmH,EAAQ;AAAA,IACf,YAAYK;AAAA,IACZ,MAAAxH;AAAA,EAAA;AAEJ;AACA,SAASyH,GACP1H,GACAC,GACAmH,GACA/B,GACAsC,GAQA;AACA,MAAIL;AAEJ,MAAIxD,EAAWsD,CAAO,GAAG;AACvB,UAAM,EAAE,OAAOQ,EAAA,IAAiBC,EAAc7H,GAAUC,CAAI;AAC5D,IAAAqH,IAAWF,EAAQ,EAAE,OAAOQ,EAAA,CAAc;AAAA,EAC5C;AACE,IAAAN,IAAWF;AAIb,QAAMU,IAAejJ;AAAA,IACnBmB;AAAA,IACAC;AAAA,IACAqH;AAAA,IACAjC;AAAA,IACAsC;AAAA,EAAA;AAIF,EAAAzI,GAAYc,GAAUC,GAAM,EAAE,QAAQ,IAAM;AAE5C,QAAMwH,IAAclJ,EAAkByB,GAAUC,CAAI;AAEpD,MAAI8H;AACJ,SAAIN,GAAa,aAAapC,MAAU,UAAaA,IAAQ,MAC3D0C,IAAgBN,EAAY,UAAUpC,IAAQ,CAAC,IAG1C;AAAA,IACL,MAAM;AAAA,IACN,UAAAiC;AAAA,IACA,YAAYG;AAAA,IACZ,MAAAxH;AAAA,IACA,QAAQ6H;AAAA,IACR,eAAAC;AAAA,EAAA;AAEJ;AAEA,SAASC,GACPhI,GACAC,GACsD;AACtD,QAAMgI,IAAkBhI,EAAK,MAAM,GAAG,EAAE,GAClCoH,IAAW5I,EAAeuB,GAAUC,CAAI;AAC9C,SAAAlB,GAAyBiB,GAAUC,CAAI,GACvCf,GAAYc,GAAUiI,GAAiB,EAAE,QAAQ,IAAM,GAChD,EAAE,MAAM,OAAO,UAAAZ,GAAoB,YAAYY,EAAA;AACxD;AAEA,SAASpC,KAAa;AACpB,QAAMqC,wBAA4B,IAAA,GAC5BC,IAA0D,CAAA,GAE1DC,IAAgC,CAAA;AAEtC,aAAWC,KAAQ3C,IAAkB;AACnC,QAAI2C,EAAK,UAAUA,EAAK,YAAY;AAClC,MAAAD,EAAU,KAAKC,CAAwB;AACvC;AAAA,IACF;AAEA,UAAM7B,IAAS6B,GAETtC,IAAeS,EAAO,SAAS,QAAQ,OAAOA,EAAO;AAC3D,IAAIA,EAAO,YAAY,SAAS,SAAS,KACvC2B,EAAc,KAAK,EAAE,YAAY3B,EAAO,YAAY,cAAAT,GAAc,GAGrCQ;AAAA,MAC7BC,EAAO;AAAA,MACPA,EAAO;AAAA,MACPA;AAAA,IAAA,EAGqB,QAAQ,CAAC1B,MAAc;AAC5C,MAAAoD,EAAsB,IAAIpD,CAAS;AAAA,IACrC,CAAC;AAAA,EAEH;AAEA,EAAIsD,EAAU,SAAS,KACrB/I,GAAY+I,CAAS,GAGvBD,EAAc,QAAQ,CAAC,EAAE,YAAAhI,GAAY,cAAA4F,QAAmB;AACtD,IAAAD,GAAc3F,GAAY4F,CAAY;AAAA,EACxC,CAAC,GAGDmC,EAAsB,QAAQ,CAACpD,MAAc;AAC3C,IAAAA,EAAU,YAAA;AAAA,EACZ,CAAC,GAKDY,KAAmB,CAAA,GACnBC,KAAmB;AACrB;AACA,SAAS2C,GACP5E,GACAE,GACA2E,GACsB;AACtB,SAAO,CAACC,GAAoBvI,GAAMwI,MAAc;AAC9C,IAAAC,EAAchF,GAASzD,GAAMuI,GAAoBC,CAAS;AAAA,EAC5D;AAEA,WAASC,EACP1I,GACAC,GACAmH,GACApG,GACA;AACA,QAAIwF;AACJ,YAAQxF,EAAQ,YAAA;AAAA,MACd,KAAK;AACH,QAAAwF,IAASW,GAAanH,GAAUC,GAAMmH,CAAO;AAC7C;AAAA,MACF,KAAK;AACH,QAAAZ,IAASkB;AAAA,UACP1H;AAAA,UACAC;AAAA,UACAmH;AAAA,UACApG,EAAQ;AAAA,UACRA,EAAQ;AAAA,QAAA;AAEV;AAAA,MACF,KAAK;AACH,QAAAwF,IAASgB,GAAiBxH,GAAUC,GAAMmH,CAAO;AACjD;AAAA,MACF,KAAK;AACH,QAAAZ,IAASwB,GAAUhI,GAAUC,CAAI;AACjC;AAAA,IAAA;AAGJ,QAAIuG,MAAW;AACb;AAEF,IAAAA,EAAO,WAAWxG,GAClBwG,EAAO,OAAOvG,GACdyF,GAAiB,KAAKc,CAAM,GAC5BZ,GAAA;AAEA,UAAM+C,IAA8B;AAAA,MAClC,WAAW,KAAK,IAAA;AAAA,MAChB,UAAA3I;AAAA,MACA,MAAAC;AAAA,MACA,YAAYe,EAAQ;AAAA,MACpB,QAAQ;AAAA,MACR,UAAUwF,EAAO;AAAA,MACjB,UAAUA,EAAO,YAAY;AAAA,MAC7B,QAAQA,EAAO;AAAA,MACf,eAAeA,EAAO;AAAA,MACtB,UAAUxF,EAAQ;AAAA,IAAA;AAGpB,IAAA0E,GAAiB,KAAKiD,CAAS,GAE3BnC,EAAO,aAAa,UACtBhD;AAAA,MACEgD,EAAO;AAAA,MACPxG;AAAA,MACAuI,EAAwB;AAAA,MACxB3E;AAAA,IAAA,GAIA2E,EAAwB,SAAS,cACnCA,EAAwB,QAAQ,WAAW,EAAE,QAAQI,GAAW,GAElEC,GAAcD,GAAW3H,EAAQ,qBAAqB,cAAc,GACpEnB,GAAa8I,CAAS;AAAA,EACxB;AACF;AAEO,SAAS3F,GAId6F,GACA;AAAA,EACE,UAAA7I;AAAA,EACA,cAAA8I;AAAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAzG;AAAA,EACA,cAAA0G;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AACF,IAKgC,IAChC;AACA,QAAM,CAACC,GAAeC,CAAW,IAAI7G,GAAS,CAAA,CAAE,GAC1C,EAAE,WAAAmB,EAAA,IAAca,GAAA;AACtB,MAAI8E,IAAa,CAAAvJ;AACjB,QAAM,CAAC0D,CAAO,IAAIjB,GAASzC,KAAY0C,IAAQ,GACzC8G,IAAiB3G,EAAOL,KAAeE,GAAA,CAAQ,GAC/C6F,IAA0B1F;AAAA,IAC9B;AAAA,EAAA;AAEF,EAAA0F,EAAwB,UAAWlK,EAAkBqF,CAAiB,KACpE;AAEF,QAAM+F,IAAsBC;AAAA,IAC1B,CACEC,MAKG;AAMH,YAAMhH,IAJegH,IACjB,EAAE,GAAGtL,EAAkBqF,CAAiB,GAAG,GAAGiG,EAAA,IAC9CtL,EAAkBqF,CAAiB,GAGjCkG,IACJjH,GAAgB,gBAAgBuG,KAAgBL;AAOlD,UAHElG,GAAgB,aAAa,WAAW,aACxCA,GAAgB,aAAa,SAAS;AAGtC,eAAO;AAAA,UACL,OAAOA,EAAe,YAAa;AAAA,UACnC,QAAQ;AAAA,UACR,WAAWA,EAAe,YAAa,aAAa,KAAK,IAAA;AAAA,QAAI;AAIjE,UAAIA,GAAgB,cAAc,OAAOiB,GAAW;AAClD,cAAMiG,IAAW/F,EAAWnB,EAAe,aAAa,GAAG,IACvDA,EAAe,aAAa,IAAIiH,CAAiB,IACjDjH,EAAe,aAAa,KAE1BgC,IAAYV;AAAA,UAChB,GAAGL,CAAS,IAAIF,CAAO,IAAImG,CAAQ;AAAA,QAAA;AAGrC,YACElF,KACAA,EAAU,eAAehC,GAAgB,aAAa,aAAa;AAEnE,iBAAO;AAAA,YACL,OAAOgC,EAAU;AAAA,YACjB,QAAQ;AAAA,YACR,WAAWA,EAAU;AAAA,UAAA;AAAA,MAG3B;AAGA,aAAO;AAAA,QACL,OAAOiF,KAAsBf;AAAA,QAC7B,QAAQ;AAAA,QACR,WAAW,KAAK,IAAA;AAAA,MAAI;AAAA,IAExB;AAAA,IACA,CAACnF,GAASwF,GAAcL,GAAajF,CAAS;AAAA,EAAA;AAIhD,EAAAX,EAAU,MAAM;AACd,IAAKmG,KAGDA,EAAY,WAAW,aAAaA,EAAY,SAAS,UAC3DnK,GAAqByE,GAAS0F,CAAW;AAAA,EAE7C,GAAG,CAACA,GAAa1F,CAAO,CAAC,GAEzBT,EAAU,MACYrD,EACjB,SAAA,EACA,gBAAgB8D,GAAS,CAACoG,MAAU;AACnC,QAAIA,GAAO,SAAS,uBAAuB;AACzC,YAAMC,IAAkBD,EAAM;AAE9B,UACEC,GAAiB,WAAW,aAC5BA,EAAgB,SAAS;AAEzB;AAIF,MAAAnJ,GAAmB8C,GAAS,EAAE,aAAaqG,EAAA,CAAiB;AAE5D,YAAMC,IACJ,OAAOD,EAAgB,SAAU,WAC7BA,EAAgB,QAChBA,EAAgB,UAAU,KACxB,EAAE,UAAU,UAAmB,KAAK,SACpC,MAEFvF,IAAe/F,EAAeiF,GAAS,EAAE,GACzCuG,IAAeF,EAAgB;AAErC,UACEC,KACAA,EAAY,aAAa,YACzB,SAASA,KACT,MAAM,QAAQxF,CAAY,KAC1B,MAAM,QAAQyF,CAAY,GAC1B;AACA,cAAMC,IAAWF,EAAY;AAC7B,YAAI,CAACE,GAAU;AACb,kBAAQ;AAAA,YACN;AAAA,UAAA;AAEF;AAAA,QACF;AAGA,cAAMC,IAAc,IAAI;AAAA,UACtB3F,EAAa,IAAI,CAAC6D,MAAcA,EAAK6B,CAAQ,CAAC;AAAA,QAAA,GAI1CE,IAAiBH,EAAa;AAAA,UAClC,CAAC5B,MAAc,CAAC8B,EAAY,IAAI9B,EAAK6B,CAAQ,CAAC;AAAA,QAAA;AAGhD,QAAIE,EAAe,SAAS,KAE1BtL,GAA8B4E,GAAS,CAAA,GAAI0G,CAAc;AAI3D,cAAMC,IAAa5L,EAAeiF,GAAS,EAAE;AAC7C,QAAAsB;AAAA,UACEtB;AAAA,UACA,CAAA;AAAA,UACA2G;AAAA,UACAN,EAAgB,aAAa,KAAK,IAAA;AAAA,QAAI;AAAA,MAE1C;AAEE,QAAArL,EAAsBgF,GAASuG,CAAY,GAG3CjF;AAAA,UACEtB;AAAA,UACA,CAAA;AAAA,UACAuG;AAAA,UACAF,EAAgB,aAAa,KAAK,IAAA;AAAA,QAAI;AAK1C,MAAAlI,EAAiB6B,CAAO;AAAA,IAC1B;AAAA,EACF,CAAC,GAGF,CAACA,CAAO,CAAC,GACZT,EAAU,MAAM;AACd,UAAMqH,IAAe1K,EAClB,SAAA,EACA,kBAAkB8D,GAAS,EAAE;AAGhC,QAAI4G,KAAgBA,EAAa;AAC/B;AAGF,UAAMtJ,IAAU3C,EAAkBqF,CAAiB,GAE7C6G,IAAW;AAAA,MACf,qBAAqB,CAAC,CAACvJ,GAAS,cAAc;AAAA,IAAA;AAQhD,QALAxC,EAAkBkF,GAAS,IAAI;AAAA,MAC7B,GAAG4G;AAAA,MACH,UAAAC;AAAA,IAAA,CACD,GAEGvJ,GAAS,iBAAiB,UAAakI,MAAiB,QAAW;AACrE,YAAMU,IAAoB5I,GAAS,gBAAgBkI;AACnD,MAAKlI,GAAS,gBACZJ,GAAmB8C,GAAmB;AAAA,QACpC,cAAckG;AAAA,MAAA,CACf;AAAA,IAEL;AAEA,UAAM,EAAE,OAAOY,GAAe,QAAAjJ,GAAQ,WAAA0D,EAAA,IAAcwE,EAAA;AACpD,IAAA/K,EAAsBgF,GAAS8G,CAAa,GAC5ChM,EAAkBkF,GAAS,IAAI;AAAA,MAC7B,aAAanC;AAAA,MACb,gBAAgBA,MAAW,WAAW0D,IAAY;AAAA,MAClD,SAAS1D,MAAW,WAAW,KAAQ;AAAA,MACvC,iBAAiBA,MAAW,WAAWiJ,IAAgB;AAAA,IAAA,CACxD,GAEGjJ,MAAW,YAAY6H,KACzBnK,GAAqByE,GAAS0F,CAAW,GAG3CvH,EAAiB6B,CAAO;AAAA,EAC1B,GAAG,CAACA,GAAS,GAAIyF,KAAgB,CAAA,CAAG,CAAC,GAErCsB,GAAgB,MAAM;AACpB,IAAIlB,KACF3I,GAAmB8C,GAAmB;AAAA,MACpC,cAAAqF;AAAA,MACA,cAAAG;AAAA,MACA,cAAAJ;AAAAA,MACA,YAAYP,EAAwB,SAAS;AAAA,IAAA,CAC9C;AAGH,UAAMmC,IAAe,GAAGhH,CAAO,OAAO8F,EAAe,OAAO,IAGtD/C,IAAWlI,EAAkBmF,GAAS,EAAE,GACxCiH,IAAalE,GAAU,cAAc,oBAAI,IAAA;AAE/C,WAAAkE,EAAW,IAAID,GAAc;AAAA,MAC3B,aAAa,MAAMpB,EAAY,EAAE;AAAA,MACjC,cAAcL,KAAgB,CAAC,WAAW;AAAA,MAC1C,2BAAW,IAAA;AAAA,MACX,cAAcD,KAAgB;AAAA,MAC9B,MAAMA,IAAeA,EAAavK,EAAeiF,GAAS,CAAA,CAAE,CAAC,IAAI,CAAA;AAAA,MACjE,UAAUsF,IACNA,EAAavK,EAAeiF,GAAS,CAAA,CAAE,CAAC,IACxC,CAAA;AAAA,IAAC,CACN,GAEDlF,EAAkBkF,GAAS,IAAI;AAAA,MAC7B,GAAG+C;AAAA,MACH,YAAAkE;AAAA,IAAA,CACD,GACDrB,EAAY,CAAA,CAAE,GACP,MAAM;AACX,YAAMpJ,IAAO3B,EAAkBmF,GAAS,EAAE,GACpCoB,IAAY5E,GAAM,YAAY,IAAIwK,CAAY;AAGpD,MAAI5F,GAAW,SACbA,EAAU,MAAM,QAAQ,CAAC8F,MAAa;AAGpC,cAAM3K,IADY2K,EAAS,MAAM,GAAG,EACb,MAAM,CAAC,GAExBhE,IAAWhH,EACd,SAAA,EACA,kBAAkB8D,GAASzD,CAAI;AAClC,QAAI2G,GAAU,kBAGRA,EAAS,eAAe,SAAS,MACnC,OAAOA,EAAS,gBAChBhH,EACG,SAAA,EACA,kBAAkB8D,GAASzD,GAAM2G,CAAQ;AAAA,MAGlD,CAAC,GAIC1G,GAAM,cACR1B,EAAkBkF,GAAS,CAAA,GAAIxD,CAAI;AAAA,IAEvC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM2K,IAAoBvC;AAAA,IACxB5E;AAAA,IAEAE;AAAA,IACA2E;AAAA,EAAA;AAGF,SAAK3I,EAAe,SAAA,EAAW,mBAAmB8D,CAAO,KACvDpF,GAAyBoF,GAASmF,CAAW,GAG1BiC,GAAQ,MACXC;AAAA,IACdrH;AAAA,IACAmH;AAAA,IACArB,EAAe;AAAA,IACf5F;AAAA,EAAA,GAID,CAACF,GAASE,CAAS,CAAC;AAGzB;AAeA,MAAMoH,KAAkB,CACtBhL,GACAC,GACAC,MACa;AACb,MAAI+K,IAAM1M,EAAkByB,GAAUC,CAAI,GAAG,aAAa,CAAA;AAC1D,QAAMiL,IAAahL,GAAM;AACzB,MAAI,CAACgL,KAAcA,EAAW,WAAW;AACvC,WAAOD;AAIT,aAAWE,KAAaD;AACtB,QAAIC,EAAU,SAAS,UAAU;AAC/B,YAAMC,IAAkB,CAAA;AACxB,MAAAH,EAAI,QAAQ,CAACI,GAAIhG,MAAU;AACzB,cAAMiG,IAAQ7M,EAAeuB,GAAU,CAAC,GAAGC,GAAMoL,CAAE,CAAC;AAEpD,QAAIF,EAAU,GAAGG,GAAOjG,CAAK,KAC3B+F,EAAS,KAAKC,CAAE;AAAA,MAEpB,CAAC,GACDJ,IAAMG;AAAA,IACR,MAAA,CAAWD,EAAU,SAAS,UAC5BF,EAAI,KAAK,CAACM,GAAGC,MAAM;AACjB,YAAMC,IAAShN,EAAeuB,GAAU,CAAC,GAAGC,GAAMsL,CAAC,CAAC,GAC9CG,IAASjN,EAAeuB,GAAU,CAAC,GAAGC,GAAMuL,CAAC,CAAC;AACpD,aAAOL,EAAU,GAAGM,GAAQC,CAAM;AAAA,IACpC,CAAC;AAIL,SAAOT;AACT,GACMU,IAA8B,CAClC3L,GACAwC,GACAoJ,MACG;AACH,QAAMC,IAAkB,GAAG7L,CAAQ,OAAOwC,CAAW,IAG/CsC,IADWvG,EAAkByB,GAAU,EAAE,GACnB,YAAY,IAAI6L,CAAe;AAE3D,EACE,CAAC/G,KACDA,EAAU,iBAAiB,UAC3B,EACE,MAAM,QAAQA,EAAU,YAAY,IAChCA,EAAU,eACV,CAACA,EAAU,YAAY,GAC3B,SAAS,WAAW,KAKxB3F,GAAiBa,GAAU4L,GAAgBC,CAAe;AAC5D,GACMC,IAA4B,CAChC9L,GACA+L,GACAC,MACG;AACH,QAAMvF,IAAWlI,EAAkByB,GAAU,EAAE,GACzCiM,wBAAyB,IAAA;AAG/B,EAAIxF,GAAU,cACZA,EAAS,WAAW,QAAQ,CAAC3B,GAAWtC,MAAgB;AAKtD,KAJsB,MAAM,QAAQsC,EAAU,YAAY,IACtDA,EAAU,eACV,CAACA,EAAU,gBAAgB,WAAW,GAExB,SAAS,KAAK,MAC9BA,EAAU,YAAA,GACVmH,EAAmB,IAAIzJ,CAAW;AAAA,EAEtC,CAAC,GAGHjE,EAAkByB,GAAU;AAAA,IAC1B,GAAG+L;AAAA,IACH;AAAA,EAAA,CACD,GAAG,gBAAgB,QAAQ,CAACvJ,MAAgB;AAE3C,IADiBiE,GAAU,YAAY,IAAIjE,CAAW,GAC5C,YAAA;AAAA,EACZ,CAAC;AAED,QAAM0J,IAAa3N,EAAkByB,GAAU+L,CAAU;AACzD,WAASI,KAAYD,GAAY,aAAa,CAAA,GAAI;AAChD,UAAMvL,IAAMwL,IAAW,aACjBC,IAAe7N,EAAkByB,GAAUW,EAAI,MAAM,GAAG,EAAE,MAAM,CAAC,CAAC;AACxE,IAAIwL,KAAYH,KACdI,GAAc,gBAAgB,QAAQ,CAAC5J,MAAgB;AAErD,MADiBiE,GAAU,YAAY,IAAIjE,CAAW,GAC5C,YAAA;AAAA,IACZ,CAAC;AAAA,EAEL;AACF;AACA,SAASqF,EAAc7H,GAAkBC,GAAgBC,GAAiB;AACxE,QAAMC,IAAa5B,EAAkByB,GAAUC,CAAI,GAC7CG,IAAeH,EAAK,SAAS,IAAIA,EAAK,KAAK,GAAG,IAAI,QAClDoM,IAAYnM,GAAM,aAAaE,CAAY;AAGjD,MAAI,MAAM,QAAQiM,CAAS,KAAKA,EAAU,WAAW;AACnD,WAAO;AAAA,MACL,YAAAlM;AAAA,MACA,OAAO,CAAA;AAAA,MACP,WAAWA,GAAY;AAAA,IAAA;AAI3B,QAAMmL,IAAQ7M,EAAeuB,GAAUC,GAAMoM,CAAS;AAEtD,SAAO;AAAA,IACL,YAAAlM;AAAA,IACA,OAAAmL;AAAA,IACA,WAAWnL,GAAY;AAAA,EAAA;AAE3B;AAEA,SAAS4K,GAIP/K,GACA6K,GACAyB,GACA1I,GAC0B;AAC1B,QAAM2I,wBAAiB,IAAA;AAEvB,WAASC,EAAkB;AAAA,IACzB,MAAAvM,IAAO,CAAA;AAAA,IACP,MAAAC;AAAA,IACA,aAAAsC;AAAA,EAAA,GAKM;AACN,UAAMiK,IAAsBvM,IACxB,KAAK,UAAUA,EAAK,cAAcA,EAAK,UAAU,IACjD,IAEEwM,IACJzM,EAAK,KAAK,GAAG,IAAI,MAAMuC,IAAc,MAAMiK;AAC7C,QAAIF,EAAW,IAAIG,CAAQ;AACzB,aAAOH,EAAW,IAAIG,CAAQ;AAEhC,UAAMC,IAAkB,CAAC3M,GAAU,GAAGC,CAAI,EAAE,KAAK,GAAG,GAE9C2M,IAAc,MAAM;AAAA,IAAC,GAErBC,IAAU;AAAA,MACd,MAAMvL,GAAawL,GAAcC,GAAW;AAC1C,YAAIA,EAAK,WAAW,GAAG;AAErB,gBAAM3M,IAAeH,EAAK,SAAS,IAAIA,EAAK,KAAK,GAAG,IAAI,QAClDI,IAAUH,GAAM,aAAaE,CAAY;AAG/C,iBAAAuL,EAA4B3L,GAAUwC,GAAavC,CAAI,GAChDxB,EAAeuB,GAAUC,GAAMI,CAAO;AAAA,QAC/C;AAGA,cAAMiH,IAAWyF,EAAK,CAAC;AACvB,eAAAlC,EAAkBvD,GAAUrH,GAAM,EAAE,YAAY,UAAU,GACnD;AAAA,MACT;AAAA,MAEA,IAAIqB,GAAa0L,GAAcC,GAAe;AAI5C,YAAID,MAAU,OAAO;AACnB,iBAAO,CAACE,MACFA,MAAS,WAAiB,MAC1BA,MAAS,WAEJ,eADSjN,EAAK,KAAK,GAAG,KACI,MAAM,MAElC;AAKX,YAAI+M,MAAU,OAAO;AACnB,iBAAO;AAIT,YAAIA,MAAU,OAAO,UAAkB;AACrC,gBAAM,EAAE,OAAA1B,EAAA,IAAUzD,EAAc7H,GAAUC,GAAMC,CAAI;AACpD,iBAAI,MAAM,QAAQoL,CAAK,IACd,aAAa;AAClB,qBAAS5K,IAAI,GAAGA,IAAI4K,EAAM,QAAQ5K;AAChC,oBAAM4K,EAAM5K,CAAC;AAAA,UAEjB,IAEF;AAAA,QACF;AAEA,YAAIsM,MAAS,UAAUA,MAAS,WAAWA,MAAS;AAClD,iBAAO,QAAQ,IAAI1L,GAAQ0L,GAAMC,CAAQ;AAG3C,YAAI,OAAOD,KAAS;AAClB,iBAAO,QAAQ,IAAI1L,GAAQ0L,CAAI;AAEjC,YAAI/M,EAAK,WAAW,KAAK+M,KAAQG;AAC/B,iBAAOA,EAAiBH,CAAqC;AAG/D,YAAI,OAAOA,KAAS,YAAY,CAACA,EAAK,WAAW,GAAG,GAAG;AACrD,gBAAMI,IAAW,CAAC,GAAGnN,GAAM+M,CAAI;AAC/B,iBAAOR,EAAkB;AAAA,YACvB,MAAMY;AAAAA,YACN,aAAA5K;AAAA,YACA,MAAAtC;AAAA,UAAA,CACD;AAAA,QACH;AACA,YAAI8M,MAAS;AACX,iBAAOR;AAGT,YAAIQ,MAAS,WAAW/M,EAAK,WAAW;AACtC,iBAAO,iBAAkB;AACvB,kBAAMe,IAAUpB,EACb,SAAA,EACA,kBAAkBI,CAAQ,GACvBqN,IAAOrM,GAAS;AAEtB,gBAAI,CAACqM;AACH,6BAAQ,MAAM,sCAAsCrN,CAAQ,GAAG,GACxD,EAAE,SAAS,IAAO,OAAO,sBAAA;AAGlC,kBAAMyD,IAAQ7D,EACX,SAAA,EACA,eAAeI,GAAU,EAAE,GACxBsN,IAAgBtM,GAAS,YAAY;AAE3C,gBAAI;AACF,oBAAMuM,IAAW,MAAMF,EAAK,OAAO5J,CAAK;AAiBxC,kBAfE8J,KACA,CAACA,EAAS,WACVA,EAAS,QAaPA,GAAU,SAAS;AAErB,sBAAMpN,IAAaP,EAChB,SAAA,EACA,kBAAkBI,GAAU,EAAE;AACjC,gBAAAxB,EAAkBwB,GAAU,IAAI;AAAA,kBAC9B,GAAGG;AAAA,kBACH,SAAS;AAAA,kBACT,gBAAgB,KAAK,IAAA;AAAA,kBACrB,aAAa;AAAA,kBACb,iBAAiBsD;AAAA;AAAA,gBAAA,CAClB,GAEG4J,EAAK,aACPA,EAAK,UAAUE,EAAS,IAAI;AAAA,cAEhC,MAAA,CAAW,CAACA,GAAU,WAAWF,EAAK,WACpCA,EAAK,QAAQE,EAAS,KAAK;AAE7B,qBAAOA;AAAA,YACT,SAAShJ,GAAO;AACd,qBAAI8I,EAAK,WAASA,EAAK,QAAQ9I,CAAK,GAC7B,EAAE,SAAS,IAAO,OAAAA,EAAA;AAAA,YAC3B;AAAA,UACF;AAGF,YAAIyI,MAAS,cAAcA,MAAS,cAAc;AAChD,gBAAMQ,IAAgB,MAAM;AAE1B,kBAAM,EAAE,YAAArN,GAAY,OAAAmL,EAAA,IAAUzD,EAAc7H,GAAUC,GAAMC,CAAI;AAEhE,mBAAIC,GAAY,YAAY,KACnB,UAIPA,GAAY,gBAAgB,YAC5BA,GAAY,YAAY,KAEjB,WAGLA,GAAY,gBAAgB,iBACvB,aAGLA,GAAY,gBAAgB,aAI5BmL,MAAU,SACL,UAIF;AAAA,UACT;AAGA,iBAAO0B,MAAS,aAAaQ,EAAA,IAAkBA;AAAA,QACjD;AACA,YAAIR,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMjL,IACJnC,EAAe,SAAA,EAAW,mBAAmBI,CAAQ,GACjDyN,IAAmBpP,EAAkB2B,CAAkB,GACvD6J,IAAW/F,EAAW2J,GAAkB,cAAc,GAAG,IAC3DA,EAAiB,aAAa,IAAI1L,CAAY,IAC9C0L,GAAkB,cAAc,KAC9B1J,IAAa,GAAGH,CAAS,IAAI5D,CAAQ,IAAI6J,CAAQ;AACvD,YAAI9F,KAAY,aAAa,WAAWA,CAAU;AAAA,UACpD;AAGF,YAAIiJ,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMU,IAAQ9N,EAAe,SAAA,GAGvB,EAAE,OAAA0L,EAAA,IAAUzD,EAAc7H,GAAUC,GAAMC,CAAI,GAC9CyN,IAAOD,EAAM,kBAAkB1N,CAAQ,GACvC4N,IACJD,GAAM,YAAY,eAAeA,GAAM,YAAY;AAGrD,gBAAI,CAACC;AACH,qBAAO,EAAE,SAAS,IAAM,MAAMtC,EAAA;AAIhC,kBAAM9E,IAAUoH,EAAe,UAAUtC,CAAK;AAG9C,gBAAI9E,EAAO,SAAS;AAClB,oBAAMtB,IAAcwI,EAAM,kBAAkB1N,GAAUC,CAAI,KAAK,CAAA;AAC/D,cAAAyN,EAAM,kBAAkB1N,GAAUC,GAAM;AAAA,gBACtC,GAAGiF;AAAA,gBACH,YAAY;AAAA,kBACV,QAAQ;AAAA,kBACR,QAAQ,CAAA;AAAA,kBACR,eAAe,KAAK,IAAA;AAAA,gBAAI;AAAA,cAC1B,CACD;AAAA,YACH;AAKE,eAFEsB,EAAO,OAAO,UAAUA,EAAO,OAAO,UAAU,CAAA,GAExC,QAAQ,CAACjC,MAAe;AAChC,sBAAMsJ,IAAY,CAAC,GAAG5N,GAAM,GAAGsE,EAAM,KAAK,IAAI,MAAM,CAAC,GAC/CW,IACJwI,EAAM,kBAAkB1N,GAAU6N,CAAS,KAAK,CAAA;AAElD,gBAAAH,EAAM,kBAAkB1N,GAAU6N,GAAW;AAAA,kBAC3C,GAAG3I;AAAA,kBACH,YAAY;AAAA,oBACV,QAAQ;AAAA,oBACR,QAAQ;AAAA,sBACN;AAAA,wBACE,QAAQ;AAAA,wBACR,SAASX,EAAM;AAAA,wBACf,UAAU;AAAA,wBACV,MAAMA,EAAM;AAAA,sBAAA;AAAA,oBACd;AAAA,oBAEF,eAAe,KAAK,IAAA;AAAA,oBACpB,gBAAgBmJ,EAAM,eAAe1N,GAAU6N,CAAS;AAAA,kBAAA;AAAA,gBAC1D,CACD;AAAA,cACH,CAAC;AAGH,mBAAAhM,EAAiB7B,CAAQ,GAElBwG;AAAA,UACT;AAEF,YAAIwG,MAAS;AACX,iBAAO,MAAM;AACX,kBAAM,EAAE,YAAA7M,EAAA,IAAe0H,EAAc7H,GAAUC,GAAMC,CAAI;AACzD,mBACEC,GAAY,YAAY,WAAW,aACnCA,EAAW,WAAW,OAAO,SAAS,IAG/BA,EAAW,WAAW,OAC1B,OAAO,CAACmG,MAAQA,EAAI,aAAa,OAAO,EACxC,IAAI,CAACA,MAAQA,EAAI,OAAO,IAEtB,CAAA;AAAA,UACT;AAGF,YAAI0G,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMb,IAAW,CAACnM,GAAU,GAAGC,CAAI,EAAE,KAAK,GAAG;AAC7C,YAAA0L,EAA4B3L,GAAUwC,GAAa;AAAA,cACjD,GAAGvC;AAAA,cACH;AAAA,YAAA,CACD;AAED,kBAAM6N,IAAkBlO,EACrB,SAAA,EACA,mBAAmB,IAAIuM,CAAQ;AAClC,gBAAI,CAAC2B;AACH;AAGF,kBAAMC,IAAU9N,EAAK,KAAK,GAAG,GACvB+N,IAAiB9N,GAAM,aAAa6N,CAAO,GAC3CE,IAAiBH,EAAgB,MAAM,GAAG,EAAE,IAAA;AAWlD,gBARI,EAAAE,KAAkB,CAACA,EAAe,SAASC,CAAe,KAIhDxP;AAAA,cACZuB;AAAA,cACA8N,EAAgB,MAAM,GAAG,EAAE,MAAM,CAAC;AAAA,YAAA,MAEtB;AAId,qBAAOtB,EAAkB;AAAA,gBACvB,MAAMsB,EAAgB,MAAM,GAAG,EAAE,MAAM,CAAC;AAAA,gBACxC,aAAAtL;AAAA,gBACA,MAAAtC;AAAA,cAAA,CACD;AAAA,UACH;AAEF,YAAI8M,MAAS;AACX,iBAAO,MAAM;AAEX,kBAAMb,IAAWnM,IAAW,MAAMC,EAAK,KAAK,GAAG;AAE/B,YAAAA,EAAK,KAAK,GAAG;AAG7B,kBAAM6N,IAAkBlO,EACrB,SAAA,EACA,mBAAmB,IAAIuM,CAAQ;AAElC,gBAAI,CAAC2B;AACH,qBAAO;AAIT,kBAAM,EAAE,MAAMzN,EAAA,IAAYN,EAAaC,GAAUC,GAAMC,CAAI;AAE3D,gBAAI,CAACG;AACH,qBAAO;AAIT,kBAAM6N,IAAaJ,EAAgB,MAAM,GAAG,EAAE,IAAA;AAG9C,mBAAQzN,EAAqB,QAAQ6N,CAAoB;AAAA,UAC3D;AAEF,YAAIlB,MAAS;AACX,iBAAAlB,EAA0B9L,GAAUC,CAAI,GACjC,MAAM;AACX,YAAAX,GAAmB;AAAA,cACjB,UAAUU,IAAW,MAAMC,EAAK,KAAK,GAAG;AAAA,YAAA,CACzC;AAAA,UACH;AAGF,YAAI+M,MAAS;AACX,iBAAO,CACLmB,MACG;AAEH,kBAAM,EAAE,OAAOC,GAAa,MAAM/B,MAActM;AAAA,cAC9CC;AAAA,cACAC;AAAA,cACAC;AAAA,YAAA;AAGF,gBADAyL,EAA4B3L,GAAUwC,GAAavC,CAAI,GACnD,CAACoM,KAAa,CAAC,MAAM,QAAQ+B,CAAW;AAC1C,qBAAO,CAAA;AAGT,kBAAMC,IAAc7B,EAAkB;AAAA,cACpC,MAAAvM;AAAA,cACA,aAAAuC;AAAA,cACA,MAAAtC;AAAA,YAAA,CACD;AAED,mBAAOkO,EAAY,IAAI,CAACE,GAAOjJ,MAAU;AACvC,oBAAMD,IAAUiH,EAAUhH,CAAK;AAC/B,kBAAI,CAACD,EAAS;AAId,oBAAME,IAAW,CAAC,GAAGrF,GAAMmF,CAAO,GAE5BmJ,IAAa/B,EAAkB;AAAA,gBACnC,MAAMlH;AAAA;AAAA,gBACN,aAAA9C;AAAA,gBACA,MAAAtC;AAAA,cAAA,CACD;AAED,qBAAOiO,EAAWI,GAAYlJ,GAAOgJ,CAAW;AAAA,YAClD,CAAC;AAAA,UACH;AAGF,YAAIrB,MAAS;AACX,iBAAO,CAACmB,MAAuD;AAC7D,kBAAM/N,IAAeH,EAAK,SAAS,IAAIA,EAAK,KAAK,GAAG,IAAI,QAGlD,EAAE,MAAM+N,GAAgB,OAAOzN,MAAUR;AAAA,cAC7CC;AAAA,cACAC;AAAA,cACAC;AAAA,YAAA;AAGF,gBAAI,CAAC,MAAM,QAAQK,CAAK;AACtB,oBAAM,IAAI,MAAM,mCAAmC;AAIrD,kBAAMiO,IAAwB,CAAA;AAC9B,mBAAAjO,EAAM,QAAQ,CAAC8H,GAAMhD,MAAU;AAC7B,kBAAI8I,EAAW9F,GAAMhD,CAAK,GAAG;AAE3B,sBAAMgG,IAAK2C,EAAe3I,CAAK;AAC/B,gBAAIgG,KACFmD,EAAY,KAAKnD,CAAE;AAAA,cAEvB;AAAA,YACF,CAAC,GAGMmB,EAAkB;AAAA,cACvB,MAAAvM;AAAA,cACA,aAAAuC;AAAA,cACA,MAAM;AAAA,gBACJ,GAAGtC;AAAA,gBACH,YAAY;AAAA,kBACV,GAAIA,GAAM,cAAc,CAAA;AAAA,kBACxB,CAACE,CAAY,GAAGoO;AAAA,gBAAA;AAAA,gBAElB,YAAY;AAAA,kBACV,GAAItO,GAAM,cAAc,CAAA;AAAA,kBACxB,EAAE,MAAM,UAAU,IAAIiO,GAAY,MAAAlO,EAAA;AAAA,gBAAK;AAAA,cACzC;AAAA,YACF,CACD;AAAA,UACH;AAEF,YAAI+M,MAAS;AACX,iBAAO,CAACyB,MAA0C;AAChD,kBAAMrO,IAAeH,EAAK,SAAS,IAAIA,EAAK,KAAK,GAAG,IAAI,QAGlD,EAAE,OAAOyO,GAAc,MAAMV,MAAmBjO;AAAA,cACpDC;AAAA,cACAC;AAAA,cACAC;AAAA,YAAA;AAGF,gBAAI,CAAC,MAAM,QAAQwO,CAAY,KAAK,CAACV;AACnC,oBAAM,IAAI,MAAM,iCAAiC;AAInD,kBAAMW,IAAeD,EAAa,IAAI,CAACrG,GAAMhD,OAAW;AAAA,cACtD,MAAAgD;AAAA,cACA,KAAK2F,EAAe3I,CAAK;AAAA,YAAA,EACzB;AACF,YAAAsJ,EAAa,KAAK,CAACpD,GAAGC,MAAMiD,EAAUlD,EAAE,MAAMC,EAAE,IAAI,CAAC;AACrD,kBAAMoD,IAAYD,EAAa,IAAI,CAACjO,MAAMA,EAAE,GAAa;AAEzD,mBAAO8L,EAAkB;AAAA,cACvB,MAAAvM;AAAA,cACA,aAAAuC;AAAA,cACA,MAAM;AAAA,gBACJ,GAAGtC;AAAA,gBACH,YAAY;AAAA,kBACV,GAAIA,GAAM,cAAc,CAAA;AAAA,kBACxB,CAACE,CAAY,GAAGwO;AAAA,gBAAA;AAAA,gBAElB,YAAY;AAAA,kBACV,GAAI1O,GAAM,cAAc,CAAA;AAAA,kBACxB,EAAE,MAAM,QAAQ,IAAIuO,GAAW,MAAAxO,EAAA;AAAA,gBAAK;AAAA,cACtC;AAAA,YACF,CACD;AAAA,UACH;AAGF,YAAI+M,MAAS;AACX,iBAAO,CACLmB,wBAMoB,MAAM;AACxB,kBAAMU,IAAkBhM,EAA4B,oBAAI,KAAK,GAEvD,CAACiM,GAAexF,CAAW,IAAI7G,GAAS,CAAA,CAAE,GAE1CrC,IAAeH,EAAK,SAAS,IAAIA,EAAK,KAAK,GAAG,IAAI,QAElD8O,IAAW/D,GAAgBhL,GAAUC,GAAMC,CAAI,GAG/CuH,IAAcqD,GAAQ,OACnB;AAAA,cACL,GAAG5K;AAAA,cACH,YAAY;AAAA,gBACV,GAAIA,GAAM,cAAc,CAAA;AAAA,gBACxB,CAACE,CAAY,GAAG2O;AAAA,cAAA;AAAA,YAClB,IAED,CAAC7O,GAAME,GAAc2O,CAAQ,CAAC,GAG3B,EAAE,OAAOC,EAAA,IAAgBjP;AAAA,cAC7BC;AAAA,cACAC;AAAA,cACAwH;AAAA,YAAA;AA6CF,gBA1CAxE,EAAU,MAAM;AACd,oBAAMgM,IAAcrP,EACjB,SAAA,EACA,gBAAgB+M,GAAiB,CAACuC,MAAM;AACvC,oBAAIA,EAAE,SAAS;AACb;AAMF,sBAAMC,IAJavP,EAChB,SAAA,EACA,kBAAkBI,GAAUC,CAAI,GAER;AAC3B,oBAAIkP;AAEF,6BAAWxO,KAAOwO,EAAO;AAGvB,oBAAIxO,EAAI,WAAW6B,CAAW,KAC5B2M,EAAO,OAAOxO,CAAG;AAKvB,iBACEuO,EAAE,SAAS,YACXA,EAAE,SAAS,iBACXA,EAAE,SAAS,YACXA,EAAE,SAAS,qBACVA,EAAE,SAAS,yBACV,CAAChP,GAAM,0BAEToJ,EAAY,CAAA,CAAE;AAAA,cAElB,CAAC;AAEH,qBAAO,MAAM;AACX,gBAAA2F,EAAA;AAAA,cACF;AAAA,YAGF,GAAG,CAACzM,GAAamK,CAAe,CAAC,GAE7B,CAAC,MAAM,QAAQqC,CAAW;AAC5B,qBAAO;AAIT,kBAAMX,IAAc7B,EAAkB;AAAA,cACpC,MAAAvM;AAAA,cACA,aAAAuC;AAAA,cACA,MAAMiF;AAAA;AAAA,YAAA,CACP,GAEK2H,IAAcJ,EAAY,IAAI,CAAC3G,GAAMgH,MAAe;AACxD,oBAAMjK,IAAU2J,EAASM,CAAU;AAEnC,kBAAI,CAACjK;AACH,uBAAO;AAGT,kBAAIkK,IAAkBT,EAAgB,QAAQ,IAAIzJ,CAAO;AACzD,cAAKkK,MACHA,IAAkB5M,GAAA,GAClBmM,EAAgB,QAAQ,IAAIzJ,GAASkK,CAAe;AAGtD,oBAAMhK,IAAW,CAAC,GAAGrF,GAAMmF,CAAO;AAElC,qBAAOmK,GAAcC,IAAyB;AAAA,gBAC5C,KAAKpK;AAAA,gBACL,UAAApF;AAAA,gBACA,iBAAAsP;AAAA,gBACA,UAAAhK;AAAA,gBACA,YAAA+J;AAAA,gBACA,aAAAhB;AAAA,gBACA,mBAAA7B;AAAA,gBACA,UAAU2B;AAAA,cAAA,CACX;AAAA,YACH,CAAC;AAED,2CAAU,UAAAiB,EAAA,CAAY;AAAA,UACxB,GAEQ,EAAY;AAGxB,YAAIpC,MAAS;AACX,iBAAO,CAACyC,MAAsB;AAE5B,kBAAMrP,IAAeH,EAAK,SAAS,IAAIA,EAAK,KAAK,GAAG,IAAI,QAClDI,IAAUH,GAAM,aAAaE,CAAY,GAEzCoE,IAAe5E,EAClB,SAAA,EACA,eAAeI,GAAUC,GAAMI,CAAO;AAEzC,mBAAK,MAAM,QAAQmE,CAAY,IAExBgI,EAAkB;AAAA,cACvB,MAAM,CAAC,GAAGvM,GAAM,OAAOwP,CAAS;AAAA,cAChC,aAAAjN;AAAA,cACA,MAAAtC;AAAA,YAAA,CACD,IANwC,CAAA;AAAA,UAO3C;AAEF,YAAI8M,MAAS;AACX,iBAAO,CAAC3H,MAAkB;AACxB,kBAAMjF,IAAeH,EAAK,SAAS,IAAIA,EAAK,KAAK,GAAG,IAAI,QAClDI,IAAUH,GAAM,aAAaE,CAAY;AAE/C,gBAAIC,GAAS;AACX,oBAAMsH,IAAStH,EAAQgF,CAAK;AAC5B,qBAAKsC,IACE6E,EAAkB;AAAA,gBACvB,MAAM,CAAC,GAAGvM,GAAM0H,CAAM;AAAA,gBACtB,aAAAnF;AAAA,gBACA,MAAAtC;AAAA,cAAA,CACD,IALY;AAAA,YAMf;AAGA,kBAAMC,IAAa5B,EAAkByB,GAAUC,CAAI;AACnD,gBAAI,CAACE,GAAY,UAAW;AAE5B,kBAAMwH,IAASxH,EAAW,UAAUkF,CAAK;AACzC,gBAAKsC;AAEL,qBAAO6E,EAAkB;AAAA,gBACvB,MAAM,CAAC,GAAGvM,GAAM0H,CAAM;AAAA,gBACtB,aAAAnF;AAAA,gBACA,MAAAtC;AAAA,cAAA,CACD;AAAA,UACH;AAEF,YAAI8M,MAAS;AACX,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAMgB,EAAA,IAAmBjO,EAAaC,GAAUC,GAAMC,CAAI;AAClE,gBAAI,CAAC8N,KAAkBA,EAAe,WAAW;AAC/C;AAEF,kBAAM0B,IAAc1B,EAAeA,EAAe,SAAS,CAAC;AAE5D,gBAAI,CAAC0B;AACH;AAEF,kBAAMC,IAAU,CAAC,GAAG1P,GAAMyP,CAAW;AAErC,mBAAOlD,EAAkB;AAAA,cACvB,MAAMmD;AAAA,cACN,aAAAnN;AAAA,cACA,MAAAtC;AAAA,YAAA,CACD;AAAA,UACH;AAEF,YAAI8M,MAAS;AACX,iBAAO,CACL5F,GACA/B,MACG;AACH,YAAAwF,EAAkBzD,GAAgBnH,GAAM;AAAA,cACtC,YAAY;AAAA,cACZ,OAAAoF;AAAA,YAAA,CACD;AAAA,UACH;AAEF,YAAI2H,MAAS;AACX,iBAAO,CAAC5F,MAAoC;AAE1C,YAAAyD,EAAkBzD,GAAgBnH,GAAM;AAAA,cACtC,YAAY;AAAA,YAAA,CACb;AAAA,UACH;AAEF,YAAI+M,MAAS;AACX,iBAAO,CACL5F,GACAwI,GACAC,MACG;AACH,kBAAM,EAAE,OAAOnB,EAAA,IAAiB7G;AAAA,cAC9B7H;AAAA,cACAC;AAAA,cACAC;AAAA,YAAA,GAIIoH,IAAWxD,EAAcsD,CAAO,IAClCA,EAAQsH,CAAmB,IAC1BtH;AAEL,gBAAI0I,IAAmB;AAWvB,gBAViB,CAACpB,EAAa,KAAK,CAACrG,MAAS;AAC5C,oBAAM0H,IAAUH,IACZA,EAAO;AAAA,gBAAM,CAACI,MACZxO,EAAY6G,EAAK2H,CAAK,GAAG1I,EAAS0I,CAAK,CAAC;AAAA,cAAA,IAE1CxO,EAAY6G,GAAMf,CAAQ;AAC9B,qBAAIyI,MAASD,IAAczH,IACpB0H;AAAA,YACT,CAAC;AAGC,cAAAlF,EAAkBvD,GAAUrH,GAAM,EAAE,YAAY,UAAU;AAAA,qBACjD4P,KAAWC,GAAa;AACjC,oBAAMG,IAAcJ,EAAQC,CAAW,GACjCI,IAAexB,EAAa;AAAA,gBAAI,CAACrG,MACrC7G,EAAY6G,GAAMyH,CAAW,IAAIG,IAAc5H;AAAA,cAAA;AAGjD,cAAAwC,EAAkBqF,GAAqBjQ,GAAM;AAAA,gBAC3C,YAAY;AAAA,cAAA,CACb;AAAA,YACH;AAAA,UACF;AAEF,YAAI+M,MAAS;AACX,iBAAO,CAAC3H,GAAgBrE,MAAwC;AAC9D,kBAAMb,IAAa5B,EAAkByB,GAAUC,CAAI;AAEnD,gBAAI,CAACE,GAAY,aAAaA,EAAW,UAAU,WAAW;AAC5D;AAEF,kBAAMgQ,IACJ9K,MAAU,KACNlF,EAAW,UAAU,SAAS,IAC9BkF,MAAU,SACRA,IACAlF,EAAW,UAAU,SAAS,GAEhCiQ,IAAUjQ,EAAW,UAAUgQ,CAAU;AAC/C,YAAKC,KACLvF,EAAkB,MAAM,CAAC,GAAG5K,GAAMmQ,CAAO,GAAG;AAAA,cAC1C,YAAY;AAAA,YAAA,CACb;AAAA,UACH;AAEF,YAAIpD,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMb,IAAW,CAACnM,GAAU,GAAGC,CAAI,EAAE,KAAK,GAAG,GAEvC,EAAE,MAAM+N,EAAA,IAAmBjO,EAAaC,GAAUC,GAAMC,CAAI;AAClE,gBAAI,CAAC8N,KAAkBA,EAAe,WAAW;AAC/C;AAEF,kBAAMF,IAAkBlO,EACrB,SAAA,EACA,mBAAmB,IAAIuM,CAAQ;AAElC,gBAAI,CAAC2B;AACH;AAEF,kBAAMI,IAAaJ,EAAgB,MAAM,GAAG,EAAE,IAAA;AAE9C,gBAAI,CAAEE,EAAyB,SAASE,CAAW;AACjD;AAEF,kBAAMmC,IAAavC,EAAgB,MAAM,GAAG,EAAE,MAAM,CAAC;AACrD,YAAAlO,EAAe,SAAA,EAAW,mBAAmB,EAAE,UAAAuM,GAAU;AAEzD,kBAAMJ,IAAasE,EAAW,MAAM,GAAG,EAAE;AACzC,YAAAvE,EAA0B9L,GAAU+L,CAAU,GAE9ClB,EAAkB,MAAMwF,GAAY;AAAA,cAClC,YAAY;AAAA,YAAA,CACb;AAAA,UACH;AAEF,YAAIrD,MAAS;AACX,iBAAO,CAAC1B,MAAqC;AAC3C,kBAAM;AAAA,cACJ,SAAAzE;AAAAA,cACA,OAAOtG;AAAA,cACP,MAAAC;AAAA,YAAA,IACET,EAAaC,GAAUC,GAAMC,CAAI;AAErC,gBAAI,CAAC2G,EAAS;AAEd,kBAAMyJ,IAAQhQ,GAAcC,GAAOC,GAAM,CAAC6H,MAASA,MAASiD,CAAK;AACjE,YAAIgF,KACFzF,EAAkB,MAAM,CAAC,GAAG5K,GAAMqQ,EAAM,GAAG,GAAG;AAAA,cAC5C,YAAY;AAAA,YAAA,CACb;AAAA,UAEL;AAGF,YAAItD,MAAS;AACX,iBAAO,CAAC1B,MAAqC;AAC3C,kBAAM;AAAA,cACJ,SAAAzE;AAAAA,cACA,OAAOtG;AAAA,cACP,MAAAC;AAAA,YAAA,IACET,EAAaC,GAAUC,GAAMC,CAAI;AAErC,gBAAI,CAAC2G,EAAS;AAEd,kBAAMyJ,IAAQhQ,GAAcC,GAAOC,GAAM,CAAC6H,MAASA,MAASiD,CAAK;AAEjE,gBAAIgF,GAAO;AACT,oBAAMC,IAAc,CAAC,GAAGtQ,GAAMqQ,EAAM,GAAG;AAEvC,cAAAzF,EAAkB,MAAM0F,GAAa;AAAA,gBACnC,YAAY;AAAA,cAAA,CACb;AAAA,YACH;AACE,cAAA1F,EAAkBS,GAAcrL,GAAM,EAAE,YAAY,UAAU;AAAA,UAElE;AAEF,YAAI+M,MAAS;AACX,iBAAO,CAACwD,GAAmBC,MAAqB;AAC9C,kBAAM,EAAE,SAAA5J,GAAS,OAAAyE,GAAO,MAAA9K,MAAST,EAAaC,GAAUC,GAAMC,CAAI;AAElE,gBAAI,CAAC2G;AACH,oBAAM,IAAI,MAAM,qCAAqC;AAGvD,kBAAMyJ,IAAQhQ;AAAA,cACZgL;AAAA,cACA9K;AAAA,cACA,CAAC6H,MAASA,IAAOmI,CAAS,MAAMC;AAAA,YAAA;AAGlC,mBAAIH,IACK9D,EAAkB;AAAA,cACvB,MAAM,CAAC,GAAGvM,GAAMqQ,EAAM,GAAG;AAAA,cACzB,aAAA9N;AAAA,cACA,MAAAtC;AAAA,YAAA,CACD,IAGI;AAAA,UACT;AAEF,YAAI8M,MAAS,YAAY;AACvB,gBAAM,EAAE,OAAOoB,EAAA,IAAgBvG,EAAc7H,GAAUC,GAAMC,CAAI,GAC3D6L,IAAa9L,EAAK,MAAM,GAAG,EAAE;AACnC,iBAAA6L,EAA0B9L,GAAU+L,CAAU,GACvC,MAAM;AACX,YAAAlB,EAAkBuD,GAAanO,GAAM,EAAE,YAAY,OAAO;AAAA,UAC5D;AAAA,QACF;AAEA,YAAI+M,MAAS;AACX,iBAAO,MAAM;AACX,YAAArB,EAA4B3L,GAAUwC,GAAavC,CAAI;AACvD,kBAAM,EAAE,OAAAqL,EAAA,IAAUzD,EAAc7H,GAAUC,GAAMC,CAAI;AACpD,mBAAOoL;AAAA,UACT;AAGF,YAAI0B,MAAS;AACX,iBAAO,CAAC0D,MACNC,GAAY;AAAA,YACV,WAAW3Q;AAAA,YACX,OAAOC;AAAA,YACP,SAASyQ,EAAG,SAAA;AAAA,YACZ,OAAOxQ;AAAA,UAAA,CACR;AAGL,YAAI8M,MAAS;AACX,iBAAO,MACL2D,GAAY,EAAE,WAAW3Q,GAAU,OAAOC,GAAM,OAAOC,GAAM;AAGjE,YAAI8M,MAAS,eAAe;AAC1B,gBAAM4D,IAAU,GAAG5Q,CAAQ,IAAIC,EAAK,KAAK,GAAG,CAAC;AAC7C,iBAAOV,GAAYqR,CAAO;AAAA,QAC5B;AACA,YAAI5D,KAAQ;AACV,iBAAO,CAACrM,MACNsD,GAAqBL,IAAY,MAAM5D,IAAW,MAAMW,CAAG;AAE/D,YAAIqM,MAAS,eAAe;AAC1B,gBAAM6D,IAAkB5Q,EAAK,MAAM,GAAG,EAAE;AAGxC,cAFmB1B,EAAkByB,GAAU6Q,CAAe,GAE9C,WAAW;AACzB,kBAAMC,IAAgB9Q,IAAW,MAAM6Q,EAAgB,KAAK,GAAG,GACzD/C,IAAkBlO,EACrB,SAAA,EACA,mBAAmB,IAAIkR,CAAa,GAEjCC,IAAc/Q,IAAW,MAAMC,EAAK,KAAK,GAAG;AAElD,mBAAO6N,MAAoBiD;AAAA,UAC7B;AACA;AAAA,QACF;AAEA,YAAI/D,MAAS;AACX,iBAAO,CAAC1B,MAAmB;AACzB,kBAAMS,IAAa9L,EAAK,MAAM,GAAG,EAAE,GAC7B6Q,IAAgB9Q,IAAW,MAAM+L,EAAW,KAAK,GAAG,GACpDgF,IAAc/Q,IAAW,MAAMC,EAAK,KAAK,GAAG;AAElD,YAAA6L,EAA0B9L,GAAU+L,GAAY,MAAS,GAEnCnM,EACnB,SAAA,EACA,mBAAmB,IAAIkR,CAAa,GAEnCxF,KACF1L,EACG,SAAA,EACA,iBAAiBkR,GAAeC,CAAW;AAAA,UAElD;AAGF,YAAI/D,MAAS;AACX,iBAAO,MAAM;AACX,kBAAMjB,IAAa9L,EAAK,MAAM,GAAG,EAAE,GAC7B6Q,IAAgB9Q,IAAW,MAAM+L,EAAW,KAAK,GAAG,GACpDgF,IAAc/Q,IAAW,MAAMC,EAAK,KAAK,GAAG;AAMlD,YAJwBL,EACrB,SAAA,EACA,mBAAmB,IAAIkR,CAAa,MAEfC,IACtBnR,EACG,WACA,mBAAmB,EAAE,UAAUkR,GAAe,IAEjDlR,EACG,SAAA,EACA,iBAAiBkR,GAAeC,CAAW,GAEhDjF,EAA0B9L,GAAU+L,CAAU;AAAA,UAChD;AAGF,YAAIiB,MAAS;AACX,iBAAO,CAAChG,MAAuB;AAC7B,kBAAMgK,IAAahK,IAAU,CAAC,GAAG/G,GAAM,GAAG+G,CAAO,IAAI/G,GAC/CyN,IAAQ9N,EAAe,SAAA,GAGvBqR,IAAYvD,EAAM,cAAc1N,GAAUgR,CAAU;AAE1D,gBADA,QAAQ,IAAI,cAAcC,CAAS,GAC/B,CAACA,EAAW;AAIhB,kBAAMC,IAA2B,CAAC,CAACD,GAAWD,CAAU,CAAC;AAEzD,iBADA,QAAQ,IAAI,UAAUE,CAAK,GACpBA,EAAM,SAAS,KAAG;AACvB,oBAAM,CAACC,GAAMC,CAAQ,IAAIF,EAAM,IAAA;AAE/B,kBADA,QAAQ,IAAI,wBAAwBC,GAAMC,CAAQ,GAC9C,CAACD,KAAQ,OAAOA,KAAS,SAAU;AAGvC,kBAAIA,EAAK,OAAO,YAAY;AAE1B,gBAAAA,EAAK,MAAM,aAAa;AAAA,kBACtB,QAAQ;AAAA,kBACR,QAAQ,CAAA;AAAA,kBACR,eAAe,KAAK,IAAA;AAAA,kBACpB,gBAAgB;AAAA,gBAAA;AAIlB,sBAAME,IAAc,CAACrR,GAAU,GAAGoR,CAAQ,EAAE,KAAK,GAAG;AACpD,gBAAA1D,EAAM,sBAAsB2D,GAAa;AAAA,kBACvC,MAAM;AAAA,gBAAA,CACP;AAAA,cACH;AAGA,oBAAM7Q,IAAO,OAAO,KAAK2Q,CAAI;AAC7B,yBAAWxQ,KAAOH;AAChB,gBAAIG,MAAQ,WACVuQ,EAAM,KAAK,CAACC,EAAKxQ,CAAG,GAAG,CAAC,GAAGyQ,GAAUzQ,CAAG,CAAC,CAAC;AAAA,YAGhD;AAGA,YAAAkB,EAAiB7B,CAAQ;AAAA,UAC3B;AAEF,YAAIC,EAAK,UAAU,GAAG;AACpB,cAAI+M,MAAS;AACX,mBAAOxK;AAET,cAAIwK,MAAS;AACX,mBAAO,CAAChM,MAA4B;AAClC,cAAAD,GAAW,EAAE,UAAAf,GAAU,SAAAgB,GAAS,oBAAoB,CAAA,GAAI;AAAA,YAC1D;AAGF,cAAIgM,MAAS;AACX,mBAAO,CACL1B,GACArL,GACAqR,IAA0C,aACvC;AACH,cAAAzG,EAAkBS,GAAOrL,GAAM,EAAE,YAAAqR,EAAA,CAAY;AAAA,YAC/C;AAGF,cAAItE,MAAS;AACX,mBAAOnC;AAET,cAAImC,MAAS;AACX,mBAAO,CAACuE,MACN9R,GAAqBO,GAAUC,CAAI,GAAG,IAAIsR,CAAU;AAExD,cAAIvE,MAAS;AACX,mBAAO,CAACuE,GAAoBrN,MAC1BxE,GAAkBM,GAAUC,GAAMsR,GAAYrN,CAAI;AAEtD,cAAI8I,MAAS;AACX,mBAAO,CAACuE,MACN5R,GAAqBK,GAAUC,GAAMsR,CAAU;AAEnD,cAAIvE,MAAS;AACX,mBAAO,CACLwE,GACAjQ,MACG;AACH,cAAAiQ,EAAU,QAAQ,CAACjN,MAAU;AAC3B,sBAAMW,IACJtF,EACG,SAAA,EACA,kBAAkBI,GAAUuE,EAAM,IAAI,KAAK,CAAA;AAEhD,gBAAA3E,EACG,SAAA,EACA,kBAAkBI,GAAUuE,EAAM,MAAM;AAAA,kBACvC,GAAGW;AAAA,kBACH,YAAY;AAAA,oBACV,QAAQ;AAAA,oBACR,QAAQ;AAAA,sBACN;AAAA,wBACE,QAAQ3D,KAAU;AAAA,wBAClB,SAASgD,EAAM;AAAA,wBACf,UAAU;AAAA,wBACV,MAAMA,EAAM;AAAA,sBAAA;AAAA,oBACd;AAAA,oBAEF,eAAe,KAAK,IAAA;AAAA,oBACpB,gBAAgB;AAAA,kBAAA;AAAA,gBAClB,CACD;AAAA,cACL,CAAC;AAAA,YACH;AAGF,cAAIyI,MAAS;AACX,mBAAO,CACLyE,GAIAC,MACG;AACH,kBAAIrM;AACJ,kBACEoM,EAAU,iBACVA,EAAU,eAAe,UACzB;AACA,sBAAMtR,IAAa5B,EAAkByB,GAAUyR,EAAU,IAAI;AAC7D,oBAAItR,GAAY,WAAW;AACzB,wBAAMwR,IAAaxR,EAAW,UAAU;AAAA,oBACtCsR,EAAU;AAAA,kBAAA;AAEZ,kBAAIE,MAAe,OACjBtM,IAAQsM,IAAa;AAAA,gBAEzB;AAAA,cACF;AAEA,cAAA9G,EAAkB4G,EAAU,UAAUA,EAAU,MAAM;AAAA,gBACpD,YAAYA,EAAU;AAAA,gBACtB,QAAQA,EAAU;AAAA,gBAClB,OAAApM;AAAA;AAAA,gBACA,UAAAqM;AAAA,cAAA,CACD;AAAA,YACH;AAEF,cAAI1E,MAAS;AACX,mBAAO,CAAC4E,MAAyB;AAC/B,oBAAMlE,IAAQ9N,EAAe,SAAA,GACvB6G,IAAWiH,EAAM,kBAAkB1N,GAAU,CAAA,CAAE;AACrD,kBAAI,CAACyG,GAAU,WAAY;AAE3B,oBAAMoL,IAAc,CAACC,MACf,CAACA,KAAYA,MAAa,MAAY,CAAA,IACnCA,EACJ,MAAM,GAAG,EACT,MAAM,CAAC,EACP,IAAI,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,CAAC,GAGnD7F,wBAAyB,IAAA;AAE/B,yBAAW8F,KAASH,GAAS;AAC3B,sBAAMI,IAAeH,EAAYE,EAAM,IAAI;AAE3C,wBAAQA,EAAM,IAAA;AAAA,kBACZ,KAAK;AAAA,kBACL,KAAK,WAAW;AACd,0BAAM,EAAE,OAAAzG,MAAUyG;AAKlB,oBAAArE,EAAM,mBAAmB1N,GAAUgS,GAAc1G,CAAK,GAEtDoC,EAAM,YAAY1N,GAAUgS,GAAc,EAAE,QAAQ,IAAM;AAG1D,wBAAIrL,IAAc,CAAC,GAAGqL,CAAY;AAClC,+BAAa;AACX,4BAAMpL,IAAW8G,EAAM;AAAA,wBACrB1N;AAAA,wBACA2G;AAAA,sBAAA;AAgBF,0BAbIC,GAAU,kBACZA,EAAS,eAAe,QAAQ,CAACpE,MAAgB;AAC/C,4BAAI,CAACyJ,EAAmB,IAAIzJ,CAAW,GAAG;AACxC,gCAAMsC,IACJ2B,EAAS,YAAY,IAAIjE,CAAW;AACtC,0BAAIsC,MACFA,EAAU,YAAA,GACVmH,EAAmB,IAAIzJ,CAAW;AAAA,wBAEtC;AAAA,sBACF,CAAC,GAGCmE,EAAY,WAAW,EAAG;AAC9B,sBAAAA,EAAY,IAAA;AAAA,oBACd;AACA;AAAA,kBACF;AAAA,kBACA,KAAK,UAAU;AACb,0BAAMoF,IAAaiG,EAAa,MAAM,GAAG,EAAE;AAC3C,oBAAAtE,EAAM,yBAAyB1N,GAAUgS,CAAY,GACrDtE,EAAM,YAAY1N,GAAU+L,GAAY,EAAE,QAAQ,IAAM;AAGxD,wBAAIpF,IAAc,CAAC,GAAGoF,CAAU;AAChC,+BAAa;AACX,4BAAMnF,IAAW8G,EAAM;AAAA,wBACrB1N;AAAA,wBACA2G;AAAA,sBAAA;AAeF,0BAbIC,GAAU,kBACZA,EAAS,eAAe,QAAQ,CAACpE,MAAgB;AAC/C,4BAAI,CAACyJ,EAAmB,IAAIzJ,CAAW,GAAG;AACxC,gCAAMsC,IACJ2B,EAAS,YAAY,IAAIjE,CAAW;AACtC,0BAAIsC,MACFA,EAAU,YAAA,GACVmH,EAAmB,IAAIzJ,CAAW;AAAA,wBAEtC;AAAA,sBACF,CAAC,GAGCmE,EAAY,WAAW,EAAG;AAC9B,sBAAAA,EAAY,IAAA;AAAA,oBACd;AACA;AAAA,kBACF;AAAA,gBAAA;AAAA,cAEJ;AAAA,YACF;AAGF,cAAIqG,MAAS;AACX,mBAAO,MAAMzO,EAAkByB,GAAU,CAAA,CAAE,GAAG;AAAA,QAClD;AAEA,YAAIgN,MAAS;AACX,iBAAO,CAAC;AAAA,YACN,UAAAiF;AAAA,YACA,aAAAC;AAAA,UAAA,MAKA,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,UACEF,IAAc,EAAE,YAAY,EAAE,SAAS,GAAA,MAAS;AAAA,cAElD,MAAAjS;AAAA,cACA,UAAAD;AAAA,cAEC,UAAAiS;AAAA,YAAA;AAAA,UAAA;AAKP,YAAIjF,MAAS,aAAc,QAAOhN;AAClC,YAAIgN,MAAS,SAAU,QAAO/M;AAC9B,YAAI+M,MAAS;AACX,iBAAO,CAAC5F,OACNyD,EAAkBzD,GAAgBnH,GAAM,EAAE,YAAY,UAAU,GAEzD;AAAA,YACL,QAAQ,MAAM;AACZ,oBAAME,IAAaP,EAChB,SAAA,EACA,kBAAkBI,GAAUC,CAAI;AAEnC,cAAAzB,EAAkBwB,GAAUC,GAAM;AAAA,gBAChC,GAAGE;AAAA,gBACH,SAAS;AAAA,gBACT,aAAa;AAAA,gBACb,gBAAgB,KAAK,IAAA;AAAA,cAAI,CAC1B;AAED,oBAAMyK,IAAW,CAAC5K,GAAU,GAAGC,CAAI,EAAE,KAAK,GAAG;AAC7C,cAAAT,GAAsBoL,GAAU;AAAA,gBAC9B,MAAM;AAAA,gBACN,SAAS;AAAA,cAAA,CACV;AAAA,YACH;AAAA,UAAA;AAIN,YAAIoC,MAAS,WAAW;AACtB,gBAAM,EAAE,OAAOqF,EAAA,IAAuBxK;AAAA,YACpC7H;AAAA,YACAC;AAAA,YACAC;AAAA,UAAA;AAGF,cAAI,OAAOmS,KAAsB;AAC/B,kBAAM,IAAI,MAAM,6CAA6C;AAE/D,iBAAO,MAAM;AACX,YAAAxH,EAAkB,CAACwH,GAA2BpS,GAAM;AAAA,cAClD,YAAY;AAAA,YAAA,CACb;AAAA,UACH;AAAA,QACF;AACA,YAAI+M,MAAS;AAEX,iBAAO,CACLsF,GACAC,MACG;AAEH,kBAAMC,IAAkB,MAAM,QAAQF,CAAI,GAGpCnJ,IAAeqJ,IAAkBF,IAAO,QACxCG,IAAWD,IAAkBD,IAAOD;AAE1C,gBAAI,CAACG,KAAY,OAAOA,KAAa;AACnC,oBAAM,IAAI;AAAA,gBACR;AAAA,cAAA;AAIJ,mBACE,gBAAAN;AAAA,cAACO;AAAA,cAAA;AAAA,gBACC,UAAA1S;AAAA,gBACA,MAAAC;AAAA,gBACA,cAAAkJ;AAAA,gBACA,mBAAAqD;AAAA,gBACA,UAAAiG;AAAA,cAAA;AAAA,YAAA;AAAA,UAGN;AAEF,YAAIzF,MAAS;AACX,iBAAO,CAAC2F,GAAuBC,MAE3B,gBAAAT;AAAA,YAACU;AAAA,YAAA;AAAA,cACC,UAAA7S;AAAA,cACA,MAAAC;AAAA,cACA,mBAAAuM;AAAA,cACA,UAAU3B;AAAA,cACV,UAAA+H;AAAA,cACA,UAAUD;AAAA,YAAA;AAAA,UAAA;AAKlB,cAAMvF,IAAW,CAAC,GAAGnN,GAAM+M,CAAI;AAC/B,eAAOR,EAAkB;AAAA,UACvB,MAAMY;AAAA,UACN,aAAA5K;AAAA,UACA,MAAAtC;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA,GAGI4S,IAAgB,IAAI,MAAMlG,GAAaC,CAAO;AACpD,WAAAN,EAAW,IAAIG,GAAUoG,CAAa,GAE/BA;AAAA,EACT;AAGA,QAAM3F,IAAmB;AAAA,IACvB,uBAAuB,CAAC4F,MAAqC;AAC3D,YAAM5S,IAAaP,EAChB,SAAA,EACA,kBAAkBI,GAAU,EAAE;AACjC,UAAIgT;AAEJ,MAAI7S,GAAY,gBAAgB,YAAYA,EAAW,kBACrD6S,IAAc7S,EAAW,kBAEzB6S,IAAcpT,EAAe,WAAW,mBAAmBI,CAAQ,GAGrEZ,GAA6BY,CAAQ,GACrCtB,EAAsBsB,GAAUgT,CAAW,GAE3CxG,EAAkB;AAAA,QAChB,MAAM,CAAA;AAAA,QACN,aAAaF;AAAA,MAAA,CACd;AAGD,YAAMmB,IAAmBpP,EAAkB2B,CAAkB,GACvD6J,IAAW/F,EAAW2J,GAAkB,cAAc,GAAG,IAC3DA,GAAkB,cAAc,IAAIuF,CAAW,IAC/CvF,GAAkB,cAAc,KAC9B1J,IAAa,GAAGH,CAAS,IAAI5D,CAAQ,IAAI6J,CAAQ;AACvD,aAAI9F,KACF,aAAa,WAAWA,CAAU,GAGpClC,EAAiB7B,CAAQ,GAElBgT;AAAA,IACT;AAAA,IACA,gCAAgC,CAACC,MAAgB;AAC/C,MAAAtU,GAA8BqB,GAAUiT,CAAQ,GAChDpR,EAAiB7B,CAAQ;AAAA,IAC3B;AAAA,IACA,qBAAqB,CAACiT,MAAgB;AACpC,YAAMC,IAAkBnI;AAAA,QACtB/K;AAAA,QACA6K;AAAA,QACAyB;AAAA,QACA1I;AAAA,MAAA,GAEI7B,IACJnC,EAAe,SAAA,EAAW,mBAAmBI,CAAQ,GACjDyN,IAAmBpP,EAAkB2B,CAAkB,GACvD6J,IAAW/F,EAAW2J,GAAkB,cAAc,GAAG,IAC3DA,GAAkB,cAAc,IAAI1L,CAAY,IAChD0L,GAAkB,cAAc,KAE9B1J,IAAa,GAAGH,CAAS,IAAI5D,CAAQ,IAAI6J,CAAQ;AAEvD,aAAI,aAAa,QAAQ9F,CAAU,KACjC,aAAa,WAAWA,CAAU,GAEpCoP,GAAgB,MAAM;AACpB,QAAA7U,GAAyB0B,GAAUiT,CAAQ,GAC3CvU,EAAsBsB,GAAUiT,CAAQ;AAGxC,cAAMrO,IAAahF,EAChB,SAAA,EACA,kBAAkBI,GAAU,EAAE;AAEjC,QAAI4E,KACFA,GAAY,YAAY,QAAQ,CAACE,MAAc;AAC7C,UAAAA,EAAU,YAAA;AAAA,QACZ,CAAC;AAAA,MAEL,CAAC,GAEM;AAAA,QACL,SAAS,CAACkL,MAAoBkD,EAAgB,KAAA,EAAelD,CAAK;AAAA,MAAA;AAAA,IAEtE;AAAA,EAAA;AAQF,SALoBxD,EAAkB;AAAA,IACpC,aAAaF;AAAA,IACb,MAAM,CAAA;AAAA,EAAC,CACR;AAGH;AAEO,SAASqE,GAAYyC,GAMzB;AACD,SAAO7D,GAAc8D,IAAgB,EAAE,OAAAD,GAAO;AAChD;AAEA,SAASC,GAAe;AAAA,EACtB,OAAAD;AACF,GAOG;AACD,QAAME,IAAazQ,EAAwB,IAAI,GACzC0Q,IAAgB1Q,EAAsB,IAAI,GAC1C2Q,IAAa3Q,EAAO,EAAK,GACzB4Q,IAAW,GAAGL,EAAM,SAAS,IAAIA,EAAM,MAAM,KAAK,GAAG,CAAC,IAEtDhT,IAAegT,EAAM,MAAM,SAAS,IAAIA,EAAM,MAAM,KAAK,GAAG,IAAI,QAChE/S,IAAU+S,EAAM,OAAO,aAAahT,CAAY,GAEhDkL,IAAQ7M,EAAe2U,EAAM,WAAWA,EAAM,OAAO/S,CAAO;AAElE,SAAA4C,EAAU,MAAM;AACd,UAAMyQ,IAAUJ,EAAW;AAC3B,QAAI,CAACI,KAAWF,EAAW,QAAS;AAEpC,UAAMG,IAAY,WAAW,MAAM;AACjC,UAAI,CAACD,EAAQ,eAAe;AAC1B,gBAAQ,KAAK,uCAAuCD,CAAQ;AAC5D;AAAA,MACF;AAEA,YAAMG,IAAgBF,EAAQ,eAExBzN,IADa,MAAM,KAAK2N,EAAc,UAAU,EAC1B,QAAQF,CAAO;AAE3C,UAAI1N,IAAW4N,EAAc,aAAa,gBAAgB;AAC1D,MAAK5N,MACHA,IAAW,UAAU,OAAO,WAAA,CAAY,IACxC4N,EAAc,aAAa,kBAAkB5N,CAAQ,IAGvDuN,EAAc,UAAU,YAAY,OAAO,WAAA,CAAY;AAEvD,YAAMrO,IACJtF,EACG,WACA,kBAAkBwT,EAAM,WAAWA,EAAM,KAAK,KAAK,CAAA,GAClDS,IAAU3O,EAAY,WAAW,CAAA;AACvC,MAAA2O,EAAQ,KAAK;AAAA,QACX,YAAYN,EAAc;AAAA,QAC1B,UAAAvN;AAAA,QACA,UAAAC;AAAA,QACA,QAAQmN,EAAM;AAAA,MAAA,CACf,GAEDxT,EACG,WACA,kBAAkBwT,EAAM,WAAWA,EAAM,OAAO;AAAA,QAC/C,GAAGlO;AAAA,QACH,SAAA2O;AAAA,MAAA,CACD;AAEH,UAAI9N,IAAeuF;AACnB,UAAI8H,EAAM;AACR,YAAI;AACF,UAAArN,IAAe,IAAI;AAAA,YACjB;AAAA,YACA,WAAWqN,EAAM,OAAO;AAAA,UAAA,EACxB9H,CAAK;AAAA,QACT,SAAShF,GAAK;AACZ,kBAAQ,MAAM,qCAAqCA,CAAG;AAAA,QACxD;AAGF,MAAIP,MAAiB,QAAQ,OAAOA,KAAiB,aACnDA,IAAe,KAAK,UAAUA,CAAY;AAE5C,YAAM+N,IAAW,SAAS,eAAe,OAAO/N,KAAgB,EAAE,CAAC;AACnE,MAAA2N,EAAQ,YAAYI,CAAQ,GAC5BN,EAAW,UAAU;AAAA,IACvB,GAAG,CAAC;AAEJ,WAAO,MAAM;AAEX,UADA,aAAaG,CAAS,GAClBJ,EAAc,SAAS;AACzB,cAAMrO,IACJtF,EACG,WACA,kBAAkBwT,EAAM,WAAWA,EAAM,KAAK,KAAK,CAAA;AACxD,QAAIlO,EAAY,YACdA,EAAY,UAAUA,EAAY,QAAQ;AAAA,UACxC,CAAC6O,MAAMA,EAAE,eAAeR,EAAc;AAAA,QAAA,GAExC3T,EACG,WACA,kBAAkBwT,EAAM,WAAWA,EAAM,OAAOlO,CAAW;AAAA,MAElE;AAAA,IACF;AAAA,EACF,GAAG,CAAA,CAAE,GAEEqK,GAAc,QAAQ;AAAA,IAC3B,KAAK+D;AAAA,IACL,OAAO,EAAE,SAAS,WAAA;AAAA,IAClB,kBAAkBG;AAAA,EAAA,CACnB;AACH;"}
@@ -15,4 +15,4 @@ export {
15
15
  r as config,
16
16
  u as useCogsConfig
17
17
  };
18
- //# sourceMappingURL=CogsStateClient.jsx.map
18
+ //# sourceMappingURL=CogsStateClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CogsStateClient.js","sources":["../src/CogsStateClient.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport React, { createContext, useContext } from \"react\";\r\ntype ConfigType = { sessionId?: string };\r\nexport const config: ConfigType = {\r\n sessionId: undefined,\r\n};\r\n\r\nconst CogsContext = createContext<ConfigType>(config);\r\n\r\nexport const useCogsConfig = () => useContext(CogsContext);\r\n\r\nexport function CogsStateClient({\r\n children,\r\n sessionId,\r\n}: {\r\n children: React.ReactNode;\r\n sessionId?: string;\r\n}) {\r\n return (\r\n <CogsContext.Provider value={{ sessionId }}>\r\n {children}\r\n </CogsContext.Provider>\r\n );\r\n}\r\n"],"names":["config","CogsContext","createContext","useCogsConfig","useContext","CogsStateClient","children","sessionId","jsx"],"mappings":";;;AAIO,MAAMA,IAAqB;AAAA,EAChC,WAAW;AACb,GAEMC,IAAcC,EAA0BF,CAAM,GAEvCG,IAAgB,MAAMC,EAAWH,CAAW;AAElD,SAASI,EAAgB;AAAA,EAC9B,UAAAC;AAAA,EACA,WAAAC;AACF,GAGG;AACD,SACE,gBAAAC,EAACP,EAAY,UAAZ,EAAqB,OAAO,EAAE,WAAAM,EAAA,GAC5B,UAAAD,GACH;AAEJ;"}
@@ -346,4 +346,4 @@ export {
346
346
  nt as ValidationWrapper,
347
347
  B as useRegisterComponent
348
348
  };
349
- //# sourceMappingURL=Components.jsx.map
349
+ //# sourceMappingURL=Components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Components.js","sources":["../src/Components.tsx"],"sourcesContent":["import {\r\n FormElementParams,\r\n StateObject,\r\n UpdateTypeDetail,\r\n type FormOptsType,\r\n} from './CogsState';\r\nimport { pluginStore } from './pluginStore';\r\nimport {\r\n createMetadataContext,\r\n createScopedMetadataContext,\r\n PluginsApi,\r\n toDeconstructedMethods,\r\n} from './plugins';\r\nimport React, {\r\n memo,\r\n RefObject,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n useMemo,\r\n} from 'react';\r\nimport { getGlobalStore, ValidationError, ValidationSeverity } from './store';\r\nimport { useInView } from 'react-intersection-observer';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isDeepEqual } from './utility';\r\nimport { runValidation } from './validation';\r\n\r\nconst {\r\n getInitialOptions,\r\n\r\n getShadowMetadata,\r\n setShadowMetadata,\r\n getShadowValue,\r\n\r\n registerComponent,\r\n unregisterComponent,\r\n\r\n notifyPathSubscribers,\r\n subscribeToPath,\r\n} = getGlobalStore.getState();\r\nconst { stateHandlers, notifyFormUpdate } = pluginStore.getState();\r\n\r\nexport type ValidationWrapperProps = {\r\n formOpts?: FormOptsType;\r\n path: string[];\r\n stateKey: string;\r\n children: React.ReactNode;\r\n};\r\n\r\nexport function ValidationWrapper({\r\n formOpts,\r\n path,\r\n stateKey,\r\n children,\r\n}: ValidationWrapperProps) {\r\n const { getInitialOptions, getShadowMetadata, getShadowValue } =\r\n getGlobalStore.getState();\r\n const thisStateOpts = getInitialOptions(stateKey!);\r\n\r\n const shadowMeta = getShadowMetadata(stateKey!, path);\r\n const validationState = shadowMeta?.validation;\r\n\r\n const status = validationState?.status || 'NOT_VALIDATED';\r\n\r\n const errors = (validationState?.errors || []).map((err) => ({\r\n ...err,\r\n path: path,\r\n })) as ValidationError[];\r\n const errorMessages = errors\r\n .filter((err) => err.severity === 'error')\r\n .map((err) => err.message);\r\n const warningMessages = errors\r\n .filter((err) => err.severity === 'warning')\r\n .map((err) => err.message);\r\n\r\n // Use first error, or first warning if no errors\r\n const message = errorMessages[0] || warningMessages[0];\r\n const primarySeverity: ValidationSeverity =\r\n errorMessages.length > 0\r\n ? 'error'\r\n : warningMessages.length > 0\r\n ? 'warning'\r\n : undefined;\r\n const { registeredPlugins } = pluginStore.getState();\r\n const pluginsApi: PluginsApi = {};\r\n\r\n // We iterate over ALL registered plugins in the app.\r\n registeredPlugins.forEach((plugin) => {\r\n if (thisStateOpts && thisStateOpts.hasOwnProperty(plugin.name)) {\r\n const pluginName = plugin.name;\r\n\r\n const hookData = pluginStore\r\n .getState()\r\n .getHookResult(stateKey!, pluginName);\r\n\r\n const scopedMetadata = createScopedMetadataContext(\r\n stateKey!,\r\n pluginName,\r\n path\r\n );\r\n\r\n pluginsApi[pluginName] = {\r\n hookData,\r\n getFieldMetaData: scopedMetadata.getFieldMetaData,\r\n setFieldMetaData: scopedMetadata.setFieldMetaData,\r\n removeFieldMetaData: scopedMetadata.removeFieldMetaData,\r\n };\r\n }\r\n });\r\n\r\n return (\r\n <>\r\n {thisStateOpts?.formElements?.validation &&\r\n !formOpts?.validation?.disable ? (\r\n thisStateOpts.formElements!.validation!({\r\n children: (\r\n <React.Fragment key={path.toString()}>{children}</React.Fragment>\r\n ),\r\n status, // Now passes the new ValidationStatus type\r\n message: formOpts?.validation?.hideMessage\r\n ? ''\r\n : formOpts?.validation?.message || message || '',\r\n severity: primarySeverity,\r\n hasErrors: errorMessages.length > 0,\r\n hasWarnings: warningMessages.length > 0,\r\n allErrors: errors,\r\n path: path,\r\n getData: () => getShadowValue(stateKey!, path),\r\n plugins: pluginsApi,\r\n })\r\n ) : (\r\n <React.Fragment key={path.toString()}>{children}</React.Fragment>\r\n )}\r\n </>\r\n );\r\n}\r\nexport const MemoizedCogsItemWrapper = memo(\r\n ListItemWrapper,\r\n (prevProps, nextProps) => {\r\n // Re-render if any of these change:\r\n return (\r\n prevProps.itemPath.join('.') === nextProps.itemPath.join('.') &&\r\n prevProps.stateKey === nextProps.stateKey &&\r\n prevProps.itemComponentId === nextProps.itemComponentId &&\r\n prevProps.localIndex === nextProps.localIndex\r\n );\r\n }\r\n);\r\n\r\nexport function ListItemWrapper({\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n localIndex,\r\n arraySetter,\r\n rebuildStateShape,\r\n renderFn,\r\n}: {\r\n stateKey: string;\r\n itemComponentId: string;\r\n itemPath: string[];\r\n localIndex: number;\r\n arraySetter: any;\r\n rebuildStateShape: any;\r\n renderFn: any;\r\n}) {\r\n const [, forceUpdate] = useState({});\r\n const { ref: inViewRef, inView } = useInView();\r\n const elementRef = useRef<HTMLElement | null>(null); // Changed to HTMLElement to be generic\r\n\r\n const fullKey = [stateKey, ...itemPath].join('.');\r\n\r\n useRegisterComponent(stateKey, itemComponentId, forceUpdate);\r\n\r\n const setRefs = useCallback(\r\n (element: HTMLElement | null) => {\r\n elementRef.current = element;\r\n inViewRef(element);\r\n },\r\n [inViewRef]\r\n );\r\n\r\n useEffect(() => {\r\n const unsubscribe = subscribeToPath(fullKey, (e) => {\r\n forceUpdate({});\r\n });\r\n return () => unsubscribe();\r\n }, [fullKey]);\r\n\r\n const itemValue = getShadowValue(stateKey, itemPath);\r\n if (itemValue === undefined) return null;\r\n\r\n const itemSetter = rebuildStateShape({\r\n currentState: itemValue,\r\n path: itemPath,\r\n componentId: itemComponentId,\r\n });\r\n\r\n // 1. Render the user's content (e.g. the <tr>)\r\n const children = renderFn(itemSetter, localIndex, arraySetter);\r\n\r\n // 2. AUTO-DETECT: If it is a single valid element (<tr>, <div>, <li>), inject the ref.\r\n if (React.isValidElement(children)) {\r\n // We clone the element and force our ref onto it\r\n return React.cloneElement(children as React.ReactElement<any>, {\r\n ref: (node: any) => {\r\n // Apply our virtualization ref\r\n setRefs(node);\r\n\r\n // Preserve any ref the user might have put on the element themselves\r\n const { ref: existingRef } = children as any;\r\n if (typeof existingRef === 'function') {\r\n existingRef(node);\r\n } else if (existingRef && 'current' in existingRef) {\r\n (existingRef as any).current = node;\r\n }\r\n },\r\n });\r\n }\r\n\r\n // 3. Fallback: If they returned a Fragment or string, we MUST wrap it to measure it.\r\n // (Note: This specific fallback will still break inside a <tbody>, but\r\n // as long as you return a <tr> above, line 90 catches it).\r\n return <div ref={setRefs}>{children}</div>;\r\n}\r\n\r\nexport function FormElementWrapper({\r\n stateKey,\r\n path,\r\n rebuildStateShape,\r\n renderFn,\r\n formOpts,\r\n setState,\r\n}: {\r\n stateKey: string;\r\n path: string[];\r\n rebuildStateShape: (options: {\r\n path: string[];\r\n componentId: string;\r\n meta?: any;\r\n }) => any;\r\n renderFn: (params: FormElementParams<any>) => React.ReactNode;\r\n formOpts?: FormOptsType;\r\n setState: any;\r\n}) {\r\n const componentId = useRef(uuidv4()).current;\r\n\r\n const [, forceUpdate] = useState({});\r\n const formElementRef = useRef<any>(null);\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n // Get the shadow node to access typeInfo and schema\r\n const shadowNode = getGlobalStore.getState().getShadowNode(stateKey, path);\r\n const typeInfo = shadowNode?._meta?.typeInfo;\r\n\r\n const globalStateValue = getShadowValue(stateKey, path);\r\n const [localValue, setLocalValue] = useState<any>(globalStateValue);\r\n const isCurrentlyDebouncing = useRef(false);\r\n const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n useEffect(() => {\r\n if (\r\n !isCurrentlyDebouncing.current &&\r\n !isDeepEqual(globalStateValue, localValue)\r\n ) {\r\n setLocalValue(globalStateValue);\r\n }\r\n }, [globalStateValue]);\r\n\r\n useEffect(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Initialize clientActivityState if needed\r\n const currentMeta = getShadowMetadata(stateKey, path) || {};\r\n if (!currentMeta.clientActivityState) {\r\n currentMeta.clientActivityState = { elements: new Map() };\r\n }\r\n\r\n // Detect element type from the ref\r\n const detectElementType = () => {\r\n const el = formElementRef.current;\r\n if (!el) return 'input';\r\n const tagName = el.tagName.toLowerCase();\r\n if (tagName === 'textarea') return 'textarea';\r\n if (tagName === 'select') return 'select';\r\n if (tagName === 'input') {\r\n const type = (el as HTMLInputElement).type;\r\n if (type === 'checkbox') return 'checkbox';\r\n if (type === 'radio') return 'radio';\r\n if (type === 'range') return 'range';\r\n if (type === 'file') return 'file';\r\n }\r\n return 'input';\r\n };\r\n\r\n // Add this element to the Map\r\n currentMeta.clientActivityState.elements.set(componentId, {\r\n domRef: formElementRef,\r\n elementType: detectElementType(),\r\n inputType: formElementRef.current?.type,\r\n mountedAt: Date.now(),\r\n });\r\n\r\n setShadowMetadata(stateKey, path, currentMeta);\r\n\r\n // Subscribe to path updates\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (newValue) => {\r\n if (!isCurrentlyDebouncing.current && localValue !== newValue) {\r\n forceUpdate({});\r\n }\r\n });\r\n\r\n // Cleanup\r\n return () => {\r\n unsubscribe();\r\n\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n isCurrentlyDebouncing.current = false;\r\n }\r\n\r\n // Remove element from Map\r\n const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements) {\r\n meta.clientActivityState.elements.delete(componentId);\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdate = useCallback(\r\n (newValue: any) => {\r\n // Type conversion logic (keep existing)\r\n if (typeInfo) {\r\n if (typeInfo.type === 'number' && typeof newValue === 'string') {\r\n newValue =\r\n newValue === ''\r\n ? typeInfo.nullable\r\n ? null\r\n : (typeInfo.default ?? 0)\r\n : Number(newValue);\r\n } else if (\r\n typeInfo.type === 'boolean' &&\r\n typeof newValue === 'string'\r\n ) {\r\n newValue = newValue === 'true' || newValue === '1';\r\n } else if (typeInfo.type === 'date' && typeof newValue === 'string') {\r\n newValue = new Date(newValue);\r\n }\r\n } else {\r\n const currentType = typeof globalStateValue;\r\n if (currentType === 'number' && typeof newValue === 'string') {\r\n newValue = newValue === '' ? 0 : Number(newValue);\r\n }\r\n }\r\n\r\n setLocalValue(newValue);\r\n\r\n // Update input activity details\r\n const { getShadowMetadata, setShadowMetadata } =\r\n getGlobalStore.getState();\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId);\r\n if (element && element.currentActivity?.type === 'focus') {\r\n element!.currentActivity.details = {\r\n ...element!.currentActivity.details,\r\n value: newValue,\r\n previousValue:\r\n element!.currentActivity.details?.value || globalStateValue,\r\n inputLength:\r\n typeof newValue === 'string' ? newValue.length : undefined,\r\n keystrokeCount:\r\n (element!.currentActivity.details?.keystrokeCount || 0) + 1,\r\n };\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n }\r\n const element = meta?.clientActivityState?.elements?.get(componentId);\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'input', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n details: {\r\n value: newValue,\r\n inputLength:\r\n typeof newValue === 'string' ? newValue.length : undefined,\r\n isComposing: false, // You'd need to track this from the actual input event\r\n isPasting: false, // You'd need to track this from paste events\r\n keystrokeCount:\r\n (element?.currentActivity?.details?.keystrokeCount || 0) + 1,\r\n },\r\n });\r\n // Validation (keep existing)\r\n const virtualOperation: UpdateTypeDetail = {\r\n stateKey,\r\n path,\r\n newValue: newValue,\r\n updateType: 'update',\r\n timeStamp: Date.now(),\r\n status: 'new',\r\n oldValue: globalStateValue,\r\n };\r\n runValidation(virtualOperation, 'onChange');\r\n\r\n // Debounce state update (keep existing)\r\n isCurrentlyDebouncing.current = true;\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n }\r\n\r\n const debounceTime = formOpts?.debounceTime ?? 200;\r\n debounceTimeoutRef.current = setTimeout(() => {\r\n isCurrentlyDebouncing.current = false;\r\n setState(newValue, path, {\r\n updateType: 'update',\r\n validationTrigger: 'onChange',\r\n });\r\n }, debounceTime);\r\n },\r\n [\r\n setState,\r\n path,\r\n formOpts?.debounceTime,\r\n typeInfo,\r\n globalStateValue,\r\n stateKey,\r\n componentId,\r\n ]\r\n );\r\n\r\n const handleFocus = useCallback(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Update element's current activity\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId)!;\r\n element.currentActivity = {\r\n type: 'focus',\r\n startTime: Date.now(),\r\n details: {\r\n value: localValue,\r\n inputLength:\r\n typeof localValue === 'string' ? localValue.length : undefined,\r\n },\r\n };\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'focus', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n details: {\r\n cursorPosition: formElementRef.current?.selectionStart,\r\n },\r\n });\r\n }, [stateKey, path, componentId, localValue]);\r\n const handleBlur = useCallback(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Clear debounce if active\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n debounceTimeoutRef.current = null;\r\n isCurrentlyDebouncing.current = false;\r\n setState(localValue, path, {\r\n updateType: 'update',\r\n validationTrigger: 'onBlur',\r\n });\r\n }\r\n\r\n // Clear element's current activity\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId)!;\r\n element.currentActivity = undefined;\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n const focusStartTime =\r\n meta?.clientActivityState?.elements?.get(componentId)?.currentActivity\r\n ?.startTime;\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'blur', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n duration: focusStartTime ? Date.now() - focusStartTime : undefined,\r\n details: {\r\n duration: focusStartTime ? Date.now() - focusStartTime : 0,\r\n },\r\n });\r\n\r\n // Run validation if configured\r\n const validationOptions = getInitialOptions(stateKey)?.validation;\r\n if (validationOptions?.onBlur) {\r\n const virtualOperation: UpdateTypeDetail = {\r\n stateKey,\r\n path,\r\n newValue: localValue,\r\n updateType: 'update',\r\n timeStamp: Date.now(),\r\n status: 'new',\r\n oldValue: globalStateValue,\r\n };\r\n runValidation(virtualOperation, 'onBlur');\r\n }\r\n }, [localValue, setState, path, stateKey, componentId, globalStateValue]);\r\n\r\n const baseState = rebuildStateShape({\r\n path: path,\r\n componentId: componentId,\r\n meta: undefined,\r\n });\r\n\r\n const stateWithInputProps = new Proxy(baseState, {\r\n get(target, prop) {\r\n if (prop === '$inputProps') {\r\n return {\r\n value: localValue ?? '',\r\n onChange: (e: any) => {\r\n debouncedUpdate(e.target.value);\r\n },\r\n onFocus: handleFocus,\r\n onBlur: handleBlur,\r\n ref: formElementRef,\r\n };\r\n }\r\n\r\n return target[prop];\r\n },\r\n });\r\n\r\n const initialElement = renderFn(stateWithInputProps);\r\n\r\n return (\r\n <ValidationWrapper formOpts={formOpts} path={path} stateKey={stateKey}>\r\n {initialElement}\r\n </ValidationWrapper>\r\n );\r\n}\r\nexport function useRegisterComponent(\r\n stateKey: string,\r\n componentId: string,\r\n forceUpdate: (o: object) => void\r\n) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n useLayoutEffect(() => {\r\n registerComponent(stateKey, fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n reactiveType: ['component'],\r\n });\r\n return () => {\r\n unregisterComponent(stateKey, fullComponentId);\r\n };\r\n }, [stateKey, fullComponentId]);\r\n}\r\n\r\nexport function IsolatedComponentWrapper({\r\n stateKey,\r\n path, // The path of the parent node (e.g. ['form'])\r\n dependencies, // NEW: Optional array of Proxy objects or path arrays\r\n rebuildStateShape,\r\n renderFn,\r\n}: {\r\n stateKey: string;\r\n path: string[];\r\n dependencies?: any[]; // The explicit list of dependencies\r\n rebuildStateShape: (options: any) => any;\r\n renderFn: (state: any) => React.ReactNode;\r\n}) {\r\n const [componentId] = useState(() => uuidv4());\r\n const [, forceUpdate] = useState({});\r\n\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n\r\n const pathsToSubscribe = useMemo(() => {\r\n if (dependencies && dependencies.length > 0) {\r\n return dependencies.map((dep) => {\r\n return [stateKey, ...dep.$_path].join('.');\r\n });\r\n }\r\n\r\n return [[stateKey, ...path].join('.')];\r\n }, [stateKey, path, dependencies]);\r\n\r\n // 2. Subscribe to ALL calculated paths\r\n useEffect(() => {\r\n const store = getGlobalStore.getState();\r\n\r\n // Create an array of unsubscribe functions\r\n const unsubs = pathsToSubscribe.map((fullPathKey) => {\r\n return store.subscribeToPath(fullPathKey, () => {\r\n forceUpdate({});\r\n });\r\n });\r\n\r\n return () => {\r\n unsubs.forEach((unsub) => unsub());\r\n };\r\n }, [pathsToSubscribe]);\r\n\r\n const baseState = rebuildStateShape({\r\n path: path,\r\n componentId: componentId,\r\n meta: undefined,\r\n });\r\n\r\n return <>{renderFn(baseState)}</>;\r\n}\r\n// 1. Define the MINIMAL props needed.\r\ntype PluginWrapperProps = {\r\n children: React.ReactNode;\r\n stateKey: string;\r\n path: string[];\r\n pluginName: string;\r\n wrapperDepth: number;\r\n};\r\n\r\nconst PluginWrapper = memo(function PluginWrapper({\r\n children,\r\n stateKey,\r\n path,\r\n pluginName,\r\n wrapperDepth,\r\n}: PluginWrapperProps) {\r\n const [, forceUpdate] = useState({});\r\n\r\n useEffect(() => {\r\n const fullPathKey = [stateKey, ...path].join('.');\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(fullPathKey, () => {\r\n forceUpdate({});\r\n });\r\n return unsubscribe;\r\n }, [stateKey, path]);\r\n\r\n const plugin = pluginStore\r\n .getState()\r\n .registeredPlugins.find((p) => p.name === pluginName);\r\n\r\n const stateHandler: StateObject<any> | undefined = pluginStore\r\n .getState()\r\n .stateHandlers.get(stateKey);\r\n\r\n const typeInfo = getGlobalStore.getState().getShadowNode(stateKey, path)\r\n ?._meta?.typeInfo;\r\n\r\n const options = pluginStore\r\n .getState()\r\n .pluginOptions.get(stateKey)\r\n ?.get(pluginName);\r\n\r\n const hookData = pluginStore.getState().getHookResult(stateKey, pluginName);\r\n\r\n if (!plugin?.formWrapper || !stateHandler) {\r\n return <>{children}</>;\r\n }\r\n\r\n const deconstructed = toDeconstructedMethods(stateHandler);\r\n const scopedMetadataContext = createScopedMetadataContext(\r\n stateKey,\r\n plugin.name,\r\n path\r\n );\r\n return plugin.formWrapper({\r\n element: children,\r\n path,\r\n stateKey,\r\n pluginName: plugin.name,\r\n ...deconstructed,\r\n\r\n ...scopedMetadataContext,\r\n options,\r\n hookData,\r\n fieldType: typeInfo?.type,\r\n wrapperDepth,\r\n });\r\n});\r\n"],"names":["getInitialOptions","getShadowMetadata","setShadowMetadata","getShadowValue","registerComponent","unregisterComponent","notifyPathSubscribers","subscribeToPath","getGlobalStore","stateHandlers","notifyFormUpdate","pluginStore","ValidationWrapper","formOpts","path","stateKey","children","thisStateOpts","validationState","status","errors","err","errorMessages","warningMessages","message","primarySeverity","registeredPlugins","pluginsApi","plugin","pluginName","hookData","scopedMetadata","createScopedMetadataContext","jsx","Fragment","React","MemoizedCogsItemWrapper","memo","ListItemWrapper","prevProps","nextProps","itemComponentId","itemPath","localIndex","arraySetter","rebuildStateShape","renderFn","forceUpdate","useState","inViewRef","inView","useInView","elementRef","useRef","fullKey","useRegisterComponent","setRefs","useCallback","element","useEffect","unsubscribe","e","itemValue","itemSetter","node","existingRef","FormElementWrapper","setState","componentId","uuidv4","formElementRef","stateKeyPathKey","typeInfo","globalStateValue","localValue","setLocalValue","isCurrentlyDebouncing","debounceTimeoutRef","isDeepEqual","currentMeta","detectElementType","el","tagName","type","newValue","meta","debouncedUpdate","runValidation","debounceTime","handleFocus","handleBlur","focusStartTime","baseState","stateWithInputProps","target","prop","initialElement","fullComponentId","useLayoutEffect","IsolatedComponentWrapper","dependencies","pathsToSubscribe","useMemo","dep","store","unsubs","fullPathKey","unsub","wrapperDepth","p","stateHandler","options","deconstructed","toDeconstructedMethods","scopedMetadataContext"],"mappings":"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"}
@@ -134,4 +134,4 @@ function J({ children: r }) {
134
134
  export {
135
135
  J as PluginRunner
136
136
  };
137
- //# sourceMappingURL=PluginRunner.jsx.map
137
+ //# sourceMappingURL=PluginRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginRunner.js","sources":["../src/PluginRunner.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState, useRef, useReducer } from 'react';\r\nimport { ClientActivityEvent, pluginStore } from './pluginStore';\r\nimport { isDeepEqual } from './utility';\r\nimport {\r\n createMetadataContext,\r\n createScopedMetadataContext,\r\n toDeconstructedMethods,\r\n} from './plugins';\r\nimport type { CogsPlugin } from './plugins';\r\nimport type { StateObject, UpdateTypeDetail } from './CogsState';\r\nimport { ClientActivityState, FormEventType } from './store';\r\n\r\nconst { setHookResult, removeHookResult } = pluginStore.getState();\r\n\r\nconst PluginInstance = React.memo(\r\n ({\r\n stateKey,\r\n plugin,\r\n options,\r\n stateHandler,\r\n }: {\r\n stateKey: string;\r\n plugin: CogsPlugin<any, any, any, any, any>;\r\n options: any;\r\n stateHandler: StateObject<any>;\r\n }) => {\r\n const [isInitialMount, setIsInitialMount] = useState(true);\r\n const metadataContext = useMemo(\r\n () => createMetadataContext(stateKey, plugin.name),\r\n [stateKey, plugin.name]\r\n );\r\n\r\n const deconstructed = useMemo(\r\n () => toDeconstructedMethods(stateHandler),\r\n [stateHandler]\r\n );\r\n\r\n const hookContext = useMemo(\r\n () => ({\r\n stateKey,\r\n pluginName: plugin.name,\r\n isInitialMount,\r\n options,\r\n ...deconstructed,\r\n ...metadataContext,\r\n }),\r\n [\r\n stateKey,\r\n plugin.name,\r\n isInitialMount,\r\n options,\r\n deconstructed,\r\n metadataContext,\r\n ]\r\n );\r\n\r\n const hookData = plugin.useHook ? plugin.useHook(hookContext) : undefined;\r\n\r\n useEffect(() => {\r\n setIsInitialMount(false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (plugin.useHook) setHookResult(stateKey, plugin.name, hookData);\r\n else removeHookResult(stateKey, plugin.name);\r\n return () => removeHookResult(stateKey, plugin.name);\r\n }, [stateKey, plugin.name, !!plugin.useHook, hookData]);\r\n\r\n const lastProcessedOptionsRef = useRef<any>();\r\n const [isInitialTransform, setIsInitialTransform] = useState(true);\r\n\r\n useEffect(() => {\r\n if (plugin.transformState) {\r\n if (!isDeepEqual(options, lastProcessedOptionsRef.current)) {\r\n plugin.transformState({\r\n stateKey,\r\n pluginName: plugin.name,\r\n options,\r\n hookData,\r\n isInitialTransform,\r\n ...deconstructed,\r\n ...metadataContext,\r\n });\r\n lastProcessedOptionsRef.current = options;\r\n setIsInitialTransform(false);\r\n }\r\n }\r\n }, [\r\n stateKey,\r\n plugin,\r\n options,\r\n hookData,\r\n isInitialTransform,\r\n deconstructed,\r\n metadataContext,\r\n ]);\r\n\r\n const hookDataRef = useRef(hookData);\r\n hookDataRef.current = hookData;\r\n\r\n useEffect(() => {\r\n if (!plugin.onUpdate) return;\r\n\r\n const handleUpdate = (update: UpdateTypeDetail) => {\r\n if (update.stateKey === stateKey) {\r\n // Create a new, SCOPED context for this specific path\r\n const scopedMetadata = createScopedMetadataContext(\r\n stateKey,\r\n plugin.name,\r\n update.path\r\n );\r\n\r\n plugin.onUpdate!({\r\n stateKey,\r\n pluginName: plugin.name,\r\n update,\r\n path: update.path,\r\n options,\r\n hookData: hookDataRef.current,\r\n ...deconstructed,\r\n ...scopedMetadata, // <-- Use the new scoped context\r\n });\r\n }\r\n };\r\n\r\n const unsubscribe = pluginStore\r\n .getState()\r\n .subscribeToUpdates(handleUpdate);\r\n return unsubscribe;\r\n }, [stateKey, plugin, options, deconstructed]);\r\n\r\n useEffect(() => {\r\n if (!plugin.onFormUpdate) return;\r\n\r\n const handleFormUpdate = (\r\n event: ClientActivityEvent // Use the proper type\r\n ) => {\r\n if (event.stateKey === stateKey) {\r\n // Create a new, SCOPED context for this specific path\r\n const scopedMetadata = createScopedMetadataContext(\r\n stateKey,\r\n plugin.name,\r\n event.path\r\n );\r\n\r\n plugin.onFormUpdate!({\r\n stateKey,\r\n pluginName: plugin.name,\r\n path: event.path,\r\n event: event,\r\n options,\r\n hookData: hookDataRef.current,\r\n ...deconstructed,\r\n ...scopedMetadata, // <-- Use the new scoped context\r\n });\r\n }\r\n };\r\n\r\n const unsubscribe = pluginStore\r\n .getState()\r\n .subscribeToFormUpdates(handleFormUpdate);\r\n return unsubscribe;\r\n }, [stateKey, plugin, options, deconstructed]);\r\n\r\n return null;\r\n }\r\n);\r\n/**\r\n * The main orchestrator component. It reads from the central pluginStore\r\n * and renders a `PluginInstance` controller for each active plugin.\r\n */\r\nexport function PluginRunner({ children }: { children: React.ReactNode }) {\r\n // A simple way to force a re-render when the store changes.\r\n const [, forceUpdate] = useReducer((c) => c + 1, 0);\r\n\r\n // Subscribe to the store. When plugins or their options are added/removed,\r\n // this component will re-render to update the list of PluginInstances.\r\n useEffect(() => {\r\n const unsubscribe = pluginStore.subscribe(forceUpdate);\r\n return unsubscribe;\r\n }, []);\r\n\r\n const { pluginOptions, stateHandlers, registeredPlugins } =\r\n pluginStore.getState();\r\n\r\n return (\r\n <>\r\n {/*\r\n This declarative mapping is the core of the solution.\r\n React will now manage adding and removing `PluginInstance` components\r\n as the application state changes, ensuring hooks are handled safely.\r\n */}\r\n {Array.from(pluginOptions.entries()).map(([stateKey, pluginMap]) => {\r\n const stateHandler = stateHandlers.get(stateKey);\r\n if (!stateHandler) {\r\n return null; // Don't render a runner if the state handler isn't ready.\r\n }\r\n\r\n return Array.from(pluginMap.entries()).map(([pluginName, options]) => {\r\n const plugin = registeredPlugins.find((p) => p.name === pluginName);\r\n if (!plugin) {\r\n return null; // Don't render if the plugin is not in the registered list.\r\n }\r\n\r\n // Render a dedicated, memoized controller for this specific plugin configuration.\r\n return (\r\n <PluginInstance\r\n key={`${stateKey}:${pluginName}`}\r\n stateKey={stateKey}\r\n plugin={plugin}\r\n options={options}\r\n stateHandler={stateHandler}\r\n />\r\n );\r\n });\r\n })}\r\n\r\n {children}\r\n </>\r\n );\r\n}\r\n"],"names":["setHookResult","removeHookResult","pluginStore","PluginInstance","React","stateKey","plugin","options","stateHandler","isInitialMount","setIsInitialMount","useState","metadataContext","useMemo","createMetadataContext","deconstructed","toDeconstructedMethods","hookContext","hookData","useEffect","lastProcessedOptionsRef","useRef","isInitialTransform","setIsInitialTransform","isDeepEqual","hookDataRef","handleUpdate","update","scopedMetadata","createScopedMetadataContext","handleFormUpdate","event","PluginRunner","children","forceUpdate","useReducer","c","pluginOptions","stateHandlers","registeredPlugins","jsxs","Fragment","pluginMap","pluginName","p","jsx"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import { $cogsSignal as r, addStateOptions as o, createCogsState as a, useCogsStateFn as n } from "./CogsState.jsx";
2
- import { CogsStateClient as d, config as g, useCogsConfig as i } from "./CogsStateClient.jsx";
1
+ import { $cogsSignal as r, addStateOptions as o, createCogsState as a, useCogsStateFn as n } from "./CogsState.js";
2
+ import { CogsStateClient as d, config as g, useCogsConfig as i } from "./CogsStateClient.js";
3
3
  import { debounce as f, deepMerge as p, deleteNestedProperty as u, getArrayLengthDifferences as S, getArrayLengthDifferencesArray as l, getDifferences as x, getDifferencesArray as C, isArray as m, isDeepEqual as y, isFunction as h, isObject as D, transformStateFunc as A, updateNestedProperty as b } from "./utility.js";
4
4
  import { useCogsTrpcValidationLink as P } from "./TRPCValidationLink.js";
5
5
  import { buildShadowNode as F, generateId as L, getGlobalStore as N, shadowStateStore as k, updateShadowTypeInfo as I } from "./store.js";
6
6
  import { createMetadataContext as T, createPluginContext as j, createScopedMetadataContext as q, keyedSchema as E, toDeconstructedMethods as G } from "./plugins.js";
7
- import { PluginRunner as V } from "./PluginRunner.jsx";
7
+ import { PluginRunner as V } from "./PluginRunner.js";
8
8
  export {
9
9
  r as $cogsSignal,
10
10
  d as CogsStateClient,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.475",
3
+ "version": "0.5.476",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"file":"CogsState.jsx","sources":["../src/CogsState.tsx"],"sourcesContent":["'use client';\r\nimport { pluginStore } from './pluginStore';\r\nimport { FormWrapperParams, type CogsPlugin } from './plugins';\r\nimport {\r\n createElement,\r\n startTransition,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type ReactNode,\r\n type RefObject,\r\n} from 'react';\r\n\r\nimport {\r\n transformStateFunc,\r\n isFunction,\r\n type GenericObject,\r\n isArray,\r\n getDifferences,\r\n} from './utility.js';\r\nimport {\r\n FormElementWrapper,\r\n IsolatedComponentWrapper,\r\n MemoizedCogsItemWrapper,\r\n ValidationWrapper,\r\n} from './Components.js';\r\nimport { isDeepEqual } from './utility.js';\r\nimport superjson from 'superjson';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport {\r\n getGlobalStore,\r\n updateShadowTypeInfo,\r\n ValidationError,\r\n ValidationSeverity,\r\n ValidationStatus,\r\n type ComponentsType,\r\n} from './store.js';\r\nimport { useCogsConfig } from './CogsStateClient.js';\r\nimport { Operation } from 'fast-json-patch';\r\n\r\nimport * as z3 from 'zod/v3';\r\n\r\nimport { runValidation } from './validation';\r\nimport { ZodType } from 'zod/v4';\r\n\r\nexport type Prettify<T> = T extends any ? { [K in keyof T]: T[K] } : never;\r\n\r\nexport type SyncInfo = {\r\n timeStamp: number;\r\n userId: number;\r\n};\r\n\r\nexport type FormElementParams<T> = StateObject<T> & {\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<\r\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\r\n >\r\n ) => void;\r\n onBlur?: (\r\n event: React.FocusEvent<\r\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\r\n >\r\n ) => void;\r\n };\r\n};\r\n\r\nexport type StateKeys = string;\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\n\r\nexport type FormControl<T> = (obj: FormElementParams<T>) => JSX.Element;\r\n\r\nexport type UpdateArg<S> = S | ((prevState: S) => S);\r\nexport type InsertParams<S> =\r\n | S\r\n | ((prevState: { state: S; uuid: string }) => S);\r\nexport type UpdateType<T> = (payload: UpdateArg<T>) => { synced: () => void };\r\n\r\nexport type InsertType<T> = (payload: InsertParams<T>, index?: number) => void;\r\nexport type InsertTypeObj<T> = (payload: InsertParams<T>) => void;\r\n\r\ntype EffectFunction<T, R> = (state: T, deps: any[]) => R;\r\nexport type PerPathFormOptsType<\r\n TState,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = Omit<FormOptsType, 'formElements'> & {\r\n formElements?: FormsElementsType<TState, TPlugins>;\r\n};\r\nexport type FormOptsType = {\r\n validation?: {\r\n hideMessage?: boolean;\r\n message?: string;\r\n\r\n props?: GenericObject;\r\n disable?: boolean;\r\n };\r\n\r\n debounceTime?: number;\r\n sync?: {\r\n allowInvalidValues?: boolean; // default: false\r\n };\r\n};\r\n\r\n// Separate type for array-element-specific methods\r\nexport type ArrayElementExtras<TParentArray = unknown> = {\r\n $cutThis: () => void;\r\n $_index: number;\r\n};\r\n\r\n// EndType - NO $cutThis here, it's purely contextual\r\nexport type EndType<\r\n T,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = {\r\n $getPluginMetaData: (pluginName: string) => Record<string, any>;\r\n $addPluginMetaData: (key: string, data: Record<string, any>) => void;\r\n $removePluginMetaData: (key: string) => void;\r\n $setOptions: (options: OptionsType<T>) => void;\r\n $addZodValidation: (\r\n errors: ValidationError[],\r\n source?: 'client' | 'sync_engine' | 'api'\r\n ) => void;\r\n $clearValidation: (paths?: string[]) => void;\r\n $applyOperation: (\r\n operation: UpdateTypeDetail,\r\n metaData?: Record<string, any>\r\n ) => void;\r\n $applyJsonPatch: (patches: any[]) => void;\r\n $update: UpdateType<T>;\r\n $_path: string[];\r\n $_stateKey: string;\r\n $isolate: {\r\n (\r\n renderFn: (state: StateObject<T, TPlugins>) => React.ReactNode\r\n ): JSX.Element;\r\n (\r\n dependencies: any[],\r\n renderFn: (state: StateObject<T, TPlugins>) => React.ReactNode\r\n ): JSX.Element;\r\n };\r\n $formElement: (\r\n control: FormControl<T>,\r\n opts?: PerPathFormOptsType<T, TPlugins>\r\n ) => JSX.Element;\r\n $get: () => T;\r\n $$get: () => T;\r\n $$derive: <R>(fn: EffectFunction<T, R>) => R;\r\n $_status: 'fresh' | 'dirty' | 'synced' | 'restored' | 'unknown';\r\n $getStatus: () => 'fresh' | 'dirty' | 'synced' | 'restored' | 'unknown';\r\n $showValidationErrors: () => string[];\r\n $setValidation: (ctx: string) => void;\r\n $removeValidation: (ctx: string) => void;\r\n $isSelected: boolean;\r\n $setSelected: (value: boolean) => void;\r\n $toggleSelected: () => void;\r\n $formInput: {\r\n setDisabled: (isDisabled: boolean) => void;\r\n focus: () => void;\r\n blur: () => void;\r\n scrollIntoView: (options?: ScrollIntoViewOptions) => void;\r\n click: () => void;\r\n selectText: () => void;\r\n };\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};\r\n\r\n// Helper type for element returned from array methods\r\nexport type ArrayElementState<\r\n TElement,\r\n TParentArray,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = StateObject<TElement, TPlugins> & ArrayElementExtras<TParentArray>;\r\n\r\nexport type ArrayEndType<\r\n TShape extends unknown,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[],\r\n> = {\r\n (): TShape;\r\n (newValue: TShape | ((prev: TShape) => TShape)): void;\r\n\r\n $findWith: <K extends keyof Prettify<InferArrayElement<TShape>>>(\r\n key: K,\r\n value: Prettify<InferArrayElement<TShape>>[K]\r\n ) =>\r\n | ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>\r\n | undefined;\r\n\r\n // Returns element WITH $cutThis\r\n $index: (\r\n index: number\r\n ) => ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>;\r\n\r\n $insert: InsertType<Prettify<InferArrayElement<TShape>>>;\r\n $insertMany: (payload: InferArrayElement<TShape>[]) => void;\r\n $cut: CutFunctionType<TShape>;\r\n $cutSelected: () => void;\r\n $cutByValue: (value: string | number | boolean) => void;\r\n $toggleByValue: (value: string | number | boolean) => void;\r\n\r\n // Returns array StateObject (chainable)\r\n $sort: (\r\n compareFn: (\r\n a: Prettify<InferArrayElement<TShape>>,\r\n b: Prettify<InferArrayElement<TShape>>\r\n ) => number\r\n ) => StateObject<TShape, TPlugins>;\r\n\r\n // Callback receives element WITH $cutThis\r\n $list: (\r\n callbackfn: (\r\n setter: ArrayElementState<\r\n Prettify<InferArrayElement<TShape>>,\r\n TShape,\r\n TPlugins\r\n >,\r\n index: number,\r\n arraySetter: StateObject<TShape, TPlugins>\r\n ) => void\r\n ) => any;\r\n\r\n $map: <U>(\r\n callbackfn: (\r\n setter: ArrayElementState<\r\n Prettify<InferArrayElement<TShape>>,\r\n TShape,\r\n TPlugins\r\n >,\r\n index: number,\r\n arraySetter: StateObject<TShape, TPlugins>\r\n ) => U\r\n ) => U[];\r\n\r\n $stateFlattenOn: <K extends keyof Prettify<InferArrayElement<TShape>>>(\r\n field: K\r\n ) => StateObject<\r\n InferArrayElement<Prettify<InferArrayElement<TShape>>[K]>[],\r\n TPlugins\r\n >;\r\n\r\n $uniqueInsert: (\r\n payload: InsertParams<Prettify<InferArrayElement<TShape>>>,\r\n fields?: (keyof Prettify<InferArrayElement<TShape>>)[],\r\n onMatch?: (existingItem: any) => any\r\n ) => void;\r\n\r\n // Returns element WITH $cutThis\r\n $find: (\r\n callbackfn: (\r\n value: Prettify<InferArrayElement<TShape>>,\r\n index: number\r\n ) => boolean\r\n ) =>\r\n | ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>\r\n | undefined;\r\n\r\n // Returns array StateObject (chainable)\r\n $filter: (\r\n callbackfn: (\r\n value: Prettify<InferArrayElement<TShape>>,\r\n index: number\r\n ) => boolean\r\n ) => StateObject<TShape, TPlugins>;\r\n\r\n // Returns element WITH $cutThis\r\n $getSelected: () =>\r\n | ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>\r\n | undefined;\r\n\r\n $clearSelected: () => void;\r\n $getSelectedIndex: () => number;\r\n\r\n // Returns element WITH $cutThis\r\n $last: () =>\r\n | ArrayElementState<Prettify<InferArrayElement<TShape>>, TShape, TPlugins>\r\n | undefined;\r\n} & EndType<TShape, TPlugins>; // NO $cutThis on arrays themselves\r\n\r\nexport type StateObject<\r\n T,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = {\r\n (): T;\r\n (newValue: T | ((prev: T) => T)): void;\r\n} & (T extends any[]\r\n ? ArrayEndType<T, TPlugins>\r\n : T extends Record<string, unknown> | object\r\n ? { [K in keyof T]-?: StateObject<T[K], TPlugins> }\r\n : EndType<T, TPlugins>) & // primitives just get EndType\r\n EndType<T, TPlugins> & {\r\n // NO third param = no $cutThis\r\n $toggle: T extends boolean ? () => void : never;\r\n $validate: () => { success: boolean; data?: T; error?: any };\r\n $_componentId: string | null;\r\n $getComponents: () => ComponentsType;\r\n $_initialState: T;\r\n $updateInitialState: (newState: T | null) => {\r\n fetchId: (field: keyof T) => string | number;\r\n };\r\n $initializeAndMergeShadowState: (newState: any | null) => void;\r\n $_isLoading: boolean;\r\n $_serverState: T;\r\n $revertToInitialState: (obj?: { validationKey?: string }) => T;\r\n $middleware: (\r\n middles: ({\r\n updateLog,\r\n update,\r\n }: {\r\n updateLog: UpdateTypeDetail[] | undefined;\r\n update: UpdateTypeDetail;\r\n }) => void\r\n ) => void;\r\n $getLocalStorage: (key: string) => LocalStorageData<T> | null;\r\n };\r\n\r\nexport type CogsUpdate<T extends unknown> = UpdateType<T>;\r\n\r\ntype EffectiveSetStateArg<\r\n T,\r\n UpdateType extends 'update' | 'insert' | 'cut',\r\n> = UpdateType extends 'insert'\r\n ? T extends any[]\r\n ? InsertParams<InferArrayElement<T>>\r\n : never\r\n : UpdateArg<T>;\r\n\r\ntype UpdateOptions = {\r\n updateType: 'insert' | 'cut' | 'update' | 'insert_many';\r\n validationTrigger?: 'onBlur' | 'onChange' | 'programmatic';\r\n itemId?: string;\r\n index?: number;\r\n metaData?: Record<string, any>;\r\n};\r\ntype EffectiveSetState<TStateObject> = (\r\n newStateOrFunction:\r\n | EffectiveSetStateArg<TStateObject, 'update'>\r\n | EffectiveSetStateArg<TStateObject, 'insert'>\r\n | null,\r\n path: string[],\r\n updateObj: UpdateOptions, // Now includes itemId\r\n validationKey?: string\r\n) => void;\r\n\r\nexport type UpdateTypeDetail = {\r\n timeStamp: number;\r\n stateKey: string;\r\n updateType: 'update' | 'insert' | 'cut' | 'insert_many';\r\n path: string[];\r\n status: 'new' | 'sent' | 'synced';\r\n oldValue: any;\r\n newValue: any;\r\n userId?: number;\r\n itemId?: string;\r\n insertAfterId?: string;\r\n metaData?: Record<string, any>;\r\n};\r\nexport type ReactivityUnion = 'none' | 'component' | 'deps' | 'all';\r\nexport type ReactivityType =\r\n | 'none'\r\n | 'component'\r\n | 'deps'\r\n | 'all'\r\n | Array<Prettify<'none' | 'component' | 'deps' | 'all'>>;\r\n\r\n// Define the return type of the sync hook locally\r\n\r\ntype ValidationOptionsType = {\r\n key?: string;\r\n zodSchemaV3?: z3.ZodType<any, any, any>;\r\n zodSchemaV4?: ZodType;\r\n onBlur?: 'error' | 'warning';\r\n onChange?: 'error' | 'warning';\r\n blockSync?: boolean;\r\n};\r\n\r\ntype SyncOptionsType<TApiParams> = {\r\n apiParams: TApiParams;\r\n stateKey?: string;\r\n stateRoom:\r\n | number\r\n | string\r\n | (({ clientId }: { clientId: string }) => string | null);\r\n connect?: boolean;\r\n inMemoryState?: boolean;\r\n};\r\n\r\nexport type CreateStateOptionsType<\r\n T extends unknown = unknown,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = {\r\n formElements?: FormsElementsType<T, TPlugins>;\r\n validation?: ValidationOptionsType;\r\n plugins?: TPlugins;\r\n};\r\nexport type OptionsType<\r\n T extends unknown = unknown,\r\n TApiParams = never,\r\n> = CreateStateOptionsType & {\r\n log?: boolean;\r\n componentId?: string;\r\n syncOptions?: SyncOptionsType<TApiParams>;\r\n\r\n serverState?: {\r\n id?: string | number;\r\n data?: T;\r\n status?: 'pending' | 'error' | 'success' | 'loading';\r\n timestamp?: number;\r\n merge?:\r\n | boolean\r\n | {\r\n strategy: 'append' | 'prepend' | 'diff';\r\n key?: string;\r\n };\r\n };\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?: ({ update }: { update: UpdateTypeDetail }) => void;\r\n\r\n localStorage?: {\r\n key: string | ((state: T) => string);\r\n onChange?: (state: T) => void;\r\n };\r\n\r\n reactiveDeps?: (state: T) => any[] | true;\r\n reactiveType?: ReactivityType;\r\n syncUpdate?: Partial<UpdateTypeDetail>;\r\n\r\n defaultState?: T;\r\n\r\n dependencies?: any[];\r\n};\r\ntype ScopedPluginApi<THookReturn, TFieldMetaData> = {\r\n hookData: THookReturn;\r\n getFieldMetaData: () => TFieldMetaData | undefined;\r\n setFieldMetaData: (data: Partial<TFieldMetaData>) => void;\r\n // Add any other scoped functions or data a plugin might need here\r\n};\r\nexport type FormsElementsType<\r\n TState,\r\n TPlugins extends readonly CogsPlugin<any, any, any, any, any>[] = [],\r\n> = {\r\n // These optional, built-in wrappers are unchanged.\r\n validation?: (options: {\r\n children: React.ReactNode;\r\n status: ValidationStatus;\r\n severity: ValidationSeverity;\r\n hasErrors: boolean;\r\n hasWarnings: boolean;\r\n allErrors: ValidationError[];\r\n path: string[];\r\n message?: string;\r\n getData?: () => TState;\r\n plugins: {\r\n // It maps over the plugins...\r\n [P in TPlugins[number] as P['name']]: P extends CogsPlugin<\r\n any,\r\n any,\r\n infer THookReturn,\r\n any,\r\n infer TFieldMetaData\r\n >\r\n ? // ...and provides the scoped API for each one.\r\n ScopedPluginApi<THookReturn, TFieldMetaData>\r\n : never;\r\n };\r\n }) => React.ReactNode;\r\n syncRender?: (options: {\r\n children: React.ReactNode;\r\n time: number;\r\n data?: TState;\r\n key?: string;\r\n }) => React.ReactNode;\r\n};\r\nexport type CogsInitialState<T> =\r\n | {\r\n initialState: T;\r\n }\r\n | CreateStateOptionsType<T>;\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\nconst {\r\n getInitialOptions,\r\n updateInitialStateGlobal,\r\n getShadowMetadata,\r\n setShadowMetadata,\r\n getShadowValue,\r\n initializeShadowState,\r\n initializeAndMergeShadowState,\r\n updateShadowAtPath,\r\n insertShadowArrayElement,\r\n insertManyShadowArrayElements,\r\n removeShadowArrayElement,\r\n setInitialStateOptions,\r\n setServerStateUpdate,\r\n markAsDirty,\r\n addPathComponent,\r\n clearSelectedIndexesForState,\r\n addStateLog,\r\n clearSelectedIndex,\r\n getSyncInfo,\r\n notifyPathSubscribers,\r\n getPluginMetaDataMap,\r\n setPluginMetaData,\r\n removePluginMetaData,\r\n} = getGlobalStore.getState();\r\n\r\nconst { notifyUpdate } = pluginStore.getState();\r\n\r\nfunction getArrayData(stateKey: string, path: string[], meta?: MetaData) {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n const isArray = !!shadowMeta?.arrayKeys;\r\n\r\n if (!isArray) {\r\n const value = getGlobalStore.getState().getShadowValue(stateKey, path);\r\n return { isArray: false, value, keys: [] };\r\n }\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey] ?? shadowMeta.arrayKeys;\r\n\r\n // FIX: If the derived view is empty, return an empty array and keys.\r\n if (Array.isArray(viewIds) && viewIds.length === 0) {\r\n return { isArray: true, value: [], keys: [] };\r\n }\r\n\r\n const value = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path, viewIds);\r\n\r\n return { isArray: true, value, keys: viewIds ?? [] };\r\n}\r\n\r\nfunction findArrayItem(\r\n array: any[],\r\n keys: string[],\r\n predicate: (item: any, index: number) => boolean\r\n): { key: string; index: number; value: any } | null {\r\n for (let i = 0; i < array.length; i++) {\r\n if (predicate(array[i], i)) {\r\n const key = keys[i];\r\n if (key) {\r\n return { key, index: i, value: array[i] };\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction setAndMergeOptions(stateKey: string, newOptions: OptionsType<any>) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n\r\n const mergedOptions = {\r\n ...initialOptions,\r\n ...newOptions,\r\n };\r\n\r\n // FIX: Apply the same default onBlur logic here too\r\n if (\r\n (mergedOptions.validation?.zodSchemaV4 ||\r\n mergedOptions.validation?.zodSchemaV3) &&\r\n !mergedOptions.validation?.onBlur\r\n ) {\r\n mergedOptions.validation.onBlur = 'error';\r\n }\r\n\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n}\r\n\r\nfunction setOptions<StateKey, Opt>({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n}: {\r\n stateKey: StateKey;\r\n options?: OptionsType<any>;\r\n initialOptionsPart: Record<string, any>;\r\n}) {\r\n const initialOptions = getInitialOptions(stateKey as string) || {};\r\n const initialOptionsPartState = initialOptionsPart[stateKey as string] || {};\r\n\r\n let mergedOptions = { ...initialOptionsPartState, ...initialOptions };\r\n let needToAdd = false;\r\n\r\n if (options) {\r\n const deepMerge = (target: any, source: any) => {\r\n for (const key in source) {\r\n if (source.hasOwnProperty(key)) {\r\n if (\r\n source[key] instanceof Object &&\r\n !Array.isArray(source[key]) &&\r\n target[key] instanceof Object\r\n ) {\r\n if (!isDeepEqual(target[key], source[key])) {\r\n deepMerge(target[key], source[key]);\r\n needToAdd = true;\r\n }\r\n } else {\r\n if (target[key] !== source[key]) {\r\n target[key] = source[key];\r\n needToAdd = true;\r\n }\r\n }\r\n }\r\n }\r\n return target;\r\n };\r\n\r\n mergedOptions = deepMerge(mergedOptions, options);\r\n }\r\n\r\n // Set default onBlur\r\n if (mergedOptions.validation) {\r\n const onBlurProvided =\r\n options?.validation?.hasOwnProperty('onBlur') ||\r\n initialOptions?.validation?.hasOwnProperty('onBlur') ||\r\n initialOptionsPartState?.validation?.hasOwnProperty('onBlur');\r\n\r\n if (!onBlurProvided) {\r\n mergedOptions.validation.onBlur = 'error';\r\n needToAdd = true;\r\n }\r\n }\r\n\r\n if (needToAdd) {\r\n setInitialStateOptions(stateKey as string, mergedOptions);\r\n\r\n // NEW: Update type info if validation schema was added\r\n const hadSchema =\r\n initialOptions?.validation?.zodSchemaV4 ||\r\n initialOptions?.validation?.zodSchemaV3;\r\n const hasNewSchemaV4 =\r\n mergedOptions.validation?.zodSchemaV4 &&\r\n !initialOptions?.validation?.zodSchemaV4;\r\n const hasNewSchemaV3 =\r\n mergedOptions.validation?.zodSchemaV3 &&\r\n !initialOptions?.validation?.zodSchemaV3;\r\n\r\n if (!hadSchema && (hasNewSchemaV4 || hasNewSchemaV3)) {\r\n if (hasNewSchemaV4) {\r\n updateShadowTypeInfo(\r\n stateKey as string,\r\n mergedOptions.validation.zodSchemaV4,\r\n 'zod4'\r\n );\r\n } else if (hasNewSchemaV3) {\r\n updateShadowTypeInfo(\r\n stateKey as string,\r\n mergedOptions.validation.zodSchemaV3,\r\n 'zod3'\r\n );\r\n }\r\n\r\n // Notify components to re-render with updated validation\r\n notifyComponents(stateKey as string);\r\n }\r\n }\r\n\r\n return mergedOptions;\r\n}\r\nexport function addStateOptions<T>(\r\n initialState: T,\r\n options: CreateStateOptionsType<T>\r\n) {\r\n return {\r\n ...options,\r\n initialState,\r\n _addStateOptions: true,\r\n };\r\n}\r\nexport type PluginData = {\r\n plugin: CogsPlugin<any, any, any, any, any>;\r\n options: any;\r\n hookData?: any;\r\n};\r\n\r\n////////////////////////////////\r\n\r\nexport const createCogsState = <\r\n State extends Record<string, unknown>,\r\n const TPlugins extends readonly CogsPlugin<string, any, any, any, any>[] = [],\r\n>(\r\n initialState: State,\r\n opt?: {\r\n plugins?: TPlugins;\r\n formElements?: FormsElementsType<State, TPlugins>;\r\n validation?: ValidationOptionsType;\r\n }\r\n) => {\r\n type PluginOptions = {\r\n [K in TPlugins[number] as K['name']]?: K extends CogsPlugin<\r\n string,\r\n infer O,\r\n any,\r\n any,\r\n any\r\n >\r\n ? O\r\n : never;\r\n };\r\n\r\n if (opt?.plugins) {\r\n pluginStore.getState().setRegisteredPlugins(opt.plugins as any);\r\n }\r\n\r\n const [statePart, initialOptionsPart] =\r\n transformStateFunc<State>(initialState);\r\n\r\n // FIX: Store options INCLUDING validation for each state key\r\n Object.keys(statePart).forEach((key) => {\r\n let existingOptions = initialOptionsPart[key] || {};\r\n\r\n const mergedOptions: any = {\r\n ...existingOptions,\r\n };\r\n\r\n if (opt?.formElements) {\r\n mergedOptions.formElements = {\r\n ...opt.formElements,\r\n ...(existingOptions.formElements || {}),\r\n };\r\n }\r\n\r\n mergedOptions.validation = {\r\n onBlur: 'error',\r\n ...opt?.validation,\r\n ...(existingOptions.validation || {}),\r\n };\r\n\r\n if (opt?.validation?.key && !existingOptions.validation?.key) {\r\n mergedOptions.validation.key = `${opt.validation.key}.${key}`;\r\n }\r\n\r\n const existingGlobalOptions = getInitialOptions(key);\r\n\r\n const finalOptions = existingGlobalOptions\r\n ? {\r\n ...existingGlobalOptions,\r\n ...mergedOptions,\r\n formElements: {\r\n ...existingGlobalOptions.formElements,\r\n ...mergedOptions.formElements,\r\n },\r\n validation: {\r\n ...existingGlobalOptions.validation,\r\n ...mergedOptions.validation,\r\n },\r\n }\r\n : mergedOptions;\r\n\r\n setInitialStateOptions(key, finalOptions);\r\n });\r\n\r\n Object.keys(statePart).forEach((key) => {\r\n initializeShadowState(key, statePart[key]);\r\n });\r\n type Prettify<T> = {\r\n [K in keyof T]: T[K];\r\n } & {};\r\n type StateKeys = keyof typeof statePart;\r\n\r\n const useCogsState = <StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options?: Prettify<\r\n OptionsType<(typeof statePart)[StateKey], never> & {\r\n [PName in keyof PluginOptions]?: PluginOptions[PName] extends infer P\r\n ? P extends Record<string, any>\r\n ? {\r\n [K in keyof P]: P[K] extends { __key: 'keyed'; map: infer TMap }\r\n ? StateKey extends keyof TMap\r\n ? TMap[StateKey]\r\n : never\r\n : P[K];\r\n }\r\n : P\r\n : never;\r\n }\r\n >\r\n ) => {\r\n const [componentId] = useState(options?.componentId ?? uuidv4());\r\n\r\n const currentOptions = setOptions({\r\n stateKey,\r\n options,\r\n initialOptionsPart,\r\n });\r\n\r\n const optionsRef = useRef(currentOptions);\r\n optionsRef.current = currentOptions;\r\n\r\n const thiState =\r\n getShadowValue(stateKey as string, []) || statePart[stateKey as string];\r\n\r\n const updater = useCogsStateFn<(typeof statePart)[StateKey], TPlugins>(\r\n thiState,\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 reactiveType: options?.reactiveType,\r\n reactiveDeps: options?.reactiveDeps,\r\n defaultState: options?.defaultState as any,\r\n dependencies: options?.dependencies,\r\n serverState: options?.serverState,\r\n }\r\n );\r\n\r\n useEffect(() => {\r\n if (options) {\r\n pluginStore\r\n .getState()\r\n .setPluginOptionsForState(stateKey as string, options);\r\n }\r\n }, [stateKey, options]);\r\n useEffect(() => {\r\n pluginStore\r\n .getState()\r\n .stateHandlers.set(stateKey as string, updater as any);\r\n\r\n return () => {\r\n pluginStore.getState().stateHandlers.delete(stateKey as string);\r\n };\r\n }, [stateKey, updater]);\r\n\r\n return updater;\r\n };\r\n\r\n function setCogsOptionsByKey<StateKey extends StateKeys>(\r\n stateKey: StateKey,\r\n options: CreateStateOptionsType<(typeof statePart)[StateKey], TPlugins> &\r\n Omit<\r\n OptionsType<(typeof statePart)[StateKey]>,\r\n keyof CreateStateOptionsType\r\n >\r\n ) {\r\n setOptions({ stateKey, options, initialOptionsPart } as any);\r\n\r\n if (options.localStorage) {\r\n loadAndApplyLocalStorage(stateKey as string, options);\r\n }\r\n if (options.formElements) {\r\n const currentPlugins = pluginStore.getState().registeredPlugins;\r\n\r\n const updatedPlugins = currentPlugins.map((plugin) => {\r\n // Use `options.formElements` as the source\r\n if (options.formElements!.hasOwnProperty(plugin.name)) {\r\n return {\r\n ...plugin,\r\n formWrapper: (options.formElements as any)[plugin.name],\r\n };\r\n }\r\n return plugin;\r\n });\r\n\r\n pluginStore.getState().setRegisteredPlugins(updatedPlugins as any);\r\n }\r\n notifyComponents(stateKey as string);\r\n }\r\n function setCogsOptions(\r\n // The type allows any valid options, but uses a generic `unknown` for the\r\n // state type because it applies to multiple different state shapes.\r\n // The `TPlugins` generic is correctly preserved.\r\n globalOptions: CreateStateOptionsType<unknown, TPlugins> &\r\n Omit<OptionsType<unknown>, keyof CreateStateOptionsType>\r\n ) {\r\n // Get all the state keys that this instance manages\r\n const allStateKeys = Object.keys(statePart) as StateKeys[];\r\n\r\n // Loop through every state key and apply the provided options\r\n allStateKeys.forEach((key) => {\r\n // We use `as any` here because we are intentionally applying a single\r\n // generic options object to many differently-typed state slices.\r\n // The internal logic of setCogsOptionsByKey handles the merging correctly.\r\n setCogsOptionsByKey(key, globalOptions as any);\r\n });\r\n }\r\n\r\n return {\r\n useCogsState,\r\n setCogsOptionsByKey,\r\n setCogsOptions,\r\n };\r\n};\r\n\r\nconst saveToLocalStorage = <T,>(\r\n state: T,\r\n thisKey: string,\r\n currentInitialOptions: any,\r\n sessionId?: string,\r\n 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 const shadowMeta = getShadowMetadata(thisKey, []);\r\n\r\n const data: LocalStorageData<T> = {\r\n state,\r\n lastUpdated: Date.now(),\r\n lastSyncedWithServer: lastSyncedWithServer ?? existingLastSynced,\r\n stateSource: shadowMeta?.stateSource,\r\n baseServerState: shadowMeta?.baseServerState,\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 = getShadowValue(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 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; // Keep reference to what server state this is based on\r\n stateSource?: 'default' | 'server' | 'localStorage'; // Track origin\r\n};\r\n\r\nconst notifyComponents = (thisKey: string) => {\r\n const stateEntry = getShadowMetadata(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\nfunction markEntireStateAsServerSynced(\r\n stateKey: string,\r\n path: string[],\r\n data: any,\r\n timestamp: number\r\n) {\r\n // Mark current path as synced\r\n const currentMeta = getShadowMetadata(stateKey, path);\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync: timestamp || Date.now(),\r\n });\r\n\r\n // If it's an array, mark each item as synced\r\n if (Array.isArray(data)) {\r\n const arrayMeta = getShadowMetadata(stateKey, path);\r\n if (arrayMeta?.arrayKeys) {\r\n arrayMeta.arrayKeys.forEach((itemKey, index) => {\r\n // Fix: Don't split the itemKey, just use it directly\r\n const itemPath = [...path, itemKey];\r\n const itemData = data[index];\r\n if (itemData !== undefined) {\r\n markEntireStateAsServerSynced(\r\n stateKey,\r\n itemPath,\r\n itemData,\r\n timestamp\r\n );\r\n }\r\n });\r\n }\r\n }\r\n // If it's an object, mark each field as synced\r\n else if (data && typeof data === 'object' && data.constructor === Object) {\r\n Object.keys(data).forEach((key) => {\r\n const fieldPath = [...path, key];\r\n const fieldData = data[key];\r\n markEntireStateAsServerSynced(stateKey, fieldPath, fieldData, timestamp);\r\n });\r\n }\r\n}\r\n// 5. Batch queue\r\nlet updateBatchQueue: any[] = [];\r\nlet isFlushScheduled = false;\r\n\r\nfunction scheduleFlush() {\r\n if (!isFlushScheduled) {\r\n isFlushScheduled = true;\r\n queueMicrotask(() => {\r\n flushQueue();\r\n });\r\n }\r\n}\r\n\r\n// 2. Update signals\r\nfunction updateSignals(shadowMeta: any, displayValue: any) {\r\n if (!shadowMeta?.signals?.length) return;\r\n\r\n shadowMeta.signals.forEach(({ parentId, position, effect }: any) => {\r\n const parent = document.querySelector(`[data-parent-id=\"${parentId}\"]`);\r\n if (!parent) return;\r\n\r\n const childNodes = Array.from(parent.childNodes);\r\n if (!childNodes[position]) return;\r\n\r\n let finalDisplayValue = displayValue;\r\n if (effect && displayValue !== null) {\r\n try {\r\n finalDisplayValue = new Function('state', `return (${effect})(state)`)(\r\n displayValue\r\n );\r\n } catch (err) {\r\n console.error('Error evaluating effect function:', err);\r\n }\r\n }\r\n\r\n if (finalDisplayValue !== null && typeof finalDisplayValue === 'object') {\r\n finalDisplayValue = JSON.stringify(finalDisplayValue);\r\n }\r\n\r\n childNodes[position].textContent = String(finalDisplayValue ?? '');\r\n });\r\n}\r\n\r\nfunction getComponentNotifications(\r\n stateKey: string,\r\n path: string[],\r\n result: any\r\n): Set<any> {\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n\r\n if (!rootMeta?.components) {\r\n return new Set();\r\n }\r\n\r\n const componentsToNotify = new Set<any>();\r\n\r\n // --- PASS 1: Notify specific subscribers based on update type ---\r\n\r\n if (result.type === 'update') {\r\n // --- Bubble-up Notification ---\r\n // An update to `user.address.street` notifies listeners of `street`, `address`, and `user`.\r\n let currentPath = [...path];\r\n while (true) {\r\n const pathMeta = getShadowMetadata(stateKey, currentPath);\r\n\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set instead of calling forceUpdate()\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n if (!reactiveTypes.includes('none')) {\r\n componentsToNotify.add(component);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop(); // Go up one level\r\n }\r\n\r\n // --- Deep Object Change Notification ---\r\n // If the new value is an object, notify components subscribed to sub-paths that changed.\r\n if (\r\n result.newValue &&\r\n typeof result.newValue === 'object' &&\r\n !isArray(result.newValue)\r\n ) {\r\n const changedSubPaths = getDifferences(result.newValue, result.oldValue);\r\n\r\n changedSubPaths.forEach((subPathString: string) => {\r\n const subPath = subPathString.split('.');\r\n const fullSubPath = [...path, ...subPath];\r\n const subPathMeta = getShadowMetadata(stateKey, fullSubPath);\r\n\r\n if (subPathMeta?.pathComponents) {\r\n subPathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n // NEW: Add component to the set\r\n if (component) {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n if (!reactiveTypes.includes('none')) {\r\n componentsToNotify.add(component);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n }\r\n } else if (\r\n result.type === 'insert' ||\r\n result.type === 'cut' ||\r\n result.type === 'insert_many'\r\n ) {\r\n // This path is the array itself (e.g., ['pets'])\r\n const parentArrayPath = result.type === 'insert' ? path : path.slice(0, -1);\r\n\r\n // --- FIX: ADD BUBBLE-UP LOGIC HERE ---\r\n // Start from the array's path and go up to the root\r\n let currentPath = [...parentArrayPath];\r\n while (true) {\r\n const pathMeta = getShadowMetadata(stateKey, currentPath);\r\n\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId: string) => {\r\n const component = rootMeta.components?.get(componentId);\r\n if (component) {\r\n componentsToNotify.add(component);\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop(); // Go up one level\r\n }\r\n // --- END FIX ---\r\n }\r\n\r\n // --- PASS 2: Handle 'all' and 'deps' reactivity types ---\r\n // Iterate over all components for this stateKey that haven't been notified yet.\r\n // rootMeta.components.forEach((component, componentId) => {\r\n // // If we've already added this component, skip it.\r\n // if (componentsToNotify.has(component)) {\r\n // return;\r\n // }\r\n\r\n // const reactiveTypes = Array.isArray(component.reactiveType)\r\n // ? component.reactiveType\r\n // : [component.reactiveType || 'component'];\r\n\r\n // if (reactiveTypes.includes('all')) {\r\n // componentsToNotify.add(component);\r\n // } else if (reactiveTypes.includes('deps') && component.depsFunction) {\r\n // const currentState = getShadowValue(stateKey, []);\r\n // const newDeps = component.depsFunction(currentState);\r\n\r\n // if (\r\n // newDeps === true ||\r\n // (Array.isArray(newDeps) && !isDeepEqual(component.prevDeps, newDeps))\r\n // ) {\r\n // component.prevDeps = newDeps as any; // Update the dependencies for the next check\r\n // componentsToNotify.add(component);\r\n // }\r\n // }\r\n // });\r\n\r\n return componentsToNotify;\r\n}\r\n\r\nfunction handleUpdate(\r\n stateKey: string,\r\n path: string[],\r\n payload: any\r\n): { type: 'update'; oldValue: any; newValue: any; shadowMeta: any } | null {\r\n // ✅ FIX: Get the old value before the update.\r\n const oldValue = getGlobalStore.getState().getShadowValue(stateKey, path);\r\n\r\n const newValue = isFunction(payload) ? payload(oldValue) : payload;\r\n if (isDeepEqual(oldValue, newValue)) {\r\n return null; // <-- Abort the update\r\n }\r\n\r\n // ✅ FIX: The new `updateShadowAtPath` handles metadata preservation automatically.\r\n // The manual loop has been removed.\r\n updateShadowAtPath(stateKey, path, newValue);\r\n\r\n markAsDirty(stateKey, path, { bubble: true });\r\n\r\n // Return the metadata of the node *after* the update.\r\n const newShadowMeta = getShadowMetadata(stateKey, path);\r\n\r\n return {\r\n type: 'update',\r\n oldValue: oldValue,\r\n newValue,\r\n shadowMeta: newShadowMeta,\r\n };\r\n}\r\nfunction handleInsertMany(\r\n stateKey: string,\r\n path: string[],\r\n payload: any[]\r\n): {\r\n type: 'insert_many';\r\n count: number;\r\n shadowMeta: any;\r\n path: string[];\r\n} {\r\n // Use the existing, optimized global store function to perform the state update\r\n insertManyShadowArrayElements(stateKey, path, payload);\r\n\r\n markAsDirty(stateKey, path, { bubble: true });\r\n const updatedMeta = getShadowMetadata(stateKey, path);\r\n\r\n return {\r\n type: 'insert_many',\r\n count: payload.length,\r\n shadowMeta: updatedMeta,\r\n path: path,\r\n };\r\n}\r\nfunction handleInsert(\r\n stateKey: string,\r\n path: string[],\r\n payload: any,\r\n index?: number,\r\n itemId?: string\r\n): {\r\n type: 'insert';\r\n newValue: any;\r\n shadowMeta: any;\r\n path: string[];\r\n itemId: string;\r\n insertAfterId?: string;\r\n} {\r\n let newValue;\r\n\r\n if (isFunction(payload)) {\r\n const { value: currentValue } = getScopedData(stateKey, path);\r\n newValue = payload({ state: currentValue });\r\n } else {\r\n newValue = payload;\r\n }\r\n //console.time('insertShadowArrayElement');\r\n // Pass itemId to insertShadowArrayElement\r\n const actualItemId = insertShadowArrayElement(\r\n stateKey,\r\n path,\r\n newValue,\r\n index,\r\n itemId\r\n );\r\n //console.timeEnd('insertShadowArrayElement');\r\n\r\n markAsDirty(stateKey, path, { bubble: true });\r\n\r\n const updatedMeta = getShadowMetadata(stateKey, path);\r\n\r\n let insertAfterId: string | undefined;\r\n if (updatedMeta?.arrayKeys && index !== undefined && index > 0) {\r\n insertAfterId = updatedMeta.arrayKeys[index - 1];\r\n }\r\n\r\n return {\r\n type: 'insert',\r\n newValue,\r\n shadowMeta: updatedMeta,\r\n path: path,\r\n itemId: actualItemId,\r\n insertAfterId: insertAfterId,\r\n };\r\n}\r\n\r\nfunction handleCut(\r\n stateKey: string,\r\n path: string[]\r\n): { type: 'cut'; oldValue: any; parentPath: string[] } {\r\n const parentArrayPath = path.slice(0, -1);\r\n const oldValue = getShadowValue(stateKey, path);\r\n removeShadowArrayElement(stateKey, path);\r\n markAsDirty(stateKey, parentArrayPath, { bubble: true });\r\n return { type: 'cut', oldValue: oldValue, parentPath: parentArrayPath };\r\n}\r\n\r\nfunction flushQueue() {\r\n const allComponentsToNotify = new Set<any>();\r\n const signalUpdates: { shadowMeta: any; displayValue: any }[] = [];\r\n\r\n const logsToAdd: UpdateTypeDetail[] = [];\r\n\r\n for (const item of updateBatchQueue) {\r\n if (item.status && item.updateType) {\r\n logsToAdd.push(item as UpdateTypeDetail);\r\n continue;\r\n }\r\n\r\n const result = item;\r\n\r\n const displayValue = result.type === 'cut' ? null : result.newValue;\r\n if (result.shadowMeta?.signals?.length > 0) {\r\n signalUpdates.push({ shadowMeta: result.shadowMeta, displayValue });\r\n }\r\n // console.time('getComponentNotifications');\r\n const componentNotifications = getComponentNotifications(\r\n result.stateKey,\r\n result.path,\r\n result\r\n );\r\n\r\n componentNotifications.forEach((component) => {\r\n allComponentsToNotify.add(component);\r\n });\r\n // console.timeEnd('getComponentNotifications');\r\n }\r\n //console.time('logs');\r\n if (logsToAdd.length > 0) {\r\n addStateLog(logsToAdd);\r\n }\r\n //console.timeEnd('logs');\r\n signalUpdates.forEach(({ shadowMeta, displayValue }) => {\r\n updateSignals(shadowMeta, displayValue);\r\n });\r\n\r\n // console.time('updateComponents');\r\n allComponentsToNotify.forEach((component) => {\r\n component.forceUpdate();\r\n });\r\n //console.timeEnd('updateComponents');\r\n\r\n // --- Step 3: CLEANUP ---\r\n // Clear the queue for the next batch of updates.\r\n updateBatchQueue = [];\r\n isFlushScheduled = false;\r\n}\r\nfunction createEffectiveSetState<T>(\r\n thisKey: string,\r\n sessionId: string | undefined,\r\n latestInitialOptionsRef: React.MutableRefObject<OptionsType<T> | null>\r\n): EffectiveSetState<T> {\r\n return (newStateOrFunction, path, updateObj) => {\r\n executeUpdate(thisKey, path, newStateOrFunction, updateObj);\r\n };\r\n\r\n function executeUpdate(\r\n stateKey: string,\r\n path: string[],\r\n payload: any,\r\n options: UpdateOptions // Now includes itemId\r\n ) {\r\n let result: any;\r\n switch (options.updateType) {\r\n case 'update':\r\n result = handleUpdate(stateKey, path, payload);\r\n break;\r\n case 'insert':\r\n result = handleInsert(\r\n stateKey,\r\n path,\r\n payload,\r\n options.index,\r\n options.itemId\r\n );\r\n break;\r\n case 'insert_many':\r\n result = handleInsertMany(stateKey, path, payload);\r\n break;\r\n case 'cut':\r\n result = handleCut(stateKey, path);\r\n break;\r\n }\r\n\r\n if (result === null) {\r\n return;\r\n }\r\n result.stateKey = stateKey;\r\n result.path = path;\r\n updateBatchQueue.push(result);\r\n scheduleFlush();\r\n\r\n const newUpdate: UpdateTypeDetail = {\r\n timeStamp: Date.now(),\r\n stateKey,\r\n path,\r\n updateType: options.updateType,\r\n status: 'new',\r\n oldValue: result.oldValue,\r\n newValue: result.newValue ?? null,\r\n itemId: result.itemId,\r\n insertAfterId: result.insertAfterId,\r\n metaData: options.metaData,\r\n };\r\n\r\n updateBatchQueue.push(newUpdate);\r\n\r\n if (result.newValue !== undefined) {\r\n saveToLocalStorage(\r\n result.newValue,\r\n stateKey,\r\n latestInitialOptionsRef.current,\r\n sessionId\r\n );\r\n }\r\n\r\n if (latestInitialOptionsRef.current?.middleware) {\r\n latestInitialOptionsRef.current.middleware({ update: newUpdate });\r\n }\r\n runValidation(newUpdate, options.validationTrigger || 'programmatic');\r\n notifyUpdate(newUpdate);\r\n }\r\n}\r\n\r\nexport function useCogsStateFn<\r\n TStateObject extends unknown,\r\n const TPlugins extends readonly CogsPlugin<any, any, any, any, any>[],\r\n>(\r\n stateObject: TStateObject,\r\n {\r\n stateKey,\r\n localStorage,\r\n formElements,\r\n reactiveDeps,\r\n reactiveType,\r\n componentId,\r\n defaultState,\r\n dependencies,\r\n serverState,\r\n }: {\r\n stateKey?: string;\r\n componentId?: string;\r\n defaultState?: TStateObject;\r\n syncOptions?: SyncOptionsType<any>;\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 let noStateKey = stateKey ? false : true;\r\n const [thisKey] = useState(stateKey ?? uuidv4());\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 const resolveInitialState = useCallback(\r\n (\r\n overrideOptions?: OptionsType<TStateObject>\r\n ): {\r\n value: TStateObject;\r\n source: 'default' | 'server' | 'localStorage';\r\n timestamp: number;\r\n } => {\r\n // If we pass in options, use them. Otherwise, get from the global store.\r\n const optionsToUse = overrideOptions\r\n ? { ...getInitialOptions(thisKey as string), ...overrideOptions }\r\n : getInitialOptions(thisKey as string);\r\n\r\n const currentOptions = optionsToUse;\r\n const finalDefaultState =\r\n currentOptions?.defaultState || defaultState || stateObject;\r\n\r\n // 1. Check server state\r\n const hasValidServerData =\r\n currentOptions?.serverState?.status === 'success' &&\r\n currentOptions?.serverState?.data !== undefined;\r\n\r\n if (hasValidServerData) {\r\n return {\r\n value: currentOptions.serverState!.data! as any,\r\n source: 'server',\r\n timestamp: currentOptions.serverState!.timestamp || Date.now(),\r\n };\r\n }\r\n // 2. Check localStorage\r\n if (currentOptions?.localStorage?.key && sessionId) {\r\n const localKey = isFunction(currentOptions.localStorage.key)\r\n ? currentOptions.localStorage.key(finalDefaultState)\r\n : currentOptions.localStorage.key;\r\n\r\n const localData = loadFromLocalStorage(\r\n `${sessionId}-${thisKey}-${localKey}`\r\n );\r\n\r\n if (\r\n localData &&\r\n localData.lastUpdated > (currentOptions?.serverState?.timestamp || 0)\r\n ) {\r\n return {\r\n value: localData.state,\r\n source: 'localStorage',\r\n timestamp: localData.lastUpdated,\r\n };\r\n }\r\n }\r\n\r\n // 3. Use default state\r\n return {\r\n value: finalDefaultState || (stateObject as any),\r\n source: 'default',\r\n timestamp: Date.now(),\r\n };\r\n },\r\n [thisKey, defaultState, stateObject, sessionId]\r\n );\r\n\r\n // Effect 1: When this component's serverState prop changes, broadcast it\r\n useEffect(() => {\r\n if (!serverState) return;\r\n\r\n // Only broadcast if we have valid server data\r\n if (serverState.status === 'success' && serverState.data !== undefined) {\r\n setServerStateUpdate(thisKey, serverState);\r\n }\r\n }, [serverState, thisKey]);\r\n // Effect 2: Listen for server state updates from ANY component\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(thisKey, (event) => {\r\n if (event?.type === 'SERVER_STATE_UPDATE') {\r\n const serverStateData = event.serverState;\r\n\r\n if (\r\n serverStateData?.status !== 'success' ||\r\n serverStateData.data === undefined\r\n ) {\r\n return; // Ignore if no valid data\r\n }\r\n\r\n // Store the server state in options for future reference\r\n setAndMergeOptions(thisKey, { serverState: serverStateData });\r\n\r\n const mergeConfig =\r\n typeof serverStateData.merge === 'object'\r\n ? serverStateData.merge\r\n : serverStateData.merge === true\r\n ? { strategy: 'append' as const, key: 'id' }\r\n : null;\r\n\r\n const currentState = getShadowValue(thisKey, []);\r\n const incomingData = serverStateData.data;\r\n\r\n if (\r\n mergeConfig &&\r\n mergeConfig.strategy === 'append' &&\r\n 'key' in mergeConfig &&\r\n Array.isArray(currentState) &&\r\n Array.isArray(incomingData)\r\n ) {\r\n const keyField = mergeConfig.key;\r\n if (!keyField) {\r\n console.error(\r\n \"CogsState: Merge strategy 'append' requires a 'key' field.\"\r\n );\r\n return;\r\n }\r\n\r\n // Get existing IDs to check for duplicates\r\n const existingIds = new Set(\r\n currentState.map((item: any) => item[keyField])\r\n );\r\n\r\n // Filter out duplicates from incoming data\r\n const newUniqueItems = incomingData.filter(\r\n (item: any) => !existingIds.has(item[keyField])\r\n );\r\n\r\n if (newUniqueItems.length > 0) {\r\n // Insert only the new unique items\r\n insertManyShadowArrayElements(thisKey, [], newUniqueItems);\r\n }\r\n\r\n // Mark the entire merged state as synced\r\n const finalState = getShadowValue(thisKey, []);\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n finalState,\r\n serverStateData.timestamp || Date.now()\r\n );\r\n } else {\r\n // Replace strategy (default) - completely replace the state\r\n initializeShadowState(thisKey, incomingData);\r\n\r\n // Mark as synced from server\r\n markEntireStateAsServerSynced(\r\n thisKey,\r\n [],\r\n incomingData,\r\n serverStateData.timestamp || Date.now()\r\n );\r\n }\r\n\r\n // Notify all components subscribed to this state\r\n notifyComponents(thisKey);\r\n }\r\n });\r\n\r\n return unsubscribe;\r\n }, [thisKey]);\r\n useEffect(() => {\r\n const existingMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, []);\r\n\r\n // Skip if already initialized\r\n if (existingMeta && existingMeta.stateSource) {\r\n return;\r\n }\r\n\r\n const options = getInitialOptions(thisKey as string);\r\n\r\n const features = {\r\n localStorageEnabled: !!options?.localStorage?.key,\r\n };\r\n\r\n setShadowMetadata(thisKey, [], {\r\n ...existingMeta,\r\n features,\r\n });\r\n\r\n if (options?.defaultState !== undefined || defaultState !== undefined) {\r\n const finalDefaultState = options?.defaultState || defaultState;\r\n if (!options?.defaultState) {\r\n setAndMergeOptions(thisKey as string, {\r\n defaultState: finalDefaultState,\r\n });\r\n }\r\n }\r\n\r\n const { value: resolvedState, source, timestamp } = resolveInitialState();\r\n initializeShadowState(thisKey, resolvedState);\r\n setShadowMetadata(thisKey, [], {\r\n stateSource: source,\r\n lastServerSync: source === 'server' ? timestamp : undefined,\r\n isDirty: source === 'server' ? false : undefined,\r\n baseServerState: source === 'server' ? resolvedState : undefined,\r\n });\r\n\r\n if (source === 'server' && serverState) {\r\n setServerStateUpdate(thisKey, serverState);\r\n }\r\n\r\n notifyComponents(thisKey);\r\n }, [thisKey, ...(dependencies || [])]);\r\n\r\n useLayoutEffect(() => {\r\n if (noStateKey) {\r\n setAndMergeOptions(thisKey as string, {\r\n formElements,\r\n defaultState,\r\n localStorage,\r\n middleware: latestInitialOptionsRef.current?.middleware,\r\n });\r\n }\r\n\r\n const componentKey = `${thisKey}////${componentIdRef.current}`;\r\n\r\n // Register component in shadow metadata at root level\r\n const rootMeta = getShadowMetadata(thisKey, []);\r\n const components = rootMeta?.components || new Map();\r\n\r\n components.set(componentKey, {\r\n forceUpdate: () => forceUpdate({}),\r\n reactiveType: reactiveType ?? ['component'],\r\n paths: new Set(),\r\n depsFunction: reactiveDeps || undefined,\r\n deps: reactiveDeps ? reactiveDeps(getShadowValue(thisKey, [])) : [],\r\n prevDeps: reactiveDeps // Initialize prevDeps with the same initial value\r\n ? reactiveDeps(getShadowValue(thisKey, []))\r\n : [],\r\n });\r\n\r\n setShadowMetadata(thisKey, [], {\r\n ...rootMeta,\r\n components,\r\n });\r\n forceUpdate({});\r\n return () => {\r\n const meta = getShadowMetadata(thisKey, []);\r\n const component = meta?.components?.get(componentKey);\r\n\r\n // Remove from each path we registered to\r\n if (component?.paths) {\r\n component.paths.forEach((fullPath) => {\r\n // fullPath is like \"todos.0.name\", need to split and remove stateKey\r\n const pathParts = fullPath.split('.');\r\n const path = pathParts.slice(1); // Remove stateKey part\r\n\r\n const pathMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(thisKey, path);\r\n if (pathMeta?.pathComponents) {\r\n // Optionally clean up empty Sets\r\n\r\n if (pathMeta.pathComponents.size === 0) {\r\n delete pathMeta.pathComponents;\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(thisKey, path, pathMeta);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Remove from root components\r\n if (meta?.components) {\r\n setShadowMetadata(thisKey, [], meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const effectiveSetState = createEffectiveSetState(\r\n thisKey,\r\n\r\n sessionId,\r\n latestInitialOptionsRef\r\n );\r\n\r\n if (!getGlobalStore.getState().initialStateGlobal[thisKey]) {\r\n updateInitialStateGlobal(thisKey, stateObject);\r\n }\r\n\r\n const updaterFinal = useMemo(() => {\r\n const handler = createProxyHandler<TStateObject, TPlugins>(\r\n thisKey,\r\n effectiveSetState,\r\n componentIdRef.current,\r\n sessionId\r\n );\r\n\r\n return handler;\r\n }, [thisKey, sessionId]);\r\n\r\n return updaterFinal;\r\n}\r\n\r\ntype MetaData = {\r\n // Map array paths to their filtered/sorted ID order\r\n arrayViews?: {\r\n [arrayPath: string]: string[]; // e.g. { \"todos\": [\"id:xxx\", \"id:yyy\"], \"todos.id:xxx.subtasks\": [\"id:aaa\"] }\r\n };\r\n transforms?: Array<{\r\n type: 'filter' | 'sort';\r\n fn: Function;\r\n path: string[]; // Which array this transform applies to\r\n }>;\r\n serverStateIsUpStream?: boolean;\r\n};\r\n\r\nconst applyTransforms = (\r\n stateKey: string,\r\n path: string[],\r\n meta?: MetaData\r\n): string[] => {\r\n let ids = getShadowMetadata(stateKey, path)?.arrayKeys || [];\r\n const transforms = meta?.transforms;\r\n if (!transforms || transforms.length === 0) {\r\n return ids;\r\n }\r\n\r\n // Apply each transform using just IDs\r\n for (const transform of transforms) {\r\n if (transform.type === 'filter') {\r\n const filtered: any[] = [];\r\n ids.forEach((id, index) => {\r\n const value = getShadowValue(stateKey, [...path, id]);\r\n\r\n if (transform.fn(value, index)) {\r\n filtered.push(id);\r\n }\r\n });\r\n ids = filtered;\r\n } else if (transform.type === 'sort') {\r\n ids.sort((a, b) => {\r\n const aValue = getShadowValue(stateKey, [...path, a]);\r\n const bValue = getShadowValue(stateKey, [...path, b]);\r\n return transform.fn(aValue, bValue);\r\n });\r\n }\r\n }\r\n\r\n return ids;\r\n};\r\nconst registerComponentDependency = (\r\n stateKey: string,\r\n componentId: string,\r\n dependencyPath: string[]\r\n) => {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n const component = rootMeta?.components?.get(fullComponentId);\r\n\r\n if (\r\n !component ||\r\n component.reactiveType === 'none' ||\r\n !(\r\n Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType]\r\n ).includes('component')\r\n ) {\r\n return;\r\n }\r\n\r\n addPathComponent(stateKey, dependencyPath, fullComponentId);\r\n};\r\nconst notifySelectionComponents = (\r\n stateKey: string,\r\n parentPath: string[],\r\n currentSelected?: string | undefined\r\n) => {\r\n const rootMeta = getShadowMetadata(stateKey, []);\r\n const notifiedComponents = new Set<string>();\r\n\r\n // Handle \"all\" reactive components first\r\n if (rootMeta?.components) {\r\n rootMeta.components.forEach((component, componentId) => {\r\n const reactiveTypes = Array.isArray(component.reactiveType)\r\n ? component.reactiveType\r\n : [component.reactiveType || 'component'];\r\n\r\n if (reactiveTypes.includes('all')) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n });\r\n }\r\n\r\n getShadowMetadata(stateKey, [\r\n ...parentPath,\r\n 'getSelected',\r\n ])?.pathComponents?.forEach((componentId) => {\r\n const thisComp = rootMeta?.components?.get(componentId);\r\n thisComp?.forceUpdate();\r\n });\r\n\r\n const parentMeta = getShadowMetadata(stateKey, parentPath);\r\n for (let arrayKey of parentMeta?.arrayKeys || []) {\r\n const key = arrayKey + '.selected';\r\n const selectedItem = getShadowMetadata(stateKey, key.split('.').slice(1));\r\n if (arrayKey == currentSelected) {\r\n selectedItem?.pathComponents?.forEach((componentId) => {\r\n const thisComp = rootMeta?.components?.get(componentId);\r\n thisComp?.forceUpdate();\r\n });\r\n }\r\n }\r\n};\r\nfunction getScopedData(stateKey: string, path: string[], meta?: MetaData) {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const arrayKeys = meta?.arrayViews?.[arrayPathKey];\r\n\r\n // FIX: If the derived view is empty, return an empty array directly.\r\n if (Array.isArray(arrayKeys) && arrayKeys.length === 0) {\r\n return {\r\n shadowMeta,\r\n value: [],\r\n arrayKeys: shadowMeta?.arrayKeys,\r\n };\r\n }\r\n\r\n const value = getShadowValue(stateKey, path, arrayKeys);\r\n\r\n return {\r\n shadowMeta,\r\n value,\r\n arrayKeys: shadowMeta?.arrayKeys,\r\n };\r\n}\r\n\r\nfunction createProxyHandler<\r\n T,\r\n const TPlugins extends readonly CogsPlugin<any, any, any, any, any>[],\r\n>(\r\n stateKey: string,\r\n effectiveSetState: EffectiveSetState<T>,\r\n outerComponentId: string,\r\n sessionId?: string\r\n): StateObject<T, TPlugins> {\r\n const proxyCache = new Map<string, any>();\r\n\r\n function rebuildStateShape({\r\n path = [],\r\n meta,\r\n componentId,\r\n }: {\r\n path: string[];\r\n componentId: string;\r\n meta?: MetaData;\r\n }): any {\r\n const derivationSignature = meta\r\n ? JSON.stringify(meta.arrayViews || meta.transforms)\r\n : '';\r\n\r\n const cacheKey =\r\n path.join('.') + ':' + componentId + ':' + derivationSignature;\r\n if (proxyCache.has(cacheKey)) {\r\n return proxyCache.get(cacheKey);\r\n }\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n\r\n const proxyTarget = () => {};\r\n\r\n const handler = {\r\n apply(target: any, thisArg: any, args: any) {\r\n if (args.length === 0) {\r\n // FIX: Calculate viewIds from meta so filters/sorts are respected\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n // Pass viewIds to getShadowValue to get the filtered/sorted data\r\n registerComponentDependency(stateKey, componentId, path);\r\n return getShadowValue(stateKey, path, viewIds);\r\n }\r\n\r\n // Setter: state.count(5)\r\n const newValue = args[0];\r\n effectiveSetState(newValue, path, { updateType: 'update' });\r\n return true;\r\n },\r\n\r\n get(target: any, prop: string, receiver: any) {\r\n // === ADD SYMBOL HANDLERS FIRST (before string checks) ===\r\n\r\n // Handle Symbol.toPrimitive - critical for React DevTools\r\n if (prop === (Symbol.toPrimitive as any)) {\r\n return (hint: string) => {\r\n if (hint === 'number') return NaN;\r\n if (hint === 'string') {\r\n const pathStr = path.join('.');\r\n return `[CogsState: ${pathStr || 'root'}]`;\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n // Handle Symbol.toStringTag - used by Object.prototype.toString\r\n if (prop === (Symbol.toStringTag as any)) {\r\n return 'CogsState';\r\n }\r\n\r\n // Handle Symbol.iterator for arrays\r\n if (prop === (Symbol.iterator as any)) {\r\n const { value } = getScopedData(stateKey, path, meta);\r\n if (Array.isArray(value)) {\r\n return function* () {\r\n for (let i = 0; i < value.length; i++) {\r\n yield value[i];\r\n }\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n if (prop === 'call' || prop === 'apply' || prop === 'bind') {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n\r\n if (typeof prop !== 'string') {\r\n return Reflect.get(target, prop);\r\n }\r\n if (path.length === 0 && prop in rootLevelMethods) {\r\n return rootLevelMethods[prop as keyof typeof rootLevelMethods];\r\n }\r\n\r\n if (typeof prop === 'string' && !prop.startsWith('$')) {\r\n const nextPath = [...path, prop];\r\n return rebuildStateShape({\r\n path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n if (prop === '$_rebuildStateShape') {\r\n return rebuildStateShape;\r\n }\r\n\r\n if (prop === '$sync' && path.length === 0) {\r\n return async function () {\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 const state = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, []);\r\n const validationKey = options?.validation?.key;\r\n\r\n try {\r\n const response = await sync.action(state);\r\n if (\r\n response &&\r\n !response.success &&\r\n response.errors &&\r\n validationKey\r\n ) {\r\n // getGlobalStore.getState().removeValidationError(validationKey);\r\n // response.errors.forEach((error) => {\r\n // const errorPath = [validationKey, ...error.path].join('.');\r\n // getGlobalStore\r\n // .getState()\r\n // .addValidationError(errorPath, error.message);\r\n // });\r\n // notifyComponents(stateKey);\r\n }\r\n\r\n if (response?.success) {\r\n // Mark as synced and not dirty\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n setShadowMetadata(stateKey, [], {\r\n ...shadowMeta,\r\n isDirty: false,\r\n lastServerSync: Date.now(),\r\n stateSource: 'server',\r\n baseServerState: state, // Update base server state\r\n });\r\n\r\n if (sync.onSuccess) {\r\n sync.onSuccess(response.data);\r\n }\r\n } else if (!response?.success && sync.onError)\r\n sync.onError(response.error);\r\n\r\n return response;\r\n } catch (error) {\r\n if (sync.onError) sync.onError(error);\r\n return { success: false, error };\r\n }\r\n };\r\n }\r\n // Fixed getStatus function in createProxyHandler\r\n if (prop === '$_status' || prop === '$getStatus') {\r\n const getStatusFunc = () => {\r\n // ✅ Use the optimized helper to get all data in one efficient call\r\n const { shadowMeta, value } = getScopedData(stateKey, path, meta);\r\n\r\n if (shadowMeta?.isDirty === true) {\r\n return 'dirty';\r\n }\r\n\r\n if (\r\n shadowMeta?.stateSource === 'server' ||\r\n shadowMeta?.isDirty === false\r\n ) {\r\n return 'synced';\r\n }\r\n\r\n if (shadowMeta?.stateSource === 'localStorage') {\r\n return 'restored';\r\n }\r\n\r\n if (shadowMeta?.stateSource === 'default') {\r\n return 'fresh';\r\n }\r\n\r\n if (value !== undefined) {\r\n return 'fresh';\r\n }\r\n\r\n // Fallback if no other condition is met.\r\n return 'unknown';\r\n };\r\n\r\n // This part remains the same\r\n return prop === '$_status' ? getStatusFunc() : getStatusFunc;\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 const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n if (storageKey) localStorage.removeItem(storageKey);\r\n };\r\n }\r\n\r\n if (prop === '$validate') {\r\n return () => {\r\n const store = getGlobalStore.getState();\r\n\r\n // 1. Get Data & Schema\r\n const { value } = getScopedData(stateKey, path, meta);\r\n const opts = store.getInitialOptions(stateKey);\r\n const schema =\r\n opts?.validation?.zodSchemaV4 || opts?.validation?.zodSchemaV3;\r\n\r\n // If no schema, assume valid\r\n if (!schema) {\r\n return { success: true, data: value };\r\n }\r\n\r\n // 2. Run Zod Validation\r\n const result = (schema as any).safeParse(value);\r\n\r\n // 3. Update State Logic\r\n if (result.success) {\r\n const currentMeta = store.getShadowMetadata(stateKey, path) || {};\r\n store.setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'VALID',\r\n errors: [],\r\n lastValidated: Date.now(),\r\n },\r\n });\r\n } else {\r\n // Zod v4 uses 'issues', Zod v3 uses 'errors'\r\n const zodErrors =\r\n result.error?.issues || result.error?.errors || [];\r\n\r\n zodErrors.forEach((error: any) => {\r\n const errorPath = [...path, ...error.path.map(String)];\r\n const currentMeta =\r\n store.getShadowMetadata(stateKey, errorPath) || {};\r\n\r\n store.setShadowMetadata(stateKey, errorPath, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'INVALID',\r\n errors: [\r\n {\r\n source: 'client',\r\n message: error.message,\r\n severity: 'error',\r\n code: error.code,\r\n },\r\n ],\r\n lastValidated: Date.now(),\r\n validatedValue: store.getShadowValue(stateKey, errorPath),\r\n },\r\n });\r\n });\r\n }\r\n\r\n notifyComponents(stateKey);\r\n\r\n return result;\r\n };\r\n }\r\n if (prop === '$showValidationErrors') {\r\n return () => {\r\n const { shadowMeta } = getScopedData(stateKey, path, meta);\r\n if (\r\n shadowMeta?.validation?.status === 'INVALID' &&\r\n shadowMeta.validation.errors.length > 0\r\n ) {\r\n // Return only error-severity messages (not warnings)\r\n return shadowMeta.validation.errors\r\n .filter((err) => err.severity === 'error')\r\n .map((err) => err.message);\r\n }\r\n return [];\r\n };\r\n }\r\n\r\n if (prop === '$getSelected') {\r\n return () => {\r\n const arrayKey = [stateKey, ...path].join('.');\r\n registerComponentDependency(stateKey, componentId, [\r\n ...path,\r\n 'getSelected',\r\n ]);\r\n\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n if (!selectedItemKey) {\r\n return undefined;\r\n }\r\n\r\n const viewKey = path.join('.');\r\n const currentViewIds = meta?.arrayViews?.[viewKey];\r\n const selectedItemId = selectedItemKey.split('.').pop();\r\n\r\n // FIX: Only return the selected item if it exists in the current filtered/sorted view.\r\n if (currentViewIds && !currentViewIds.includes(selectedItemId!)) {\r\n return undefined;\r\n }\r\n\r\n const value = getShadowValue(\r\n stateKey,\r\n selectedItemKey.split('.').slice(1)\r\n );\r\n if (value === undefined) {\r\n return undefined;\r\n }\r\n\r\n return rebuildStateShape({\r\n path: selectedItemKey.split('.').slice(1) as string[],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === '$getSelectedIndex') {\r\n return () => {\r\n // Key for the array in the global selection map (e.g., \"myState.products\")\r\n const arrayKey = stateKey + '.' + path.join('.');\r\n // Key for this specific view in the meta object (e.g., \"products\")\r\n const viewKey = path.join('.');\r\n\r\n // Get the full path of the selected item (e.g., \"myState.products.id:abc\")\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n\r\n if (!selectedItemKey) {\r\n return -1; // Nothing is selected for this array.\r\n }\r\n\r\n // Get the list of item IDs for the current filtered/sorted view.\r\n const { keys: viewIds } = getArrayData(stateKey, path, meta);\r\n\r\n if (!viewIds) {\r\n return -1; // Should not happen if it's an array, but a safe guard.\r\n }\r\n\r\n // FIX: Extract just the ID from the full selected item path.\r\n const selectedId = selectedItemKey.split('.').pop();\r\n\r\n // Return the index of that ID within the current view's list of IDs.\r\n return (viewIds as string[]).indexOf(selectedId as string);\r\n };\r\n }\r\n if (prop === '$clearSelected') {\r\n notifySelectionComponents(stateKey, path);\r\n return () => {\r\n clearSelectedIndex({\r\n arrayKey: stateKey + '.' + path.join('.'),\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$map') {\r\n return (\r\n callbackfn: (setter: any, index: number, arraySetter: any) => void\r\n ) => {\r\n // FIX: Use getArrayData to reliably get both the value and the keys of the current view.\r\n const { value: shadowValue, keys: arrayKeys } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n registerComponentDependency(stateKey, componentId, path);\r\n if (!arrayKeys || !Array.isArray(shadowValue)) {\r\n return []; // It's valid to map over an empty array.\r\n }\r\n\r\n const arraySetter = rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return shadowValue.map((_item, index) => {\r\n const itemKey = arrayKeys[index];\r\n if (!itemKey) return undefined;\r\n\r\n // FIX: Construct the correct path to the item in the original store.\r\n // The path is the array's path plus the specific item's unique key.\r\n const itemPath = [...path, itemKey];\r\n\r\n const itemSetter = rebuildStateShape({\r\n path: itemPath, // This now correctly points to the item in the shadow store.\r\n componentId: componentId!,\r\n meta,\r\n });\r\n\r\n return callbackfn(itemSetter, index, arraySetter);\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$filter') {\r\n return (callbackfn: (value: any, index: number) => boolean) => {\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n // ✅ FIX: Get keys from `getArrayData` which correctly resolves them from meta or the full list.\r\n const { keys: currentViewIds, value: array } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!Array.isArray(array)) {\r\n throw new Error('filter can only be used on arrays');\r\n }\r\n\r\n // Filter the array and collect the IDs of the items that pass\r\n const filteredIds: string[] = [];\r\n array.forEach((item, index) => {\r\n if (callbackfn(item, index)) {\r\n // currentViewIds[index] is the original ID before filtering\r\n const id = currentViewIds[index];\r\n if (id) {\r\n filteredIds.push(id);\r\n }\r\n }\r\n });\r\n\r\n // The rest is the same...\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: filteredIds,\r\n },\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'filter', fn: callbackfn, path },\r\n ],\r\n },\r\n });\r\n };\r\n }\r\n if (prop === '$sort') {\r\n return (compareFn: (a: any, b: any) => number) => {\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n // FIX: Use the more robust `getArrayData` which always correctly resolves the keys for a view.\r\n const { value: currentArray, keys: currentViewIds } = getArrayData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (!Array.isArray(currentArray) || !currentViewIds) {\r\n throw new Error('No array keys found for sorting');\r\n }\r\n\r\n // ... (rest of the function is the same and now works)\r\n const itemsWithIds = currentArray.map((item, index) => ({\r\n item,\r\n key: currentViewIds[index],\r\n }));\r\n itemsWithIds.sort((a, b) => compareFn(a.item, b.item));\r\n const sortedIds = itemsWithIds.map((i) => i.key as string);\r\n\r\n return rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: sortedIds,\r\n },\r\n transforms: [\r\n ...(meta?.transforms || []),\r\n { type: 'sort', fn: compareFn, path },\r\n ],\r\n },\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$list') {\r\n return (\r\n callbackfn: (\r\n setter: any,\r\n index: number,\r\n arraySetter: any\r\n ) => ReactNode\r\n ) => {\r\n const ListWrapper = () => {\r\n const componentIdsRef = useRef<Map<string, string>>(new Map());\r\n\r\n const [updateTrigger, forceUpdate] = useState({});\r\n\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n\r\n const validIds = applyTransforms(stateKey, path, meta);\r\n\r\n // Memoize the updated meta to prevent creating new objects on every render\r\n const updatedMeta = useMemo(() => {\r\n return {\r\n ...meta,\r\n arrayViews: {\r\n ...(meta?.arrayViews || {}),\r\n [arrayPathKey]: validIds,\r\n },\r\n };\r\n }, [meta, arrayPathKey, validIds]);\r\n\r\n // Now use the updated meta when getting array data\r\n const { value: arrayValues } = getArrayData(\r\n stateKey,\r\n path,\r\n updatedMeta\r\n );\r\n\r\n useEffect(() => {\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (e) => {\r\n if (e.type === 'GET_SELECTED') {\r\n return;\r\n }\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n const caches = shadowMeta?.transformCaches;\r\n if (caches) {\r\n // Iterate over ALL keys in the cache map.\r\n for (const key of caches.keys()) {\r\n // If the key belongs to this component instance, delete it.\r\n // This purges caches for 'sort by name', 'sort by score', etc.\r\n if (key.startsWith(componentId)) {\r\n caches.delete(key);\r\n }\r\n }\r\n }\r\n\r\n if (\r\n e.type === 'INSERT' ||\r\n e.type === 'INSERT_MANY' ||\r\n e.type === 'REMOVE' ||\r\n e.type === 'CLEAR_SELECTION' ||\r\n (e.type === 'SERVER_STATE_UPDATE' &&\r\n !meta?.serverStateIsUpStream)\r\n ) {\r\n forceUpdate({});\r\n }\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n\r\n // This effect's logic now depends on the componentId to perform the purge.\r\n }, [componentId, stateKeyPathKey]);\r\n\r\n if (!Array.isArray(arrayValues)) {\r\n return null;\r\n }\r\n\r\n // Continue using updatedMeta for the rest of your logic instead of meta\r\n const arraySetter = rebuildStateShape({\r\n path,\r\n componentId: componentId!,\r\n meta: updatedMeta, // Use updated meta here\r\n });\r\n\r\n const returnValue = arrayValues.map((item, localIndex) => {\r\n const itemKey = validIds[localIndex];\r\n\r\n if (!itemKey) {\r\n return null;\r\n }\r\n\r\n let itemComponentId = componentIdsRef.current.get(itemKey);\r\n if (!itemComponentId) {\r\n itemComponentId = uuidv4();\r\n componentIdsRef.current.set(itemKey, itemComponentId);\r\n }\r\n\r\n const itemPath = [...path, itemKey];\r\n\r\n return createElement(MemoizedCogsItemWrapper, {\r\n key: itemKey,\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n localIndex,\r\n arraySetter,\r\n rebuildStateShape,\r\n renderFn: callbackfn,\r\n });\r\n });\r\n\r\n return <>{returnValue}</>;\r\n };\r\n\r\n return <ListWrapper />;\r\n };\r\n }\r\n if (prop === '$stateFlattenOn') {\r\n return (fieldName: string) => {\r\n // FIX: Get the definitive list of IDs for the current view from meta.arrayViews.\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n const currentState = getGlobalStore\r\n .getState()\r\n .getShadowValue(stateKey, path, viewIds);\r\n\r\n if (!Array.isArray(currentState)) return [];\r\n\r\n return rebuildStateShape({\r\n path: [...path, '[*]', fieldName],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === '$index') {\r\n return (index: number) => {\r\n const arrayPathKey = path.length > 0 ? path.join('.') : 'root';\r\n const viewIds = meta?.arrayViews?.[arrayPathKey];\r\n\r\n if (viewIds) {\r\n const itemId = viewIds[index];\r\n if (!itemId) return undefined;\r\n return rebuildStateShape({\r\n path: [...path, itemId],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n\r\n // ✅ FIX: Get the metadata and use the `arrayKeys` property.\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n if (!shadowMeta?.arrayKeys) return undefined;\r\n\r\n const itemId = shadowMeta.arrayKeys[index];\r\n if (!itemId) return undefined;\r\n\r\n return rebuildStateShape({\r\n path: [...path, itemId],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === '$last') {\r\n return () => {\r\n const { keys: currentViewIds } = getArrayData(stateKey, path, meta);\r\n if (!currentViewIds || currentViewIds.length === 0) {\r\n return undefined;\r\n }\r\n const lastItemKey = currentViewIds[currentViewIds.length - 1];\r\n\r\n if (!lastItemKey) {\r\n return undefined;\r\n }\r\n const newPath = [...path, lastItemKey];\r\n\r\n return rebuildStateShape({\r\n path: newPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n };\r\n }\r\n if (prop === '$insert') {\r\n return (\r\n payload: InsertParams<InferArrayElement<T>>,\r\n index?: number\r\n ) => {\r\n effectiveSetState(payload as any, path, {\r\n updateType: 'insert',\r\n index,\r\n });\r\n };\r\n }\r\n if (prop === '$insertMany') {\r\n return (payload: InferArrayElement<T>[]) => {\r\n // Call the one true path for all state changes.\r\n effectiveSetState(payload as any, path, {\r\n updateType: 'insert_many',\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 { value: currentArray } = getScopedData(\r\n stateKey,\r\n path,\r\n meta\r\n ) as {\r\n value: any[];\r\n };\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 const isMatch = fields\r\n ? fields.every((field) =>\r\n isDeepEqual(item[field], newValue[field])\r\n )\r\n : isDeepEqual(item, newValue);\r\n if (isMatch) matchedItem = item;\r\n return isMatch;\r\n });\r\n\r\n if (isUnique) {\r\n effectiveSetState(newValue, path, { updateType: 'insert' });\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\r\n effectiveSetState(updatedArray as any, path, {\r\n updateType: 'update',\r\n });\r\n }\r\n };\r\n }\r\n if (prop === '$cut') {\r\n return (index?: number, options?: { waitForSync?: boolean }) => {\r\n const shadowMeta = getShadowMetadata(stateKey, path);\r\n\r\n if (!shadowMeta?.arrayKeys || shadowMeta.arrayKeys.length === 0)\r\n return;\r\n\r\n const indexToCut =\r\n index === -1\r\n ? shadowMeta.arrayKeys.length - 1\r\n : index !== undefined\r\n ? index\r\n : shadowMeta.arrayKeys.length - 1;\r\n\r\n const idToCut = shadowMeta.arrayKeys[indexToCut];\r\n if (!idToCut) return;\r\n effectiveSetState(null, [...path, idToCut], {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === '$cutSelected') {\r\n return () => {\r\n const arrayKey = [stateKey, ...path].join('.');\r\n\r\n const { keys: currentViewIds } = getArrayData(stateKey, path, meta);\r\n if (!currentViewIds || currentViewIds.length === 0) {\r\n return;\r\n }\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(arrayKey);\r\n\r\n if (!selectedItemKey) {\r\n return;\r\n }\r\n const selectedId = selectedItemKey.split('.').pop() as string;\r\n\r\n if (!(currentViewIds as any[]).includes(selectedId!)) {\r\n return;\r\n }\r\n const pathForCut = selectedItemKey.split('.').slice(1);\r\n getGlobalStore.getState().clearSelectedIndex({ arrayKey });\r\n\r\n const parentPath = pathForCut.slice(0, -1);\r\n notifySelectionComponents(stateKey, parentPath);\r\n\r\n effectiveSetState(null, pathForCut, {\r\n updateType: 'cut',\r\n });\r\n };\r\n }\r\n if (prop === '$cutByValue') {\r\n return (value: string | number | boolean) => {\r\n const {\r\n isArray,\r\n value: array,\r\n keys,\r\n } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) return;\r\n\r\n const found = findArrayItem(array, keys, (item) => item === value);\r\n if (found) {\r\n effectiveSetState(null, [...path, found.key], {\r\n updateType: 'cut',\r\n });\r\n }\r\n };\r\n }\r\n\r\n if (prop === '$toggleByValue') {\r\n return (value: string | number | boolean) => {\r\n const {\r\n isArray,\r\n value: array,\r\n keys,\r\n } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) return;\r\n\r\n const found = findArrayItem(array, keys, (item) => item === value);\r\n\r\n if (found) {\r\n const pathForItem = [...path, found.key];\r\n\r\n effectiveSetState(null, pathForItem, {\r\n updateType: 'cut',\r\n });\r\n } else {\r\n effectiveSetState(value as any, path, { updateType: 'insert' });\r\n }\r\n };\r\n }\r\n if (prop === '$findWith') {\r\n return (searchKey: string, searchValue: any) => {\r\n const { isArray, value, keys } = getArrayData(stateKey, path, meta);\r\n\r\n if (!isArray) {\r\n throw new Error('findWith can only be used on arrays');\r\n }\r\n\r\n const found = findArrayItem(\r\n value,\r\n keys,\r\n (item) => item?.[searchKey] === searchValue\r\n );\r\n\r\n if (found) {\r\n return rebuildStateShape({\r\n path: [...path, found.key],\r\n componentId: componentId!,\r\n meta,\r\n });\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n if (prop === '$cutThis') {\r\n const { value: shadowValue } = getScopedData(stateKey, path, meta);\r\n const parentPath = path.slice(0, -1);\r\n notifySelectionComponents(stateKey, parentPath);\r\n return () => {\r\n effectiveSetState(shadowValue, path, { updateType: 'cut' });\r\n };\r\n }\r\n\r\n if (prop === '$get') {\r\n return () => {\r\n registerComponentDependency(stateKey, componentId, path);\r\n const { value } = getScopedData(stateKey, path, meta);\r\n return value;\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 _meta: meta,\r\n });\r\n }\r\n\r\n if (prop === '$$get') {\r\n return () =>\r\n $cogsSignal({ _stateKey: stateKey, _path: path, _meta: meta });\r\n }\r\n\r\n if (prop === '$lastSynced') {\r\n const syncKey = `${stateKey}:${path.join('.')}`;\r\n return getSyncInfo(syncKey);\r\n }\r\n if (prop == 'getLocalStorage') {\r\n return (key: string) =>\r\n loadFromLocalStorage(sessionId + '-' + stateKey + '-' + key);\r\n }\r\n if (prop === '$isSelected') {\r\n const parentPathArray = path.slice(0, -1);\r\n const parentMeta = getShadowMetadata(stateKey, parentPathArray);\r\n\r\n if (parentMeta?.arrayKeys) {\r\n const fullParentKey = stateKey + '.' + parentPathArray.join('.');\r\n const selectedItemKey = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n return selectedItemKey === fullItemKey;\r\n }\r\n return undefined;\r\n }\r\n\r\n if (prop === '$setSelected') {\r\n return (value: boolean) => {\r\n const parentPath = path.slice(0, -1);\r\n const fullParentKey = stateKey + '.' + parentPath.join('.');\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n notifySelectionComponents(stateKey, parentPath, undefined);\r\n\r\n const selectedIndex = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n if (value) {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(fullParentKey, fullItemKey);\r\n }\r\n };\r\n }\r\n\r\n if (prop === '$toggleSelected') {\r\n return () => {\r\n const parentPath = path.slice(0, -1);\r\n const fullParentKey = stateKey + '.' + parentPath.join('.');\r\n const fullItemKey = stateKey + '.' + path.join('.');\r\n\r\n const currentSelected = getGlobalStore\r\n .getState()\r\n .selectedIndicesMap.get(fullParentKey);\r\n\r\n if (currentSelected === fullItemKey) {\r\n getGlobalStore\r\n .getState()\r\n .clearSelectedIndex({ arrayKey: fullParentKey });\r\n } else {\r\n getGlobalStore\r\n .getState()\r\n .setSelectedIndex(fullParentKey, fullItemKey);\r\n }\r\n notifySelectionComponents(stateKey, parentPath);\r\n };\r\n }\r\n\r\n if (prop === '$clearValidation') {\r\n return (subPath?: string[]) => {\r\n const targetPath = subPath ? [...path, ...subPath] : path;\r\n const store = getGlobalStore.getState();\r\n\r\n // 1. Get the node where we want to start clearing\r\n const startNode = store.getShadowNode(stateKey, targetPath);\r\n console.log('startNode ', startNode);\r\n if (!startNode) return;\r\n\r\n // 2. Define a stack for iterative traversal (avoids recursion depth issues)\r\n // Stack items: [currentNode, currentPathArray]\r\n const stack: [any, string[]][] = [[startNode, targetPath]];\r\n console.log('stack ', stack);\r\n while (stack.length > 0) {\r\n const [node, currPath] = stack.pop()!;\r\n console.log('while (stack.length ', node, currPath);\r\n if (!node || typeof node !== 'object') continue;\r\n\r\n // 3. Clear validation on the current node if it exists\r\n if (node._meta?.validation) {\r\n // Reset the validation object\r\n node._meta.validation = {\r\n status: 'NOT_VALIDATED',\r\n errors: [],\r\n lastValidated: Date.now(),\r\n validatedValue: undefined,\r\n };\r\n\r\n // 4. Notify specific path subscribers so isolated fields update\r\n const fullPathKey = [stateKey, ...currPath].join('.');\r\n store.notifyPathSubscribers(fullPathKey, {\r\n type: 'VALIDATION_CLEAR',\r\n });\r\n }\r\n\r\n // 5. Add children to stack to continue traversal\r\n const keys = Object.keys(node);\r\n for (const key of keys) {\r\n if (key !== '_meta') {\r\n stack.push([node[key], [...currPath, key]]);\r\n }\r\n }\r\n }\r\n\r\n // 6. Notify root components\r\n notifyComponents(stateKey);\r\n };\r\n }\r\n if (path.length == 0) {\r\n if (prop === '$_componentId') {\r\n return componentId;\r\n }\r\n if (prop === '$setOptions') {\r\n return (options: OptionsType<T>) => {\r\n setOptions({ stateKey, options, initialOptionsPart: {} });\r\n };\r\n }\r\n\r\n if (prop === '$_applyUpdate') {\r\n return (\r\n value: any,\r\n path: string[],\r\n updateType: 'update' | 'insert' | 'cut' = 'update'\r\n ) => {\r\n effectiveSetState(value, path, { updateType });\r\n };\r\n }\r\n\r\n if (prop === '$_getEffectiveSetState') {\r\n return effectiveSetState;\r\n }\r\n if (prop === '$getPluginMetaData') {\r\n return (pluginName: string) =>\r\n getPluginMetaDataMap(stateKey, path)?.get(pluginName);\r\n }\r\n if (prop === '$addPluginMetaData') {\r\n return (pluginName: string, data: Record<string, any>) =>\r\n setPluginMetaData(stateKey, path, pluginName, data);\r\n }\r\n if (prop === '$removePluginMetaData') {\r\n return (pluginName: string) =>\r\n removePluginMetaData(stateKey, path, pluginName);\r\n }\r\n if (prop === '$addZodValidation') {\r\n return (\r\n zodErrors: any[],\r\n source: 'client' | 'sync_engine' | 'api'\r\n ) => {\r\n zodErrors.forEach((error) => {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, error.path) || {};\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(stateKey, error.path, {\r\n ...currentMeta,\r\n validation: {\r\n status: 'INVALID',\r\n errors: [\r\n {\r\n source: source || 'client',\r\n message: error.message,\r\n severity: 'error',\r\n code: error.code,\r\n },\r\n ],\r\n lastValidated: Date.now(),\r\n validatedValue: undefined,\r\n },\r\n });\r\n });\r\n };\r\n }\r\n\r\n if (prop === '$applyOperation') {\r\n return (\r\n operation: UpdateTypeDetail & {\r\n validation?: any[];\r\n version?: string;\r\n },\r\n metaData?: Record<string, any>\r\n ) => {\r\n let index: number | undefined;\r\n if (\r\n operation.insertAfterId &&\r\n operation.updateType === 'insert'\r\n ) {\r\n const shadowMeta = getShadowMetadata(stateKey, operation.path);\r\n if (shadowMeta?.arrayKeys) {\r\n const afterIndex = shadowMeta.arrayKeys.indexOf(\r\n operation.insertAfterId\r\n );\r\n if (afterIndex !== -1) {\r\n index = afterIndex + 1; // Insert after the found item\r\n }\r\n }\r\n }\r\n\r\n effectiveSetState(operation.newValue, operation.path, {\r\n updateType: operation.updateType,\r\n itemId: operation.itemId,\r\n index, // Pass the calculated index\r\n metaData,\r\n });\r\n };\r\n }\r\n if (prop === '$applyJsonPatch') {\r\n return (patches: Operation[]) => {\r\n const store = getGlobalStore.getState();\r\n const rootMeta = store.getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.components) return;\r\n\r\n const convertPath = (jsonPath: string): string[] => {\r\n if (!jsonPath || jsonPath === '/') return [];\r\n return jsonPath\r\n .split('/')\r\n .slice(1)\r\n .map((p) => p.replace(/~1/g, '/').replace(/~0/g, '~'));\r\n };\r\n\r\n const notifiedComponents = new Set<string>();\r\n\r\n for (const patch of patches) {\r\n const relativePath = convertPath(patch.path);\r\n\r\n switch (patch.op) {\r\n case 'add':\r\n case 'replace': {\r\n const { value } = patch as {\r\n op: 'add' | 'replace';\r\n path: string;\r\n value: any;\r\n };\r\n store.updateShadowAtPath(stateKey, relativePath, value);\r\n\r\n store.markAsDirty(stateKey, relativePath, { bubble: true });\r\n\r\n // Bubble up - notify components at this path and all parent paths\r\n let currentPath = [...relativePath];\r\n while (true) {\r\n const pathMeta = store.getShadowMetadata(\r\n stateKey,\r\n currentPath\r\n );\r\n\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component =\r\n rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop(); // Go up one level\r\n }\r\n break;\r\n }\r\n case 'remove': {\r\n const parentPath = relativePath.slice(0, -1);\r\n store.removeShadowArrayElement(stateKey, relativePath);\r\n store.markAsDirty(stateKey, parentPath, { bubble: true });\r\n\r\n // Bubble up from parent path\r\n let currentPath = [...parentPath];\r\n while (true) {\r\n const pathMeta = store.getShadowMetadata(\r\n stateKey,\r\n currentPath\r\n );\r\n if (pathMeta?.pathComponents) {\r\n pathMeta.pathComponents.forEach((componentId) => {\r\n if (!notifiedComponents.has(componentId)) {\r\n const component =\r\n rootMeta.components?.get(componentId);\r\n if (component) {\r\n component.forceUpdate();\r\n notifiedComponents.add(componentId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (currentPath.length === 0) break;\r\n currentPath.pop();\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n if (prop === '$getComponents')\r\n return () => getShadowMetadata(stateKey, [])?.components;\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 stateKey={stateKey}\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 === '$update') {\r\n return (payload: UpdateArg<T>) => {\r\n effectiveSetState(payload as any, path, { updateType: 'update' });\r\n\r\n return {\r\n synced: () => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, path);\r\n\r\n setShadowMetadata(stateKey, path, {\r\n ...shadowMeta,\r\n isDirty: false,\r\n stateSource: 'server',\r\n lastServerSync: Date.now(),\r\n });\r\n\r\n const fullPath = [stateKey, ...path].join('.');\r\n notifyPathSubscribers(fullPath, {\r\n type: 'SYNC_STATUS_CHANGE',\r\n isDirty: false,\r\n });\r\n },\r\n };\r\n };\r\n }\r\n if (prop === '$toggle') {\r\n const { value: currentValueAtPath } = getScopedData(\r\n stateKey,\r\n path,\r\n meta\r\n );\r\n\r\n if (typeof currentValueAtPath != 'boolean') {\r\n throw new Error('toggle() can only be used on boolean values');\r\n }\r\n return () => {\r\n effectiveSetState(!currentValueAtPath as any, path, {\r\n updateType: 'update',\r\n });\r\n };\r\n }\r\n if (prop === '$isolate') {\r\n // We accept (renderFn) OR (deps, renderFn)\r\n return (\r\n arg1: any[] | ((state: any) => React.ReactNode),\r\n arg2?: (state: any) => React.ReactNode\r\n ) => {\r\n // Check if the first argument is the dependency array\r\n const hasDependencies = Array.isArray(arg1);\r\n\r\n // Normalize arguments\r\n const dependencies = hasDependencies ? arg1 : undefined;\r\n const renderFn = hasDependencies ? arg2 : arg1;\r\n\r\n if (!renderFn || typeof renderFn !== 'function') {\r\n throw new Error(\r\n 'CogsState: $isolate requires a render function.'\r\n );\r\n }\r\n\r\n return (\r\n <IsolatedComponentWrapper\r\n stateKey={stateKey}\r\n path={path} // The path of the node calling $isolate (e.g. \"form\")\r\n dependencies={dependencies} // Pass the specific parts to watch\r\n rebuildStateShape={rebuildStateShape}\r\n renderFn={renderFn}\r\n />\r\n );\r\n };\r\n }\r\n if (prop === '$formElement') {\r\n return (child: FormControl<T>, formOpts?: FormOptsType) => {\r\n return (\r\n <FormElementWrapper\r\n stateKey={stateKey}\r\n path={path}\r\n rebuildStateShape={rebuildStateShape}\r\n setState={effectiveSetState}\r\n formOpts={formOpts}\r\n renderFn={child as any}\r\n />\r\n );\r\n };\r\n }\r\n const nextPath = [...path, prop];\r\n return rebuildStateShape({\r\n path: nextPath,\r\n componentId: componentId!,\r\n meta,\r\n });\r\n },\r\n };\r\n\r\n const proxyInstance = new Proxy(proxyTarget, handler);\r\n proxyCache.set(cacheKey, proxyInstance);\r\n\r\n return proxyInstance;\r\n }\r\n\r\n // ... (rest of the function: rootLevelMethods, returnShape, etc.)\r\n const rootLevelMethods = {\r\n $revertToInitialState: (obj?: { validationKey?: string }) => {\r\n const shadowMeta = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(stateKey, []);\r\n let revertState;\r\n\r\n if (shadowMeta?.stateSource === 'server' && shadowMeta.baseServerState) {\r\n revertState = shadowMeta.baseServerState;\r\n } else {\r\n revertState = getGlobalStore.getState().initialStateGlobal[stateKey];\r\n }\r\n\r\n clearSelectedIndexesForState(stateKey);\r\n initializeShadowState(stateKey, revertState);\r\n\r\n rebuildStateShape({\r\n path: [],\r\n componentId: outerComponentId!,\r\n });\r\n\r\n // Handle localStorage side-effects\r\n const initalOptionsGet = getInitialOptions(stateKey as string);\r\n const localKey = isFunction(initalOptionsGet?.localStorage?.key)\r\n ? initalOptionsGet?.localStorage?.key(revertState)\r\n : initalOptionsGet?.localStorage?.key;\r\n const storageKey = `${sessionId}-${stateKey}-${localKey}`;\r\n if (storageKey) {\r\n localStorage.removeItem(storageKey);\r\n }\r\n\r\n notifyComponents(stateKey);\r\n\r\n return revertState;\r\n },\r\n $initializeAndMergeShadowState: (newState: T) => {\r\n initializeAndMergeShadowState(stateKey, newState);\r\n notifyComponents(stateKey);\r\n },\r\n $updateInitialState: (newState: T) => {\r\n const newUpdaterState = createProxyHandler(\r\n stateKey,\r\n effectiveSetState,\r\n outerComponentId,\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 initializeShadowState(stateKey, newState);\r\n // initializeShadowStateNEW(stateKey, newState);\r\n\r\n const stateEntry = getGlobalStore\r\n .getState()\r\n .getShadowMetadata(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() as any)[field],\r\n };\r\n },\r\n };\r\n\r\n const returnShape = rebuildStateShape({\r\n componentId: outerComponentId,\r\n path: [],\r\n });\r\n\r\n return returnShape;\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 _meta?: MetaData;\r\n}) {\r\n return createElement(SignalRenderer, { proxy });\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 _meta?: MetaData;\r\n };\r\n}) {\r\n const elementRef = useRef<HTMLSpanElement>(null);\r\n const instanceIdRef = useRef<string | null>(null);\r\n const isSetupRef = useRef(false);\r\n const signalId = `${proxy._stateKey}-${proxy._path.join('.')}`;\r\n\r\n const arrayPathKey = proxy._path.length > 0 ? proxy._path.join('.') : 'root';\r\n const viewIds = proxy._meta?.arrayViews?.[arrayPathKey];\r\n\r\n const value = getShadowValue(proxy._stateKey, proxy._path, viewIds);\r\n\r\n useEffect(() => {\r\n const element = elementRef.current;\r\n if (!element || isSetupRef.current) return;\r\n\r\n const timeoutId = setTimeout(() => {\r\n if (!element.parentElement) {\r\n console.warn('Parent element not found for signal', signalId);\r\n return;\r\n }\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 instanceIdRef.current = `instance-${crypto.randomUUID()}`;\r\n\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n const signals = currentMeta.signals || [];\r\n signals.push({\r\n instanceId: instanceIdRef.current,\r\n parentId,\r\n position,\r\n effect: proxy._effect,\r\n });\r\n\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, {\r\n ...currentMeta,\r\n signals,\r\n });\r\n\r\n let displayValue = value;\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:', err);\r\n }\r\n }\r\n\r\n if (displayValue !== null && typeof displayValue === 'object') {\r\n displayValue = JSON.stringify(displayValue);\r\n }\r\n const textNode = document.createTextNode(String(displayValue ?? ''));\r\n element.replaceWith(textNode);\r\n isSetupRef.current = true;\r\n }, 0);\r\n\r\n return () => {\r\n clearTimeout(timeoutId);\r\n if (instanceIdRef.current) {\r\n const currentMeta =\r\n getGlobalStore\r\n .getState()\r\n .getShadowMetadata(proxy._stateKey, proxy._path) || {};\r\n if (currentMeta.signals) {\r\n currentMeta.signals = currentMeta.signals.filter(\r\n (s) => s.instanceId !== instanceIdRef.current\r\n );\r\n getGlobalStore\r\n .getState()\r\n .setShadowMetadata(proxy._stateKey, proxy._path, currentMeta);\r\n }\r\n }\r\n };\r\n }, []);\r\n\r\n return createElement('span', {\r\n ref: elementRef,\r\n style: { display: 'contents' },\r\n 'data-signal-id': signalId,\r\n });\r\n}\r\n"],"names":["getInitialOptions","updateInitialStateGlobal","getShadowMetadata","setShadowMetadata","getShadowValue","initializeShadowState","initializeAndMergeShadowState","updateShadowAtPath","insertShadowArrayElement","insertManyShadowArrayElements","removeShadowArrayElement","setInitialStateOptions","setServerStateUpdate","markAsDirty","addPathComponent","clearSelectedIndexesForState","addStateLog","clearSelectedIndex","getSyncInfo","notifyPathSubscribers","getPluginMetaDataMap","setPluginMetaData","removePluginMetaData","getGlobalStore","notifyUpdate","pluginStore","getArrayData","stateKey","path","meta","shadowMeta","arrayPathKey","viewIds","findArrayItem","array","keys","predicate","i","key","setAndMergeOptions","newOptions","mergedOptions","setOptions","options","initialOptionsPart","initialOptions","initialOptionsPartState","needToAdd","deepMerge","target","source","isDeepEqual","hadSchema","hasNewSchemaV4","hasNewSchemaV3","updateShadowTypeInfo","notifyComponents","addStateOptions","initialState","createCogsState","opt","statePart","transformStateFunc","existingOptions","existingGlobalOptions","finalOptions","useCogsState","componentId","useState","uuidv4","currentOptions","optionsRef","useRef","thiState","updater","useCogsStateFn","useEffect","setCogsOptionsByKey","loadAndApplyLocalStorage","updatedPlugins","plugin","setCogsOptions","globalOptions","saveToLocalStorage","state","thisKey","currentInitialOptions","sessionId","lastSyncedWithServer","isFunction","storageKey","existingLastSynced","loadFromLocalStorage","data","superJsonResult","superjson","localStorageKey","storedData","error","currentState","useCogsConfig","localkey","localData","stateEntry","updates","component","update","markEntireStateAsServerSynced","timestamp","currentMeta","arrayMeta","itemKey","index","itemPath","itemData","fieldPath","fieldData","updateBatchQueue","isFlushScheduled","scheduleFlush","flushQueue","updateSignals","displayValue","parentId","position","effect","parent","childNodes","finalDisplayValue","err","getComponentNotifications","result","rootMeta","componentsToNotify","currentPath","pathMeta","isArray","getDifferences","subPathString","subPath","fullSubPath","subPathMeta","handleUpdate","payload","oldValue","newValue","newShadowMeta","handleInsertMany","updatedMeta","handleInsert","itemId","currentValue","getScopedData","actualItemId","insertAfterId","handleCut","parentArrayPath","allComponentsToNotify","signalUpdates","logsToAdd","item","createEffectiveSetState","latestInitialOptionsRef","newStateOrFunction","updateObj","executeUpdate","newUpdate","runValidation","stateObject","localStorage","formElements","reactiveDeps","reactiveType","defaultState","dependencies","serverState","reactiveForce","forceUpdate","noStateKey","componentIdRef","resolveInitialState","useCallback","overrideOptions","finalDefaultState","localKey","event","serverStateData","mergeConfig","incomingData","keyField","existingIds","newUniqueItems","finalState","existingMeta","features","resolvedState","useLayoutEffect","componentKey","components","fullPath","effectiveSetState","useMemo","createProxyHandler","applyTransforms","ids","transforms","transform","filtered","id","value","a","b","aValue","bValue","registerComponentDependency","dependencyPath","fullComponentId","notifySelectionComponents","parentPath","currentSelected","notifiedComponents","parentMeta","arrayKey","selectedItem","arrayKeys","outerComponentId","proxyCache","rebuildStateShape","derivationSignature","cacheKey","stateKeyPathKey","proxyTarget","handler","thisArg","args","prop","receiver","hint","rootLevelMethods","nextPath","sync","validationKey","response","getStatusFunc","initalOptionsGet","store","opts","schema","errorPath","selectedItemKey","viewKey","currentViewIds","selectedItemId","selectedId","callbackfn","shadowValue","arraySetter","_item","itemSetter","filteredIds","compareFn","currentArray","itemsWithIds","sortedIds","componentIdsRef","updateTrigger","validIds","arrayValues","unsubscribe","e","caches","returnValue","localIndex","itemComponentId","createElement","MemoizedCogsItemWrapper","fieldName","lastItemKey","newPath","fields","onMatch","matchedItem","isMatch","field","updatedItem","updatedArray","indexToCut","idToCut","pathForCut","found","pathForItem","searchKey","searchValue","fn","$cogsSignal","syncKey","parentPathArray","fullParentKey","fullItemKey","targetPath","startNode","stack","node","currPath","fullPathKey","updateType","pluginName","zodErrors","operation","metaData","afterIndex","patches","convertPath","jsonPath","patch","relativePath","children","hideMessage","jsx","ValidationWrapper","currentValueAtPath","arg1","arg2","hasDependencies","renderFn","IsolatedComponentWrapper","child","formOpts","FormElementWrapper","proxyInstance","obj","revertState","newState","newUpdaterState","startTransition","proxy","SignalRenderer","elementRef","instanceIdRef","isSetupRef","signalId","element","timeoutId","parentElement","signals","textNode","s"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CogsStateClient.jsx","sources":["../src/CogsStateClient.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport React, { createContext, useContext } from \"react\";\r\ntype ConfigType = { sessionId?: string };\r\nexport const config: ConfigType = {\r\n sessionId: undefined,\r\n};\r\n\r\nconst CogsContext = createContext<ConfigType>(config);\r\n\r\nexport const useCogsConfig = () => useContext(CogsContext);\r\n\r\nexport function CogsStateClient({\r\n children,\r\n sessionId,\r\n}: {\r\n children: React.ReactNode;\r\n sessionId?: string;\r\n}) {\r\n return (\r\n <CogsContext.Provider value={{ sessionId }}>\r\n {children}\r\n </CogsContext.Provider>\r\n );\r\n}\r\n"],"names":["config","CogsContext","createContext","useCogsConfig","useContext","CogsStateClient","children","sessionId","jsx"],"mappings":";;;AAIO,MAAMA,IAAqB;AAAA,EAChC,WAAW;AACb,GAEMC,IAAcC,EAA0BF,CAAM,GAEvCG,IAAgB,MAAMC,EAAWH,CAAW;AAElD,SAASI,EAAgB;AAAA,EAC9B,UAAAC;AAAA,EACA,WAAAC;AACF,GAGG;AACD,SACE,gBAAAC,EAACP,EAAY,UAAZ,EAAqB,OAAO,EAAE,WAAAM,EAAA,GAC5B,UAAAD,GACH;AAEJ;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Components.jsx","sources":["../src/Components.tsx"],"sourcesContent":["import {\r\n FormElementParams,\r\n StateObject,\r\n UpdateTypeDetail,\r\n type FormOptsType,\r\n} from './CogsState';\r\nimport { pluginStore } from './pluginStore';\r\nimport {\r\n createMetadataContext,\r\n createScopedMetadataContext,\r\n PluginsApi,\r\n toDeconstructedMethods,\r\n} from './plugins';\r\nimport React, {\r\n memo,\r\n RefObject,\r\n useCallback,\r\n useEffect,\r\n useLayoutEffect,\r\n useRef,\r\n useState,\r\n useMemo,\r\n} from 'react';\r\nimport { getGlobalStore, ValidationError, ValidationSeverity } from './store';\r\nimport { useInView } from 'react-intersection-observer';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isDeepEqual } from './utility';\r\nimport { runValidation } from './validation';\r\n\r\nconst {\r\n getInitialOptions,\r\n\r\n getShadowMetadata,\r\n setShadowMetadata,\r\n getShadowValue,\r\n\r\n registerComponent,\r\n unregisterComponent,\r\n\r\n notifyPathSubscribers,\r\n subscribeToPath,\r\n} = getGlobalStore.getState();\r\nconst { stateHandlers, notifyFormUpdate } = pluginStore.getState();\r\n\r\nexport type ValidationWrapperProps = {\r\n formOpts?: FormOptsType;\r\n path: string[];\r\n stateKey: string;\r\n children: React.ReactNode;\r\n};\r\n\r\nexport function ValidationWrapper({\r\n formOpts,\r\n path,\r\n stateKey,\r\n children,\r\n}: ValidationWrapperProps) {\r\n const { getInitialOptions, getShadowMetadata, getShadowValue } =\r\n getGlobalStore.getState();\r\n const thisStateOpts = getInitialOptions(stateKey!);\r\n\r\n const shadowMeta = getShadowMetadata(stateKey!, path);\r\n const validationState = shadowMeta?.validation;\r\n\r\n const status = validationState?.status || 'NOT_VALIDATED';\r\n\r\n const errors = (validationState?.errors || []).map((err) => ({\r\n ...err,\r\n path: path,\r\n })) as ValidationError[];\r\n const errorMessages = errors\r\n .filter((err) => err.severity === 'error')\r\n .map((err) => err.message);\r\n const warningMessages = errors\r\n .filter((err) => err.severity === 'warning')\r\n .map((err) => err.message);\r\n\r\n // Use first error, or first warning if no errors\r\n const message = errorMessages[0] || warningMessages[0];\r\n const primarySeverity: ValidationSeverity =\r\n errorMessages.length > 0\r\n ? 'error'\r\n : warningMessages.length > 0\r\n ? 'warning'\r\n : undefined;\r\n const { registeredPlugins } = pluginStore.getState();\r\n const pluginsApi: PluginsApi = {};\r\n\r\n // We iterate over ALL registered plugins in the app.\r\n registeredPlugins.forEach((plugin) => {\r\n if (thisStateOpts && thisStateOpts.hasOwnProperty(plugin.name)) {\r\n const pluginName = plugin.name;\r\n\r\n const hookData = pluginStore\r\n .getState()\r\n .getHookResult(stateKey!, pluginName);\r\n\r\n const scopedMetadata = createScopedMetadataContext(\r\n stateKey!,\r\n pluginName,\r\n path\r\n );\r\n\r\n pluginsApi[pluginName] = {\r\n hookData,\r\n getFieldMetaData: scopedMetadata.getFieldMetaData,\r\n setFieldMetaData: scopedMetadata.setFieldMetaData,\r\n removeFieldMetaData: scopedMetadata.removeFieldMetaData,\r\n };\r\n }\r\n });\r\n\r\n return (\r\n <>\r\n {thisStateOpts?.formElements?.validation &&\r\n !formOpts?.validation?.disable ? (\r\n thisStateOpts.formElements!.validation!({\r\n children: (\r\n <React.Fragment key={path.toString()}>{children}</React.Fragment>\r\n ),\r\n status, // Now passes the new ValidationStatus type\r\n message: formOpts?.validation?.hideMessage\r\n ? ''\r\n : formOpts?.validation?.message || message || '',\r\n severity: primarySeverity,\r\n hasErrors: errorMessages.length > 0,\r\n hasWarnings: warningMessages.length > 0,\r\n allErrors: errors,\r\n path: path,\r\n getData: () => getShadowValue(stateKey!, path),\r\n plugins: pluginsApi,\r\n })\r\n ) : (\r\n <React.Fragment key={path.toString()}>{children}</React.Fragment>\r\n )}\r\n </>\r\n );\r\n}\r\nexport const MemoizedCogsItemWrapper = memo(\r\n ListItemWrapper,\r\n (prevProps, nextProps) => {\r\n // Re-render if any of these change:\r\n return (\r\n prevProps.itemPath.join('.') === nextProps.itemPath.join('.') &&\r\n prevProps.stateKey === nextProps.stateKey &&\r\n prevProps.itemComponentId === nextProps.itemComponentId &&\r\n prevProps.localIndex === nextProps.localIndex\r\n );\r\n }\r\n);\r\n\r\nexport function ListItemWrapper({\r\n stateKey,\r\n itemComponentId,\r\n itemPath,\r\n localIndex,\r\n arraySetter,\r\n rebuildStateShape,\r\n renderFn,\r\n}: {\r\n stateKey: string;\r\n itemComponentId: string;\r\n itemPath: string[];\r\n localIndex: number;\r\n arraySetter: any;\r\n rebuildStateShape: any;\r\n renderFn: any;\r\n}) {\r\n const [, forceUpdate] = useState({});\r\n const { ref: inViewRef, inView } = useInView();\r\n const elementRef = useRef<HTMLElement | null>(null); // Changed to HTMLElement to be generic\r\n\r\n const fullKey = [stateKey, ...itemPath].join('.');\r\n\r\n useRegisterComponent(stateKey, itemComponentId, forceUpdate);\r\n\r\n const setRefs = useCallback(\r\n (element: HTMLElement | null) => {\r\n elementRef.current = element;\r\n inViewRef(element);\r\n },\r\n [inViewRef]\r\n );\r\n\r\n useEffect(() => {\r\n const unsubscribe = subscribeToPath(fullKey, (e) => {\r\n forceUpdate({});\r\n });\r\n return () => unsubscribe();\r\n }, [fullKey]);\r\n\r\n const itemValue = getShadowValue(stateKey, itemPath);\r\n if (itemValue === undefined) return null;\r\n\r\n const itemSetter = rebuildStateShape({\r\n currentState: itemValue,\r\n path: itemPath,\r\n componentId: itemComponentId,\r\n });\r\n\r\n // 1. Render the user's content (e.g. the <tr>)\r\n const children = renderFn(itemSetter, localIndex, arraySetter);\r\n\r\n // 2. AUTO-DETECT: If it is a single valid element (<tr>, <div>, <li>), inject the ref.\r\n if (React.isValidElement(children)) {\r\n // We clone the element and force our ref onto it\r\n return React.cloneElement(children as React.ReactElement<any>, {\r\n ref: (node: any) => {\r\n // Apply our virtualization ref\r\n setRefs(node);\r\n\r\n // Preserve any ref the user might have put on the element themselves\r\n const { ref: existingRef } = children as any;\r\n if (typeof existingRef === 'function') {\r\n existingRef(node);\r\n } else if (existingRef && 'current' in existingRef) {\r\n (existingRef as any).current = node;\r\n }\r\n },\r\n });\r\n }\r\n\r\n // 3. Fallback: If they returned a Fragment or string, we MUST wrap it to measure it.\r\n // (Note: This specific fallback will still break inside a <tbody>, but\r\n // as long as you return a <tr> above, line 90 catches it).\r\n return <div ref={setRefs}>{children}</div>;\r\n}\r\n\r\nexport function FormElementWrapper({\r\n stateKey,\r\n path,\r\n rebuildStateShape,\r\n renderFn,\r\n formOpts,\r\n setState,\r\n}: {\r\n stateKey: string;\r\n path: string[];\r\n rebuildStateShape: (options: {\r\n path: string[];\r\n componentId: string;\r\n meta?: any;\r\n }) => any;\r\n renderFn: (params: FormElementParams<any>) => React.ReactNode;\r\n formOpts?: FormOptsType;\r\n setState: any;\r\n}) {\r\n const componentId = useRef(uuidv4()).current;\r\n\r\n const [, forceUpdate] = useState({});\r\n const formElementRef = useRef<any>(null);\r\n const stateKeyPathKey = [stateKey, ...path].join('.');\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n // Get the shadow node to access typeInfo and schema\r\n const shadowNode = getGlobalStore.getState().getShadowNode(stateKey, path);\r\n const typeInfo = shadowNode?._meta?.typeInfo;\r\n\r\n const globalStateValue = getShadowValue(stateKey, path);\r\n const [localValue, setLocalValue] = useState<any>(globalStateValue);\r\n const isCurrentlyDebouncing = useRef(false);\r\n const debounceTimeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n useEffect(() => {\r\n if (\r\n !isCurrentlyDebouncing.current &&\r\n !isDeepEqual(globalStateValue, localValue)\r\n ) {\r\n setLocalValue(globalStateValue);\r\n }\r\n }, [globalStateValue]);\r\n\r\n useEffect(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Initialize clientActivityState if needed\r\n const currentMeta = getShadowMetadata(stateKey, path) || {};\r\n if (!currentMeta.clientActivityState) {\r\n currentMeta.clientActivityState = { elements: new Map() };\r\n }\r\n\r\n // Detect element type from the ref\r\n const detectElementType = () => {\r\n const el = formElementRef.current;\r\n if (!el) return 'input';\r\n const tagName = el.tagName.toLowerCase();\r\n if (tagName === 'textarea') return 'textarea';\r\n if (tagName === 'select') return 'select';\r\n if (tagName === 'input') {\r\n const type = (el as HTMLInputElement).type;\r\n if (type === 'checkbox') return 'checkbox';\r\n if (type === 'radio') return 'radio';\r\n if (type === 'range') return 'range';\r\n if (type === 'file') return 'file';\r\n }\r\n return 'input';\r\n };\r\n\r\n // Add this element to the Map\r\n currentMeta.clientActivityState.elements.set(componentId, {\r\n domRef: formElementRef,\r\n elementType: detectElementType(),\r\n inputType: formElementRef.current?.type,\r\n mountedAt: Date.now(),\r\n });\r\n\r\n setShadowMetadata(stateKey, path, currentMeta);\r\n\r\n // Subscribe to path updates\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(stateKeyPathKey, (newValue) => {\r\n if (!isCurrentlyDebouncing.current && localValue !== newValue) {\r\n forceUpdate({});\r\n }\r\n });\r\n\r\n // Cleanup\r\n return () => {\r\n unsubscribe();\r\n\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n isCurrentlyDebouncing.current = false;\r\n }\r\n\r\n // Remove element from Map\r\n const meta = getGlobalStore.getState().getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements) {\r\n meta.clientActivityState.elements.delete(componentId);\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n };\r\n }, []);\r\n\r\n const debouncedUpdate = useCallback(\r\n (newValue: any) => {\r\n // Type conversion logic (keep existing)\r\n if (typeInfo) {\r\n if (typeInfo.type === 'number' && typeof newValue === 'string') {\r\n newValue =\r\n newValue === ''\r\n ? typeInfo.nullable\r\n ? null\r\n : (typeInfo.default ?? 0)\r\n : Number(newValue);\r\n } else if (\r\n typeInfo.type === 'boolean' &&\r\n typeof newValue === 'string'\r\n ) {\r\n newValue = newValue === 'true' || newValue === '1';\r\n } else if (typeInfo.type === 'date' && typeof newValue === 'string') {\r\n newValue = new Date(newValue);\r\n }\r\n } else {\r\n const currentType = typeof globalStateValue;\r\n if (currentType === 'number' && typeof newValue === 'string') {\r\n newValue = newValue === '' ? 0 : Number(newValue);\r\n }\r\n }\r\n\r\n setLocalValue(newValue);\r\n\r\n // Update input activity details\r\n const { getShadowMetadata, setShadowMetadata } =\r\n getGlobalStore.getState();\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId);\r\n if (element && element.currentActivity?.type === 'focus') {\r\n element!.currentActivity.details = {\r\n ...element!.currentActivity.details,\r\n value: newValue,\r\n previousValue:\r\n element!.currentActivity.details?.value || globalStateValue,\r\n inputLength:\r\n typeof newValue === 'string' ? newValue.length : undefined,\r\n keystrokeCount:\r\n (element!.currentActivity.details?.keystrokeCount || 0) + 1,\r\n };\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n }\r\n const element = meta?.clientActivityState?.elements?.get(componentId);\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'input', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n details: {\r\n value: newValue,\r\n inputLength:\r\n typeof newValue === 'string' ? newValue.length : undefined,\r\n isComposing: false, // You'd need to track this from the actual input event\r\n isPasting: false, // You'd need to track this from paste events\r\n keystrokeCount:\r\n (element?.currentActivity?.details?.keystrokeCount || 0) + 1,\r\n },\r\n });\r\n // Validation (keep existing)\r\n const virtualOperation: UpdateTypeDetail = {\r\n stateKey,\r\n path,\r\n newValue: newValue,\r\n updateType: 'update',\r\n timeStamp: Date.now(),\r\n status: 'new',\r\n oldValue: globalStateValue,\r\n };\r\n runValidation(virtualOperation, 'onChange');\r\n\r\n // Debounce state update (keep existing)\r\n isCurrentlyDebouncing.current = true;\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n }\r\n\r\n const debounceTime = formOpts?.debounceTime ?? 200;\r\n debounceTimeoutRef.current = setTimeout(() => {\r\n isCurrentlyDebouncing.current = false;\r\n setState(newValue, path, {\r\n updateType: 'update',\r\n validationTrigger: 'onChange',\r\n });\r\n }, debounceTime);\r\n },\r\n [\r\n setState,\r\n path,\r\n formOpts?.debounceTime,\r\n typeInfo,\r\n globalStateValue,\r\n stateKey,\r\n componentId,\r\n ]\r\n );\r\n\r\n const handleFocus = useCallback(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Update element's current activity\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId)!;\r\n element.currentActivity = {\r\n type: 'focus',\r\n startTime: Date.now(),\r\n details: {\r\n value: localValue,\r\n inputLength:\r\n typeof localValue === 'string' ? localValue.length : undefined,\r\n },\r\n };\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'focus', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n details: {\r\n cursorPosition: formElementRef.current?.selectionStart,\r\n },\r\n });\r\n }, [stateKey, path, componentId, localValue]);\r\n const handleBlur = useCallback(() => {\r\n const { getShadowMetadata, setShadowMetadata } = getGlobalStore.getState();\r\n\r\n // Clear debounce if active\r\n if (debounceTimeoutRef.current) {\r\n clearTimeout(debounceTimeoutRef.current);\r\n debounceTimeoutRef.current = null;\r\n isCurrentlyDebouncing.current = false;\r\n setState(localValue, path, {\r\n updateType: 'update',\r\n validationTrigger: 'onBlur',\r\n });\r\n }\r\n\r\n // Clear element's current activity\r\n const meta = getShadowMetadata(stateKey, path);\r\n if (meta?.clientActivityState?.elements?.has(componentId)) {\r\n const element = meta.clientActivityState.elements.get(componentId)!;\r\n element.currentActivity = undefined;\r\n setShadowMetadata(stateKey, path, meta);\r\n }\r\n const focusStartTime =\r\n meta?.clientActivityState?.elements?.get(componentId)?.currentActivity\r\n ?.startTime;\r\n\r\n // Notify plugins\r\n notifyFormUpdate({\r\n stateKey,\r\n activityType: 'blur', // Changed from 'type'\r\n path,\r\n timestamp: Date.now(),\r\n duration: focusStartTime ? Date.now() - focusStartTime : undefined,\r\n details: {\r\n duration: focusStartTime ? Date.now() - focusStartTime : 0,\r\n },\r\n });\r\n\r\n // Run validation if configured\r\n const validationOptions = getInitialOptions(stateKey)?.validation;\r\n if (validationOptions?.onBlur) {\r\n const virtualOperation: UpdateTypeDetail = {\r\n stateKey,\r\n path,\r\n newValue: localValue,\r\n updateType: 'update',\r\n timeStamp: Date.now(),\r\n status: 'new',\r\n oldValue: globalStateValue,\r\n };\r\n runValidation(virtualOperation, 'onBlur');\r\n }\r\n }, [localValue, setState, path, stateKey, componentId, globalStateValue]);\r\n\r\n const baseState = rebuildStateShape({\r\n path: path,\r\n componentId: componentId,\r\n meta: undefined,\r\n });\r\n\r\n const stateWithInputProps = new Proxy(baseState, {\r\n get(target, prop) {\r\n if (prop === '$inputProps') {\r\n return {\r\n value: localValue ?? '',\r\n onChange: (e: any) => {\r\n debouncedUpdate(e.target.value);\r\n },\r\n onFocus: handleFocus,\r\n onBlur: handleBlur,\r\n ref: formElementRef,\r\n };\r\n }\r\n\r\n return target[prop];\r\n },\r\n });\r\n\r\n const initialElement = renderFn(stateWithInputProps);\r\n\r\n return (\r\n <ValidationWrapper formOpts={formOpts} path={path} stateKey={stateKey}>\r\n {initialElement}\r\n </ValidationWrapper>\r\n );\r\n}\r\nexport function useRegisterComponent(\r\n stateKey: string,\r\n componentId: string,\r\n forceUpdate: (o: object) => void\r\n) {\r\n const fullComponentId = `${stateKey}////${componentId}`;\r\n\r\n useLayoutEffect(() => {\r\n registerComponent(stateKey, fullComponentId, {\r\n forceUpdate: () => forceUpdate({}),\r\n paths: new Set(),\r\n reactiveType: ['component'],\r\n });\r\n return () => {\r\n unregisterComponent(stateKey, fullComponentId);\r\n };\r\n }, [stateKey, fullComponentId]);\r\n}\r\n\r\nexport function IsolatedComponentWrapper({\r\n stateKey,\r\n path, // The path of the parent node (e.g. ['form'])\r\n dependencies, // NEW: Optional array of Proxy objects or path arrays\r\n rebuildStateShape,\r\n renderFn,\r\n}: {\r\n stateKey: string;\r\n path: string[];\r\n dependencies?: any[]; // The explicit list of dependencies\r\n rebuildStateShape: (options: any) => any;\r\n renderFn: (state: any) => React.ReactNode;\r\n}) {\r\n const [componentId] = useState(() => uuidv4());\r\n const [, forceUpdate] = useState({});\r\n\r\n useRegisterComponent(stateKey, componentId, forceUpdate);\r\n\r\n const pathsToSubscribe = useMemo(() => {\r\n if (dependencies && dependencies.length > 0) {\r\n return dependencies.map((dep) => {\r\n return [stateKey, ...dep.$_path].join('.');\r\n });\r\n }\r\n\r\n return [[stateKey, ...path].join('.')];\r\n }, [stateKey, path, dependencies]);\r\n\r\n // 2. Subscribe to ALL calculated paths\r\n useEffect(() => {\r\n const store = getGlobalStore.getState();\r\n\r\n // Create an array of unsubscribe functions\r\n const unsubs = pathsToSubscribe.map((fullPathKey) => {\r\n return store.subscribeToPath(fullPathKey, () => {\r\n forceUpdate({});\r\n });\r\n });\r\n\r\n return () => {\r\n unsubs.forEach((unsub) => unsub());\r\n };\r\n }, [pathsToSubscribe]);\r\n\r\n const baseState = rebuildStateShape({\r\n path: path,\r\n componentId: componentId,\r\n meta: undefined,\r\n });\r\n\r\n return <>{renderFn(baseState)}</>;\r\n}\r\n// 1. Define the MINIMAL props needed.\r\ntype PluginWrapperProps = {\r\n children: React.ReactNode;\r\n stateKey: string;\r\n path: string[];\r\n pluginName: string;\r\n wrapperDepth: number;\r\n};\r\n\r\nconst PluginWrapper = memo(function PluginWrapper({\r\n children,\r\n stateKey,\r\n path,\r\n pluginName,\r\n wrapperDepth,\r\n}: PluginWrapperProps) {\r\n const [, forceUpdate] = useState({});\r\n\r\n useEffect(() => {\r\n const fullPathKey = [stateKey, ...path].join('.');\r\n const unsubscribe = getGlobalStore\r\n .getState()\r\n .subscribeToPath(fullPathKey, () => {\r\n forceUpdate({});\r\n });\r\n return unsubscribe;\r\n }, [stateKey, path]);\r\n\r\n const plugin = pluginStore\r\n .getState()\r\n .registeredPlugins.find((p) => p.name === pluginName);\r\n\r\n const stateHandler: StateObject<any> | undefined = pluginStore\r\n .getState()\r\n .stateHandlers.get(stateKey);\r\n\r\n const typeInfo = getGlobalStore.getState().getShadowNode(stateKey, path)\r\n ?._meta?.typeInfo;\r\n\r\n const options = pluginStore\r\n .getState()\r\n .pluginOptions.get(stateKey)\r\n ?.get(pluginName);\r\n\r\n const hookData = pluginStore.getState().getHookResult(stateKey, pluginName);\r\n\r\n if (!plugin?.formWrapper || !stateHandler) {\r\n return <>{children}</>;\r\n }\r\n\r\n const deconstructed = toDeconstructedMethods(stateHandler);\r\n const scopedMetadataContext = createScopedMetadataContext(\r\n stateKey,\r\n plugin.name,\r\n path\r\n );\r\n return plugin.formWrapper({\r\n element: children,\r\n path,\r\n stateKey,\r\n pluginName: plugin.name,\r\n ...deconstructed,\r\n\r\n ...scopedMetadataContext,\r\n options,\r\n hookData,\r\n fieldType: typeInfo?.type,\r\n wrapperDepth,\r\n });\r\n});\r\n"],"names":["getInitialOptions","getShadowMetadata","setShadowMetadata","getShadowValue","registerComponent","unregisterComponent","notifyPathSubscribers","subscribeToPath","getGlobalStore","stateHandlers","notifyFormUpdate","pluginStore","ValidationWrapper","formOpts","path","stateKey","children","thisStateOpts","validationState","status","errors","err","errorMessages","warningMessages","message","primarySeverity","registeredPlugins","pluginsApi","plugin","pluginName","hookData","scopedMetadata","createScopedMetadataContext","jsx","Fragment","React","MemoizedCogsItemWrapper","memo","ListItemWrapper","prevProps","nextProps","itemComponentId","itemPath","localIndex","arraySetter","rebuildStateShape","renderFn","forceUpdate","useState","inViewRef","inView","useInView","elementRef","useRef","fullKey","useRegisterComponent","setRefs","useCallback","element","useEffect","unsubscribe","e","itemValue","itemSetter","node","existingRef","FormElementWrapper","setState","componentId","uuidv4","formElementRef","stateKeyPathKey","typeInfo","globalStateValue","localValue","setLocalValue","isCurrentlyDebouncing","debounceTimeoutRef","isDeepEqual","currentMeta","detectElementType","el","tagName","type","newValue","meta","debouncedUpdate","runValidation","debounceTime","handleFocus","handleBlur","focusStartTime","baseState","stateWithInputProps","target","prop","initialElement","fullComponentId","useLayoutEffect","IsolatedComponentWrapper","dependencies","pathsToSubscribe","useMemo","dep","store","unsubs","fullPathKey","unsub","wrapperDepth","p","stateHandler","options","deconstructed","toDeconstructedMethods","scopedMetadataContext"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PluginRunner.jsx","sources":["../src/PluginRunner.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState, useRef, useReducer } from 'react';\r\nimport { ClientActivityEvent, pluginStore } from './pluginStore';\r\nimport { isDeepEqual } from './utility';\r\nimport {\r\n createMetadataContext,\r\n createScopedMetadataContext,\r\n toDeconstructedMethods,\r\n} from './plugins';\r\nimport type { CogsPlugin } from './plugins';\r\nimport type { StateObject, UpdateTypeDetail } from './CogsState';\r\nimport { ClientActivityState, FormEventType } from './store';\r\n\r\nconst { setHookResult, removeHookResult } = pluginStore.getState();\r\n\r\nconst PluginInstance = React.memo(\r\n ({\r\n stateKey,\r\n plugin,\r\n options,\r\n stateHandler,\r\n }: {\r\n stateKey: string;\r\n plugin: CogsPlugin<any, any, any, any, any>;\r\n options: any;\r\n stateHandler: StateObject<any>;\r\n }) => {\r\n const [isInitialMount, setIsInitialMount] = useState(true);\r\n const metadataContext = useMemo(\r\n () => createMetadataContext(stateKey, plugin.name),\r\n [stateKey, plugin.name]\r\n );\r\n\r\n const deconstructed = useMemo(\r\n () => toDeconstructedMethods(stateHandler),\r\n [stateHandler]\r\n );\r\n\r\n const hookContext = useMemo(\r\n () => ({\r\n stateKey,\r\n pluginName: plugin.name,\r\n isInitialMount,\r\n options,\r\n ...deconstructed,\r\n ...metadataContext,\r\n }),\r\n [\r\n stateKey,\r\n plugin.name,\r\n isInitialMount,\r\n options,\r\n deconstructed,\r\n metadataContext,\r\n ]\r\n );\r\n\r\n const hookData = plugin.useHook ? plugin.useHook(hookContext) : undefined;\r\n\r\n useEffect(() => {\r\n setIsInitialMount(false);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (plugin.useHook) setHookResult(stateKey, plugin.name, hookData);\r\n else removeHookResult(stateKey, plugin.name);\r\n return () => removeHookResult(stateKey, plugin.name);\r\n }, [stateKey, plugin.name, !!plugin.useHook, hookData]);\r\n\r\n const lastProcessedOptionsRef = useRef<any>();\r\n const [isInitialTransform, setIsInitialTransform] = useState(true);\r\n\r\n useEffect(() => {\r\n if (plugin.transformState) {\r\n if (!isDeepEqual(options, lastProcessedOptionsRef.current)) {\r\n plugin.transformState({\r\n stateKey,\r\n pluginName: plugin.name,\r\n options,\r\n hookData,\r\n isInitialTransform,\r\n ...deconstructed,\r\n ...metadataContext,\r\n });\r\n lastProcessedOptionsRef.current = options;\r\n setIsInitialTransform(false);\r\n }\r\n }\r\n }, [\r\n stateKey,\r\n plugin,\r\n options,\r\n hookData,\r\n isInitialTransform,\r\n deconstructed,\r\n metadataContext,\r\n ]);\r\n\r\n const hookDataRef = useRef(hookData);\r\n hookDataRef.current = hookData;\r\n\r\n useEffect(() => {\r\n if (!plugin.onUpdate) return;\r\n\r\n const handleUpdate = (update: UpdateTypeDetail) => {\r\n if (update.stateKey === stateKey) {\r\n // Create a new, SCOPED context for this specific path\r\n const scopedMetadata = createScopedMetadataContext(\r\n stateKey,\r\n plugin.name,\r\n update.path\r\n );\r\n\r\n plugin.onUpdate!({\r\n stateKey,\r\n pluginName: plugin.name,\r\n update,\r\n path: update.path,\r\n options,\r\n hookData: hookDataRef.current,\r\n ...deconstructed,\r\n ...scopedMetadata, // <-- Use the new scoped context\r\n });\r\n }\r\n };\r\n\r\n const unsubscribe = pluginStore\r\n .getState()\r\n .subscribeToUpdates(handleUpdate);\r\n return unsubscribe;\r\n }, [stateKey, plugin, options, deconstructed]);\r\n\r\n useEffect(() => {\r\n if (!plugin.onFormUpdate) return;\r\n\r\n const handleFormUpdate = (\r\n event: ClientActivityEvent // Use the proper type\r\n ) => {\r\n if (event.stateKey === stateKey) {\r\n // Create a new, SCOPED context for this specific path\r\n const scopedMetadata = createScopedMetadataContext(\r\n stateKey,\r\n plugin.name,\r\n event.path\r\n );\r\n\r\n plugin.onFormUpdate!({\r\n stateKey,\r\n pluginName: plugin.name,\r\n path: event.path,\r\n event: event,\r\n options,\r\n hookData: hookDataRef.current,\r\n ...deconstructed,\r\n ...scopedMetadata, // <-- Use the new scoped context\r\n });\r\n }\r\n };\r\n\r\n const unsubscribe = pluginStore\r\n .getState()\r\n .subscribeToFormUpdates(handleFormUpdate);\r\n return unsubscribe;\r\n }, [stateKey, plugin, options, deconstructed]);\r\n\r\n return null;\r\n }\r\n);\r\n/**\r\n * The main orchestrator component. It reads from the central pluginStore\r\n * and renders a `PluginInstance` controller for each active plugin.\r\n */\r\nexport function PluginRunner({ children }: { children: React.ReactNode }) {\r\n // A simple way to force a re-render when the store changes.\r\n const [, forceUpdate] = useReducer((c) => c + 1, 0);\r\n\r\n // Subscribe to the store. When plugins or their options are added/removed,\r\n // this component will re-render to update the list of PluginInstances.\r\n useEffect(() => {\r\n const unsubscribe = pluginStore.subscribe(forceUpdate);\r\n return unsubscribe;\r\n }, []);\r\n\r\n const { pluginOptions, stateHandlers, registeredPlugins } =\r\n pluginStore.getState();\r\n\r\n return (\r\n <>\r\n {/*\r\n This declarative mapping is the core of the solution.\r\n React will now manage adding and removing `PluginInstance` components\r\n as the application state changes, ensuring hooks are handled safely.\r\n */}\r\n {Array.from(pluginOptions.entries()).map(([stateKey, pluginMap]) => {\r\n const stateHandler = stateHandlers.get(stateKey);\r\n if (!stateHandler) {\r\n return null; // Don't render a runner if the state handler isn't ready.\r\n }\r\n\r\n return Array.from(pluginMap.entries()).map(([pluginName, options]) => {\r\n const plugin = registeredPlugins.find((p) => p.name === pluginName);\r\n if (!plugin) {\r\n return null; // Don't render if the plugin is not in the registered list.\r\n }\r\n\r\n // Render a dedicated, memoized controller for this specific plugin configuration.\r\n return (\r\n <PluginInstance\r\n key={`${stateKey}:${pluginName}`}\r\n stateKey={stateKey}\r\n plugin={plugin}\r\n options={options}\r\n stateHandler={stateHandler}\r\n />\r\n );\r\n });\r\n })}\r\n\r\n {children}\r\n </>\r\n );\r\n}\r\n"],"names":["setHookResult","removeHookResult","pluginStore","PluginInstance","React","stateKey","plugin","options","stateHandler","isInitialMount","setIsInitialMount","useState","metadataContext","useMemo","createMetadataContext","deconstructed","toDeconstructedMethods","hookContext","hookData","useEffect","lastProcessedOptionsRef","useRef","isInitialTransform","setIsInitialTransform","isDeepEqual","hookDataRef","handleUpdate","update","scopedMetadata","createScopedMetadataContext","handleFormUpdate","event","PluginRunner","children","forceUpdate","useReducer","c","pluginOptions","stateHandlers","registeredPlugins","jsxs","Fragment","pluginMap","pluginName","p","jsx"],"mappings":"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"}