cogsbox-state 0.5.483 → 0.5.485
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.
- package/dist/CogsState.d.ts +1 -0
- package/dist/CogsState.d.ts.map +1 -1
- package/dist/CogsState.js +599 -579
- package/dist/CogsState.js.map +1 -1
- package/dist/Components.d.ts.map +1 -1
- package/dist/Components.js +213 -213
- package/dist/Components.js.map +1 -1
- package/dist/PluginRunner.d.ts.map +1 -1
- package/dist/PluginRunner.js +44 -44
- package/dist/PluginRunner.js.map +1 -1
- package/dist/plugins.d.ts +2 -0
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +92 -91
- package/dist/plugins.js.map +1 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +124 -118
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
- package/src/CogsState.tsx +82 -48
- package/src/Components.tsx +32 -27
- package/src/PluginRunner.tsx +2 -1
- package/src/plugins.ts +3 -0
- package/src/store.ts +24 -7
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from 'zustand';\r\nimport type { RefObject } from 'react';\r\n\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from './CogsState.js';\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype StateValue = any;\r\nexport type FormEventType = {\r\n type: 'focus' | 'blur' | 'input';\r\n value?: any;\r\n path: string[];\r\n};\r\nexport type TrieNode = {\r\n subscribers: Set<string>;\r\n children: Map<string, TrieNode>;\r\n};\r\n\r\nexport type ComponentsType = {\r\n components?: Map<\r\n string,\r\n {\r\n forceUpdate: () => void;\r\n paths: Set<string>;\r\n deps?: any[];\r\n prevDeps?: any[];\r\n depsFunction?: (state: any) => any[] | true;\r\n reactiveType: ReactivityType[] | ReactivityType;\r\n }\r\n >;\r\n};\r\n\r\nexport type ValidationStatus =\r\n | 'NOT_VALIDATED'\r\n | 'VALIDATING'\r\n | 'VALID'\r\n | 'INVALID';\r\nexport type ValidationSeverity = 'warning' | 'error' | undefined;\r\nexport type ValidationError = {\r\n source: 'client' | 'sync_engine' | 'api';\r\n message: string;\r\n severity: ValidationSeverity;\r\n code?: string;\r\n};\r\n\r\nexport type ValidationState = {\r\n status: ValidationStatus;\r\n errors: ValidationError[];\r\n lastValidated?: number;\r\n validatedValue?: any;\r\n};\r\nexport type SchemaTypeInfo = {\r\n type:\r\n | 'string'\r\n | 'number'\r\n | 'boolean'\r\n | 'array'\r\n | 'object'\r\n | 'date'\r\n | 'unknown';\r\n schema: any; // Store the actual Zod schema object\r\n source: 'sync' | 'zod4' | 'zod3' | 'runtime' | 'default';\r\n default: any;\r\n nullable?: boolean;\r\n optional?: boolean;\r\n};\r\nexport type ClientActivityState = {\r\n // ALL elements currently mounted for this path\r\n elements: Map<\r\n string,\r\n {\r\n // componentId -> element info\r\n domRef: RefObject<HTMLElement>;\r\n elementType:\r\n | 'input'\r\n | 'textarea'\r\n | 'select'\r\n | 'checkbox'\r\n | 'radio'\r\n | 'range'\r\n | 'file'\r\n | 'custom';\r\n inputType?: string; // For input elements: 'text', 'number', 'date', etc.\r\n mountedAt: number;\r\n\r\n // Current activity for THIS specific element\r\n currentActivity?: {\r\n type:\r\n | 'focus'\r\n | 'blur'\r\n | 'input'\r\n | 'select'\r\n | 'hover'\r\n | 'scroll'\r\n | 'cursor';\r\n startTime: number;\r\n details?: {\r\n value?: any;\r\n previousValue?: any;\r\n inputLength?: number;\r\n changeType?: 'keyboard' | 'paste' | 'drop' | 'select' | 'clear';\r\n selectionStart?: number;\r\n selectionEnd?: number;\r\n selectedText?: string;\r\n cursorPosition?: number;\r\n scrollTop?: number;\r\n scrollLeft?: number;\r\n isComposing?: boolean;\r\n keystrokeCount?: number;\r\n key?: string;\r\n optionCount?: number;\r\n selectedIndex?: number;\r\n checked?: boolean;\r\n arrayOperation?: 'insert' | 'remove' | 'reorder';\r\n arrayIndex?: number;\r\n arrayLength?: number;\r\n };\r\n };\r\n }\r\n >;\r\n};\r\n// Update ShadowMetadata to include typeInfo\r\nexport type ShadowMetadata = {\r\n value?: any;\r\n id?: string;\r\n typeInfo?: SchemaTypeInfo;\r\n stateSource?: 'default' | 'server' | 'localStorage';\r\n lastServerSync?: number;\r\n isDirty?: boolean;\r\n isRaw?: boolean;\r\n baseServerState?: any;\r\n arrayKeys?: string[];\r\n fields?: Record<string, any>;\r\n virtualizer?: {\r\n itemHeight?: number;\r\n domRef?: HTMLElement | null;\r\n };\r\n syncInfo?: { status: string };\r\n validation?: ValidationState;\r\n features?: {\r\n localStorageEnabled: boolean;\r\n };\r\n signals?: Array<{\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n }>;\r\n transformCaches?: Map<\r\n string,\r\n {\r\n validIds: string[];\r\n computedAt: number;\r\n transforms: Array<{ type: 'filter' | 'sort'; fn: Function }>;\r\n }\r\n >;\r\n pathComponents?: Set<string>;\r\n\r\n streams?: Map<\r\n string,\r\n {\r\n buffer: any[];\r\n flushTimer: NodeJS.Timeout | null;\r\n }\r\n >;\r\n pluginMetaData?: Map<string, Record<string, any>>;\r\n // formRef?: React.RefObject<any>;\r\n // focusedElement?: { path: string[]; ref: React.RefObject<any> } | null;\r\n clientActivityState?: ClientActivityState;\r\n} & ComponentsType;\r\n\r\ntype ShadowNode = {\r\n _meta?: ShadowMetadata;\r\n [key: string]: any;\r\n};\r\n\r\nexport type CogsGlobalState = {\r\n getPluginMetaDataMap: (\r\n key: string,\r\n path: string[]\r\n ) => Map<string, Record<string, any>> | undefined;\r\n setPluginMetaData: (\r\n key: string,\r\n path: string[],\r\n pluginName: string,\r\n data: Record<string, any>\r\n ) => void;\r\n removePluginMetaData: (\r\n key: string,\r\n path: string[],\r\n pluginName: string\r\n ) => void;\r\n setTransformCache: (\r\n key: string,\r\n path: string[],\r\n cacheKey: string,\r\n cacheData: any\r\n ) => void;\r\n initializeAndMergeShadowState: (key: string, initialState: any) => void;\r\n initializeShadowState: (key: string, initialState: any) => void;\r\n getShadowNode: (key: string, path: string[]) => ShadowNode | undefined;\r\n getShadowMetadata: (\r\n key: string,\r\n path: string[]\r\n ) => ShadowMetadata | undefined;\r\n\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => void;\r\n getShadowValue: (\r\n key: string,\r\n path: string[],\r\n validArrayIds?: string[],\r\n log?: boolean\r\n ) => any;\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => void;\r\n insertManyShadowArrayElements: (\r\n key: string,\r\n arrayPath: string[],\r\n newItems: any[],\r\n index?: number\r\n ) => void;\r\n addItemsToArrayNode: (\r\n key: string,\r\n arrayPath: string[],\r\n newItems: any\r\n ) => void;\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItem: any,\r\n index?: number,\r\n itemId?: string\r\n ) => string;\r\n removeShadowArrayElement: (key: string, itemPath: string[]) => void;\r\n registerComponent: (\r\n stateKey: string,\r\n componentId: string,\r\n registration: any\r\n ) => void;\r\n unregisterComponent: (stateKey: string, componentId: string) => void;\r\n addPathComponent: (\r\n stateKey: string,\r\n dependencyPath: string[],\r\n fullComponentId: string\r\n ) => void;\r\n markAsDirty: (\r\n key: string,\r\n path: string[],\r\n options: { bubble: boolean }\r\n ) => void;\r\n\r\n pathSubscribers: Map<string, Set<(newValue: any) => void>>;\r\n subscribeToPath: (\r\n path: string,\r\n callback: (newValue: any) => void\r\n ) => () => void;\r\n notifyPathSubscribers: (updatedPath: string, newValue: any) => void;\r\n\r\n selectedIndicesMap: Map<string, string>; // stateKey -> (parentPath -> selectedIndex)\r\n getSelectedIndex: (stateKey: string, validArrayIds?: string[]) => number;\r\n setSelectedIndex: (key: string, itemKey: string) => void;\r\n clearSelectedIndex: ({ arrayKey }: { arrayKey: string }) => void;\r\n clearSelectedIndexesForState: (stateKey: string) => void;\r\n\r\n initialStateOptions: { [key: string]: OptionsType };\r\n initialStateGlobal: { [key: string]: StateValue };\r\n updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n\r\n serverStateUpdates: Map<\r\n string,\r\n {\r\n data: any;\r\n status: 'loading' | 'success' | 'error';\r\n timestamp: number;\r\n }\r\n >;\r\n\r\n setServerStateUpdate: (key: string, serverState: any) => void;\r\n\r\n stateLog: Map<string, Map<string, UpdateTypeDetail>>;\r\n syncInfoStore: Map<string, SyncInfo>;\r\n addStateLog: (updates: UpdateTypeDetail[]) => void;\r\n\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\nfunction getTypeFromZodSchema(\r\n schema: any,\r\n source: 'zod4' | 'zod3' | 'sync' = 'zod4'\r\n): SchemaTypeInfo | null {\r\n if (!schema) return null;\r\n\r\n let current = schema;\r\n let isNullable = false;\r\n let isOptional = false;\r\n let defaultValue: any = undefined;\r\n let hasDefault = false;\r\n\r\n // This loop will now correctly navigate through any wrappers AND unions.\r\n for (let i = 0; i < 20; i++) {\r\n // Added a safety break for complex schemas\r\n const def = current?.def || current?._def;\r\n if (!def) break;\r\n\r\n const typeIdentifier = def.typeName || def.type || current._type;\r\n\r\n // --- START: THE CRITICAL FIX FOR ZodUnion ---\r\n if (typeIdentifier === 'ZodUnion' || typeIdentifier === 'union') {\r\n if (def.options && def.options.length > 0) {\r\n current = def.options[0]; // Proceed by analyzing the FIRST option of the union\r\n continue; // Restart the loop with the new schema\r\n } else {\r\n break; // Union with no options, cannot determine type\r\n }\r\n }\r\n // --- END: THE CRITICAL FIX ---\r\n\r\n if (typeIdentifier === 'ZodOptional' || typeIdentifier === 'optional') {\r\n isOptional = true;\r\n } else if (\r\n typeIdentifier === 'ZodNullable' ||\r\n typeIdentifier === 'nullable'\r\n ) {\r\n isNullable = true;\r\n } else if (\r\n typeIdentifier === 'ZodDefault' ||\r\n typeIdentifier === 'default'\r\n ) {\r\n hasDefault = true;\r\n defaultValue =\r\n typeof def.defaultValue === 'function'\r\n ? def.defaultValue()\r\n : def.defaultValue;\r\n } else if (\r\n typeIdentifier !== 'ZodEffects' &&\r\n typeIdentifier !== 'effects'\r\n ) {\r\n // This is not a wrapper we need to unwrap further, so we can exit the loop.\r\n break;\r\n }\r\n\r\n const nextSchema = def.innerType || def.schema || current._inner;\r\n if (!nextSchema || nextSchema === current) {\r\n break; // Reached the end or a recursive schema\r\n }\r\n current = nextSchema;\r\n }\r\n\r\n const baseSchema = current;\r\n const baseDef = baseSchema?.def || baseSchema?._def;\r\n const baseType = baseDef?.typeName || baseDef?.type || baseSchema?._type;\r\n\r\n if (baseType === 'ZodNumber' || baseType === 'number') {\r\n return {\r\n type: 'number',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : 0,\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodString' || baseType === 'string') {\r\n return {\r\n type: 'string',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : '',\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodBoolean' || baseType === 'boolean') {\r\n return {\r\n type: 'boolean',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : false,\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodArray' || baseType === 'array') {\r\n return {\r\n type: 'array',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : [],\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodObject' || baseType === 'object') {\r\n return {\r\n type: 'object',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : {},\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodDate' || baseType === 'date') {\r\n return {\r\n type: 'date',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : new Date(),\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// Helper to get type info from runtime value\r\nfunction getTypeFromValue(value: any): SchemaTypeInfo {\r\n if (value === null) {\r\n return {\r\n type: 'unknown',\r\n schema: null,\r\n source: 'default',\r\n default: null,\r\n nullable: true,\r\n };\r\n }\r\n\r\n if (value === undefined) {\r\n return {\r\n type: 'unknown',\r\n schema: null,\r\n source: 'default',\r\n default: undefined,\r\n optional: true,\r\n };\r\n }\r\n\r\n const valueType = typeof value;\r\n\r\n if (valueType === 'number') {\r\n return { type: 'number', schema: null, source: 'runtime', default: value };\r\n } else if (valueType === 'string') {\r\n return { type: 'string', schema: null, source: 'runtime', default: value };\r\n } else if (valueType === 'boolean') {\r\n return { type: 'boolean', schema: null, source: 'runtime', default: value };\r\n } else if (Array.isArray(value)) {\r\n return { type: 'array', schema: null, source: 'runtime', default: [] };\r\n } else if (value instanceof Date) {\r\n return { type: 'date', schema: null, source: 'runtime', default: value };\r\n } else if (valueType === 'object') {\r\n return { type: 'object', schema: null, source: 'runtime', default: {} };\r\n }\r\n\r\n return { type: 'unknown', schema: null, source: 'runtime', default: value };\r\n}\r\ntype BuildContext = {\r\n stateKey: string;\r\n path: string[];\r\n schemas: {\r\n sync?: any;\r\n zodV4?: any;\r\n zodV3?: any;\r\n };\r\n};\r\n\r\nexport function buildShadowNode(\r\n stateKey: string,\r\n value: any,\r\n context?: BuildContext\r\n): ShadowNode {\r\n // Handle null/undefined/primitives (This part is already correct)\r\n if (value === null || value === undefined || typeof value !== 'object') {\r\n const node: ShadowNode = { _meta: { value } };\r\n node._meta!.typeInfo = getTypeInfoForPath(value, context);\r\n return node;\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(value)) {\r\n // 1. Create the node for the array.\r\n const node: ShadowNode = { _meta: { arrayKeys: [] } };\r\n\r\n // 2. Get the type info for the array itself ONCE, right at the start.\r\n node._meta!.typeInfo = getTypeInfoForPath(value, context);\r\n\r\n // 3. THEN, recursively process the children.\r\n value.forEach((item, index) => {\r\n const itemId = generateId(stateKey);\r\n const itemContext = context\r\n ? {\r\n ...context,\r\n path: [...context.path, index.toString()],\r\n }\r\n : undefined;\r\n\r\n node[itemId] = buildShadowNode(stateKey, item, itemContext);\r\n node._meta!.arrayKeys!.push(itemId);\r\n });\r\n\r\n return node;\r\n }\r\n\r\n // Handle objects\r\n if (value.constructor === Object) {\r\n // 1. Create the node for the object.\r\n const node: ShadowNode = { _meta: {} };\r\n\r\n // 2. Get the type info for the object itself ONCE, right at the start.\r\n node._meta!.typeInfo = getTypeInfoForPath(value, context);\r\n\r\n // 3. THEN, recursively process the children.\r\n for (const key in value) {\r\n if (Object.prototype.hasOwnProperty.call(value, key)) {\r\n const propContext = context\r\n ? {\r\n ...context,\r\n path: [...context.path, key],\r\n }\r\n : undefined;\r\n\r\n node[key] = buildShadowNode(stateKey, value[key], propContext);\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n // Fallback for other object types (Date, class instances, etc.)\r\n return {\r\n _meta: {\r\n value: value,\r\n typeInfo: getTypeFromValue(value),\r\n },\r\n };\r\n}\r\n\r\n// Helper function to get type info (extracted for clarity)\r\nfunction getTypeInfoForPath(\r\n value: any,\r\n context?: BuildContext\r\n): SchemaTypeInfo {\r\n if (context) {\r\n // Try to get schema-based type info\r\n let typeInfo: SchemaTypeInfo | null = null;\r\n\r\n if (context.schemas.zodV4) {\r\n const schema =\r\n context.path.length === 0\r\n ? context.schemas.zodV4\r\n : getSchemaAtPath(context.schemas.zodV4, context.path);\r\n if (schema) {\r\n typeInfo = getTypeFromZodSchema(schema, 'zod4');\r\n }\r\n }\r\n\r\n if (!typeInfo && context.schemas.zodV3) {\r\n const schema =\r\n context.path.length === 0\r\n ? context.schemas.zodV3\r\n : getSchemaAtPath(context.schemas.zodV3, context.path);\r\n if (schema) {\r\n typeInfo = getTypeFromZodSchema(schema, 'zod3');\r\n }\r\n }\r\n\r\n if (!typeInfo && context.schemas.sync?.[context.stateKey]) {\r\n typeInfo = getTypeFromValue(value);\r\n typeInfo.source = 'sync';\r\n }\r\n\r\n if (typeInfo) return typeInfo;\r\n }\r\n\r\n return getTypeFromValue(value);\r\n}\r\n\r\nexport function updateShadowTypeInfo(\r\n stateKey: string,\r\n rootSchema: any,\r\n source: 'zod4' | 'zod3'\r\n) {\r\n const rootNode =\r\n shadowStateStore.get(stateKey) || shadowStateStore.get(`[${stateKey}`);\r\n if (!rootNode) return;\r\n\r\n function updateNodeTypeInfo(node: any, path: string[]) {\r\n if (!node || typeof node !== 'object') return;\r\n const fieldSchema = getSchemaAtPath(rootSchema, path);\r\n\r\n if (fieldSchema) {\r\n const typeInfo = getTypeFromZodSchema(fieldSchema, source);\r\n if (typeInfo) {\r\n if (!node._meta) node._meta = {};\r\n node._meta.typeInfo = {\r\n ...typeInfo,\r\n schema: fieldSchema,\r\n };\r\n }\r\n }\r\n\r\n // Recursively update children\r\n if (node._meta?.arrayKeys) {\r\n node._meta.arrayKeys.forEach((itemKey: string) => {\r\n if (node[itemKey]) {\r\n updateNodeTypeInfo(node[itemKey], [...path, '0']); // Use index 0 for array item schema\r\n }\r\n });\r\n } else if (!node._meta?.hasOwnProperty('value')) {\r\n // It's an object - update each property\r\n Object.keys(node).forEach((key) => {\r\n if (key !== '_meta') {\r\n updateNodeTypeInfo(node[key], [...path, key]);\r\n }\r\n });\r\n }\r\n }\r\n\r\n updateNodeTypeInfo(rootNode, []);\r\n}\r\n\r\n/**\r\n * Reliably unwraps a Zod schema to its core type, handling modifiers\r\n * from both Zod v3 and modern Zod.\r\n */\r\nfunction unwrapSchema(schema: any): any {\r\n let current = schema;\r\n while (current) {\r\n // Version-agnostic way to get the definition object\r\n const def = current.def || current._def;\r\n\r\n // VITAL FIX: Check for `def.type` (like in your log), `def.typeName` (modern Zod), and `_type` (zod v3)\r\n const typeIdentifier = def?.typeName || def?.type || current._type;\r\n\r\n if (\r\n typeIdentifier === 'ZodOptional' ||\r\n typeIdentifier === 'optional' ||\r\n typeIdentifier === 'ZodNullable' ||\r\n typeIdentifier === 'nullable' ||\r\n typeIdentifier === 'ZodDefault' ||\r\n typeIdentifier === 'default' ||\r\n typeIdentifier === 'ZodEffects' ||\r\n typeIdentifier === 'effects'\r\n ) {\r\n // Get the inner schema, supporting multiple internal structures\r\n current =\r\n def.innerType || def.schema || current._inner || current.unwrap?.();\r\n } else {\r\n break; // Reached the base schema\r\n }\r\n }\r\n return current;\r\n}\r\n\r\n/**\r\n * Helper function to get a nested schema at a specific path,\r\n * correctly handling both Zod v3 and modern Zod internals.\r\n */\r\nfunction getSchemaAtPath(schema: any, path: string[]): any {\r\n if (!schema) return null;\r\n if (path.length === 0) return schema;\r\n\r\n let currentSchema = schema;\r\n\r\n for (const segment of path) {\r\n const containerSchema = unwrapSchema(currentSchema);\r\n if (!containerSchema) return null;\r\n\r\n const def = containerSchema.def || containerSchema._def;\r\n\r\n // VITAL FIX: Check for `def.type` as you discovered.\r\n const typeIdentifier = def?.typeName || def?.type || containerSchema._type;\r\n\r\n if (typeIdentifier === 'ZodObject' || typeIdentifier === 'object') {\r\n // VITAL FIX: Check for `shape` inside `def` first, then on the schema itself.\r\n const shape =\r\n def?.shape || containerSchema.shape || containerSchema._shape;\r\n currentSchema = shape?.[segment];\r\n } else if (typeIdentifier === 'ZodArray' || typeIdentifier === 'array') {\r\n // For arrays, the next schema is always the element's schema.\r\n currentSchema = containerSchema.element || def?.type;\r\n } else {\r\n return null; // Not a container, cannot traverse deeper.\r\n }\r\n\r\n if (!currentSchema) {\r\n return null; // Path segment does not exist in the schema.\r\n }\r\n }\r\n\r\n return currentSchema;\r\n}\r\nexport const shadowStateStore = new Map<string, ShadowNode>();\r\nlet globalCounter = 0;\r\nconst instanceId = Date.now().toString(36);\r\n\r\nexport function generateId(stateKey: string): string {\r\n const prefix = 'local';\r\n\r\n return `id:${prefix}_${instanceId}_${(globalCounter++).toString(36)}`;\r\n}\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n getPluginMetaDataMap: (\r\n key: string,\r\n path: string[]\r\n ): Map<string, Record<string, any>> | undefined => {\r\n const metadata = get().getShadowMetadata(key, path);\r\n return metadata?.pluginMetaData;\r\n },\r\n\r\n setPluginMetaData: (\r\n key: string,\r\n path: string[], // ADD THIS PARAMETER\r\n pluginName: string,\r\n data: Record<string, any>\r\n ) => {\r\n const metadata = get().getShadowMetadata(key, path) || {}; // Use the path!\r\n const pluginMetaData = new Map(metadata.pluginMetaData || []);\r\n const existingData = pluginMetaData.get(pluginName) || {};\r\n pluginMetaData.set(pluginName, { ...existingData, ...data });\r\n get().setShadowMetadata(key, path, { ...metadata, pluginMetaData });\r\n get().notifyPathSubscribers([key, ...path].join('.'), {\r\n type: 'METADATA_UPDATE',\r\n });\r\n },\r\n removePluginMetaData: (key: string, path: string[], pluginName: string) => {\r\n const metadata = get().getShadowMetadata(key, path);\r\n if (!metadata?.pluginMetaData) return;\r\n const pluginMetaData = new Map(metadata.pluginMetaData);\r\n pluginMetaData.delete(pluginName);\r\n get().setShadowMetadata(key, path, { ...metadata, pluginMetaData });\r\n },\r\n\r\n setTransformCache: (\r\n key: string,\r\n path: string[],\r\n cacheKey: string,\r\n cacheData: any\r\n ) => {\r\n const metadata = get().getShadowMetadata(key, path) || {};\r\n if (!metadata.transformCaches) {\r\n metadata.transformCaches = new Map();\r\n }\r\n metadata.transformCaches.set(cacheKey, cacheData);\r\n get().setShadowMetadata(key, path, {\r\n transformCaches: metadata.transformCaches,\r\n });\r\n },\r\n // Replace your entire `initializeAndMergeShadowState` function with this one.\r\n\r\n initializeAndMergeShadowState: (key: string, shadowState: any) => {\r\n const isArrayState = shadowState?._meta?.arrayKeys !== undefined;\r\n const storageKey = isArrayState ? `[${key}` : key;\r\n\r\n const existingRoot =\r\n shadowStateStore.get(storageKey) ||\r\n shadowStateStore.get(key) ||\r\n shadowStateStore.get(`[${key}`);\r\n\r\n // --- THIS LOGIC IS RESTORED ---\r\n // This is vital for preserving component registrations and other top-level\r\n // metadata across a full merge/replace, which is why removing it was a mistake.\r\n let preservedMetadata: Partial<ShadowMetadata> = {};\r\n if (existingRoot?._meta) {\r\n const {\r\n components,\r\n features,\r\n lastServerSync,\r\n stateSource,\r\n baseServerState,\r\n pathComponents,\r\n signals,\r\n validation,\r\n } = existingRoot._meta;\r\n\r\n if (components) preservedMetadata.components = components;\r\n if (features) preservedMetadata.features = features;\r\n if (lastServerSync) preservedMetadata.lastServerSync = lastServerSync;\r\n if (stateSource) preservedMetadata.stateSource = stateSource;\r\n if (baseServerState) preservedMetadata.baseServerState = baseServerState;\r\n if (pathComponents) preservedMetadata.pathComponents = pathComponents;\r\n if (signals) preservedMetadata.signals = signals;\r\n if (validation) preservedMetadata.validation = validation;\r\n }\r\n function deepMergeShadowNodes(target: ShadowNode, source: ShadowNode) {\r\n // --- START: CORRECTED, MORE ROBUST METADATA MERGE ---\r\n if (source._meta || target._meta) {\r\n const existingMeta = target._meta || {};\r\n const sourceMeta = source._meta || {};\r\n\r\n // Combine metadata, letting the source overwrite simple, top-level properties.\r\n const newMeta = { ...existingMeta, ...sourceMeta };\r\n\r\n // CRITICAL FIX: Now, explicitly check and preserve the complex, valuable\r\n // objects from the existing state if the incoming source state doesn't have\r\n // an equally good or better version.\r\n\r\n // 1. Preserve rich TypeInfo (with a schema) over a simple runtime one.\r\n if (existingMeta.typeInfo?.schema && !sourceMeta.typeInfo?.schema) {\r\n newMeta.typeInfo = existingMeta.typeInfo;\r\n }\r\n\r\n // 2. Preserve the existing validation state, which is computed and stored on the target.\r\n // A source built from a plain object will never have this.\r\n if (existingMeta.validation && !sourceMeta.validation) {\r\n newMeta.validation = existingMeta.validation;\r\n }\r\n\r\n // 3. Preserve component registrations\r\n if (existingMeta.components) {\r\n newMeta.components = existingMeta.components;\r\n }\r\n\r\n // 4. Preserve clientActivityState (DOM ref registrations)\r\n if (\r\n existingMeta.clientActivityState &&\r\n !sourceMeta.clientActivityState\r\n ) {\r\n newMeta.clientActivityState = existingMeta.clientActivityState;\r\n }\r\n\r\n // 5. Preserve pluginMetaData\r\n if (existingMeta.pluginMetaData && !sourceMeta.pluginMetaData) {\r\n newMeta.pluginMetaData = existingMeta.pluginMetaData;\r\n }\r\n\r\n target._meta = newMeta;\r\n }\r\n // --- END: CORRECTED METADATA MERGE ---\r\n\r\n // 2. Handle the node's data (primitive, array, or object).\r\n if (source._meta?.hasOwnProperty('value')) {\r\n // Source is a primitive. Clear any old child properties from target.\r\n for (const key in target) {\r\n if (key !== '_meta') delete target[key];\r\n }\r\n return; // Done with this branch\r\n }\r\n\r\n // Synchronize the data structure based on the source.\r\n const sourceKeys = new Set(\r\n Object.keys(source).filter((k) => k !== '_meta')\r\n );\r\n const targetKeys = new Set(\r\n Object.keys(target).filter((k) => k !== '_meta')\r\n );\r\n\r\n // Delete keys that are in the target but no longer in the source.\r\n for (const key of targetKeys) {\r\n if (!sourceKeys.has(key)) {\r\n delete target[key];\r\n }\r\n }\r\n\r\n // Recursively merge or add keys from the source.\r\n for (const key of sourceKeys) {\r\n const sourceValue = source[key];\r\n const targetValue = target[key];\r\n if (\r\n targetValue &&\r\n typeof targetValue === 'object' &&\r\n sourceValue &&\r\n typeof sourceValue === 'object'\r\n ) {\r\n deepMergeShadowNodes(targetValue, sourceValue); // Recurse for objects\r\n } else {\r\n target[key] = sourceValue; // Add new or replace primitive/node\r\n }\r\n }\r\n }\r\n // --- THIS IS YOUR ORIGINAL, CORRECT MAIN LOGIC ---\r\n if (existingRoot) {\r\n // Merge the new shadow state into the existing one\r\n deepMergeShadowNodes(existingRoot, shadowState);\r\n // Restore preserved metadata\r\n if (!existingRoot._meta) existingRoot._meta = {};\r\n Object.assign(existingRoot._meta, preservedMetadata);\r\n shadowStateStore.set(storageKey, existingRoot);\r\n } else {\r\n // The logic for when no state exists yet\r\n if (preservedMetadata && Object.keys(preservedMetadata).length > 0) {\r\n if (!shadowState._meta) shadowState._meta = {};\r\n Object.assign(shadowState._meta, preservedMetadata);\r\n }\r\n shadowStateStore.set(storageKey, shadowState);\r\n }\r\n\r\n // As your logs show, this part works. It runs AFTER the merge to apply schemas.\r\n const options = get().getInitialOptions(key);\r\n const hasSchema =\r\n options?.validation?.zodSchemaV4 || options?.validation?.zodSchemaV3;\r\n if (hasSchema) {\r\n if (options.validation?.zodSchemaV4) {\r\n updateShadowTypeInfo(key, options.validation.zodSchemaV4, 'zod4');\r\n } else if (options.validation?.zodSchemaV3) {\r\n updateShadowTypeInfo(key, options.validation.zodSchemaV3, 'zod3');\r\n }\r\n }\r\n\r\n // Cleanup logic is restored\r\n if (storageKey === key) {\r\n shadowStateStore.delete(`[${key}`);\r\n } else {\r\n shadowStateStore.delete(key);\r\n }\r\n },\r\n initializeShadowState: (key: string, initialState: any) => {\r\n const existingRoot =\r\n shadowStateStore.get(key) || shadowStateStore.get(`[${key}`);\r\n let preservedMetadata: Partial<ShadowMetadata> = {};\r\n\r\n // NEW: Collect runtime metadata (clientActivityState, pluginMetaData) from ALL nodes\r\n const preservedRuntimeMeta = new Map<\r\n string,\r\n {\r\n clientActivityState?: ClientActivityState;\r\n pluginMetaData?: Map<string, Record<string, any>>;\r\n }\r\n >();\r\n\r\n if (existingRoot) {\r\n const collectRuntimeMeta = (node: any, pathSegments: string[]) => {\r\n if (!node || typeof node !== 'object') return;\r\n if (node._meta?.clientActivityState || node._meta?.pluginMetaData) {\r\n preservedRuntimeMeta.set(pathSegments.join('\\x00'), {\r\n clientActivityState: node._meta.clientActivityState,\r\n pluginMetaData: node._meta.pluginMetaData,\r\n });\r\n }\r\n for (const k in node) {\r\n if (k !== '_meta') {\r\n collectRuntimeMeta(node[k], [...pathSegments, k]);\r\n }\r\n }\r\n };\r\n collectRuntimeMeta(existingRoot, []);\r\n }\r\n\r\n if (existingRoot?._meta) {\r\n const {\r\n components,\r\n features,\r\n lastServerSync,\r\n stateSource,\r\n baseServerState,\r\n } = existingRoot._meta;\r\n if (components) preservedMetadata.components = components;\r\n if (features) preservedMetadata.features = features;\r\n if (lastServerSync) preservedMetadata.lastServerSync = lastServerSync;\r\n if (stateSource) preservedMetadata.stateSource = stateSource;\r\n if (baseServerState) preservedMetadata.baseServerState = baseServerState;\r\n }\r\n\r\n shadowStateStore.delete(key);\r\n shadowStateStore.delete(`[${key}`);\r\n\r\n const options = get().getInitialOptions(key);\r\n const syncSchemas = get().getInitialOptions('__syncSchemas');\r\n\r\n const context: BuildContext = {\r\n stateKey: key,\r\n path: [],\r\n schemas: {\r\n sync: syncSchemas,\r\n zodV4: options?.validation?.zodSchemaV4,\r\n zodV3: options?.validation?.zodSchemaV3,\r\n },\r\n };\r\n\r\n const newRoot = buildShadowNode(key, initialState, context);\r\n\r\n if (!newRoot._meta) newRoot._meta = {};\r\n Object.assign(newRoot._meta, preservedMetadata);\r\n\r\n // NEW: Restore runtime metadata to matching nodes in rebuilt tree\r\n const restoreRuntimeMeta = (node: any, pathSegments: string[]) => {\r\n if (!node || typeof node !== 'object') return;\r\n const pathKey = pathSegments.join('\\x00');\r\n const saved = preservedRuntimeMeta.get(pathKey);\r\n if (saved) {\r\n if (!node._meta) node._meta = {};\r\n if (saved.clientActivityState)\r\n node._meta.clientActivityState = saved.clientActivityState;\r\n if (saved.pluginMetaData)\r\n node._meta.pluginMetaData = saved.pluginMetaData;\r\n }\r\n for (const k in node) {\r\n if (k !== '_meta') {\r\n restoreRuntimeMeta(node[k], [...pathSegments, k]);\r\n }\r\n }\r\n };\r\n restoreRuntimeMeta(newRoot, []);\r\n\r\n const storageKey = Array.isArray(initialState) ? `[${key}` : key;\r\n shadowStateStore.set(storageKey, newRoot);\r\n },\r\n getShadowNode: (key: string, path: string[]): ShadowNode | undefined => {\r\n let current: any =\r\n shadowStateStore.get(key) || shadowStateStore.get(`[${key}`);\r\n if (!current) return undefined;\r\n if (path.length === 0) return current;\r\n\r\n for (const segment of path) {\r\n if (typeof current !== 'object' || current === null) return undefined;\r\n current = current[segment];\r\n if (current === undefined) return undefined;\r\n }\r\n return current;\r\n },\r\n\r\n getShadowMetadata: (\r\n key: string,\r\n path: string[]\r\n ): ShadowMetadata | undefined => {\r\n const node = get().getShadowNode(key, path);\r\n return node?._meta;\r\n },\r\n\r\n setShadowMetadata: (\r\n key: string,\r\n path: string[],\r\n newMetadata: Partial<ShadowMetadata>\r\n ) => {\r\n // Direct mutation - no cloning!\r\n const rootKey = shadowStateStore.has(`[${key}`) ? `[${key}` : key;\r\n let root = shadowStateStore.get(rootKey);\r\n\r\n if (!root) {\r\n root = { _meta: newMetadata };\r\n shadowStateStore.set(rootKey, root);\r\n return;\r\n }\r\n\r\n // Navigate to target without cloning\r\n let current = root;\r\n for (const segment of path) {\r\n if (!current[segment]) {\r\n current[segment] = {};\r\n }\r\n current = current[segment];\r\n }\r\n\r\n // Mutate metadata directly\r\n if (!current._meta) {\r\n current._meta = {};\r\n }\r\n\r\n Object.assign(current._meta, newMetadata);\r\n },\r\n getShadowValue: (key: string, path: string[], validArrayIds?: string[]) => {\r\n const startNode = get().getShadowNode(key, path);\r\n\r\n // If the path is invalid or leads nowhere, return undefined immediately.\r\n if (!startNode) {\r\n return undefined;\r\n }\r\n\r\n // --- High-Performance Iterative Materializer ---\r\n\r\n // A single root object to hold the final, materialized result.\r\n const rootResult: any = {};\r\n\r\n // Stack to manage the traversal without recursion.\r\n // Each item is [shadowNode, parentObjectInResult, keyToSetOnParent]\r\n const stack: [ShadowNode, any, string | number][] = [\r\n [startNode, rootResult, 'final'],\r\n ];\r\n\r\n while (stack.length > 0) {\r\n const [currentNode, parentResult, resultKey] = stack.pop()!;\r\n\r\n // 1. Handle primitive values\r\n if (currentNode._meta?.hasOwnProperty('value')) {\r\n parentResult[resultKey] = currentNode._meta.value;\r\n continue; // Done with this branch\r\n }\r\n\r\n // 2. Handle arrays\r\n if (currentNode._meta?.arrayKeys) {\r\n const keysToIterate = validArrayIds || currentNode._meta.arrayKeys;\r\n const newArray: any[] = [];\r\n parentResult[resultKey] = newArray;\r\n\r\n // Push children onto the stack in reverse order to process them from 0 to N\r\n for (let i = keysToIterate.length - 1; i >= 0; i--) {\r\n const itemKey = keysToIterate[i]!;\r\n if (currentNode[itemKey]) {\r\n // The child's result will be placed at index `i` in `newArray`\r\n stack.push([currentNode[itemKey], newArray, i]);\r\n }\r\n }\r\n continue; // Done with this branch\r\n }\r\n\r\n // 3. Handle objects\r\n const newObject: any = {};\r\n parentResult[resultKey] = newObject;\r\n\r\n const objectKeys = Object.keys(currentNode);\r\n // Push children onto the stack (order doesn't matter for objects)\r\n for (const propKey of objectKeys) {\r\n if (propKey !== '_meta') {\r\n // The child's result will be set as a property on `newObject`\r\n stack.push([currentNode[propKey], newObject, propKey]);\r\n }\r\n }\r\n }\r\n\r\n return rootResult.final;\r\n },\r\n updateShadowAtPath: (key, path, newValue) => {\r\n const rootKey = shadowStateStore.has(`[${key}`) ? `[${key}` : key;\r\n let root = shadowStateStore.get(rootKey);\r\n if (!root) return;\r\n\r\n let parentNode = root;\r\n for (let i = 0; i < path.length - 1; i++) {\r\n if (!parentNode[path[i]!]) {\r\n parentNode[path[i]!] = {};\r\n }\r\n parentNode = parentNode[path[i]!];\r\n }\r\n const targetNode =\r\n path.length === 0 ? parentNode : parentNode[path[path.length - 1]!];\r\n\r\n // This function is now defined inside to close over 'key' and 'path' for context\r\n function intelligentMerge(\r\n nodeToUpdate: any,\r\n plainValue: any,\r\n currentPath: string[]\r\n ) {\r\n // 1. Handle primitives (but NOT arrays)\r\n if (\r\n typeof plainValue !== 'object' ||\r\n plainValue === null ||\r\n plainValue instanceof Date\r\n ) {\r\n const oldMeta = nodeToUpdate._meta || {};\r\n // Clear all child properties\r\n for (const prop in nodeToUpdate) {\r\n if (prop !== '_meta') delete nodeToUpdate[prop];\r\n }\r\n // Set the new primitive value, preserving metadata\r\n nodeToUpdate._meta = { ...oldMeta, value: plainValue };\r\n return;\r\n }\r\n\r\n // 2. Handle Arrays INTELLIGENTLY\r\n if (Array.isArray(plainValue)) {\r\n // Ensure the target is a shadow array node\r\n if (!nodeToUpdate._meta) nodeToUpdate._meta = {};\r\n if (!nodeToUpdate._meta.arrayKeys) nodeToUpdate._meta.arrayKeys = [];\r\n\r\n const existingKeys = nodeToUpdate._meta.arrayKeys;\r\n const newValues = plainValue;\r\n\r\n const updatedKeys: string[] = [];\r\n\r\n // Merge existing items and add new items\r\n for (let i = 0; i < newValues.length; i++) {\r\n const newItemValue = newValues[i]!;\r\n if (i < existingKeys.length) {\r\n // Merge into existing item, preserving its key and metadata\r\n const existingKey = existingKeys[i]!;\r\n intelligentMerge(nodeToUpdate[existingKey], newItemValue, [\r\n ...currentPath,\r\n existingKey,\r\n ]);\r\n updatedKeys.push(existingKey);\r\n } else {\r\n // Add a new item\r\n const newItemId = generateId(key);\r\n const options = get().getInitialOptions(key);\r\n // Build the new node WITH proper context to get schema info\r\n const itemContext: BuildContext = {\r\n stateKey: key,\r\n path: [...currentPath, '0'], // Use '0' for array element schema lookup\r\n schemas: {\r\n zodV4: options?.validation?.zodSchemaV4,\r\n zodV3: options?.validation?.zodSchemaV3,\r\n },\r\n };\r\n nodeToUpdate[newItemId] = buildShadowNode(\r\n key,\r\n newItemValue,\r\n itemContext\r\n );\r\n updatedKeys.push(newItemId);\r\n }\r\n }\r\n\r\n // Remove deleted items\r\n if (existingKeys.length > newValues.length) {\r\n const keysToDelete = existingKeys.slice(newValues.length);\r\n keysToDelete.forEach((keyToDelete: string) => {\r\n delete nodeToUpdate[keyToDelete];\r\n });\r\n }\r\n\r\n // Update the keys array to reflect the new state\r\n nodeToUpdate._meta.arrayKeys = updatedKeys;\r\n return;\r\n }\r\n\r\n // 3. Handle Objects\r\n const plainValueKeys = new Set(Object.keys(plainValue));\r\n if (nodeToUpdate._meta?.hasOwnProperty('value')) {\r\n // transitioning from primitive to object, clear the value\r\n delete nodeToUpdate._meta.value;\r\n }\r\n\r\n for (const propKey of plainValueKeys) {\r\n const childValue = plainValue[propKey];\r\n if (nodeToUpdate[propKey]) {\r\n intelligentMerge(nodeToUpdate[propKey], childValue, [\r\n ...currentPath,\r\n propKey,\r\n ]);\r\n } else {\r\n const options = get().getInitialOptions(key);\r\n const itemContext: BuildContext = {\r\n stateKey: key,\r\n path: [...currentPath, propKey],\r\n schemas: {\r\n zodV4: options?.validation?.zodSchemaV4,\r\n zodV3: options?.validation?.zodSchemaV3,\r\n },\r\n };\r\n nodeToUpdate[propKey] = buildShadowNode(key, childValue, itemContext);\r\n }\r\n }\r\n\r\n // Delete keys that no longer exist\r\n for (const nodeKey in nodeToUpdate) {\r\n if (\r\n nodeKey === '_meta' ||\r\n !Object.prototype.hasOwnProperty.call(nodeToUpdate, nodeKey)\r\n )\r\n continue;\r\n if (!plainValueKeys.has(nodeKey)) {\r\n delete nodeToUpdate[nodeKey];\r\n }\r\n }\r\n }\r\n\r\n if (!targetNode) {\r\n parentNode[path[path.length - 1]!] = buildShadowNode(key, newValue); // Build fresh if no target\r\n } else {\r\n intelligentMerge(targetNode, newValue, path); // Use the new intelligent merge\r\n }\r\n\r\n get().notifyPathSubscribers([key, ...path].join('.'), {\r\n type: 'UPDATE',\r\n newValue,\r\n });\r\n },\r\n addItemsToArrayNode: (key, arrayPath, newItems) => {\r\n const rootKey = shadowStateStore.has(`[${key}`) ? `[${key}` : key;\r\n let root = shadowStateStore.get(rootKey);\r\n if (!root) {\r\n console.error('Root not found for state key:', key);\r\n return;\r\n }\r\n\r\n let current = root;\r\n for (const segment of arrayPath) {\r\n if (!current[segment]) {\r\n current[segment] = {};\r\n }\r\n current = current[segment];\r\n }\r\n\r\n Object.assign(current, newItems);\r\n },\r\n insertShadowArrayElement: (key, arrayPath, newItem, index, itemId) => {\r\n const arrayNode = get().getShadowNode(key, arrayPath);\r\n if (!arrayNode?._meta?.arrayKeys) {\r\n throw new Error(\r\n `Array not found at path: ${[key, ...arrayPath].join('.')}`\r\n );\r\n }\r\n\r\n const newItemId = itemId || `${generateId(key)}`;\r\n\r\n // BUILD AND ADD the node directly - no need for addItemsToArrayNode\r\n arrayNode[newItemId] = buildShadowNode(key, newItem);\r\n\r\n // Mutate the array directly\r\n const currentKeys = arrayNode._meta.arrayKeys;\r\n const insertionPoint =\r\n index !== undefined && index >= 0 && index <= currentKeys.length\r\n ? index\r\n : currentKeys.length;\r\n\r\n if (insertionPoint >= currentKeys.length) {\r\n currentKeys.push(newItemId);\r\n } else {\r\n currentKeys.splice(insertionPoint, 0, newItemId);\r\n }\r\n\r\n // Skip addItemsToArrayNode entirely - we already did everything it does!\r\n\r\n const arrayKey = [key, ...arrayPath].join('.');\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'INSERT',\r\n path: arrayKey,\r\n itemKey: `${arrayKey}.${newItemId}`,\r\n index: insertionPoint,\r\n });\r\n\r\n return newItemId;\r\n },\r\n\r\n insertManyShadowArrayElements: (key, arrayPath, newItems, index) => {\r\n if (!newItems || newItems.length === 0) {\r\n return;\r\n }\r\n\r\n const arrayNode = get().getShadowNode(key, arrayPath);\r\n if (!arrayNode?._meta?.arrayKeys) {\r\n console.error(\r\n `Array not found at path: ${[key, ...arrayPath].join('.')}`\r\n );\r\n return;\r\n }\r\n\r\n const newIds: string[] = [];\r\n\r\n // Build and add items directly\r\n newItems.forEach((item) => {\r\n const newItemId = `${generateId(key)}`;\r\n newIds.push(newItemId);\r\n arrayNode[newItemId] = buildShadowNode(key, item); // ADD DIRECTLY!\r\n });\r\n\r\n // Mutate the keys array\r\n const currentKeys = arrayNode._meta.arrayKeys;\r\n const insertionPoint =\r\n index !== undefined && index >= 0 && index <= currentKeys.length\r\n ? index\r\n : currentKeys.length;\r\n\r\n if (insertionPoint >= currentKeys.length) {\r\n currentKeys.push(...newIds);\r\n } else {\r\n currentKeys.splice(insertionPoint, 0, ...newIds);\r\n }\r\n\r\n // NO addItemsToArrayNode call needed!\r\n\r\n const arrayKey = [key, ...arrayPath].join('.');\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'INSERT_MANY',\r\n path: arrayKey,\r\n count: newItems.length,\r\n index: insertionPoint,\r\n });\r\n },\r\n\r\n removeShadowArrayElement: (key, itemPath) => {\r\n if (itemPath.length === 0) return;\r\n\r\n const arrayPath = itemPath.slice(0, -1);\r\n const itemId = itemPath[itemPath.length - 1];\r\n if (!itemId?.startsWith('id:')) return;\r\n\r\n const arrayNode = get().getShadowNode(key, arrayPath);\r\n if (!arrayNode?._meta?.arrayKeys) return;\r\n\r\n // Mutate directly\r\n const currentKeys = arrayNode._meta.arrayKeys;\r\n const indexToRemove = currentKeys.indexOf(itemId);\r\n\r\n if (indexToRemove === -1) return;\r\n\r\n // O(1) for removing from end\r\n if (indexToRemove === currentKeys.length - 1) {\r\n currentKeys.pop();\r\n }\r\n // O(n) for removing from beginning or middle\r\n else if (indexToRemove === 0) {\r\n currentKeys.shift();\r\n } else {\r\n currentKeys.splice(indexToRemove, 1);\r\n }\r\n\r\n // Delete the actual item\r\n delete arrayNode[itemId];\r\n\r\n // No need to update metadata - already mutated!\r\n\r\n const arrayKey = [key, ...arrayPath].join('.');\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'REMOVE',\r\n path: arrayKey,\r\n itemKey: `${arrayKey}.${itemId}`,\r\n });\r\n },\r\n\r\n registerComponent: (stateKey, fullComponentId, registration) => {\r\n const rootMeta = get().getShadowMetadata(stateKey, []) || {};\r\n const components = new Map(rootMeta.components);\r\n components.set(fullComponentId, registration);\r\n\r\n get().setShadowMetadata(stateKey, [], { components });\r\n },\r\n\r\n unregisterComponent: (stateKey, fullComponentId) => {\r\n const rootMeta = get().getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.components) return;\r\n const components = new Map(rootMeta.components);\r\n if (components.delete(fullComponentId)) {\r\n get().setShadowMetadata(stateKey, [], { components });\r\n }\r\n },\r\n\r\n addPathComponent: (stateKey, dependencyPath, fullComponentId) => {\r\n const metadata = get().getShadowMetadata(stateKey, dependencyPath) || {};\r\n const newPathComponents = new Set(metadata.pathComponents);\r\n newPathComponents.add(fullComponentId);\r\n get().setShadowMetadata(stateKey, dependencyPath, {\r\n pathComponents: newPathComponents,\r\n });\r\n\r\n const rootMeta = get().getShadowMetadata(stateKey, []);\r\n if (rootMeta?.components) {\r\n const component = rootMeta.components.get(fullComponentId);\r\n if (component) {\r\n const fullPathKey = [stateKey, ...dependencyPath].join('.');\r\n const newPaths = new Set(component.paths);\r\n newPaths.add(fullPathKey);\r\n const newComponentRegistration = { ...component, paths: newPaths };\r\n const newComponentsMap = new Map(rootMeta.components);\r\n newComponentsMap.set(fullComponentId, newComponentRegistration);\r\n get().setShadowMetadata(stateKey, [], { components: newComponentsMap });\r\n }\r\n }\r\n },\r\n\r\n markAsDirty: (key, path, options = { bubble: true }) => {\r\n // Start at the root node once.\r\n let rootNode = get().getShadowNode(key, []);\r\n if (!rootNode) return;\r\n\r\n // Navigate to the target node once.\r\n let currentNode = rootNode;\r\n for (const segment of path) {\r\n currentNode = currentNode[segment];\r\n if (!currentNode) return; // Path doesn't exist, nothing to mark.\r\n }\r\n\r\n // Mark the target node as dirty.\r\n if (!currentNode._meta) currentNode._meta = {};\r\n currentNode._meta.isDirty = true;\r\n\r\n // If bubbling is disabled, we are done.\r\n if (!options.bubble) return;\r\n\r\n // Efficiently bubble up using the path segments.\r\n let parentNode = rootNode;\r\n for (let i = 0; i < path.length; i++) {\r\n // The current node in the loop is the parent of the next one.\r\n if (parentNode._meta?.isDirty) {\r\n // Optimization: If a parent is already dirty, all of its ancestors are too.\r\n // We can stop bubbling immediately.\r\n return;\r\n }\r\n if (!parentNode._meta) parentNode._meta = {};\r\n parentNode._meta.isDirty = true;\r\n parentNode = parentNode[path[i]!];\r\n }\r\n },\r\n\r\n // Keep these in Zustand as they need React reactivity\r\n serverStateUpdates: new Map(),\r\n setServerStateUpdate: (key, serverState) => {\r\n set((state) => ({\r\n serverStateUpdates: new Map(state.serverStateUpdates).set(\r\n key,\r\n serverState\r\n ),\r\n }));\r\n get().notifyPathSubscribers(key, {\r\n type: 'SERVER_STATE_UPDATE',\r\n serverState,\r\n });\r\n },\r\n\r\n pathSubscribers: new Map<string, Set<(newValue: any) => void>>(),\r\n subscribeToPath: (path, callback) => {\r\n const subscribers = get().pathSubscribers;\r\n const subsForPath = subscribers.get(path) || new Set();\r\n subsForPath.add(callback);\r\n subscribers.set(path, subsForPath);\r\n\r\n return () => {\r\n const currentSubs = get().pathSubscribers.get(path);\r\n if (currentSubs) {\r\n currentSubs.delete(callback);\r\n if (currentSubs.size === 0) {\r\n get().pathSubscribers.delete(path);\r\n }\r\n }\r\n };\r\n },\r\n\r\n notifyPathSubscribers: (updatedPath, newValue) => {\r\n const subscribers = get().pathSubscribers;\r\n const subs = subscribers.get(updatedPath);\r\n if (subs) {\r\n subs.forEach((callback) => callback(newValue));\r\n }\r\n },\r\n\r\n selectedIndicesMap: new Map<string, string>(),\r\n getSelectedIndex: (arrayKey, validIds) => {\r\n const itemKey = get().selectedIndicesMap.get(arrayKey);\r\n if (!itemKey) return -1;\r\n\r\n const arrayMeta = get().getShadowMetadata(\r\n arrayKey.split('.')[0]!,\r\n arrayKey.split('.').slice(1)\r\n );\r\n const arrayKeys = validIds || arrayMeta?.arrayKeys;\r\n\r\n return arrayKeys ? arrayKeys.indexOf(itemKey) : -1;\r\n },\r\n\r\n setSelectedIndex: (arrayKey: string, itemKey: string | undefined) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n\r\n if (itemKey === undefined) {\r\n newMap.delete(arrayKey);\r\n } else {\r\n if (newMap.has(arrayKey)) {\r\n get().notifyPathSubscribers(newMap.get(arrayKey)!, {\r\n type: 'THIS_UNSELECTED',\r\n });\r\n }\r\n newMap.set(arrayKey, itemKey);\r\n get().notifyPathSubscribers(itemKey, { type: 'THIS_SELECTED' });\r\n }\r\n\r\n get().notifyPathSubscribers(arrayKey, { type: 'GET_SELECTED' });\r\n\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n\r\n clearSelectedIndex: ({ arrayKey }: { arrayKey: string }): void => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n const actualKey = newMap.get(arrayKey);\r\n if (actualKey) {\r\n get().notifyPathSubscribers(actualKey, {\r\n type: 'CLEAR_SELECTION',\r\n });\r\n }\r\n\r\n newMap.delete(arrayKey);\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'CLEAR_SELECTION',\r\n });\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n\r\n clearSelectedIndexesForState: (stateKey) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n let changed = false;\r\n for (const key of newMap.keys()) {\r\n if (key === stateKey || key.startsWith(stateKey + '.')) {\r\n newMap.delete(key);\r\n changed = true;\r\n }\r\n }\r\n return changed ? { selectedIndicesMap: newMap } : {};\r\n });\r\n },\r\n\r\n initialStateOptions: {},\r\n stateLog: new Map(),\r\n initialStateGlobal: {},\r\n\r\n addStateLog: (updates) => {\r\n if (!updates || updates.length === 0) return;\r\n set((state) => {\r\n const newLog = new Map(state.stateLog);\r\n const logsGroupedByKey = new Map<string, UpdateTypeDetail[]>();\r\n for (const update of updates) {\r\n const group = logsGroupedByKey.get(update.stateKey) || [];\r\n group.push(update);\r\n logsGroupedByKey.set(update.stateKey, group);\r\n }\r\n for (const [key, batchOfUpdates] of logsGroupedByKey.entries()) {\r\n const newStateLogForKey = new Map(newLog.get(key));\r\n for (const update of batchOfUpdates) {\r\n newStateLogForKey.set(JSON.stringify(update.path), { ...update });\r\n }\r\n newLog.set(key, newStateLogForKey);\r\n }\r\n return { stateLog: newLog };\r\n });\r\n },\r\n\r\n getInitialOptions: (key) => get().initialStateOptions[key],\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: { ...prev.initialStateOptions, [key]: value },\r\n }));\r\n },\r\n\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: { ...prev.initialStateGlobal, [key]: newState },\r\n }));\r\n },\r\n\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key, syncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key) => get().syncInfoStore.get(key) || null,\r\n}));\r\n\r\nexport function getAllFieldElements(stateKey: string): HTMLElement[] {\r\n const elements: HTMLElement[] = [];\r\n\r\n const rootNode =\r\n shadowStateStore.get(stateKey) || shadowStateStore.get(`[${stateKey}`);\r\n\r\n if (!rootNode) return elements;\r\n\r\n const collectElements = (node: any) => {\r\n if (!node || typeof node !== 'object') return;\r\n\r\n // Check this node for elements\r\n if (node._meta?.clientActivityState?.elements) {\r\n node._meta.clientActivityState.elements.forEach((entry: any) => {\r\n if (entry.domRef?.current) {\r\n elements.push(entry.domRef.current);\r\n }\r\n });\r\n }\r\n\r\n // Recurse into children\r\n for (const key in node) {\r\n if (key !== '_meta') {\r\n collectElements(node[key]);\r\n }\r\n }\r\n };\r\n\r\n collectElements(rootNode);\r\n\r\n return elements;\r\n}\r\n\r\nexport function setAllFieldsDisabled(\r\n stateKey: string,\r\n disabled: boolean\r\n): void {\r\n const rootNode =\r\n shadowStateStore.get(stateKey) || shadowStateStore.get(`[${stateKey}`);\r\n if (!rootNode) return;\r\n\r\n const disableElements = (node: any) => {\r\n if (!node || typeof node !== 'object') return;\r\n\r\n if (node._meta?.clientActivityState?.elements) {\r\n node._meta.clientActivityState.elements.forEach((entry: any) => {\r\n const el = entry.domRef?.current;\r\n if (!el) return;\r\n\r\n if ('disabled' in el) {\r\n (el as HTMLInputElement).disabled = disabled;\r\n } else {\r\n el.style.pointerEvents = disabled ? 'none' : '';\r\n el.setAttribute('aria-disabled', String(disabled));\r\n }\r\n });\r\n }\r\n\r\n for (const key in node) {\r\n if (key !== '_meta') {\r\n disableElements(node[key]);\r\n }\r\n }\r\n };\r\n\r\n disableElements(rootNode);\r\n}\r\n"],"names":["getTypeFromZodSchema","schema","source","current","isNullable","isOptional","defaultValue","hasDefault","i","def","typeIdentifier","nextSchema","baseSchema","baseDef","baseType","getTypeFromValue","value","valueType","buildShadowNode","stateKey","context","node","getTypeInfoForPath","item","index","itemId","generateId","itemContext","key","propContext","typeInfo","getSchemaAtPath","updateShadowTypeInfo","rootSchema","rootNode","shadowStateStore","updateNodeTypeInfo","path","fieldSchema","itemKey","unwrapSchema","currentSchema","segment","containerSchema","globalCounter","instanceId","getGlobalStore","create","set","get","pluginName","data","metadata","pluginMetaData","existingData","cacheKey","cacheData","shadowState","storageKey","existingRoot","preservedMetadata","components","features","lastServerSync","stateSource","baseServerState","pathComponents","signals","validation","deepMergeShadowNodes","target","existingMeta","sourceMeta","newMeta","sourceKeys","k","targetKeys","sourceValue","targetValue","options","initialState","preservedRuntimeMeta","collectRuntimeMeta","pathSegments","syncSchemas","newRoot","restoreRuntimeMeta","pathKey","saved","newMetadata","rootKey","root","validArrayIds","startNode","rootResult","stack","currentNode","parentResult","resultKey","keysToIterate","newArray","newObject","objectKeys","propKey","newValue","parentNode","targetNode","intelligentMerge","nodeToUpdate","plainValue","currentPath","oldMeta","prop","existingKeys","newValues","updatedKeys","newItemValue","existingKey","newItemId","keyToDelete","plainValueKeys","childValue","nodeKey","arrayPath","newItems","newItem","arrayNode","currentKeys","insertionPoint","arrayKey","newIds","itemPath","indexToRemove","fullComponentId","registration","rootMeta","dependencyPath","newPathComponents","component","fullPathKey","newPaths","newComponentRegistration","newComponentsMap","serverState","state","callback","subscribers","subsForPath","currentSubs","updatedPath","subs","validIds","arrayMeta","arrayKeys","newMap","actualKey","changed","updates","newLog","logsGroupedByKey","update","group","batchOfUpdates","newStateLogForKey","prev","newState","syncInfo","getAllFieldElements","elements","collectElements","entry","setAllFieldsDisabled","disabled","disableElements","el"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from 'zustand';\r\nimport type { RefObject } from 'react';\r\n\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from './CogsState.js';\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype StateValue = any;\r\nexport type FormEventType = {\r\n type: 'focus' | 'blur' | 'input';\r\n value?: any;\r\n path: string[];\r\n};\r\nexport type TrieNode = {\r\n subscribers: Set<string>;\r\n children: Map<string, TrieNode>;\r\n};\r\n\r\nexport type ComponentsType = {\r\n components?: Map<\r\n string,\r\n {\r\n forceUpdate: () => void;\r\n paths: Set<string>;\r\n deps?: any[];\r\n prevDeps?: any[];\r\n depsFunction?: (state: any) => any[] | true;\r\n reactiveType: ReactivityType[] | ReactivityType;\r\n }\r\n >;\r\n};\r\n\r\nexport type ValidationStatus =\r\n | 'NOT_VALIDATED'\r\n | 'VALIDATING'\r\n | 'VALID'\r\n | 'INVALID';\r\nexport type ValidationSeverity = 'warning' | 'error' | undefined;\r\nexport type ValidationError = {\r\n source: 'client' | 'sync_engine' | 'api';\r\n message: string;\r\n severity: ValidationSeverity;\r\n code?: string;\r\n};\r\n\r\nexport type ValidationState = {\r\n status: ValidationStatus;\r\n errors: ValidationError[];\r\n lastValidated?: number;\r\n validatedValue?: any;\r\n};\r\nexport type SchemaTypeInfo = {\r\n type:\r\n | 'string'\r\n | 'number'\r\n | 'boolean'\r\n | 'array'\r\n | 'object'\r\n | 'date'\r\n | 'unknown';\r\n schema: any; // Store the actual Zod schema object\r\n source: 'sync' | 'zod4' | 'zod3' | 'runtime' | 'default';\r\n default: any;\r\n nullable?: boolean;\r\n optional?: boolean;\r\n};\r\nexport type ClientActivityState = {\r\n // ALL elements currently mounted for this path\r\n elements: Map<\r\n string,\r\n {\r\n // componentId -> element info\r\n domRef: RefObject<HTMLElement>;\r\n elementType:\r\n | 'input'\r\n | 'textarea'\r\n | 'select'\r\n | 'checkbox'\r\n | 'radio'\r\n | 'range'\r\n | 'file'\r\n | 'custom';\r\n inputType?: string; // For input elements: 'text', 'number', 'date', etc.\r\n mountedAt: number;\r\n\r\n // Current activity for THIS specific element\r\n currentActivity?: {\r\n type:\r\n | 'focus'\r\n | 'blur'\r\n | 'input'\r\n | 'select'\r\n | 'hover'\r\n | 'scroll'\r\n | 'cursor';\r\n startTime: number;\r\n details?: {\r\n value?: any;\r\n previousValue?: any;\r\n inputLength?: number;\r\n changeType?: 'keyboard' | 'paste' | 'drop' | 'select' | 'clear';\r\n selectionStart?: number;\r\n selectionEnd?: number;\r\n selectedText?: string;\r\n cursorPosition?: number;\r\n scrollTop?: number;\r\n scrollLeft?: number;\r\n isComposing?: boolean;\r\n keystrokeCount?: number;\r\n key?: string;\r\n optionCount?: number;\r\n selectedIndex?: number;\r\n checked?: boolean;\r\n arrayOperation?: 'insert' | 'remove' | 'reorder';\r\n arrayIndex?: number;\r\n arrayLength?: number;\r\n };\r\n };\r\n }\r\n >;\r\n};\r\n// Update ShadowMetadata to include typeInfo\r\nexport type ShadowMetadata = {\r\n value?: any;\r\n id?: string;\r\n typeInfo?: SchemaTypeInfo;\r\n stateSource?: 'default' | 'server' | 'localStorage';\r\n lastServerSync?: number;\r\n isDirty?: boolean;\r\n isRaw?: boolean;\r\n baseServerState?: any;\r\n arrayKeys?: string[];\r\n fields?: Record<string, any>;\r\n virtualizer?: {\r\n itemHeight?: number;\r\n domRef?: HTMLElement | null;\r\n };\r\n syncInfo?: { status: string };\r\n validation?: ValidationState;\r\n features?: {\r\n localStorageEnabled: boolean;\r\n };\r\n signals?: Array<{\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n }>;\r\n transformCaches?: Map<\r\n string,\r\n {\r\n validIds: string[];\r\n computedAt: number;\r\n transforms: Array<{ type: 'filter' | 'sort'; fn: Function }>;\r\n }\r\n >;\r\n pathComponents?: Set<string>;\r\n\r\n streams?: Map<\r\n string,\r\n {\r\n buffer: any[];\r\n flushTimer: NodeJS.Timeout | null;\r\n }\r\n >;\r\n pluginMetaData?: Map<string, Record<string, any>>;\r\n // formRef?: React.RefObject<any>;\r\n // focusedElement?: { path: string[]; ref: React.RefObject<any> } | null;\r\n clientActivityState?: ClientActivityState;\r\n} & ComponentsType;\r\n\r\ntype ShadowNode = {\r\n _meta?: ShadowMetadata;\r\n [key: string]: any;\r\n};\r\n\r\nexport type CogsGlobalState = {\r\n getPluginMetaDataMap: (\r\n key: string,\r\n path: string[]\r\n ) => Map<string, Record<string, any>> | undefined;\r\n setPluginMetaData: (\r\n key: string,\r\n path: string[],\r\n pluginName: string,\r\n data: Record<string, any>\r\n ) => void;\r\n removePluginMetaData: (\r\n key: string,\r\n path: string[],\r\n pluginName: string\r\n ) => void;\r\n setTransformCache: (\r\n key: string,\r\n path: string[],\r\n cacheKey: string,\r\n cacheData: any\r\n ) => void;\r\n initializeAndMergeShadowState: (key: string, initialState: any) => void;\r\n initializeShadowState: (key: string, initialState: any) => void;\r\n getShadowNode: (key: string, path: string[]) => ShadowNode | undefined;\r\n getShadowMetadata: (\r\n key: string,\r\n path: string[]\r\n ) => ShadowMetadata | undefined;\r\n\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => void;\r\n getShadowValue: (\r\n key: string,\r\n path: string[],\r\n validArrayIds?: string[],\r\n log?: boolean\r\n ) => any;\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => void;\r\n insertManyShadowArrayElements: (\r\n key: string,\r\n arrayPath: string[],\r\n newItems: any[],\r\n index?: number\r\n ) => void;\r\n addItemsToArrayNode: (\r\n key: string,\r\n arrayPath: string[],\r\n newItems: any\r\n ) => void;\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItem: any,\r\n index?: number,\r\n itemId?: string\r\n ) => string;\r\n removeShadowArrayElement: (key: string, itemPath: string[]) => void;\r\n registerComponent: (\r\n stateKey: string,\r\n componentId: string,\r\n registration: any\r\n ) => void;\r\n unregisterComponent: (stateKey: string, componentId: string) => void;\r\n addPathComponent: (\r\n stateKey: string,\r\n dependencyPath: string[],\r\n fullComponentId: string\r\n ) => void;\r\n markAsDirty: (\r\n key: string,\r\n path: string[],\r\n options: { bubble: boolean }\r\n ) => void;\r\n\r\n pathSubscribers: Map<string, Set<(newValue: any) => void>>;\r\n subscribeToPath: (\r\n path: string,\r\n callback: (newValue: any) => void\r\n ) => () => void;\r\n notifyPathSubscribers: (updatedPath: string, newValue: any) => void;\r\n\r\n selectedIndicesMap: Map<string, string>; // stateKey -> (parentPath -> selectedIndex)\r\n getSelectedIndex: (stateKey: string, validArrayIds?: string[]) => number;\r\n setSelectedIndex: (key: string, itemKey: string) => void;\r\n clearSelectedIndex: ({ arrayKey }: { arrayKey: string }) => void;\r\n clearSelectedIndexesForState: (stateKey: string) => void;\r\n\r\n initialStateOptions: { [key: string]: OptionsType };\r\n initialStateGlobal: { [key: string]: StateValue };\r\n updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n\r\n serverStateUpdates: Map<\r\n string,\r\n {\r\n data: any;\r\n status: 'loading' | 'success' | 'error';\r\n timestamp: number;\r\n }\r\n >;\r\n\r\n setServerStateUpdate: (key: string, serverState: any) => void;\r\n\r\n stateLog: Map<string, Map<string, UpdateTypeDetail>>;\r\n syncInfoStore: Map<string, SyncInfo>;\r\n addStateLog: (updates: UpdateTypeDetail[]) => void;\r\n\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\nfunction getTypeFromZodSchema(\r\n schema: any,\r\n source: 'zod4' | 'zod3' | 'sync' = 'zod4'\r\n): SchemaTypeInfo | null {\r\n if (!schema) return null;\r\n\r\n let current = schema;\r\n let isNullable = false;\r\n let isOptional = false;\r\n let defaultValue: any = undefined;\r\n let hasDefault = false;\r\n\r\n // This loop will now correctly navigate through any wrappers AND unions.\r\n for (let i = 0; i < 20; i++) {\r\n // Added a safety break for complex schemas\r\n const def = current?.def || current?._def;\r\n if (!def) break;\r\n\r\n const typeIdentifier = def.typeName || def.type || current._type;\r\n\r\n if (typeIdentifier === 'ZodUnion' || typeIdentifier === 'union') {\r\n if (def.options && def.options.length > 0) {\r\n const preferredOption = def.options.find((option: any) => {\r\n const optionDef = option?.def || option?._def;\r\n const optionType =\r\n optionDef?.typeName || optionDef?.type || option?._type;\r\n return (\r\n optionType !== 'ZodNull' &&\r\n optionType !== 'null' &&\r\n optionType !== 'ZodUndefined' &&\r\n optionType !== 'undefined'\r\n );\r\n });\r\n current = preferredOption ?? def.options[0];\r\n continue;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (typeIdentifier === 'ZodOptional' || typeIdentifier === 'optional') {\r\n isOptional = true;\r\n } else if (\r\n typeIdentifier === 'ZodNullable' ||\r\n typeIdentifier === 'nullable'\r\n ) {\r\n isNullable = true;\r\n } else if (\r\n typeIdentifier === 'ZodDefault' ||\r\n typeIdentifier === 'default'\r\n ) {\r\n hasDefault = true;\r\n defaultValue =\r\n typeof def.defaultValue === 'function'\r\n ? def.defaultValue()\r\n : def.defaultValue;\r\n } else if (\r\n typeIdentifier !== 'ZodEffects' &&\r\n typeIdentifier !== 'effects'\r\n ) {\r\n // This is not a wrapper we need to unwrap further, so we can exit the loop.\r\n break;\r\n }\r\n\r\n const nextSchema = def.innerType || def.schema || current._inner;\r\n if (!nextSchema || nextSchema === current) {\r\n break; // Reached the end or a recursive schema\r\n }\r\n current = nextSchema;\r\n }\r\n\r\n const baseSchema = current;\r\n const baseDef = baseSchema?.def || baseSchema?._def;\r\n const baseType = baseDef?.typeName || baseDef?.type || baseSchema?._type;\r\n\r\n if (baseType === 'ZodNumber' || baseType === 'number') {\r\n return {\r\n type: 'number',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : 0,\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodString' || baseType === 'string') {\r\n return {\r\n type: 'string',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : '',\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodBoolean' || baseType === 'boolean') {\r\n return {\r\n type: 'boolean',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : false,\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodArray' || baseType === 'array') {\r\n return {\r\n type: 'array',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : [],\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodObject' || baseType === 'object') {\r\n return {\r\n type: 'object',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : {},\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n if (baseType === 'ZodDate' || baseType === 'date') {\r\n return {\r\n type: 'date',\r\n schema: schema,\r\n source,\r\n default: hasDefault ? defaultValue : new Date(),\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// Helper to get type info from runtime value\r\nfunction getTypeFromValue(value: any): SchemaTypeInfo {\r\n if (value === null) {\r\n return {\r\n type: 'unknown',\r\n schema: null,\r\n source: 'default',\r\n default: null,\r\n nullable: true,\r\n };\r\n }\r\n\r\n if (value === undefined) {\r\n return {\r\n type: 'unknown',\r\n schema: null,\r\n source: 'default',\r\n default: undefined,\r\n optional: true,\r\n };\r\n }\r\n\r\n const valueType = typeof value;\r\n\r\n if (valueType === 'number') {\r\n return { type: 'number', schema: null, source: 'runtime', default: value };\r\n } else if (valueType === 'string') {\r\n return { type: 'string', schema: null, source: 'runtime', default: value };\r\n } else if (valueType === 'boolean') {\r\n return { type: 'boolean', schema: null, source: 'runtime', default: value };\r\n } else if (Array.isArray(value)) {\r\n return { type: 'array', schema: null, source: 'runtime', default: [] };\r\n } else if (value instanceof Date) {\r\n return { type: 'date', schema: null, source: 'runtime', default: value };\r\n } else if (valueType === 'object') {\r\n return { type: 'object', schema: null, source: 'runtime', default: {} };\r\n }\r\n\r\n return { type: 'unknown', schema: null, source: 'runtime', default: value };\r\n}\r\ntype BuildContext = {\r\n stateKey: string;\r\n path: string[];\r\n schemas: {\r\n sync?: any;\r\n zodV4?: any;\r\n zodV3?: any;\r\n };\r\n};\r\n\r\nexport function buildShadowNode(\r\n stateKey: string,\r\n value: any,\r\n context?: BuildContext\r\n): ShadowNode {\r\n // Handle null/undefined/primitives (This part is already correct)\r\n if (value === null || value === undefined || typeof value !== 'object') {\r\n const node: ShadowNode = { _meta: { value } };\r\n node._meta!.typeInfo = getTypeInfoForPath(value, context);\r\n return node;\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(value)) {\r\n // 1. Create the node for the array.\r\n const node: ShadowNode = { _meta: { arrayKeys: [] } };\r\n\r\n // 2. Get the type info for the array itself ONCE, right at the start.\r\n node._meta!.typeInfo = getTypeInfoForPath(value, context);\r\n\r\n // 3. THEN, recursively process the children.\r\n value.forEach((item, index) => {\r\n const itemId = generateId(stateKey);\r\n const itemContext = context\r\n ? {\r\n ...context,\r\n path: [...context.path, index.toString()],\r\n }\r\n : undefined;\r\n\r\n node[itemId] = buildShadowNode(stateKey, item, itemContext);\r\n node._meta!.arrayKeys!.push(itemId);\r\n });\r\n\r\n return node;\r\n }\r\n\r\n // Handle objects\r\n if (value.constructor === Object) {\r\n // 1. Create the node for the object.\r\n const node: ShadowNode = { _meta: {} };\r\n\r\n // 2. Get the type info for the object itself ONCE, right at the start.\r\n node._meta!.typeInfo = getTypeInfoForPath(value, context);\r\n\r\n // 3. THEN, recursively process the children.\r\n for (const key in value) {\r\n if (Object.prototype.hasOwnProperty.call(value, key)) {\r\n const propContext = context\r\n ? {\r\n ...context,\r\n path: [...context.path, key],\r\n }\r\n : undefined;\r\n\r\n node[key] = buildShadowNode(stateKey, value[key], propContext);\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n // Fallback for other object types (Date, class instances, etc.)\r\n return {\r\n _meta: {\r\n value: value,\r\n typeInfo: getTypeFromValue(value),\r\n },\r\n };\r\n}\r\n\r\n// Helper function to get type info (extracted for clarity)\r\nfunction getTypeInfoForPath(\r\n value: any,\r\n context?: BuildContext\r\n): SchemaTypeInfo {\r\n if (context) {\r\n // Try to get schema-based type info\r\n let typeInfo: SchemaTypeInfo | null = null;\r\n\r\n if (context.schemas.zodV4) {\r\n const schema =\r\n context.path.length === 0\r\n ? context.schemas.zodV4\r\n : getSchemaAtPath(context.schemas.zodV4, context.path);\r\n if (schema) {\r\n typeInfo = getTypeFromZodSchema(schema, 'zod4');\r\n }\r\n }\r\n\r\n if (!typeInfo && context.schemas.zodV3) {\r\n const schema =\r\n context.path.length === 0\r\n ? context.schemas.zodV3\r\n : getSchemaAtPath(context.schemas.zodV3, context.path);\r\n if (schema) {\r\n typeInfo = getTypeFromZodSchema(schema, 'zod3');\r\n }\r\n }\r\n\r\n if (!typeInfo && context.schemas.sync?.[context.stateKey]) {\r\n typeInfo = getTypeFromValue(value);\r\n typeInfo.source = 'sync';\r\n }\r\n\r\n if (typeInfo) return typeInfo;\r\n }\r\n\r\n return getTypeFromValue(value);\r\n}\r\n\r\nexport function updateShadowTypeInfo(\r\n stateKey: string,\r\n rootSchema: any,\r\n source: 'zod4' | 'zod3'\r\n) {\r\n const rootNode =\r\n shadowStateStore.get(stateKey) || shadowStateStore.get(`[${stateKey}`);\r\n if (!rootNode) return;\r\n\r\n function updateNodeTypeInfo(node: any, path: string[]) {\r\n if (!node || typeof node !== 'object') return;\r\n const fieldSchema = getSchemaAtPath(rootSchema, path);\r\n\r\n if (fieldSchema) {\r\n const typeInfo = getTypeFromZodSchema(fieldSchema, source);\r\n if (typeInfo) {\r\n if (!node._meta) node._meta = {};\r\n node._meta.typeInfo = {\r\n ...typeInfo,\r\n schema: fieldSchema,\r\n };\r\n }\r\n }\r\n\r\n // Recursively update children\r\n if (node._meta?.arrayKeys) {\r\n node._meta.arrayKeys.forEach((itemKey: string) => {\r\n if (node[itemKey]) {\r\n updateNodeTypeInfo(node[itemKey], [...path, '0']); // Use index 0 for array item schema\r\n }\r\n });\r\n } else if (!node._meta?.hasOwnProperty('value')) {\r\n // It's an object - update each property\r\n Object.keys(node).forEach((key) => {\r\n if (key !== '_meta') {\r\n updateNodeTypeInfo(node[key], [...path, key]);\r\n }\r\n });\r\n }\r\n }\r\n\r\n updateNodeTypeInfo(rootNode, []);\r\n}\r\n\r\n/**\r\n * Reliably unwraps a Zod schema to its core type, handling modifiers\r\n * from both Zod v3 and modern Zod.\r\n */\r\nfunction unwrapSchema(schema: any): any {\r\n let current = schema;\r\n while (current) {\r\n // Version-agnostic way to get the definition object\r\n const def = current.def || current._def;\r\n\r\n // VITAL FIX: Check for `def.type` (like in your log), `def.typeName` (modern Zod), and `_type` (zod v3)\r\n const typeIdentifier = def?.typeName || def?.type || current._type;\r\n\r\n if (\r\n typeIdentifier === 'ZodOptional' ||\r\n typeIdentifier === 'optional' ||\r\n typeIdentifier === 'ZodNullable' ||\r\n typeIdentifier === 'nullable' ||\r\n typeIdentifier === 'ZodDefault' ||\r\n typeIdentifier === 'default' ||\r\n typeIdentifier === 'ZodEffects' ||\r\n typeIdentifier === 'effects'\r\n ) {\r\n // Get the inner schema, supporting multiple internal structures\r\n current =\r\n def.innerType || def.schema || current._inner || current.unwrap?.();\r\n } else {\r\n break; // Reached the base schema\r\n }\r\n }\r\n return current;\r\n}\r\n\r\n/**\r\n * Helper function to get a nested schema at a specific path,\r\n * correctly handling both Zod v3 and modern Zod internals.\r\n */\r\nfunction getSchemaAtPath(schema: any, path: string[]): any {\r\n if (!schema) return null;\r\n if (path.length === 0) return schema;\r\n\r\n let currentSchema = schema;\r\n\r\n for (const segment of path) {\r\n const containerSchema = unwrapSchema(currentSchema);\r\n if (!containerSchema) return null;\r\n\r\n const def = containerSchema.def || containerSchema._def;\r\n\r\n // VITAL FIX: Check for `def.type` as you discovered.\r\n const typeIdentifier = def?.typeName || def?.type || containerSchema._type;\r\n\r\n if (typeIdentifier === 'ZodObject' || typeIdentifier === 'object') {\r\n const rawShape =\r\n def?.shape ?? containerSchema.shape ?? containerSchema._shape;\r\n const shape =\r\n typeof rawShape === 'function' ? rawShape() : rawShape;\r\n currentSchema = shape?.[segment];\r\n } else if (typeIdentifier === 'ZodArray' || typeIdentifier === 'array') {\r\n // For arrays, the next schema is always the element's schema.\r\n currentSchema = containerSchema.element || def?.type;\r\n } else {\r\n return null; // Not a container, cannot traverse deeper.\r\n }\r\n\r\n if (!currentSchema) {\r\n return null; // Path segment does not exist in the schema.\r\n }\r\n }\r\n\r\n return currentSchema;\r\n}\r\nexport const shadowStateStore = new Map<string, ShadowNode>();\r\nlet globalCounter = 0;\r\nconst instanceId = Date.now().toString(36);\r\n\r\nexport function generateId(stateKey: string): string {\r\n const prefix = 'local';\r\n\r\n return `id:${prefix}_${instanceId}_${(globalCounter++).toString(36)}`;\r\n}\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n getPluginMetaDataMap: (\r\n key: string,\r\n path: string[]\r\n ): Map<string, Record<string, any>> | undefined => {\r\n const metadata = get().getShadowMetadata(key, path);\r\n return metadata?.pluginMetaData;\r\n },\r\n\r\n setPluginMetaData: (\r\n key: string,\r\n path: string[], // ADD THIS PARAMETER\r\n pluginName: string,\r\n data: Record<string, any>\r\n ) => {\r\n const metadata = get().getShadowMetadata(key, path) || {}; // Use the path!\r\n const pluginMetaData = new Map(metadata.pluginMetaData || []);\r\n const existingData = pluginMetaData.get(pluginName) || {};\r\n pluginMetaData.set(pluginName, { ...existingData, ...data });\r\n get().setShadowMetadata(key, path, { ...metadata, pluginMetaData });\r\n get().notifyPathSubscribers([key, ...path].join('.'), {\r\n type: 'METADATA_UPDATE',\r\n });\r\n },\r\n removePluginMetaData: (key: string, path: string[], pluginName: string) => {\r\n const metadata = get().getShadowMetadata(key, path);\r\n if (!metadata?.pluginMetaData) return;\r\n const pluginMetaData = new Map(metadata.pluginMetaData);\r\n pluginMetaData.delete(pluginName);\r\n get().setShadowMetadata(key, path, { ...metadata, pluginMetaData });\r\n },\r\n\r\n setTransformCache: (\r\n key: string,\r\n path: string[],\r\n cacheKey: string,\r\n cacheData: any\r\n ) => {\r\n const metadata = get().getShadowMetadata(key, path) || {};\r\n if (!metadata.transformCaches) {\r\n metadata.transformCaches = new Map();\r\n }\r\n metadata.transformCaches.set(cacheKey, cacheData);\r\n get().setShadowMetadata(key, path, {\r\n transformCaches: metadata.transformCaches,\r\n });\r\n },\r\n // Replace your entire `initializeAndMergeShadowState` function with this one.\r\n\r\n initializeAndMergeShadowState: (key: string, shadowState: any) => {\r\n const isArrayState = shadowState?._meta?.arrayKeys !== undefined;\r\n const storageKey = isArrayState ? `[${key}` : key;\r\n\r\n const existingRoot =\r\n shadowStateStore.get(storageKey) ||\r\n shadowStateStore.get(key) ||\r\n shadowStateStore.get(`[${key}`);\r\n\r\n // --- THIS LOGIC IS RESTORED ---\r\n // This is vital for preserving component registrations and other top-level\r\n // metadata across a full merge/replace, which is why removing it was a mistake.\r\n let preservedMetadata: Partial<ShadowMetadata> = {};\r\n if (existingRoot?._meta) {\r\n const {\r\n components,\r\n features,\r\n lastServerSync,\r\n stateSource,\r\n baseServerState,\r\n pathComponents,\r\n signals,\r\n validation,\r\n } = existingRoot._meta;\r\n\r\n if (components) preservedMetadata.components = components;\r\n if (features) preservedMetadata.features = features;\r\n if (lastServerSync) preservedMetadata.lastServerSync = lastServerSync;\r\n if (stateSource) preservedMetadata.stateSource = stateSource;\r\n if (baseServerState) preservedMetadata.baseServerState = baseServerState;\r\n if (pathComponents) preservedMetadata.pathComponents = pathComponents;\r\n if (signals) preservedMetadata.signals = signals;\r\n if (validation) preservedMetadata.validation = validation;\r\n }\r\n function deepMergeShadowNodes(target: ShadowNode, source: ShadowNode) {\r\n // --- START: CORRECTED, MORE ROBUST METADATA MERGE ---\r\n if (source._meta || target._meta) {\r\n const existingMeta = target._meta || {};\r\n const sourceMeta = source._meta || {};\r\n\r\n // Combine metadata, letting the source overwrite simple, top-level properties.\r\n const newMeta = { ...existingMeta, ...sourceMeta };\r\n\r\n // CRITICAL FIX: Now, explicitly check and preserve the complex, valuable\r\n // objects from the existing state if the incoming source state doesn't have\r\n // an equally good or better version.\r\n\r\n // 1. Preserve rich TypeInfo (with a schema) over a simple runtime one.\r\n if (existingMeta.typeInfo?.schema && !sourceMeta.typeInfo?.schema) {\r\n newMeta.typeInfo = existingMeta.typeInfo;\r\n }\r\n\r\n // 2. Preserve the existing validation state, which is computed and stored on the target.\r\n // A source built from a plain object will never have this.\r\n if (existingMeta.validation && !sourceMeta.validation) {\r\n newMeta.validation = existingMeta.validation;\r\n }\r\n\r\n // 3. Preserve component registrations\r\n if (existingMeta.components) {\r\n newMeta.components = existingMeta.components;\r\n }\r\n\r\n // 4. Preserve clientActivityState (DOM ref registrations)\r\n if (\r\n existingMeta.clientActivityState &&\r\n !sourceMeta.clientActivityState\r\n ) {\r\n newMeta.clientActivityState = existingMeta.clientActivityState;\r\n }\r\n\r\n // 5. Preserve pluginMetaData\r\n if (existingMeta.pluginMetaData && !sourceMeta.pluginMetaData) {\r\n newMeta.pluginMetaData = existingMeta.pluginMetaData;\r\n }\r\n\r\n target._meta = newMeta;\r\n }\r\n // --- END: CORRECTED METADATA MERGE ---\r\n\r\n // 2. Handle the node's data (primitive, array, or object).\r\n if (source._meta?.hasOwnProperty('value')) {\r\n // Source is a primitive. Clear any old child properties from target.\r\n for (const key in target) {\r\n if (key !== '_meta') delete target[key];\r\n }\r\n return; // Done with this branch\r\n }\r\n\r\n // Synchronize the data structure based on the source.\r\n const sourceKeys = new Set(\r\n Object.keys(source).filter((k) => k !== '_meta')\r\n );\r\n const targetKeys = new Set(\r\n Object.keys(target).filter((k) => k !== '_meta')\r\n );\r\n\r\n // Delete keys that are in the target but no longer in the source.\r\n for (const key of targetKeys) {\r\n if (!sourceKeys.has(key)) {\r\n delete target[key];\r\n }\r\n }\r\n\r\n // Recursively merge or add keys from the source.\r\n for (const key of sourceKeys) {\r\n const sourceValue = source[key];\r\n const targetValue = target[key];\r\n if (\r\n targetValue &&\r\n typeof targetValue === 'object' &&\r\n sourceValue &&\r\n typeof sourceValue === 'object'\r\n ) {\r\n deepMergeShadowNodes(targetValue, sourceValue); // Recurse for objects\r\n } else {\r\n target[key] = sourceValue; // Add new or replace primitive/node\r\n }\r\n }\r\n }\r\n // --- THIS IS YOUR ORIGINAL, CORRECT MAIN LOGIC ---\r\n if (existingRoot) {\r\n // Merge the new shadow state into the existing one\r\n deepMergeShadowNodes(existingRoot, shadowState);\r\n // Restore preserved metadata\r\n if (!existingRoot._meta) existingRoot._meta = {};\r\n Object.assign(existingRoot._meta, preservedMetadata);\r\n shadowStateStore.set(storageKey, existingRoot);\r\n } else {\r\n // The logic for when no state exists yet\r\n if (preservedMetadata && Object.keys(preservedMetadata).length > 0) {\r\n if (!shadowState._meta) shadowState._meta = {};\r\n Object.assign(shadowState._meta, preservedMetadata);\r\n }\r\n shadowStateStore.set(storageKey, shadowState);\r\n }\r\n\r\n // As your logs show, this part works. It runs AFTER the merge to apply schemas.\r\n const options = get().getInitialOptions(key);\r\n const hasSchema =\r\n options?.validation?.zodSchemaV4 || options?.validation?.zodSchemaV3;\r\n if (hasSchema) {\r\n if (options.validation?.zodSchemaV4) {\r\n updateShadowTypeInfo(key, options.validation.zodSchemaV4, 'zod4');\r\n } else if (options.validation?.zodSchemaV3) {\r\n updateShadowTypeInfo(key, options.validation.zodSchemaV3, 'zod3');\r\n }\r\n }\r\n\r\n // Cleanup logic is restored\r\n if (storageKey === key) {\r\n shadowStateStore.delete(`[${key}`);\r\n } else {\r\n shadowStateStore.delete(key);\r\n }\r\n },\r\n initializeShadowState: (key: string, initialState: any) => {\r\n const existingRoot =\r\n shadowStateStore.get(key) || shadowStateStore.get(`[${key}`);\r\n let preservedMetadata: Partial<ShadowMetadata> = {};\r\n\r\n // NEW: Collect runtime metadata (clientActivityState, pluginMetaData) from ALL nodes\r\n const preservedRuntimeMeta = new Map<\r\n string,\r\n {\r\n clientActivityState?: ClientActivityState;\r\n pluginMetaData?: Map<string, Record<string, any>>;\r\n }\r\n >();\r\n\r\n if (existingRoot) {\r\n const collectRuntimeMeta = (node: any, pathSegments: string[]) => {\r\n if (!node || typeof node !== 'object') return;\r\n if (node._meta?.clientActivityState || node._meta?.pluginMetaData) {\r\n preservedRuntimeMeta.set(pathSegments.join('\\x00'), {\r\n clientActivityState: node._meta.clientActivityState,\r\n pluginMetaData: node._meta.pluginMetaData,\r\n });\r\n }\r\n for (const k in node) {\r\n if (k !== '_meta') {\r\n collectRuntimeMeta(node[k], [...pathSegments, k]);\r\n }\r\n }\r\n };\r\n collectRuntimeMeta(existingRoot, []);\r\n }\r\n\r\n if (existingRoot?._meta) {\r\n const {\r\n components,\r\n features,\r\n lastServerSync,\r\n stateSource,\r\n baseServerState,\r\n } = existingRoot._meta;\r\n if (components) preservedMetadata.components = components;\r\n if (features) preservedMetadata.features = features;\r\n if (lastServerSync) preservedMetadata.lastServerSync = lastServerSync;\r\n if (stateSource) preservedMetadata.stateSource = stateSource;\r\n if (baseServerState) preservedMetadata.baseServerState = baseServerState;\r\n }\r\n\r\n shadowStateStore.delete(key);\r\n shadowStateStore.delete(`[${key}`);\r\n\r\n const options = get().getInitialOptions(key);\r\n const syncSchemas = get().getInitialOptions('__syncSchemas');\r\n\r\n const context: BuildContext = {\r\n stateKey: key,\r\n path: [],\r\n schemas: {\r\n sync: syncSchemas,\r\n zodV4: options?.validation?.zodSchemaV4,\r\n zodV3: options?.validation?.zodSchemaV3,\r\n },\r\n };\r\n\r\n const newRoot = buildShadowNode(key, initialState, context);\r\n\r\n if (!newRoot._meta) newRoot._meta = {};\r\n Object.assign(newRoot._meta, preservedMetadata);\r\n\r\n // NEW: Restore runtime metadata to matching nodes in rebuilt tree\r\n const restoreRuntimeMeta = (node: any, pathSegments: string[]) => {\r\n if (!node || typeof node !== 'object') return;\r\n const pathKey = pathSegments.join('\\x00');\r\n const saved = preservedRuntimeMeta.get(pathKey);\r\n if (saved) {\r\n if (!node._meta) node._meta = {};\r\n if (saved.clientActivityState)\r\n node._meta.clientActivityState = saved.clientActivityState;\r\n if (saved.pluginMetaData)\r\n node._meta.pluginMetaData = saved.pluginMetaData;\r\n }\r\n for (const k in node) {\r\n if (k !== '_meta') {\r\n restoreRuntimeMeta(node[k], [...pathSegments, k]);\r\n }\r\n }\r\n };\r\n restoreRuntimeMeta(newRoot, []);\r\n\r\n const storageKey = Array.isArray(initialState) ? `[${key}` : key;\r\n shadowStateStore.set(storageKey, newRoot);\r\n\r\n const latestOptions = get().getInitialOptions(key);\r\n if (latestOptions?.validation?.zodSchemaV4) {\r\n updateShadowTypeInfo(key, latestOptions.validation.zodSchemaV4, 'zod4');\r\n } else if (latestOptions?.validation?.zodSchemaV3) {\r\n updateShadowTypeInfo(key, latestOptions.validation.zodSchemaV3, 'zod3');\r\n }\r\n },\r\n getShadowNode: (key: string, path: string[]): ShadowNode | undefined => {\r\n let current: any =\r\n shadowStateStore.get(key) || shadowStateStore.get(`[${key}`);\r\n if (!current) return undefined;\r\n if (path.length === 0) return current;\r\n\r\n for (const segment of path) {\r\n if (typeof current !== 'object' || current === null) return undefined;\r\n current = current[segment];\r\n if (current === undefined) return undefined;\r\n }\r\n return current;\r\n },\r\n\r\n getShadowMetadata: (\r\n key: string,\r\n path: string[]\r\n ): ShadowMetadata | undefined => {\r\n const node = get().getShadowNode(key, path);\r\n return node?._meta;\r\n },\r\n\r\n setShadowMetadata: (\r\n key: string,\r\n path: string[],\r\n newMetadata: Partial<ShadowMetadata>\r\n ) => {\r\n // Direct mutation - no cloning!\r\n const rootKey = shadowStateStore.has(`[${key}`) ? `[${key}` : key;\r\n let root = shadowStateStore.get(rootKey);\r\n\r\n if (!root) {\r\n root = { _meta: newMetadata };\r\n shadowStateStore.set(rootKey, root);\r\n return;\r\n }\r\n\r\n // Navigate to target without cloning\r\n let current = root;\r\n for (const segment of path) {\r\n if (!current[segment]) {\r\n current[segment] = {};\r\n }\r\n current = current[segment];\r\n }\r\n\r\n // Mutate metadata directly\r\n if (!current._meta) {\r\n current._meta = {};\r\n }\r\n\r\n Object.assign(current._meta, newMetadata);\r\n },\r\n getShadowValue: (key: string, path: string[], validArrayIds?: string[]) => {\r\n const startNode = get().getShadowNode(key, path);\r\n\r\n // If the path is invalid or leads nowhere, return undefined immediately.\r\n if (!startNode) {\r\n return undefined;\r\n }\r\n\r\n // --- High-Performance Iterative Materializer ---\r\n\r\n // A single root object to hold the final, materialized result.\r\n const rootResult: any = {};\r\n\r\n // Stack to manage the traversal without recursion.\r\n // Each item is [shadowNode, parentObjectInResult, keyToSetOnParent]\r\n const stack: [ShadowNode, any, string | number][] = [\r\n [startNode, rootResult, 'final'],\r\n ];\r\n\r\n while (stack.length > 0) {\r\n const [currentNode, parentResult, resultKey] = stack.pop()!;\r\n\r\n // 1. Handle primitive values\r\n if (currentNode._meta?.hasOwnProperty('value')) {\r\n parentResult[resultKey] = currentNode._meta.value;\r\n continue; // Done with this branch\r\n }\r\n\r\n // 2. Handle arrays\r\n if (currentNode._meta?.arrayKeys) {\r\n const keysToIterate = validArrayIds || currentNode._meta.arrayKeys;\r\n const newArray: any[] = [];\r\n parentResult[resultKey] = newArray;\r\n\r\n // Push children onto the stack in reverse order to process them from 0 to N\r\n for (let i = keysToIterate.length - 1; i >= 0; i--) {\r\n const itemKey = keysToIterate[i]!;\r\n if (currentNode[itemKey]) {\r\n // The child's result will be placed at index `i` in `newArray`\r\n stack.push([currentNode[itemKey], newArray, i]);\r\n }\r\n }\r\n continue; // Done with this branch\r\n }\r\n\r\n // 3. Handle objects\r\n const newObject: any = {};\r\n parentResult[resultKey] = newObject;\r\n\r\n const objectKeys = Object.keys(currentNode);\r\n // Push children onto the stack (order doesn't matter for objects)\r\n for (const propKey of objectKeys) {\r\n if (propKey !== '_meta') {\r\n // The child's result will be set as a property on `newObject`\r\n stack.push([currentNode[propKey], newObject, propKey]);\r\n }\r\n }\r\n }\r\n\r\n return rootResult.final;\r\n },\r\n updateShadowAtPath: (key, path, newValue) => {\r\n const rootKey = shadowStateStore.has(`[${key}`) ? `[${key}` : key;\r\n let root = shadowStateStore.get(rootKey);\r\n if (!root) return;\r\n\r\n let parentNode = root;\r\n for (let i = 0; i < path.length - 1; i++) {\r\n if (!parentNode[path[i]!]) {\r\n parentNode[path[i]!] = {};\r\n }\r\n parentNode = parentNode[path[i]!];\r\n }\r\n const targetNode =\r\n path.length === 0 ? parentNode : parentNode[path[path.length - 1]!];\r\n\r\n // This function is now defined inside to close over 'key' and 'path' for context\r\n function intelligentMerge(\r\n nodeToUpdate: any,\r\n plainValue: any,\r\n currentPath: string[]\r\n ) {\r\n // 1. Handle primitives (but NOT arrays)\r\n if (\r\n typeof plainValue !== 'object' ||\r\n plainValue === null ||\r\n plainValue instanceof Date\r\n ) {\r\n const oldMeta = nodeToUpdate._meta || {};\r\n // Clear all child properties\r\n for (const prop in nodeToUpdate) {\r\n if (prop !== '_meta') delete nodeToUpdate[prop];\r\n }\r\n // Set the new primitive value, preserving metadata\r\n nodeToUpdate._meta = { ...oldMeta, value: plainValue };\r\n return;\r\n }\r\n\r\n // 2. Handle Arrays INTELLIGENTLY\r\n if (Array.isArray(plainValue)) {\r\n // Ensure the target is a shadow array node\r\n if (!nodeToUpdate._meta) nodeToUpdate._meta = {};\r\n if (!nodeToUpdate._meta.arrayKeys) nodeToUpdate._meta.arrayKeys = [];\r\n\r\n const existingKeys = nodeToUpdate._meta.arrayKeys;\r\n const newValues = plainValue;\r\n\r\n const updatedKeys: string[] = [];\r\n\r\n // Merge existing items and add new items\r\n for (let i = 0; i < newValues.length; i++) {\r\n const newItemValue = newValues[i]!;\r\n if (i < existingKeys.length) {\r\n // Merge into existing item, preserving its key and metadata\r\n const existingKey = existingKeys[i]!;\r\n intelligentMerge(nodeToUpdate[existingKey], newItemValue, [\r\n ...currentPath,\r\n existingKey,\r\n ]);\r\n updatedKeys.push(existingKey);\r\n } else {\r\n // Add a new item\r\n const newItemId = generateId(key);\r\n const options = get().getInitialOptions(key);\r\n // Build the new node WITH proper context to get schema info\r\n const itemContext: BuildContext = {\r\n stateKey: key,\r\n path: [...currentPath, '0'], // Use '0' for array element schema lookup\r\n schemas: {\r\n zodV4: options?.validation?.zodSchemaV4,\r\n zodV3: options?.validation?.zodSchemaV3,\r\n },\r\n };\r\n nodeToUpdate[newItemId] = buildShadowNode(\r\n key,\r\n newItemValue,\r\n itemContext\r\n );\r\n updatedKeys.push(newItemId);\r\n }\r\n }\r\n\r\n // Remove deleted items\r\n if (existingKeys.length > newValues.length) {\r\n const keysToDelete = existingKeys.slice(newValues.length);\r\n keysToDelete.forEach((keyToDelete: string) => {\r\n delete nodeToUpdate[keyToDelete];\r\n });\r\n }\r\n\r\n // Update the keys array to reflect the new state\r\n nodeToUpdate._meta.arrayKeys = updatedKeys;\r\n return;\r\n }\r\n\r\n // 3. Handle Objects\r\n const plainValueKeys = new Set(Object.keys(plainValue));\r\n if (nodeToUpdate._meta?.hasOwnProperty('value')) {\r\n // transitioning from primitive to object, clear the value\r\n delete nodeToUpdate._meta.value;\r\n }\r\n\r\n for (const propKey of plainValueKeys) {\r\n const childValue = plainValue[propKey];\r\n if (nodeToUpdate[propKey]) {\r\n intelligentMerge(nodeToUpdate[propKey], childValue, [\r\n ...currentPath,\r\n propKey,\r\n ]);\r\n } else {\r\n const options = get().getInitialOptions(key);\r\n const itemContext: BuildContext = {\r\n stateKey: key,\r\n path: [...currentPath, propKey],\r\n schemas: {\r\n zodV4: options?.validation?.zodSchemaV4,\r\n zodV3: options?.validation?.zodSchemaV3,\r\n },\r\n };\r\n nodeToUpdate[propKey] = buildShadowNode(key, childValue, itemContext);\r\n }\r\n }\r\n\r\n // Delete keys that no longer exist\r\n for (const nodeKey in nodeToUpdate) {\r\n if (\r\n nodeKey === '_meta' ||\r\n !Object.prototype.hasOwnProperty.call(nodeToUpdate, nodeKey)\r\n )\r\n continue;\r\n if (!plainValueKeys.has(nodeKey)) {\r\n delete nodeToUpdate[nodeKey];\r\n }\r\n }\r\n }\r\n\r\n if (!targetNode) {\r\n parentNode[path[path.length - 1]!] = buildShadowNode(key, newValue); // Build fresh if no target\r\n } else {\r\n intelligentMerge(targetNode, newValue, path); // Use the new intelligent merge\r\n }\r\n\r\n get().notifyPathSubscribers([key, ...path].join('.'), {\r\n type: 'UPDATE',\r\n newValue,\r\n });\r\n },\r\n addItemsToArrayNode: (key, arrayPath, newItems) => {\r\n const rootKey = shadowStateStore.has(`[${key}`) ? `[${key}` : key;\r\n let root = shadowStateStore.get(rootKey);\r\n if (!root) {\r\n console.error('Root not found for state key:', key);\r\n return;\r\n }\r\n\r\n let current = root;\r\n for (const segment of arrayPath) {\r\n if (!current[segment]) {\r\n current[segment] = {};\r\n }\r\n current = current[segment];\r\n }\r\n\r\n Object.assign(current, newItems);\r\n },\r\n insertShadowArrayElement: (key, arrayPath, newItem, index, itemId) => {\r\n const arrayNode = get().getShadowNode(key, arrayPath);\r\n if (!arrayNode?._meta?.arrayKeys) {\r\n throw new Error(\r\n `Array not found at path: ${[key, ...arrayPath].join('.')}`\r\n );\r\n }\r\n\r\n const newItemId = itemId || `${generateId(key)}`;\r\n\r\n // BUILD AND ADD the node directly - no need for addItemsToArrayNode\r\n arrayNode[newItemId] = buildShadowNode(key, newItem);\r\n\r\n // Mutate the array directly\r\n const currentKeys = arrayNode._meta.arrayKeys;\r\n const insertionPoint =\r\n index !== undefined && index >= 0 && index <= currentKeys.length\r\n ? index\r\n : currentKeys.length;\r\n\r\n if (insertionPoint >= currentKeys.length) {\r\n currentKeys.push(newItemId);\r\n } else {\r\n currentKeys.splice(insertionPoint, 0, newItemId);\r\n }\r\n\r\n // Skip addItemsToArrayNode entirely - we already did everything it does!\r\n\r\n const arrayKey = [key, ...arrayPath].join('.');\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'INSERT',\r\n path: arrayKey,\r\n itemKey: `${arrayKey}.${newItemId}`,\r\n index: insertionPoint,\r\n });\r\n\r\n return newItemId;\r\n },\r\n\r\n insertManyShadowArrayElements: (key, arrayPath, newItems, index) => {\r\n if (!newItems || newItems.length === 0) {\r\n return;\r\n }\r\n\r\n const arrayNode = get().getShadowNode(key, arrayPath);\r\n if (!arrayNode?._meta?.arrayKeys) {\r\n console.error(\r\n `Array not found at path: ${[key, ...arrayPath].join('.')}`\r\n );\r\n return;\r\n }\r\n\r\n const newIds: string[] = [];\r\n\r\n // Build and add items directly\r\n newItems.forEach((item) => {\r\n const newItemId = `${generateId(key)}`;\r\n newIds.push(newItemId);\r\n arrayNode[newItemId] = buildShadowNode(key, item); // ADD DIRECTLY!\r\n });\r\n\r\n // Mutate the keys array\r\n const currentKeys = arrayNode._meta.arrayKeys;\r\n const insertionPoint =\r\n index !== undefined && index >= 0 && index <= currentKeys.length\r\n ? index\r\n : currentKeys.length;\r\n\r\n if (insertionPoint >= currentKeys.length) {\r\n currentKeys.push(...newIds);\r\n } else {\r\n currentKeys.splice(insertionPoint, 0, ...newIds);\r\n }\r\n\r\n // NO addItemsToArrayNode call needed!\r\n\r\n const arrayKey = [key, ...arrayPath].join('.');\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'INSERT_MANY',\r\n path: arrayKey,\r\n count: newItems.length,\r\n index: insertionPoint,\r\n });\r\n },\r\n\r\n removeShadowArrayElement: (key, itemPath) => {\r\n if (itemPath.length === 0) return;\r\n\r\n const arrayPath = itemPath.slice(0, -1);\r\n const itemId = itemPath[itemPath.length - 1];\r\n if (!itemId?.startsWith('id:')) return;\r\n\r\n const arrayNode = get().getShadowNode(key, arrayPath);\r\n if (!arrayNode?._meta?.arrayKeys) return;\r\n\r\n // Mutate directly\r\n const currentKeys = arrayNode._meta.arrayKeys;\r\n const indexToRemove = currentKeys.indexOf(itemId);\r\n\r\n if (indexToRemove === -1) return;\r\n\r\n // O(1) for removing from end\r\n if (indexToRemove === currentKeys.length - 1) {\r\n currentKeys.pop();\r\n }\r\n // O(n) for removing from beginning or middle\r\n else if (indexToRemove === 0) {\r\n currentKeys.shift();\r\n } else {\r\n currentKeys.splice(indexToRemove, 1);\r\n }\r\n\r\n // Delete the actual item\r\n delete arrayNode[itemId];\r\n\r\n // No need to update metadata - already mutated!\r\n\r\n const arrayKey = [key, ...arrayPath].join('.');\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'REMOVE',\r\n path: arrayKey,\r\n itemKey: `${arrayKey}.${itemId}`,\r\n });\r\n },\r\n\r\n registerComponent: (stateKey, fullComponentId, registration) => {\r\n const rootMeta = get().getShadowMetadata(stateKey, []) || {};\r\n const components = new Map(rootMeta.components);\r\n components.set(fullComponentId, registration);\r\n\r\n get().setShadowMetadata(stateKey, [], { components });\r\n },\r\n\r\n unregisterComponent: (stateKey, fullComponentId) => {\r\n const rootMeta = get().getShadowMetadata(stateKey, []);\r\n if (!rootMeta?.components) return;\r\n const components = new Map(rootMeta.components);\r\n if (components.delete(fullComponentId)) {\r\n get().setShadowMetadata(stateKey, [], { components });\r\n }\r\n },\r\n\r\n addPathComponent: (stateKey, dependencyPath, fullComponentId) => {\r\n const metadata = get().getShadowMetadata(stateKey, dependencyPath) || {};\r\n const newPathComponents = new Set(metadata.pathComponents);\r\n newPathComponents.add(fullComponentId);\r\n get().setShadowMetadata(stateKey, dependencyPath, {\r\n pathComponents: newPathComponents,\r\n });\r\n\r\n const rootMeta = get().getShadowMetadata(stateKey, []);\r\n if (rootMeta?.components) {\r\n const component = rootMeta.components.get(fullComponentId);\r\n if (component) {\r\n const fullPathKey = [stateKey, ...dependencyPath].join('.');\r\n const newPaths = new Set(component.paths);\r\n newPaths.add(fullPathKey);\r\n const newComponentRegistration = { ...component, paths: newPaths };\r\n const newComponentsMap = new Map(rootMeta.components);\r\n newComponentsMap.set(fullComponentId, newComponentRegistration);\r\n get().setShadowMetadata(stateKey, [], { components: newComponentsMap });\r\n }\r\n }\r\n },\r\n\r\n markAsDirty: (key, path, options = { bubble: true }) => {\r\n // Start at the root node once.\r\n let rootNode = get().getShadowNode(key, []);\r\n if (!rootNode) return;\r\n\r\n // Navigate to the target node once.\r\n let currentNode = rootNode;\r\n for (const segment of path) {\r\n currentNode = currentNode[segment];\r\n if (!currentNode) return; // Path doesn't exist, nothing to mark.\r\n }\r\n\r\n // Mark the target node as dirty.\r\n if (!currentNode._meta) currentNode._meta = {};\r\n currentNode._meta.isDirty = true;\r\n\r\n // If bubbling is disabled, we are done.\r\n if (!options.bubble) return;\r\n\r\n // Efficiently bubble up using the path segments.\r\n let parentNode = rootNode;\r\n for (let i = 0; i < path.length; i++) {\r\n // The current node in the loop is the parent of the next one.\r\n if (parentNode._meta?.isDirty) {\r\n // Optimization: If a parent is already dirty, all of its ancestors are too.\r\n // We can stop bubbling immediately.\r\n return;\r\n }\r\n if (!parentNode._meta) parentNode._meta = {};\r\n parentNode._meta.isDirty = true;\r\n parentNode = parentNode[path[i]!];\r\n }\r\n },\r\n\r\n // Keep these in Zustand as they need React reactivity\r\n serverStateUpdates: new Map(),\r\n setServerStateUpdate: (key, serverState) => {\r\n set((state) => ({\r\n serverStateUpdates: new Map(state.serverStateUpdates).set(\r\n key,\r\n serverState\r\n ),\r\n }));\r\n get().notifyPathSubscribers(key, {\r\n type: 'SERVER_STATE_UPDATE',\r\n serverState,\r\n });\r\n },\r\n\r\n pathSubscribers: new Map<string, Set<(newValue: any) => void>>(),\r\n subscribeToPath: (path, callback) => {\r\n const subscribers = get().pathSubscribers;\r\n const subsForPath = subscribers.get(path) || new Set();\r\n subsForPath.add(callback);\r\n subscribers.set(path, subsForPath);\r\n\r\n return () => {\r\n const currentSubs = get().pathSubscribers.get(path);\r\n if (currentSubs) {\r\n currentSubs.delete(callback);\r\n if (currentSubs.size === 0) {\r\n get().pathSubscribers.delete(path);\r\n }\r\n }\r\n };\r\n },\r\n\r\n notifyPathSubscribers: (updatedPath, newValue) => {\r\n const subscribers = get().pathSubscribers;\r\n const subs = subscribers.get(updatedPath);\r\n if (subs) {\r\n subs.forEach((callback) => callback(newValue));\r\n }\r\n },\r\n\r\n selectedIndicesMap: new Map<string, string>(),\r\n getSelectedIndex: (arrayKey, validIds) => {\r\n const itemKey = get().selectedIndicesMap.get(arrayKey);\r\n if (!itemKey) return -1;\r\n\r\n const arrayMeta = get().getShadowMetadata(\r\n arrayKey.split('.')[0]!,\r\n arrayKey.split('.').slice(1)\r\n );\r\n const arrayKeys = validIds || arrayMeta?.arrayKeys;\r\n\r\n return arrayKeys ? arrayKeys.indexOf(itemKey) : -1;\r\n },\r\n\r\n setSelectedIndex: (arrayKey: string, itemKey: string | undefined) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n\r\n if (itemKey === undefined) {\r\n newMap.delete(arrayKey);\r\n } else {\r\n if (newMap.has(arrayKey)) {\r\n get().notifyPathSubscribers(newMap.get(arrayKey)!, {\r\n type: 'THIS_UNSELECTED',\r\n });\r\n }\r\n newMap.set(arrayKey, itemKey);\r\n get().notifyPathSubscribers(itemKey, { type: 'THIS_SELECTED' });\r\n }\r\n\r\n get().notifyPathSubscribers(arrayKey, { type: 'GET_SELECTED' });\r\n\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n\r\n clearSelectedIndex: ({ arrayKey }: { arrayKey: string }): void => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n const actualKey = newMap.get(arrayKey);\r\n if (actualKey) {\r\n get().notifyPathSubscribers(actualKey, {\r\n type: 'CLEAR_SELECTION',\r\n });\r\n }\r\n\r\n newMap.delete(arrayKey);\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'CLEAR_SELECTION',\r\n });\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n\r\n clearSelectedIndexesForState: (stateKey) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n let changed = false;\r\n for (const key of newMap.keys()) {\r\n if (key === stateKey || key.startsWith(stateKey + '.')) {\r\n newMap.delete(key);\r\n changed = true;\r\n }\r\n }\r\n return changed ? { selectedIndicesMap: newMap } : {};\r\n });\r\n },\r\n\r\n initialStateOptions: {},\r\n stateLog: new Map(),\r\n initialStateGlobal: {},\r\n\r\n addStateLog: (updates) => {\r\n if (!updates || updates.length === 0) return;\r\n set((state) => {\r\n const newLog = new Map(state.stateLog);\r\n const logsGroupedByKey = new Map<string, UpdateTypeDetail[]>();\r\n for (const update of updates) {\r\n const group = logsGroupedByKey.get(update.stateKey) || [];\r\n group.push(update);\r\n logsGroupedByKey.set(update.stateKey, group);\r\n }\r\n for (const [key, batchOfUpdates] of logsGroupedByKey.entries()) {\r\n const newStateLogForKey = new Map(newLog.get(key));\r\n for (const update of batchOfUpdates) {\r\n newStateLogForKey.set(JSON.stringify(update.path), { ...update });\r\n }\r\n newLog.set(key, newStateLogForKey);\r\n }\r\n return { stateLog: newLog };\r\n });\r\n },\r\n\r\n getInitialOptions: (key) => get().initialStateOptions[key],\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: { ...prev.initialStateOptions, [key]: value },\r\n }));\r\n },\r\n\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: { ...prev.initialStateGlobal, [key]: newState },\r\n }));\r\n },\r\n\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key, syncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key) => get().syncInfoStore.get(key) || null,\r\n}));\r\n\r\nexport function getAllFieldElements(stateKey: string): HTMLElement[] {\r\n const elements: HTMLElement[] = [];\r\n\r\n const rootNode =\r\n shadowStateStore.get(stateKey) || shadowStateStore.get(`[${stateKey}`);\r\n\r\n if (!rootNode) return elements;\r\n\r\n const collectElements = (node: any) => {\r\n if (!node || typeof node !== 'object') return;\r\n\r\n // Check this node for elements\r\n if (node._meta?.clientActivityState?.elements) {\r\n node._meta.clientActivityState.elements.forEach((entry: any) => {\r\n if (entry.domRef?.current) {\r\n elements.push(entry.domRef.current);\r\n }\r\n });\r\n }\r\n\r\n // Recurse into children\r\n for (const key in node) {\r\n if (key !== '_meta') {\r\n collectElements(node[key]);\r\n }\r\n }\r\n };\r\n\r\n collectElements(rootNode);\r\n\r\n return elements;\r\n}\r\n\r\nexport function setAllFieldsDisabled(\r\n stateKey: string,\r\n disabled: boolean\r\n): void {\r\n const rootNode =\r\n shadowStateStore.get(stateKey) || shadowStateStore.get(`[${stateKey}`);\r\n if (!rootNode) return;\r\n\r\n const disableElements = (node: any) => {\r\n if (!node || typeof node !== 'object') return;\r\n\r\n if (node._meta?.clientActivityState?.elements) {\r\n node._meta.clientActivityState.elements.forEach((entry: any) => {\r\n const el = entry.domRef?.current;\r\n if (!el) return;\r\n\r\n if ('disabled' in el) {\r\n (el as HTMLInputElement).disabled = disabled;\r\n } else {\r\n el.style.pointerEvents = disabled ? 'none' : '';\r\n el.setAttribute('aria-disabled', String(disabled));\r\n }\r\n });\r\n }\r\n\r\n for (const key in node) {\r\n if (key !== '_meta') {\r\n disableElements(node[key]);\r\n }\r\n }\r\n };\r\n\r\n disableElements(rootNode);\r\n}\r\n"],"names":["getTypeFromZodSchema","schema","source","current","isNullable","isOptional","defaultValue","hasDefault","i","def","typeIdentifier","option","optionDef","optionType","nextSchema","baseSchema","baseDef","baseType","getTypeFromValue","value","valueType","buildShadowNode","stateKey","context","node","getTypeInfoForPath","item","index","itemId","generateId","itemContext","key","propContext","typeInfo","getSchemaAtPath","updateShadowTypeInfo","rootSchema","rootNode","shadowStateStore","updateNodeTypeInfo","path","fieldSchema","itemKey","unwrapSchema","currentSchema","segment","containerSchema","rawShape","globalCounter","instanceId","getGlobalStore","create","set","get","pluginName","data","metadata","pluginMetaData","existingData","cacheKey","cacheData","shadowState","storageKey","existingRoot","preservedMetadata","components","features","lastServerSync","stateSource","baseServerState","pathComponents","signals","validation","deepMergeShadowNodes","target","existingMeta","sourceMeta","newMeta","sourceKeys","k","targetKeys","sourceValue","targetValue","options","initialState","preservedRuntimeMeta","collectRuntimeMeta","pathSegments","syncSchemas","newRoot","restoreRuntimeMeta","pathKey","saved","latestOptions","newMetadata","rootKey","root","validArrayIds","startNode","rootResult","stack","currentNode","parentResult","resultKey","keysToIterate","newArray","newObject","objectKeys","propKey","newValue","parentNode","targetNode","intelligentMerge","nodeToUpdate","plainValue","currentPath","oldMeta","prop","existingKeys","newValues","updatedKeys","newItemValue","existingKey","newItemId","keyToDelete","plainValueKeys","childValue","nodeKey","arrayPath","newItems","newItem","arrayNode","currentKeys","insertionPoint","arrayKey","newIds","itemPath","indexToRemove","fullComponentId","registration","rootMeta","dependencyPath","newPathComponents","component","fullPathKey","newPaths","newComponentRegistration","newComponentsMap","serverState","state","callback","subscribers","subsForPath","currentSubs","updatedPath","subs","validIds","arrayMeta","arrayKeys","newMap","actualKey","changed","updates","newLog","logsGroupedByKey","update","group","batchOfUpdates","newStateLogForKey","prev","newState","syncInfo","getAllFieldElements","elements","collectElements","entry","setAllFieldsDisabled","disabled","disableElements","el"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/CogsState.tsx
CHANGED
|
@@ -158,6 +158,7 @@ export type EndType<
|
|
|
158
158
|
errors: ValidationError[],
|
|
159
159
|
source?: 'client' | 'sync_engine' | 'api'
|
|
160
160
|
) => void;
|
|
161
|
+
$clearZodValidationPaths: (paths: string[][]) => void;
|
|
161
162
|
$clearValidation: (paths?: string[]) => void;
|
|
162
163
|
$applyOperation: (
|
|
163
164
|
operation: UpdateTypeDetail,
|
|
@@ -721,33 +722,19 @@ function setOptions<StateKey, Opt>({
|
|
|
721
722
|
if (needToAdd) {
|
|
722
723
|
setInitialStateOptions(stateKey as string, mergedOptions);
|
|
723
724
|
|
|
724
|
-
|
|
725
|
-
const
|
|
726
|
-
|
|
727
|
-
initialOptions?.validation?.
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
if (!hadSchema && (hasNewSchemaV4 || hasNewSchemaV3)) {
|
|
736
|
-
if (hasNewSchemaV4) {
|
|
737
|
-
updateShadowTypeInfo(
|
|
738
|
-
stateKey as string,
|
|
739
|
-
mergedOptions.validation.zodSchemaV4,
|
|
740
|
-
'zod4'
|
|
741
|
-
);
|
|
742
|
-
} else if (hasNewSchemaV3) {
|
|
743
|
-
updateShadowTypeInfo(
|
|
744
|
-
stateKey as string,
|
|
745
|
-
mergedOptions.validation.zodSchemaV3,
|
|
746
|
-
'zod3'
|
|
747
|
-
);
|
|
725
|
+
const schemaV4 = mergedOptions.validation?.zodSchemaV4;
|
|
726
|
+
const schemaV3 = mergedOptions.validation?.zodSchemaV3;
|
|
727
|
+
const schemaChanged =
|
|
728
|
+
schemaV4 !== initialOptions?.validation?.zodSchemaV4 ||
|
|
729
|
+
schemaV3 !== initialOptions?.validation?.zodSchemaV3;
|
|
730
|
+
|
|
731
|
+
if (schemaChanged && (schemaV4 || schemaV3)) {
|
|
732
|
+
if (schemaV4) {
|
|
733
|
+
updateShadowTypeInfo(stateKey as string, schemaV4, 'zod4');
|
|
734
|
+
} else if (schemaV3) {
|
|
735
|
+
updateShadowTypeInfo(stateKey as string, schemaV3, 'zod3');
|
|
748
736
|
}
|
|
749
737
|
|
|
750
|
-
// Notify components to re-render with updated validation
|
|
751
738
|
notifyComponents(stateKey as string);
|
|
752
739
|
}
|
|
753
740
|
}
|
|
@@ -1030,14 +1017,15 @@ export const createCogsState = <
|
|
|
1030
1017
|
serverState: options?.serverState,
|
|
1031
1018
|
});
|
|
1032
1019
|
|
|
1033
|
-
|
|
1020
|
+
useLayoutEffect(() => {
|
|
1034
1021
|
if (options) {
|
|
1035
1022
|
pluginStore
|
|
1036
1023
|
.getState()
|
|
1037
1024
|
.setPluginOptionsForState(stateKey as string, options);
|
|
1038
1025
|
}
|
|
1039
1026
|
}, [stateKey, options]);
|
|
1040
|
-
|
|
1027
|
+
|
|
1028
|
+
useLayoutEffect(() => {
|
|
1041
1029
|
pluginStore
|
|
1042
1030
|
.getState()
|
|
1043
1031
|
.registerStateHandler(stateKey as string, updater as any);
|
|
@@ -1047,6 +1035,15 @@ export const createCogsState = <
|
|
|
1047
1035
|
};
|
|
1048
1036
|
}, [stateKey, updater]);
|
|
1049
1037
|
|
|
1038
|
+
useLayoutEffect(() => {
|
|
1039
|
+
const validation = getInitialOptions(stateKey as string)?.validation;
|
|
1040
|
+
if (validation?.zodSchemaV4) {
|
|
1041
|
+
updateShadowTypeInfo(stateKey as string, validation.zodSchemaV4, 'zod4');
|
|
1042
|
+
} else if (validation?.zodSchemaV3) {
|
|
1043
|
+
updateShadowTypeInfo(stateKey as string, validation.zodSchemaV3, 'zod3');
|
|
1044
|
+
}
|
|
1045
|
+
});
|
|
1046
|
+
|
|
1050
1047
|
return updater as StateObject<StateSlice<StateKey>>;
|
|
1051
1048
|
};
|
|
1052
1049
|
|
|
@@ -1927,6 +1924,14 @@ export function useCogsStateFn<
|
|
|
1927
1924
|
|
|
1928
1925
|
const { value: resolvedState, source, timestamp } = resolveInitialState();
|
|
1929
1926
|
initializeShadowState(thisKey, resolvedState);
|
|
1927
|
+
|
|
1928
|
+
const validation = getInitialOptions(thisKey as string)?.validation;
|
|
1929
|
+
if (validation?.zodSchemaV4) {
|
|
1930
|
+
updateShadowTypeInfo(thisKey as string, validation.zodSchemaV4, 'zod4');
|
|
1931
|
+
} else if (validation?.zodSchemaV3) {
|
|
1932
|
+
updateShadowTypeInfo(thisKey as string, validation.zodSchemaV3, 'zod3');
|
|
1933
|
+
}
|
|
1934
|
+
|
|
1930
1935
|
setShadowMetadata(thisKey, [], {
|
|
1931
1936
|
stateSource: source,
|
|
1932
1937
|
lastServerSync: source === 'server' ? timestamp : undefined,
|
|
@@ -3389,31 +3394,60 @@ function createProxyHandler<
|
|
|
3389
3394
|
zodErrors: any[],
|
|
3390
3395
|
source: 'client' | 'sync_engine' | 'api'
|
|
3391
3396
|
) => {
|
|
3397
|
+
const store = getGlobalStore.getState();
|
|
3392
3398
|
zodErrors.forEach((error) => {
|
|
3399
|
+
const errorPath = error.path.map(String);
|
|
3393
3400
|
const currentMeta =
|
|
3394
|
-
|
|
3395
|
-
.getState()
|
|
3396
|
-
.getShadowMetadata(stateKey, error.path) || {};
|
|
3401
|
+
store.getShadowMetadata(stateKey, errorPath) || {};
|
|
3397
3402
|
|
|
3398
|
-
|
|
3399
|
-
|
|
3400
|
-
|
|
3401
|
-
|
|
3402
|
-
|
|
3403
|
-
|
|
3404
|
-
|
|
3405
|
-
|
|
3406
|
-
|
|
3407
|
-
|
|
3408
|
-
|
|
3409
|
-
|
|
3410
|
-
|
|
3411
|
-
|
|
3412
|
-
|
|
3413
|
-
|
|
3414
|
-
|
|
3415
|
-
|
|
3403
|
+
store.setShadowMetadata(stateKey, errorPath, {
|
|
3404
|
+
...currentMeta,
|
|
3405
|
+
validation: {
|
|
3406
|
+
status: 'INVALID',
|
|
3407
|
+
errors: [
|
|
3408
|
+
{
|
|
3409
|
+
source: source || 'client',
|
|
3410
|
+
message: error.message,
|
|
3411
|
+
severity: 'error',
|
|
3412
|
+
code: error.code,
|
|
3413
|
+
},
|
|
3414
|
+
],
|
|
3415
|
+
lastValidated: Date.now(),
|
|
3416
|
+
validatedValue: undefined,
|
|
3417
|
+
},
|
|
3418
|
+
});
|
|
3419
|
+
store.notifyPathSubscribers(
|
|
3420
|
+
[stateKey, ...errorPath].join('.'),
|
|
3421
|
+
{ type: 'VALIDATION_UPDATE' }
|
|
3422
|
+
);
|
|
3423
|
+
});
|
|
3424
|
+
notifyComponents(stateKey);
|
|
3425
|
+
};
|
|
3426
|
+
}
|
|
3427
|
+
|
|
3428
|
+
if (prop === '$clearZodValidationPaths') {
|
|
3429
|
+
return (paths: string[][]) => {
|
|
3430
|
+
const store = getGlobalStore.getState();
|
|
3431
|
+
paths.forEach((targetPath) => {
|
|
3432
|
+
const currentMeta =
|
|
3433
|
+
store.getShadowMetadata(stateKey, targetPath) || {};
|
|
3434
|
+
if (!currentMeta.validation) return;
|
|
3435
|
+
|
|
3436
|
+
store.setShadowMetadata(stateKey, targetPath, {
|
|
3437
|
+
...currentMeta,
|
|
3438
|
+
validation: {
|
|
3439
|
+
status: 'NOT_VALIDATED',
|
|
3440
|
+
errors: [],
|
|
3441
|
+
lastValidated: Date.now(),
|
|
3442
|
+
validatedValue: undefined,
|
|
3443
|
+
},
|
|
3444
|
+
});
|
|
3445
|
+
store.notifyPathSubscribers(
|
|
3446
|
+
[stateKey, ...targetPath].join('.'),
|
|
3447
|
+
{ type: 'VALIDATION_CLEAR' }
|
|
3448
|
+
);
|
|
3416
3449
|
});
|
|
3450
|
+
notifyComponents(stateKey);
|
|
3417
3451
|
};
|
|
3418
3452
|
}
|
|
3419
3453
|
|