cogsbox-state 0.5.472 → 0.5.473
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 +98 -82
- package/dist/CogsState.d.ts.map +1 -1
- package/dist/CogsState.jsx +1020 -950
- package/dist/CogsState.jsx.map +1 -1
- package/dist/Components.d.ts.map +1 -1
- package/dist/Components.jsx +276 -217
- package/dist/Components.jsx.map +1 -1
- package/dist/PluginRunner.d.ts +10 -0
- package/dist/PluginRunner.d.ts.map +1 -0
- package/dist/PluginRunner.jsx +128 -0
- package/dist/PluginRunner.jsx.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -26
- package/dist/index.js.map +1 -1
- package/dist/pluginStore.d.ts +43 -0
- package/dist/pluginStore.d.ts.map +1 -0
- package/dist/pluginStore.js +52 -0
- package/dist/pluginStore.js.map +1 -0
- package/dist/plugins.d.ts +1326 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +76 -0
- package/dist/plugins.js.map +1 -0
- package/dist/store.d.ts +50 -15
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +509 -470
- package/dist/store.js.map +1 -1
- package/dist/utility.d.ts +1 -1
- package/dist/utility.d.ts.map +1 -1
- package/dist/utility.js +12 -12
- package/dist/utility.js.map +1 -1
- package/dist/validation.d.ts +7 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +39 -0
- package/dist/validation.js.map +1 -0
- package/package.json +13 -3
- package/src/CogsState.tsx +658 -457
- package/src/Components.tsx +272 -194
- package/src/PluginRunner.tsx +208 -0
- package/src/index.ts +2 -0
- package/src/pluginStore.ts +159 -0
- package/src/plugins.ts +548 -0
- package/src/store.ts +748 -493
- package/src/utility.ts +31 -31
- package/src/validation.ts +84 -0
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from 'zustand';\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\nimport { type ReactNode } from 'react';\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\n\r\nexport type TrieNode = {\r\n subscribers: Set<string>;\r\n children: Map<string, TrieNode>;\r\n};\r\n\r\nexport type FormRefStoreState = {\r\n formRefs: Map<string, React.RefObject<any>>;\r\n registerFormRef: (id: string, ref: React.RefObject<any>) => void;\r\n getFormRef: (id: string) => React.RefObject<any> | undefined;\r\n removeFormRef: (id: string) => void;\r\n getFormRefsByStateKey: (\r\n stateKey: string\r\n ) => Map<string, React.RefObject<any>>;\r\n};\r\n\r\nexport const formRefStore = create<FormRefStoreState>((set, get) => ({\r\n formRefs: new Map(),\r\n\r\n registerFormRef: (id, ref) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.set(id, ref);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRef: (id) => get().formRefs.get(id),\r\n\r\n removeFormRef: (id) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.delete(id);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRefsByStateKey: (stateKey) => {\r\n const allRefs = get().formRefs;\r\n const stateKeyPrefix = stateKey + '.';\r\n const filteredRefs = new Map();\r\n\r\n allRefs.forEach((ref, id) => {\r\n if (id.startsWith(stateKeyPrefix) || id === stateKey) {\r\n filteredRefs.set(id, ref);\r\n }\r\n });\r\n\r\n return filteredRefs;\r\n },\r\n}));\r\nexport type 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 TypeInfo = {\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\n\r\n// Update ShadowMetadata to include typeInfo\r\nexport type ShadowMetadata = {\r\n value?: any;\r\n syncArrayIdPrefix?: string;\r\n id?: string;\r\n typeInfo?: TypeInfo;\r\n stateSource?: 'default' | 'server' | 'localStorage';\r\n lastServerSync?: number;\r\n isDirty?: 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 syncEnabled: boolean;\r\n validationEnabled: boolean;\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\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 streams?: Map<\r\n string,\r\n {\r\n buffer: any[];\r\n flushTimer: NodeJS.Timeout | null;\r\n }\r\n >;\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 setTransformCache: (\r\n key: string,\r\n path: string[],\r\n cacheKey: string,\r\n cacheData: any\r\n ) => 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 newKeys: string[]\r\n ) => void;\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItem: any,\r\n index?: number\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\n\r\nfunction getTypeFromZodSchema(\r\n schema: any,\r\n source: 'zod4' | 'zod3' | 'sync' = 'zod4'\r\n): TypeInfo | null {\r\n if (!schema) return null;\r\n\r\n let baseSchema = 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 // Zod v4 unwrapping\r\n if (schema._def) {\r\n let current = schema;\r\n\r\n // Keep unwrapping until we get to the base type\r\n while (current._def) {\r\n const typeName = current._def.typeName;\r\n\r\n if (typeName === 'ZodOptional') {\r\n isOptional = true;\r\n current = current._def.innerType || current.unwrap();\r\n } else if (typeName === 'ZodNullable') {\r\n isNullable = true;\r\n current = current._def.innerType || current.unwrap();\r\n } else if (typeName === 'ZodDefault') {\r\n hasDefault = true;\r\n defaultValue = current._def.defaultValue();\r\n current = current._def.innerType;\r\n } else if (typeName === 'ZodEffects') {\r\n // Handle .refine(), .transform() etc\r\n current = current._def.schema;\r\n } else {\r\n // We've reached the base type\r\n break;\r\n }\r\n }\r\n\r\n baseSchema = current;\r\n const typeName = baseSchema._def?.typeName;\r\n\r\n if (typeName === 'ZodNumber') {\r\n return {\r\n type: 'number',\r\n schema: schema, // Store the original schema with wrappers\r\n source,\r\n default: hasDefault ? defaultValue : 0,\r\n nullable: isNullable,\r\n optional: isOptional,\r\n };\r\n } else if (typeName === 'ZodString') {\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 } else if (typeName === 'ZodBoolean') {\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 } else if (typeName === 'ZodArray') {\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 } else if (typeName === 'ZodObject') {\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 } else if (typeName === 'ZodDate') {\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\r\n // Zod v3 unwrapping\r\n if (schema._type) {\r\n let current = schema;\r\n\r\n // Check for wrappers in v3\r\n while (current) {\r\n if (current._type === 'optional') {\r\n isOptional = true;\r\n current = current._def?.innerType || current._inner;\r\n } else if (current._type === 'nullable') {\r\n isNullable = true;\r\n current = current._def?.innerType || current._inner;\r\n } else if (current._def?.defaultValue !== undefined) {\r\n hasDefault = true;\r\n defaultValue =\r\n typeof current._def.defaultValue === 'function'\r\n ? current._def.defaultValue()\r\n : current._def.defaultValue;\r\n break;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n baseSchema = current;\r\n\r\n if (baseSchema._type === '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 } else if (baseSchema._type === '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 } else if (baseSchema._type === '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 } else if (baseSchema._type === '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 } else if (baseSchema._type === '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 } else if (baseSchema._type === '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\r\n return null;\r\n}\r\n\r\n// Helper to get type info from runtime value\r\nfunction getTypeFromValue(value: any): TypeInfo {\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// Update buildShadowNode to use the new schema storage\r\nexport function buildShadowNode(\r\n stateKey: string,\r\n value: any,\r\n context?: BuildContext\r\n): ShadowNode {\r\n // For primitive values\r\n if (value === null || value === undefined || typeof value !== 'object') {\r\n const node: ShadowNode = { _meta: {} };\r\n node._meta!.value = value;\r\n if (context) {\r\n let typeInfo: TypeInfo | null = null;\r\n\r\n // 1. Try to get type from sync schema\r\n if (context.schemas.sync && context.schemas.sync[context.stateKey]) {\r\n const syncEntry = context.schemas.sync[context.stateKey];\r\n if (syncEntry.schemas?.validation) {\r\n // Navigate to the field in the validation schema\r\n let fieldSchema = syncEntry.schemas.validation;\r\n for (const segment of context.path) {\r\n if (fieldSchema?.shape) {\r\n fieldSchema = fieldSchema.shape[segment];\r\n } else if (fieldSchema?._def?.shape) {\r\n fieldSchema = fieldSchema._def.shape()[segment];\r\n }\r\n }\r\n\r\n if (fieldSchema) {\r\n typeInfo = getTypeFromZodSchema(fieldSchema, 'sync');\r\n if (typeInfo) {\r\n // Use the default from sync schema if available\r\n if (syncEntry.schemas.defaults) {\r\n let defaultValue = syncEntry.schemas.defaults;\r\n for (const segment of context.path) {\r\n if (defaultValue && typeof defaultValue === 'object') {\r\n defaultValue = defaultValue[segment];\r\n }\r\n }\r\n if (defaultValue !== undefined) {\r\n typeInfo.default = defaultValue;\r\n // If no value provided and not optional, use the default\r\n if (\r\n (value === undefined || value === null) &&\r\n !typeInfo.optional\r\n ) {\r\n node._meta!.value = defaultValue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 2. If no sync schema, try Zod v4\r\n if (!typeInfo && context.schemas.zodV4) {\r\n let fieldSchema = context.schemas.zodV4;\r\n for (const segment of context.path) {\r\n if (fieldSchema?.shape) {\r\n fieldSchema = fieldSchema.shape[segment];\r\n } else if (fieldSchema?._def?.shape) {\r\n fieldSchema = fieldSchema._def.shape()[segment];\r\n }\r\n }\r\n\r\n if (fieldSchema) {\r\n typeInfo = getTypeFromZodSchema(fieldSchema, 'zod4');\r\n if (typeInfo && (value === undefined || value === null)) {\r\n // Only use default if the field is not optional/nullable\r\n if (!typeInfo.optional && !typeInfo.nullable) {\r\n node.value = typeInfo.default;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 3. If no Zod v4, try Zod v3\r\n if (!typeInfo && context.schemas.zodV3) {\r\n let fieldSchema = context.schemas.zodV3;\r\n for (const segment of context.path) {\r\n if (fieldSchema?.shape) {\r\n fieldSchema = fieldSchema.shape[segment];\r\n } else if (fieldSchema?._shape) {\r\n fieldSchema = fieldSchema._shape[segment];\r\n }\r\n }\r\n\r\n if (fieldSchema) {\r\n typeInfo = getTypeFromZodSchema(fieldSchema, 'zod3');\r\n if (typeInfo && (value === undefined || value === null)) {\r\n // Only use default if the field is not optional/nullable\r\n if (!typeInfo.optional && !typeInfo.nullable) {\r\n node.value = typeInfo.default;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 4. Fall back to runtime type\r\n if (!typeInfo) {\r\n typeInfo = getTypeFromValue(node._meta!.value);\r\n }\r\n\r\n // Store the type info\r\n if (typeInfo) {\r\n if (!node._meta) node._meta = {};\r\n node._meta.typeInfo = typeInfo;\r\n }\r\n } else {\r\n // No context, just use runtime type\r\n const typeInfo = getTypeFromValue(value);\r\n if (!node._meta) node._meta = {};\r\n node._meta.typeInfo = typeInfo;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n // For arrays\r\n if (Array.isArray(value)) {\r\n const arrayNode: ShadowNode = { _meta: { arrayKeys: [] } };\r\n const idKeys: string[] = [];\r\n\r\n value.forEach((item, index) => {\r\n const itemId = `${generateId(stateKey)}`;\r\n // Pass context down for array items\r\n const itemContext = context\r\n ? {\r\n ...context,\r\n path: [...context.path, index.toString()],\r\n }\r\n : undefined;\r\n arrayNode[itemId] = buildShadowNode(stateKey, item, itemContext);\r\n idKeys.push(itemId);\r\n });\r\n\r\n arrayNode._meta!.arrayKeys = idKeys;\r\n if (context) {\r\n // Try to get the array schema\r\n let arraySchema = null;\r\n\r\n if (context.schemas.zodV4) {\r\n let fieldSchema = context.schemas.zodV4;\r\n for (const segment of context.path) {\r\n if (fieldSchema?.shape) {\r\n fieldSchema = fieldSchema.shape[segment];\r\n } else if (fieldSchema?._def?.shape) {\r\n fieldSchema = fieldSchema._def.shape()[segment];\r\n }\r\n }\r\n arraySchema = fieldSchema;\r\n }\r\n\r\n arrayNode._meta!.typeInfo = {\r\n type: 'array',\r\n schema: arraySchema,\r\n source: arraySchema ? 'zod4' : 'runtime',\r\n default: [],\r\n };\r\n }\r\n return arrayNode;\r\n }\r\n\r\n // For objects\r\n if (value.constructor === Object) {\r\n const objectNode: ShadowNode = { _meta: {} };\r\n for (const key in value) {\r\n if (Object.prototype.hasOwnProperty.call(value, key)) {\r\n // Pass context down for object properties\r\n const propContext = context\r\n ? {\r\n ...context,\r\n path: [...context.path, key],\r\n }\r\n : undefined;\r\n objectNode[key] = buildShadowNode(stateKey, value[key], propContext);\r\n }\r\n }\r\n if (context) {\r\n // Try to get the object schema\r\n let objectSchema = null;\r\n\r\n if (context.schemas.zodV4) {\r\n let fieldSchema = context.schemas.zodV4;\r\n for (const segment of context.path) {\r\n if (fieldSchema?.shape) {\r\n fieldSchema = fieldSchema.shape[segment];\r\n } else if (fieldSchema?._def?.shape) {\r\n fieldSchema = fieldSchema._def.shape()[segment];\r\n }\r\n }\r\n objectSchema = fieldSchema;\r\n }\r\n\r\n objectNode._meta!.typeInfo = {\r\n type: 'object',\r\n schema: objectSchema,\r\n source: objectSchema ? 'zod4' : 'runtime',\r\n default: {},\r\n };\r\n }\r\n return objectNode;\r\n }\r\n\r\n return { value };\r\n}\r\n\r\n// store.ts - Replace the shadow store methods with mutable versions\r\n// store.ts - Replace the shadow store methods with mutable versions\r\n\r\n// Module-level mutable store\r\nconst shadowStateStore = new Map<string, ShadowNode>();\r\nlet globalCounter = 0;\r\n\r\nexport function generateId(stateKey: string): string {\r\n const rootMeta = getGlobalStore.getState().getShadowMetadata(stateKey, []);\r\n const prefix = rootMeta?.syncArrayIdPrefix || 'local';\r\n return `id:${prefix}_${(globalCounter++).toString(36)}`;\r\n}\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n // Remove shadowStateStore from Zustand state\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\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 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 // Get all available schemas for this state\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 // Build with context so type info is stored\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 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 Object.assign(current._meta, newMetadata);\r\n },\r\n\r\n getShadowValue: (\r\n key: string,\r\n path: string[],\r\n validArrayIds?: string[],\r\n log?: boolean\r\n ) => {\r\n const node = get().getShadowNode(key, path);\r\n\r\n if (node === null || node === undefined) return undefined;\r\n\r\n const nodeKeys = Object.keys(node);\r\n\r\n if (\r\n node._meta &&\r\n Object.prototype.hasOwnProperty.call(node._meta, 'value') &&\r\n nodeKeys.length === 1 &&\r\n nodeKeys[0] === '_meta'\r\n ) {\r\n return node._meta.value;\r\n }\r\n\r\n const isArrayNode =\r\n node._meta &&\r\n Object.prototype.hasOwnProperty.call(node._meta, 'arrayKeys');\r\n if (isArrayNode) {\r\n const keysToIterate =\r\n validArrayIds !== undefined && validArrayIds.length > 0\r\n ? validArrayIds\r\n : node._meta!.arrayKeys!;\r\n\r\n return keysToIterate.map((itemKey: string) =>\r\n get().getShadowValue(key, [...path, itemKey])\r\n );\r\n }\r\n\r\n const result: any = {};\r\n for (const propKey of nodeKeys) {\r\n if (propKey !== '_meta' && !propKey.startsWith('id:')) {\r\n result[propKey] = get().getShadowValue(key, [...path, propKey]);\r\n }\r\n }\r\n return result;\r\n },\r\n\r\n updateShadowAtPath: (key, path, newValue) => {\r\n // NO MORE set() wrapper - direct mutation!\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 // Navigate to parent without cloning\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\r\n const targetNode =\r\n path.length === 0 ? parentNode : parentNode[path[path.length - 1]!];\r\n\r\n if (!targetNode) {\r\n parentNode[path[path.length - 1]!] = buildShadowNode(key, newValue);\r\n get().notifyPathSubscribers([key, ...path].join('.'), {\r\n type: 'UPDATE',\r\n newValue,\r\n });\r\n return;\r\n }\r\n\r\n function intelligentMerge(nodeToUpdate: any, plainValue: any) {\r\n if (\r\n typeof plainValue !== 'object' ||\r\n plainValue === null ||\r\n Array.isArray(plainValue)\r\n ) {\r\n const oldMeta = nodeToUpdate._meta;\r\n // Clear existing properties\r\n for (const key in nodeToUpdate) {\r\n if (key !== '_meta') delete nodeToUpdate[key];\r\n }\r\n const newNode = buildShadowNode(key, plainValue);\r\n Object.assign(nodeToUpdate, newNode);\r\n if (oldMeta) {\r\n nodeToUpdate._meta = { ...oldMeta, ...(nodeToUpdate._meta || {}) };\r\n }\r\n return;\r\n }\r\n\r\n const plainValueKeys = new Set(Object.keys(plainValue));\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 } else {\r\n nodeToUpdate[propKey] = buildShadowNode(key, childValue);\r\n }\r\n }\r\n\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\r\n if (!plainValueKeys.has(nodeKey)) {\r\n delete nodeToUpdate[nodeKey];\r\n }\r\n }\r\n }\r\n\r\n intelligentMerge(targetNode, newValue);\r\n\r\n get().notifyPathSubscribers([key, ...path].join('.'), {\r\n type: 'UPDATE',\r\n newValue,\r\n });\r\n },\r\n\r\n addItemsToArrayNode: (key, arrayPath, newItems, newKeys) => {\r\n // Direct mutation - no cloning!\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 // Navigate without cloning\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 // Mutate directly\r\n Object.assign(current, newItems);\r\n if (!current._meta) current._meta = {};\r\n current._meta.arrayKeys = newKeys; // Direct assignment!\r\n },\r\n\r\n insertShadowArrayElement: (key, arrayPath, newItem, index) => {\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 = `${generateId(key)}`;\r\n const itemsToAdd = { [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); // O(1)\r\n } else {\r\n currentKeys.splice(insertionPoint, 0, newItemId); // O(n) only for middle\r\n }\r\n\r\n // Pass the mutated array\r\n get().addItemsToArrayNode(key, arrayPath, itemsToAdd, currentKeys);\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 itemsToAdd: Record<string, any> = {};\r\n const newIds: string[] = [];\r\n\r\n newItems.forEach((item) => {\r\n const newItemId = `${generateId(key)}`;\r\n newIds.push(newItemId);\r\n itemsToAdd[newItemId] = buildShadowNode(key, item);\r\n });\r\n\r\n // Mutate 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(...newIds); // O(k) where k is items being added\r\n } else {\r\n currentKeys.splice(insertionPoint, 0, ...newIds); // O(n + k)\r\n }\r\n\r\n get().addItemsToArrayNode(key, arrayPath, itemsToAdd, currentKeys);\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 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 const setDirtyOnPath = (pathToMark: string[]) => {\r\n const node = get().getShadowNode(key, pathToMark);\r\n if (node?._meta?.isDirty) {\r\n return true;\r\n }\r\n get().setShadowMetadata(key, pathToMark, { isDirty: true });\r\n return false;\r\n };\r\n\r\n setDirtyOnPath(path);\r\n\r\n if (options.bubble) {\r\n let parentPath = [...path];\r\n while (parentPath.length > 0) {\r\n parentPath.pop();\r\n if (setDirtyOnPath(parentPath)) {\r\n break;\r\n }\r\n }\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"],"names":["formRefStore","create","set","get","id","ref","state","newRefs","stateKey","allRefs","stateKeyPrefix","filteredRefs","getTypeFromZodSchema","schema","source","baseSchema","isNullable","isOptional","defaultValue","hasDefault","current","typeName","getTypeFromValue","value","valueType","buildShadowNode","context","node","typeInfo","syncEntry","fieldSchema","segment","arrayNode","idKeys","item","index","itemId","generateId","itemContext","arraySchema","objectNode","key","propContext","objectSchema","shadowStateStore","globalCounter","getGlobalStore","path","cacheKey","cacheData","metadata","initialState","existingRoot","preservedMetadata","components","features","lastServerSync","stateSource","baseServerState","options","syncSchemas","newRoot","storageKey","newMetadata","rootKey","root","validArrayIds","log","nodeKeys","itemKey","result","propKey","newValue","parentNode","i","targetNode","intelligentMerge","nodeToUpdate","plainValue","oldMeta","newNode","plainValueKeys","childValue","nodeKey","arrayPath","newItems","newKeys","newItem","newItemId","itemsToAdd","currentKeys","insertionPoint","arrayKey","newIds","itemPath","indexToRemove","fullComponentId","registration","rootMeta","dependencyPath","newPathComponents","component","fullPathKey","newPaths","newComponentRegistration","newComponentsMap","setDirtyOnPath","pathToMark","parentPath","serverState","callback","subscribers","subsForPath","currentSubs","updatedPath","subs","validIds","arrayMeta","arrayKeys","newMap","actualKey","changed","updates","newLog","logsGroupedByKey","update","group","batchOfUpdates","newStateLogForKey","prev","newState","syncInfo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from 'zustand';\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: React.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 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, which only exist on the live target state.\r\n if (existingMeta.components) {\r\n newMeta.components = existingMeta.components;\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 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 // Get all available schemas for this state\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 // Build with context so type info is stored\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 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 console.log('OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO');\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 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"],"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","syncSchemas","newRoot","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"],"mappings":"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"}
|
package/dist/utility.d.ts
CHANGED
|
@@ -15,12 +15,12 @@ export declare function deepMerge(target: any, source: any): any;
|
|
|
15
15
|
export declare function getDifferencesArray(obj1: any, obj2: any): string[][];
|
|
16
16
|
export declare function getArrayLengthDifferences(obj1: any, obj2: any, currentPath?: string): string[];
|
|
17
17
|
export declare function getArrayLengthDifferencesArray(obj1: any, obj2: any): string[][];
|
|
18
|
-
export declare function transformStateFunc<State extends unknown>(initialState: State): [TransformedStateType<State>, GenericObject];
|
|
19
18
|
export declare function debounce<F extends (...args: any[]) => any>(func: (...args: any[]) => any, wait: number): F & {
|
|
20
19
|
cancel: () => void;
|
|
21
20
|
};
|
|
22
21
|
export type DebouncedFunction<F extends (...args: any[]) => any> = F & {
|
|
23
22
|
cancel: () => void;
|
|
24
23
|
};
|
|
24
|
+
export declare function transformStateFunc<State extends unknown>(initialState: State): [TransformedStateType<State>, GenericObject];
|
|
25
25
|
export {};
|
|
26
26
|
//# sourceMappingURL=utility.d.ts.map
|
package/dist/utility.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utility.d.ts","sourceRoot":"","sources":["../src/utility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"utility.d.ts","sourceRoot":"","sources":["../src/utility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAoB,MAAM,aAAa,CAAC;AAE1E,eAAO,MAAM,QAAQ,GAAI,MAAM,GAAG,KAAG,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAI9D,CAAC;AACF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEhD,eAAO,MAAM,UAAU,GAAI,YAAY,SAAS,OAAO,EACrD,KAAK,GAAG,KACP,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,KAAK,YAAyC,CAAC;AAE5E,eAAO,MAAM,OAAO,GAAI,MAAM,GAAG,KAAG,IAAI,IAAI,KAAK,CAAC,GAAG,CAEpD,CAAC;AACF,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,OAAM;IAAE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CAAO,EAC/B,cAAa,MAAM,EAAO,KACzB,OAqDF,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,GAAG,GACV,GAAG,CAqCL;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CA4CpE;AAED,KAAK,eAAe,GAAG,MAAM,EAAE,CAAC;AAEhC,wBAAgB,cAAc,CAC5B,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,GAAG,EACT,WAAW,GAAE,MAAW,GACvB,eAAe,CAqEjB;AACD,wBAAgB,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,CAgBvD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,cASvD;AACD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,GAAG,EACT,IAAI,EAAE,GAAG,EACT,WAAW,GAAE,MAAW,GACvB,MAAM,EAAE,CAkCV;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,cASlE;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC7B,IAAI,EAAE,MAAM,GACX,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CAmB5B;AACD,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG;IACrE,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,KAAK,SAAS,OAAO,EAAE,YAAY,EAAE,KAAK,GA4BxB,CACjD,oBAAoB,CAAC,KAAK,CAAC,EAC3B,aAAa,CACd,CACF"}
|
package/dist/utility.js
CHANGED
|
@@ -153,7 +153,16 @@ function m(e, n) {
|
|
|
153
153
|
(r) => r.replace(/\[(\w+)\]/g, ".$1").split(".").filter(Boolean)
|
|
154
154
|
);
|
|
155
155
|
}
|
|
156
|
-
function N(e) {
|
|
156
|
+
function N(e, n) {
|
|
157
|
+
let i = null;
|
|
158
|
+
const r = (...t) => {
|
|
159
|
+
i && clearTimeout(i), i = setTimeout(() => e(...t), n);
|
|
160
|
+
};
|
|
161
|
+
return r.cancel = () => {
|
|
162
|
+
i && (clearTimeout(i), i = null);
|
|
163
|
+
}, r;
|
|
164
|
+
}
|
|
165
|
+
function O(e) {
|
|
157
166
|
const n = (l) => Object.values(l).some(
|
|
158
167
|
(s) => s?.hasOwnProperty("initialState")
|
|
159
168
|
);
|
|
@@ -166,17 +175,8 @@ function N(e) {
|
|
|
166
175
|
};
|
|
167
176
|
return [n(e) ? r(e) : e, i];
|
|
168
177
|
}
|
|
169
|
-
function O(e, n) {
|
|
170
|
-
let i = null;
|
|
171
|
-
const r = (...t) => {
|
|
172
|
-
i && clearTimeout(i), i = setTimeout(() => e(...t), n);
|
|
173
|
-
};
|
|
174
|
-
return r.cancel = () => {
|
|
175
|
-
i && (clearTimeout(i), i = null);
|
|
176
|
-
}, r;
|
|
177
|
-
}
|
|
178
178
|
export {
|
|
179
|
-
|
|
179
|
+
N as debounce,
|
|
180
180
|
A as deepMerge,
|
|
181
181
|
p as deleteNestedProperty,
|
|
182
182
|
h as getArrayLengthDifferences,
|
|
@@ -187,7 +187,7 @@ export {
|
|
|
187
187
|
d as isDeepEqual,
|
|
188
188
|
$ as isFunction,
|
|
189
189
|
u as isObject,
|
|
190
|
-
|
|
190
|
+
O as transformStateFunc,
|
|
191
191
|
g as updateNestedProperty
|
|
192
192
|
};
|
|
193
193
|
//# sourceMappingURL=utility.js.map
|
package/dist/utility.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utility.js","sources":["../src/utility.ts"],"sourcesContent":["import type { InitialStateType, TransformedStateType } from './CogsState';\r\nimport { getGlobalStore } from './store';\r\nexport const isObject = (item: any): item is Record<string, any> => {\r\n return (\r\n item && typeof item === 'object' && !Array.isArray(item) && item !== null\r\n );\r\n};\r\nexport type GenericObject = Record<string, any>;\r\n\r\nexport const isFunction = <TStateObject extends unknown>(\r\n arg: any\r\n): arg is (prev: TStateObject) => TStateObject => typeof arg === 'function';\r\n\r\nexport const isArray = (item: any): item is Array<any> => {\r\n return Array.isArray(item);\r\n};\r\nexport const isDeepEqual = (\r\n object1?: Record<string, any>,\r\n object2?: Record<string, any>,\r\n opts: { get?: () => void } = {},\r\n currentPath: string[] = []\r\n): boolean => {\r\n if (isObject(object1) && isObject(object2)) {\r\n const objKeys1 = Object.keys(object1);\r\n const objKeys2 = Object.keys(object2);\r\n\r\n if (objKeys1.length !== objKeys2.length) {\r\n // console.log(\"not equal\", objKeys1, objKeys2);\r\n return false;\r\n }\r\n\r\n for (let key of objKeys1) {\r\n const value1 = object1[key];\r\n const value2 = object2[key];\r\n\r\n // Check if the key exists in both objects\r\n if (!(key in object1) || !(key in object2)) {\r\n // console.log(\"not equal\", key);\r\n return false;\r\n }\r\n\r\n const newPath = [...currentPath, key];\r\n\r\n // If current path is in ignoreArray, continue to the next key\r\n\r\n if (!isDeepEqual(value1, value2, opts, newPath)) {\r\n // console.log(\"not equal\", value1, value2);\r\n return false;\r\n }\r\n }\r\n return true;\r\n } else if (isArray(object1) && isArray(object2)) {\r\n if (object1.length !== object2.length) {\r\n // console.log(\"not equal\", object1);\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < object1.length; i++) {\r\n if (\r\n !isDeepEqual(object1[i], object2[i], opts, [\r\n ...currentPath,\r\n i.toString(),\r\n ])\r\n ) {\r\n // console.log(\"not equal\", object1[i]);\r\n return false;\r\n }\r\n }\r\n return true;\r\n } else {\r\n return (\r\n object1 === object2 || (Number.isNaN(object1) && Number.isNaN(object2))\r\n );\r\n }\r\n};\r\n\r\nexport function updateNestedProperty(\r\n path: string[],\r\n state: any,\r\n update: any\r\n): any {\r\n if (!path || path.length === 0) return update;\r\n const head = path[0];\r\n const tail = path.slice(1);\r\n\r\n if (Array.isArray(state)) {\r\n const index = Number(head);\r\n\r\n if (!isNaN(index) && index >= 0 && index < state.length) {\r\n return [\r\n ...state.slice(0, index),\r\n updateNestedProperty(tail, state[index], update),\r\n ...state.slice(index + 1),\r\n ];\r\n } else {\r\n console.log('errorstate', state, path);\r\n throw new Error(\r\n `Invalid array index \"${index}\" in path \"${path.join('.')}\".`\r\n );\r\n }\r\n } else if (typeof state === 'object' && state !== null) {\r\n if (head && head in state) {\r\n return {\r\n ...state,\r\n [head!]: updateNestedProperty(tail, state[head!], update),\r\n };\r\n } else {\r\n console.log(`Invalid property`, head, tail, path);\r\n throw new Error(\r\n `Invalid property \"${head}\" in path \"${path.join('.')}\".`\r\n );\r\n }\r\n } else {\r\n throw new Error(\r\n `Cannot update nested property at path \"${path.join('.')}\". The path does not exist.`\r\n );\r\n }\r\n}\r\n\r\nexport function deleteNestedProperty(path: string[], state: any): any {\r\n if (!path || path.length === 0) return state;\r\n const head = path[0] as string;\r\n const tail = path.slice(1);\r\n\r\n if (Array.isArray(state)) {\r\n const index = Number(head);\r\n\r\n if (!isNaN(index) && index >= 0 && index < state.length) {\r\n if (tail.length === 0) {\r\n // Remove the item at the index\r\n return [...state.slice(0, index), ...state.slice(index + 1)];\r\n } else {\r\n return [\r\n ...state.slice(0, index),\r\n deleteNestedProperty(tail, state[index]),\r\n ...state.slice(index + 1),\r\n ];\r\n }\r\n } else {\r\n throw new Error(\r\n `Invalid array index \"${index}\" in path \"${path.join('.')}\".`\r\n );\r\n }\r\n } else if (typeof state === 'object' && state !== null) {\r\n if (tail.length === 0) {\r\n // Delete the property and return the new object\r\n const { [head]: _, ...rest } = state;\r\n return rest;\r\n } else if (head in state) {\r\n return {\r\n ...state,\r\n [head]: deleteNestedProperty(tail, state[head]),\r\n };\r\n } else {\r\n throw new Error(\r\n `Invalid property \"${head}\" in path \"${path.join('.')}\".`\r\n );\r\n }\r\n } else {\r\n throw new Error(\r\n `Cannot delete nested property at path \"${path.join('.')}\". The path does not exist.`\r\n );\r\n }\r\n}\r\n\r\ntype DifferencePaths = string[];\r\n\r\nexport function getDifferences(\r\n obj1: any,\r\n obj2: any,\r\n currentPath: string = ''\r\n): DifferencePaths {\r\n let differences: DifferencePaths = [];\r\n // Handling null and undefined cases\r\n if (typeof obj1 === 'function' && typeof obj2 === 'function') {\r\n return differences;\r\n }\r\n if (\r\n obj1 === null ||\r\n obj1 === undefined ||\r\n obj2 === null ||\r\n obj2 === undefined\r\n ) {\r\n if (obj1 !== obj2) {\r\n // console.log(obj1, obj2);\r\n return [currentPath];\r\n }\r\n return differences;\r\n }\r\n\r\n // Handling primitive types\r\n if (typeof obj1 !== 'object' || typeof obj2 !== 'object') {\r\n if (obj1 !== obj2) {\r\n return [currentPath];\r\n }\r\n return differences;\r\n }\r\n\r\n // Handling arrays\r\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\r\n // Handle changes in length directly\r\n if (obj1.length !== obj2.length) {\r\n differences.push(`${currentPath}`);\r\n }\r\n\r\n // Use the shorter length for comparison to detect shifts or changes\r\n const commonLength = Math.min(obj1.length, obj2.length);\r\n for (let i = 0; i < commonLength; i++) {\r\n if (obj1[i] !== obj2[i]) {\r\n differences = differences.concat(\r\n getDifferences(\r\n obj1[i],\r\n obj2[i],\r\n currentPath ? `${currentPath}.${i}` : `${i}`\r\n )\r\n );\r\n }\r\n }\r\n\r\n // If an array is shorter post-cut, the remaining items in the longer array are implicitly shifted/deleted\r\n if (obj1.length !== obj2.length) {\r\n const longerArrayPath = obj1.length > obj2.length ? obj1 : obj2;\r\n for (let i = commonLength; i < longerArrayPath.length; i++) {\r\n differences.push(currentPath ? `${currentPath}.${i}` : `${i}`);\r\n }\r\n }\r\n return differences;\r\n }\r\n // Handling objects\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n const allKeys = Array.from(new Set([...keys1, ...keys2]));\r\n\r\n allKeys.forEach((key) => {\r\n const newPath = currentPath ? `${currentPath}.${key}` : key;\r\n differences = differences.concat(\r\n getDifferences(obj1[key], obj2[key], newPath)\r\n );\r\n });\r\n return differences;\r\n}\r\nexport function deepMerge(target: any, source: any): any {\r\n const output = { ...target };\r\n if (isObject(target) && isObject(source)) {\r\n Object.keys(source).forEach((key) => {\r\n if (isObject(source[key])) {\r\n if (!(key in target)) {\r\n Object.assign(output, { [key]: source[key] });\r\n } else {\r\n output[key] = deepMerge(target[key], source[key]);\r\n }\r\n } else {\r\n Object.assign(output, { [key]: source[key] });\r\n }\r\n });\r\n }\r\n return output;\r\n}\r\n\r\nexport function getDifferencesArray(obj1: any, obj2: any) {\r\n const convertedDiff = getDifferences(obj1, obj2).map((string) =>\r\n string\r\n .replace(/\\[(\\w+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n );\r\n\r\n return convertedDiff;\r\n}\r\nexport function getArrayLengthDifferences(\r\n obj1: any,\r\n obj2: any,\r\n currentPath: string = ''\r\n): string[] {\r\n let differences: string[] = [];\r\n\r\n // Check for null or undefined in entire objects\r\n if (\r\n obj1 === null ||\r\n obj1 === undefined ||\r\n obj2 === null ||\r\n obj2 === undefined\r\n ) {\r\n return differences;\r\n }\r\n\r\n // Check and compare only array lengths\r\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\r\n if (obj1.length !== obj2.length) {\r\n differences.push(currentPath);\r\n }\r\n } else if (typeof obj1 === 'object' && typeof obj2 === 'object') {\r\n // Recursively check for nested arrays\r\n const keys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]);\r\n for (const key of keys) {\r\n const newPath = currentPath ? `${currentPath}.${key}` : key;\r\n\r\n // Perform recursive checks only for array fields\r\n if (Array.isArray(obj1[key]) || Array.isArray(obj2[key])) {\r\n differences = differences.concat(\r\n getArrayLengthDifferences(obj1[key], obj2[key], newPath)\r\n );\r\n }\r\n }\r\n }\r\n\r\n return differences;\r\n}\r\n\r\nexport function getArrayLengthDifferencesArray(obj1: any, obj2: any) {\r\n const convertedDiff = getArrayLengthDifferences(obj1, obj2).map((string) =>\r\n string\r\n .replace(/\\[(\\w+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n );\r\n\r\n return convertedDiff;\r\n}\r\n\r\nexport function transformStateFunc<State extends unknown>(initialState: State) {\r\n const isInitialStateType = (state: any): state is InitialStateType<State> => {\r\n return Object.values(state).some((value) =>\r\n value?.hasOwnProperty('initialState')\r\n );\r\n };\r\n let initalOptions: GenericObject = {};\r\n const transformInitialState = (\r\n state: InitialStateType<State>\r\n ): GenericObject | GenericObject[] => {\r\n const transformedState: GenericObject | GenericObject[] = {};\r\n Object.entries(state).forEach(([key, value]) => {\r\n if (value?.initialState) {\r\n initalOptions = { ...(initalOptions ?? {}), [key]: value };\r\n\r\n transformedState[key] = value.initialState;\r\n } else {\r\n transformedState[key] = value;\r\n }\r\n });\r\n\r\n return transformedState;\r\n };\r\n\r\n const transformedInitialState = isInitialStateType(initialState)\r\n ? (transformInitialState(initialState) as State)\r\n : (initialState as State);\r\n\r\n return [transformedInitialState, initalOptions] as [\r\n TransformedStateType<State>,\r\n GenericObject,\r\n ];\r\n}\r\n\r\nexport function debounce<F extends (...args: any[]) => any>(\r\n func: (...args: any[]) => any,\r\n wait: number\r\n): F & { cancel: () => void } {\r\n let timeoutID: NodeJS.Timeout | null = null;\r\n\r\n const debounced: any = (...args: Parameters<F>) => {\r\n if (timeoutID) {\r\n clearTimeout(timeoutID);\r\n }\r\n\r\n timeoutID = setTimeout(() => func(...args), wait);\r\n };\r\n\r\n debounced.cancel = () => {\r\n if (timeoutID) {\r\n clearTimeout(timeoutID);\r\n timeoutID = null;\r\n }\r\n };\r\n\r\n return debounced as DebouncedFunction<F>;\r\n}\r\nexport type DebouncedFunction<F extends (...args: any[]) => any> = F & {\r\n cancel: () => void;\r\n};\r\n"],"names":["isObject","item","isFunction","arg","isArray","isDeepEqual","object1","object2","opts","currentPath","objKeys1","objKeys2","key","value1","value2","newPath","i","updateNestedProperty","path","state","update","head","tail","index","deleteNestedProperty","_","rest","getDifferences","obj1","obj2","differences","commonLength","longerArrayPath","keys1","keys2","deepMerge","target","source","output","getDifferencesArray","string","getArrayLengthDifferences","keys","getArrayLengthDifferencesArray","transformStateFunc","initialState","isInitialStateType","value","initalOptions","transformInitialState","transformedState","debounce","func","wait","timeoutID","debounced","args"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utility.js","sources":["../src/utility.ts"],"sourcesContent":["import type { TransformedStateType, CogsInitialState } from './CogsState';\r\n\r\nexport const isObject = (item: any): item is Record<string, any> => {\r\n return (\r\n item && typeof item === 'object' && !Array.isArray(item) && item !== null\r\n );\r\n};\r\nexport type GenericObject = Record<string, any>;\r\n\r\nexport const isFunction = <TStateObject extends unknown>(\r\n arg: any\r\n): arg is (prev: TStateObject) => TStateObject => typeof arg === 'function';\r\n\r\nexport const isArray = (item: any): item is Array<any> => {\r\n return Array.isArray(item);\r\n};\r\nexport const isDeepEqual = (\r\n object1?: Record<string, any>,\r\n object2?: Record<string, any>,\r\n opts: { get?: () => void } = {},\r\n currentPath: string[] = []\r\n): boolean => {\r\n if (isObject(object1) && isObject(object2)) {\r\n const objKeys1 = Object.keys(object1);\r\n const objKeys2 = Object.keys(object2);\r\n\r\n if (objKeys1.length !== objKeys2.length) {\r\n // console.log(\"not equal\", objKeys1, objKeys2);\r\n return false;\r\n }\r\n\r\n for (let key of objKeys1) {\r\n const value1 = object1[key];\r\n const value2 = object2[key];\r\n\r\n // Check if the key exists in both objects\r\n if (!(key in object1) || !(key in object2)) {\r\n // console.log(\"not equal\", key);\r\n return false;\r\n }\r\n\r\n const newPath = [...currentPath, key];\r\n\r\n // If current path is in ignoreArray, continue to the next key\r\n\r\n if (!isDeepEqual(value1, value2, opts, newPath)) {\r\n // console.log(\"not equal\", value1, value2);\r\n return false;\r\n }\r\n }\r\n return true;\r\n } else if (isArray(object1) && isArray(object2)) {\r\n if (object1.length !== object2.length) {\r\n // console.log(\"not equal\", object1);\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < object1.length; i++) {\r\n if (\r\n !isDeepEqual(object1[i], object2[i], opts, [\r\n ...currentPath,\r\n i.toString(),\r\n ])\r\n ) {\r\n // console.log(\"not equal\", object1[i]);\r\n return false;\r\n }\r\n }\r\n return true;\r\n } else {\r\n return (\r\n object1 === object2 || (Number.isNaN(object1) && Number.isNaN(object2))\r\n );\r\n }\r\n};\r\n\r\nexport function updateNestedProperty(\r\n path: string[],\r\n state: any,\r\n update: any\r\n): any {\r\n if (!path || path.length === 0) return update;\r\n const head = path[0];\r\n const tail = path.slice(1);\r\n\r\n if (Array.isArray(state)) {\r\n const index = Number(head);\r\n\r\n if (!isNaN(index) && index >= 0 && index < state.length) {\r\n return [\r\n ...state.slice(0, index),\r\n updateNestedProperty(tail, state[index], update),\r\n ...state.slice(index + 1),\r\n ];\r\n } else {\r\n console.log('errorstate', state, path);\r\n throw new Error(\r\n `Invalid array index \"${index}\" in path \"${path.join('.')}\".`\r\n );\r\n }\r\n } else if (typeof state === 'object' && state !== null) {\r\n if (head && head in state) {\r\n return {\r\n ...state,\r\n [head!]: updateNestedProperty(tail, state[head!], update),\r\n };\r\n } else {\r\n console.log(`Invalid property`, head, tail, path);\r\n throw new Error(\r\n `Invalid property \"${head}\" in path \"${path.join('.')}\".`\r\n );\r\n }\r\n } else {\r\n throw new Error(\r\n `Cannot update nested property at path \"${path.join('.')}\". The path does not exist.`\r\n );\r\n }\r\n}\r\n\r\nexport function deleteNestedProperty(path: string[], state: any): any {\r\n if (!path || path.length === 0) return state;\r\n const head = path[0] as string;\r\n const tail = path.slice(1);\r\n\r\n if (Array.isArray(state)) {\r\n const index = Number(head);\r\n\r\n if (!isNaN(index) && index >= 0 && index < state.length) {\r\n if (tail.length === 0) {\r\n // Remove the item at the index\r\n return [...state.slice(0, index), ...state.slice(index + 1)];\r\n } else {\r\n return [\r\n ...state.slice(0, index),\r\n deleteNestedProperty(tail, state[index]),\r\n ...state.slice(index + 1),\r\n ];\r\n }\r\n } else {\r\n throw new Error(\r\n `Invalid array index \"${index}\" in path \"${path.join('.')}\".`\r\n );\r\n }\r\n } else if (typeof state === 'object' && state !== null) {\r\n if (tail.length === 0) {\r\n // Delete the property and return the new object\r\n const { [head]: _, ...rest } = state;\r\n return rest;\r\n } else if (head in state) {\r\n return {\r\n ...state,\r\n [head]: deleteNestedProperty(tail, state[head]),\r\n };\r\n } else {\r\n throw new Error(\r\n `Invalid property \"${head}\" in path \"${path.join('.')}\".`\r\n );\r\n }\r\n } else {\r\n throw new Error(\r\n `Cannot delete nested property at path \"${path.join('.')}\". The path does not exist.`\r\n );\r\n }\r\n}\r\n\r\ntype DifferencePaths = string[];\r\n\r\nexport function getDifferences(\r\n obj1: any,\r\n obj2: any,\r\n currentPath: string = ''\r\n): DifferencePaths {\r\n let differences: DifferencePaths = [];\r\n // Handling null and undefined cases\r\n if (typeof obj1 === 'function' && typeof obj2 === 'function') {\r\n return differences;\r\n }\r\n if (\r\n obj1 === null ||\r\n obj1 === undefined ||\r\n obj2 === null ||\r\n obj2 === undefined\r\n ) {\r\n if (obj1 !== obj2) {\r\n // console.log(obj1, obj2);\r\n return [currentPath];\r\n }\r\n return differences;\r\n }\r\n\r\n // Handling primitive types\r\n if (typeof obj1 !== 'object' || typeof obj2 !== 'object') {\r\n if (obj1 !== obj2) {\r\n return [currentPath];\r\n }\r\n return differences;\r\n }\r\n\r\n // Handling arrays\r\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\r\n // Handle changes in length directly\r\n if (obj1.length !== obj2.length) {\r\n differences.push(`${currentPath}`);\r\n }\r\n\r\n // Use the shorter length for comparison to detect shifts or changes\r\n const commonLength = Math.min(obj1.length, obj2.length);\r\n for (let i = 0; i < commonLength; i++) {\r\n if (obj1[i] !== obj2[i]) {\r\n differences = differences.concat(\r\n getDifferences(\r\n obj1[i],\r\n obj2[i],\r\n currentPath ? `${currentPath}.${i}` : `${i}`\r\n )\r\n );\r\n }\r\n }\r\n\r\n // If an array is shorter post-cut, the remaining items in the longer array are implicitly shifted/deleted\r\n if (obj1.length !== obj2.length) {\r\n const longerArrayPath = obj1.length > obj2.length ? obj1 : obj2;\r\n for (let i = commonLength; i < longerArrayPath.length; i++) {\r\n differences.push(currentPath ? `${currentPath}.${i}` : `${i}`);\r\n }\r\n }\r\n return differences;\r\n }\r\n // Handling objects\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n const allKeys = Array.from(new Set([...keys1, ...keys2]));\r\n\r\n allKeys.forEach((key) => {\r\n const newPath = currentPath ? `${currentPath}.${key}` : key;\r\n differences = differences.concat(\r\n getDifferences(obj1[key], obj2[key], newPath)\r\n );\r\n });\r\n return differences;\r\n}\r\nexport function deepMerge(target: any, source: any): any {\r\n const output = { ...target };\r\n if (isObject(target) && isObject(source)) {\r\n Object.keys(source).forEach((key) => {\r\n if (isObject(source[key])) {\r\n if (!(key in target)) {\r\n Object.assign(output, { [key]: source[key] });\r\n } else {\r\n output[key] = deepMerge(target[key], source[key]);\r\n }\r\n } else {\r\n Object.assign(output, { [key]: source[key] });\r\n }\r\n });\r\n }\r\n return output;\r\n}\r\n\r\nexport function getDifferencesArray(obj1: any, obj2: any) {\r\n const convertedDiff = getDifferences(obj1, obj2).map((string) =>\r\n string\r\n .replace(/\\[(\\w+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n );\r\n\r\n return convertedDiff;\r\n}\r\nexport function getArrayLengthDifferences(\r\n obj1: any,\r\n obj2: any,\r\n currentPath: string = ''\r\n): string[] {\r\n let differences: string[] = [];\r\n\r\n // Check for null or undefined in entire objects\r\n if (\r\n obj1 === null ||\r\n obj1 === undefined ||\r\n obj2 === null ||\r\n obj2 === undefined\r\n ) {\r\n return differences;\r\n }\r\n\r\n // Check and compare only array lengths\r\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\r\n if (obj1.length !== obj2.length) {\r\n differences.push(currentPath);\r\n }\r\n } else if (typeof obj1 === 'object' && typeof obj2 === 'object') {\r\n // Recursively check for nested arrays\r\n const keys = new Set([...Object.keys(obj1), ...Object.keys(obj2)]);\r\n for (const key of keys) {\r\n const newPath = currentPath ? `${currentPath}.${key}` : key;\r\n\r\n // Perform recursive checks only for array fields\r\n if (Array.isArray(obj1[key]) || Array.isArray(obj2[key])) {\r\n differences = differences.concat(\r\n getArrayLengthDifferences(obj1[key], obj2[key], newPath)\r\n );\r\n }\r\n }\r\n }\r\n\r\n return differences;\r\n}\r\n\r\nexport function getArrayLengthDifferencesArray(obj1: any, obj2: any) {\r\n const convertedDiff = getArrayLengthDifferences(obj1, obj2).map((string) =>\r\n string\r\n .replace(/\\[(\\w+)\\]/g, '.$1')\r\n .split('.')\r\n .filter(Boolean)\r\n );\r\n\r\n return convertedDiff;\r\n}\r\n\r\nexport function debounce<F extends (...args: any[]) => any>(\r\n func: (...args: any[]) => any,\r\n wait: number\r\n): F & { cancel: () => void } {\r\n let timeoutID: NodeJS.Timeout | null = null;\r\n\r\n const debounced: any = (...args: Parameters<F>) => {\r\n if (timeoutID) {\r\n clearTimeout(timeoutID);\r\n }\r\n\r\n timeoutID = setTimeout(() => func(...args), wait);\r\n };\r\n\r\n debounced.cancel = () => {\r\n if (timeoutID) {\r\n clearTimeout(timeoutID);\r\n timeoutID = null;\r\n }\r\n };\r\n\r\n return debounced as DebouncedFunction<F>;\r\n}\r\nexport type DebouncedFunction<F extends (...args: any[]) => any> = F & {\r\n cancel: () => void;\r\n};\r\n\r\nexport function transformStateFunc<State extends unknown>(initialState: State) {\r\n const isInitialStateType = (state: any): state is CogsInitialState<State> => {\r\n return Object.values(state).some((value) =>\r\n value?.hasOwnProperty('initialState')\r\n );\r\n };\r\n let initalOptions: GenericObject = {};\r\n const transformInitialState = (\r\n state: CogsInitialState<State>\r\n ): GenericObject | GenericObject[] => {\r\n const transformedState: GenericObject | GenericObject[] = {};\r\n Object.entries(state).forEach(([key, value]) => {\r\n if (value?.initialState) {\r\n initalOptions = { ...(initalOptions ?? {}), [key]: value };\r\n\r\n transformedState[key] = value.initialState;\r\n } else {\r\n transformedState[key] = value;\r\n }\r\n });\r\n\r\n return transformedState;\r\n };\r\n\r\n const transformedInitialState = isInitialStateType(initialState)\r\n ? (transformInitialState(initialState) as State)\r\n : (initialState as State);\r\n\r\n return [transformedInitialState, initalOptions] as [\r\n TransformedStateType<State>,\r\n GenericObject,\r\n ];\r\n}\r\n"],"names":["isObject","item","isFunction","arg","isArray","isDeepEqual","object1","object2","opts","currentPath","objKeys1","objKeys2","key","value1","value2","newPath","i","updateNestedProperty","path","state","update","head","tail","index","deleteNestedProperty","_","rest","getDifferences","obj1","obj2","differences","commonLength","longerArrayPath","keys1","keys2","deepMerge","target","source","output","getDifferencesArray","string","getArrayLengthDifferences","keys","getArrayLengthDifferencesArray","debounce","func","wait","timeoutID","debounced","args","transformStateFunc","initialState","isInitialStateType","value","initalOptions","transformInitialState","transformedState"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAK/C;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,QAAQ,GAAG,UAAU,GAAG,cAAc,QAuEhD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { getGlobalStore as g } from "./store.js";
|
|
2
|
+
import { isDeepEqual as v } from "./utility.js";
|
|
3
|
+
function w(c, n) {
|
|
4
|
+
const {
|
|
5
|
+
getInitialOptions: d,
|
|
6
|
+
getShadowMetadata: f,
|
|
7
|
+
setShadowMetadata: h,
|
|
8
|
+
notifyPathSubscribers: p
|
|
9
|
+
} = g.getState(), { stateKey: o, path: r, newValue: m, updateType: I } = c;
|
|
10
|
+
if (I !== "update")
|
|
11
|
+
return;
|
|
12
|
+
const e = d(o)?.validation;
|
|
13
|
+
if (!e) return;
|
|
14
|
+
const s = f(o, r) || {}, l = s.typeInfo?.schema, V = s.validation?.status;
|
|
15
|
+
let t = !1, a = "error";
|
|
16
|
+
if (n === "onBlur" && e.onBlur ? (t = !0, a = e.onBlur) : n === "onChange" && e.onChange ? (t = !0, a = e.onChange) : n === "onChange" && V === "INVALID" ? (t = !0, a = "warning") : n === "programmatic" && (e.onBlur || e.onChange) && (t = !0, a = e.onBlur || e.onChange || "error"), !t || !l)
|
|
17
|
+
return;
|
|
18
|
+
const i = l.safeParse(m), u = {
|
|
19
|
+
status: i.success ? "VALID" : "INVALID",
|
|
20
|
+
errors: i.success ? [] : [
|
|
21
|
+
{
|
|
22
|
+
source: "client",
|
|
23
|
+
message: i.error.issues[0]?.message || "Invalid value",
|
|
24
|
+
severity: a
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
lastValidated: Date.now()
|
|
28
|
+
};
|
|
29
|
+
v(s.validation, u) || (h(o, r, {
|
|
30
|
+
...s,
|
|
31
|
+
validation: u
|
|
32
|
+
}), p([o, ...r].join("."), {
|
|
33
|
+
type: "VALIDATION_UPDATE"
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
w as runValidation
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sources":["../src/validation.ts"],"sourcesContent":["// in utils.ts\r\n\r\nimport { UpdateTypeDetail } from './CogsState'; // Adjust path as needed\r\nimport { getGlobalStore } from './store';\r\nimport { isDeepEqual } from './utility';\r\nimport { ZodType } from 'zod';\r\n\r\n/**\r\n * THIS IS THE CORRECTED FUNCTION.\r\n */\r\nexport function runValidation(\r\n operation: UpdateTypeDetail,\r\n trigger: 'onBlur' | 'onChange' | 'programmatic'\r\n) {\r\n const {\r\n getInitialOptions,\r\n getShadowMetadata,\r\n setShadowMetadata,\r\n notifyPathSubscribers,\r\n } = getGlobalStore.getState();\r\n const { stateKey, path, newValue, updateType } = operation;\r\n\r\n if (updateType !== 'update') {\r\n return;\r\n }\r\n\r\n const validationOptions = getInitialOptions(stateKey)?.validation;\r\n if (!validationOptions) return;\r\n\r\n const currentMeta = getShadowMetadata(stateKey, path) || {};\r\n const fieldSchema = currentMeta.typeInfo?.schema as ZodType | undefined;\r\n const currentStatus = currentMeta.validation?.status;\r\n\r\n let shouldValidate = false;\r\n let severity: 'error' | 'warning' = 'error';\r\n\r\n if (trigger === 'onBlur' && validationOptions.onBlur) {\r\n shouldValidate = true;\r\n severity = validationOptions.onBlur;\r\n } else if (trigger === 'onChange' && validationOptions.onChange) {\r\n shouldValidate = true;\r\n severity = validationOptions.onChange;\r\n } else if (trigger === 'onChange' && currentStatus === 'INVALID') {\r\n shouldValidate = true;\r\n severity = 'warning';\r\n } else if (trigger === 'programmatic') {\r\n if (validationOptions.onBlur || validationOptions.onChange) {\r\n shouldValidate = true;\r\n\r\n severity =\r\n validationOptions.onBlur || validationOptions.onChange || 'error';\r\n }\r\n }\r\n\r\n if (!shouldValidate || !fieldSchema) {\r\n return;\r\n }\r\n\r\n // The rest of the function is the same.\r\n const result = fieldSchema.safeParse(newValue);\r\n const newValidationState = {\r\n status: result.success ? 'VALID' : 'INVALID',\r\n errors: result.success\r\n ? []\r\n : [\r\n {\r\n source: 'client',\r\n message: result.error.issues[0]?.message || 'Invalid value',\r\n severity: severity,\r\n },\r\n ],\r\n lastValidated: Date.now(),\r\n };\r\n\r\n if (!isDeepEqual(currentMeta.validation, newValidationState)) {\r\n setShadowMetadata(stateKey, path, {\r\n ...currentMeta,\r\n validation: newValidationState,\r\n });\r\n notifyPathSubscribers([stateKey, ...path].join('.'), {\r\n type: 'VALIDATION_UPDATE',\r\n });\r\n }\r\n}\r\n"],"names":["runValidation","operation","trigger","getInitialOptions","getShadowMetadata","setShadowMetadata","notifyPathSubscribers","getGlobalStore","stateKey","path","newValue","updateType","validationOptions","currentMeta","fieldSchema","currentStatus","shouldValidate","severity","result","newValidationState","isDeepEqual"],"mappings":";;AAUO,SAASA,EACdC,GACAC,GACA;AACA,QAAM;AAAA,IACJ,mBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,uBAAAC;AAAA,EAAA,IACEC,EAAe,SAAA,GACb,EAAE,UAAAC,GAAU,MAAAC,GAAM,UAAAC,GAAU,YAAAC,MAAeV;AAEjD,MAAIU,MAAe;AACjB;AAGF,QAAMC,IAAoBT,EAAkBK,CAAQ,GAAG;AACvD,MAAI,CAACI,EAAmB;AAExB,QAAMC,IAAcT,EAAkBI,GAAUC,CAAI,KAAK,CAAA,GACnDK,IAAcD,EAAY,UAAU,QACpCE,IAAgBF,EAAY,YAAY;AAE9C,MAAIG,IAAiB,IACjBC,IAAgC;AAoBpC,MAlBIf,MAAY,YAAYU,EAAkB,UAC5CI,IAAiB,IACjBC,IAAWL,EAAkB,UACpBV,MAAY,cAAcU,EAAkB,YACrDI,IAAiB,IACjBC,IAAWL,EAAkB,YACpBV,MAAY,cAAca,MAAkB,aACrDC,IAAiB,IACjBC,IAAW,aACFf,MAAY,mBACjBU,EAAkB,UAAUA,EAAkB,cAChDI,IAAiB,IAEjBC,IACEL,EAAkB,UAAUA,EAAkB,YAAY,UAI5D,CAACI,KAAkB,CAACF;AACtB;AAIF,QAAMI,IAASJ,EAAY,UAAUJ,CAAQ,GACvCS,IAAqB;AAAA,IACzB,QAAQD,EAAO,UAAU,UAAU;AAAA,IACnC,QAAQA,EAAO,UACX,KACA;AAAA,MACE;AAAA,QACE,QAAQ;AAAA,QACR,SAASA,EAAO,MAAM,OAAO,CAAC,GAAG,WAAW;AAAA,QAC5C,UAAAD;AAAA,MAAA;AAAA,IACF;AAAA,IAEN,eAAe,KAAK,IAAA;AAAA,EAAI;AAG1B,EAAKG,EAAYP,EAAY,YAAYM,CAAkB,MACzDd,EAAkBG,GAAUC,GAAM;AAAA,IAChC,GAAGI;AAAA,IACH,YAAYM;AAAA,EAAA,CACb,GACDb,EAAsB,CAACE,GAAU,GAAGC,CAAI,EAAE,KAAK,GAAG,GAAG;AAAA,IACnD,MAAM;AAAA,EAAA,CACP;AAEL;"}
|