cogsbox-state 0.5.434 → 0.5.436

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/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from 'zustand';\r\nimport { ulid } from 'ulid';\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n StateKeys,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from './CogsState.js';\r\n\r\nimport type { ReactNode } from 'react';\r\n\r\ntype StateUpdater<StateValue> =\r\n | StateValue\r\n | ((prevValue: StateValue) => StateValue);\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype SyncLogType = {\r\n timeStamp: number;\r\n};\r\ntype StateValue = any;\r\n\r\nexport type 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 // New method to get all refs for a stateKey\r\n getFormRefsByStateKey: (\r\n stateKey: string\r\n ) => Map<string, React.RefObject<any>>;\r\n};\r\n\r\nexport const formRefStore = create<FormRefStoreState>((set, get) => ({\r\n formRefs: new Map(),\r\n\r\n registerFormRef: (id, ref) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.set(id, ref);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRef: (id) => get().formRefs.get(id),\r\n\r\n removeFormRef: (id) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.delete(id);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n // Get all refs that start with the stateKey prefix\r\n getFormRefsByStateKey: (stateKey) => {\r\n const allRefs = get().formRefs;\r\n const stateKeyPrefix = stateKey + '.';\r\n const filteredRefs = new Map();\r\n\r\n allRefs.forEach((ref, id) => {\r\n if (id.startsWith(stateKeyPrefix) || id === stateKey) {\r\n filteredRefs.set(id, ref);\r\n }\r\n });\r\n\r\n return filteredRefs;\r\n },\r\n}));\r\nexport type 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\nexport type ShadowMetadata = {\r\n id?: string;\r\n\r\n stateSource?: 'default' | 'server' | 'localStorage';\r\n lastServerSync?: number;\r\n isDirty?: boolean;\r\n baseServerState?: any;\r\n\r\n arrayKeys?: string[];\r\n\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 lastUpdated?: number;\r\n value?: any;\r\n classSignals?: Array<{\r\n // <-- ADD THIS BLOCK\r\n id: string;\r\n effect: string;\r\n lastClasses: string;\r\n deps: any[];\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 mapWrappers?: Array<{\r\n instanceId: string;\r\n path: string[];\r\n componentId: string;\r\n meta?: any;\r\n mapFn: (\r\n setter: any,\r\n index: number,\r\n\r\n arraySetter: any\r\n ) => ReactNode;\r\n containerRef: HTMLDivElement | null;\r\n rebuildStateShape: any;\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\nexport type CogsEvent =\r\n | { type: 'INSERT'; path: string; itemKey: string; index: number }\r\n | { type: 'REMOVE'; path: string; itemKey: string }\r\n | { type: 'UPDATE'; path: string; newValue: any }\r\n | { type: 'ITEMHEIGHT'; itemKey: string; height: number } // For full re-initializations (e.g., when a component is removed)\r\n | { type: 'RELOAD'; path: string }; // For full re-initializations\r\nexport type CogsGlobalState = {\r\n // --- Shadow State and Subscription System ---\r\n shadowStateStore: Map<string, ShadowMetadata>;\r\n markAsDirty: (\r\n key: string,\r\n path: string[],\r\n options: { bubble: boolean }\r\n ) => void;\r\n // These method signatures stay the same\r\n initializeShadowState: (key: string, initialState: any) => void;\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => void;\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItem: any\r\n ) => void;\r\n removeShadowArrayElement: (key: string, arrayPath: string[]) => void;\r\n getShadowValue: (\r\n key: string,\r\n\r\n validArrayIds?: string[]\r\n ) => any;\r\n\r\n getShadowMetadata: (\r\n key: string,\r\n path: string[]\r\n ) => ShadowMetadata | undefined;\r\n setShadowMetadata: (\r\n key: string,\r\n path: string[],\r\n metadata: Omit<ShadowMetadata, 'id'>\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\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 // --- Core State and Updaters ---\r\n\r\n initialStateOptions: { [key: string]: OptionsType };\r\n\r\n initialStateGlobal: { [key: string]: StateValue };\r\n\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 // --- Validation ---\r\n validationErrors: Map<string, string[]>;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n removeValidationError: (path: string) => void;\r\n\r\n // --- Server Sync and Logging ---\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: { [key: string]: UpdateTypeDetail[] };\r\n syncInfoStore: Map<string, SyncInfo>;\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\nconst isSimpleObject = (value: any): boolean => {\r\n if (value === null || typeof value !== 'object') return false;\r\n\r\n // Handle special cases that should be treated as primitives\r\n if (\r\n value instanceof Uint8Array ||\r\n value instanceof Int8Array ||\r\n value instanceof Uint16Array ||\r\n value instanceof Int16Array ||\r\n value instanceof Uint32Array ||\r\n value instanceof Int32Array ||\r\n value instanceof Float32Array ||\r\n value instanceof Float64Array ||\r\n value instanceof ArrayBuffer ||\r\n value instanceof Date ||\r\n value instanceof RegExp ||\r\n value instanceof Map ||\r\n value instanceof Set\r\n ) {\r\n return false; // Treat as primitive\r\n }\r\n\r\n // Arrays and plain objects are complex\r\n return Array.isArray(value) || value.constructor === Object;\r\n};\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n markAsDirty: (key: string, path: string[], options = { bubble: true }) => {\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n let changed = false;\r\n\r\n // This function marks a single path as dirty if it was previously synced.\r\n const setDirty = (currentPath: string[]) => {\r\n const fullKey = [key, ...currentPath].join('.');\r\n const meta = newShadowStore.get(fullKey);\r\n\r\n // We only mark something as dirty if it was previously synced from the server.\r\n // We also check `isDirty !== true` to avoid redundant updates.\r\n if (meta && meta.stateSource === 'server' && meta.isDirty !== true) {\r\n newShadowStore.set(fullKey, { ...meta, isDirty: true });\r\n changed = true;\r\n }\r\n };\r\n\r\n // 1. Mark the target path itself as dirty.\r\n setDirty(path);\r\n\r\n // 2. If `bubble` is true, walk up the path and mark all parents as dirty.\r\n if (options.bubble) {\r\n let parentPath = [...path];\r\n while (parentPath.length > 0) {\r\n parentPath.pop();\r\n setDirty(parentPath);\r\n }\r\n }\r\n\r\n // Only update the global state if something actually changed.\r\n if (changed) {\r\n set({ shadowStateStore: newShadowStore });\r\n }\r\n },\r\n serverStateUpdates: new Map(),\r\n setServerStateUpdate: (key, serverState) => {\r\n set((state) => {\r\n const newMap = new Map(state.serverStateUpdates);\r\n newMap.set(key, serverState);\r\n return { serverStateUpdates: newMap };\r\n });\r\n\r\n // Notify all subscribers for this key\r\n get().notifyPathSubscribers(key, {\r\n type: 'SERVER_STATE_UPDATE',\r\n serverState,\r\n });\r\n },\r\n shadowStateStore: new Map(),\r\n pathSubscribers: new Map<string, Set<(newValue: any) => void>>(),\r\n\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 // <-- Now accepts newValue\r\n const subscribers = get().pathSubscribers;\r\n const subs = subscribers.get(updatedPath);\r\n\r\n if (subs) {\r\n // Pass the newValue to every callback\r\n subs.forEach((callback) => callback(newValue));\r\n }\r\n },\r\n initializeShadowState: (key: string, initialState: any) => {\r\n const existingShadowStore = new Map(get().shadowStateStore);\r\n\r\n const processValue = (value: any, path: string[]) => {\r\n const nodeKey = [key, ...path].join('.');\r\n\r\n if (Array.isArray(value)) {\r\n // Handle arrays as before\r\n const childIds: string[] = [];\r\n\r\n value.forEach((item) => {\r\n const itemId = `id:${ulid()}`;\r\n childIds.push(nodeKey + '.' + itemId);\r\n });\r\n\r\n existingShadowStore.set(nodeKey, { arrayKeys: childIds });\r\n\r\n value.forEach((item, index) => {\r\n const itemId = childIds[index]!.split('.').pop();\r\n processValue(item, [...path!, itemId!]);\r\n });\r\n } else if (isSimpleObject(value)) {\r\n // Only create field mappings for simple objects\r\n const fields = Object.fromEntries(\r\n Object.keys(value).map((k) => [k, nodeKey + '.' + k])\r\n );\r\n existingShadowStore.set(nodeKey, { fields });\r\n\r\n Object.keys(value).forEach((k) => {\r\n processValue(value[k], [...path, k]);\r\n });\r\n } else {\r\n // Treat everything else (including Uint8Array) as primitive values\r\n existingShadowStore.set(nodeKey, { value });\r\n }\r\n };\r\n\r\n processValue(initialState, []);\r\n set({ shadowStateStore: existingShadowStore });\r\n },\r\n\r\n getShadowValue: (fullKey: string, validArrayIds?: string[]) => {\r\n const shadowMeta = get().shadowStateStore.get(fullKey);\r\n\r\n // If no metadata found, return undefined\r\n if (!shadowMeta) {\r\n return undefined;\r\n }\r\n\r\n // For primitive values, return the value\r\n if (shadowMeta.value !== undefined) {\r\n return shadowMeta.value;\r\n }\r\n\r\n // For arrays, reconstruct with possible validArrayIds\r\n if (shadowMeta.arrayKeys) {\r\n const arrayKeys = validArrayIds ?? shadowMeta.arrayKeys;\r\n const items = arrayKeys.map((itemKey) => {\r\n // RECURSIVELY call getShadowValue for each item\r\n return get().getShadowValue(itemKey);\r\n });\r\n return items;\r\n }\r\n\r\n // For objects with fields, reconstruct object\r\n if (shadowMeta.fields) {\r\n const reconstructedObject: any = {};\r\n Object.entries(shadowMeta.fields).forEach(([key, fieldPath]) => {\r\n // RECURSIVELY call getShadowValue for each field\r\n reconstructedObject[key] = get().getShadowValue(fieldPath as string);\r\n });\r\n return reconstructedObject;\r\n }\r\n\r\n return undefined;\r\n },\r\n getShadowMetadata: (\r\n key: string,\r\n path: string[],\r\n validArrayIds?: string[]\r\n ) => {\r\n const fullKey = [key, ...path].join('.');\r\n let data = get().shadowStateStore.get(fullKey);\r\n\r\n return get().shadowStateStore.get(fullKey);\r\n },\r\n\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => {\r\n const fullKey = [key, ...path].join('.');\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n const existing = newShadowStore.get(fullKey) || { id: ulid() };\r\n newShadowStore.set(fullKey, { ...existing, ...metadata });\r\n set({ shadowStateStore: newShadowStore });\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 fullKey = [key, ...path].join('.');\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n const existing = newShadowStore.get(fullKey) || {};\r\n\r\n // Initialize transformCaches if it doesn't exist\r\n if (!existing.transformCaches) {\r\n existing.transformCaches = new Map();\r\n }\r\n\r\n // Update just the specific cache entry\r\n existing.transformCaches.set(cacheKey, cacheData);\r\n\r\n // Update shadow store WITHOUT notifying path subscribers\r\n newShadowStore.set(fullKey, existing);\r\n set({ shadowStateStore: newShadowStore });\r\n\r\n // Don't call notifyPathSubscribers here - cache updates shouldn't trigger renders\r\n },\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItem: any\r\n ) => {\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n const arrayKey = [key, ...arrayPath].join('.');\r\n const parentMeta = newShadowStore.get(arrayKey);\r\n\r\n if (!parentMeta || !parentMeta.arrayKeys) return;\r\n\r\n const newItemId = `id:${ulid()}`;\r\n const fullItemKey = arrayKey + '.' + newItemId;\r\n\r\n // Just add to the end (or at a specific index if provided)\r\n const newArrayKeys = [...parentMeta.arrayKeys];\r\n newArrayKeys.push(fullItemKey); // Or use splice if you have an index\r\n newShadowStore.set(arrayKey, { ...parentMeta, arrayKeys: newArrayKeys });\r\n\r\n // Process the new item - but use the correct logic\r\n const processNewItem = (value: any, path: string[]) => {\r\n const nodeKey = [key, ...path].join('.');\r\n\r\n if (Array.isArray(value)) {\r\n // Handle arrays...\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Create fields mapping\r\n const fields = Object.fromEntries(\r\n Object.keys(value).map((k) => [k, nodeKey + '.' + k])\r\n );\r\n newShadowStore.set(nodeKey, { fields });\r\n\r\n // Process each field\r\n Object.entries(value).forEach(([k, v]) => {\r\n processNewItem(v, [...path, k]);\r\n });\r\n } else {\r\n // Primitive value\r\n newShadowStore.set(nodeKey, { value });\r\n }\r\n };\r\n\r\n processNewItem(newItem, [...arrayPath, newItemId]);\r\n set({ shadowStateStore: newShadowStore });\r\n\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'INSERT',\r\n path: arrayKey,\r\n itemKey: fullItemKey,\r\n });\r\n },\r\n removeShadowArrayElement: (key: string, itemPath: string[]) => {\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n\r\n // Get the full item key (e.g., \"stateKey.products.id:xxx\")\r\n const itemKey = [key, ...itemPath].join('.');\r\n\r\n // Extract parent path and item ID\r\n const parentPath = itemPath.slice(0, -1);\r\n const parentKey = [key, ...parentPath].join('.');\r\n\r\n // Get parent metadata\r\n const parentMeta = newShadowStore.get(parentKey);\r\n\r\n if (parentMeta && parentMeta.arrayKeys) {\r\n // Find the index of the item to remove\r\n const indexToRemove = parentMeta.arrayKeys.findIndex(\r\n (arrayItemKey) => arrayItemKey === itemKey\r\n );\r\n\r\n if (indexToRemove !== -1) {\r\n // Create new array keys with the item removed\r\n const newArrayKeys = parentMeta.arrayKeys.filter(\r\n (arrayItemKey) => arrayItemKey !== itemKey\r\n );\r\n\r\n // Update parent with new array keys\r\n newShadowStore.set(parentKey, {\r\n ...parentMeta,\r\n arrayKeys: newArrayKeys,\r\n });\r\n\r\n // Delete all data associated with the removed item\r\n const prefixToDelete = itemKey + '.';\r\n for (const k of Array.from(newShadowStore.keys())) {\r\n if (k === itemKey || k.startsWith(prefixToDelete)) {\r\n newShadowStore.delete(k);\r\n }\r\n }\r\n }\r\n }\r\n\r\n set({ shadowStateStore: newShadowStore });\r\n\r\n get().notifyPathSubscribers(parentKey, {\r\n type: 'REMOVE',\r\n path: parentKey,\r\n itemKey: itemKey, // The exact ID of the removed item\r\n });\r\n },\r\n updateShadowAtPath: (key, path, newValue) => {\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n const fullKey = [key, ...path].join('.');\r\n\r\n const updateValue = (currentKey: string, valueToSet: any) => {\r\n const meta = newShadowStore.get(currentKey);\r\n\r\n // If it's a simple object with fields, update recursively\r\n if (isSimpleObject(valueToSet) && meta && meta.fields) {\r\n for (const fieldKey in valueToSet) {\r\n if (Object.prototype.hasOwnProperty.call(valueToSet, fieldKey)) {\r\n const childPath = meta.fields[fieldKey];\r\n const childValue = valueToSet[fieldKey];\r\n\r\n if (childPath) {\r\n updateValue(childPath as string, childValue);\r\n }\r\n }\r\n }\r\n } else {\r\n // For primitives (including Uint8Array), just replace the value\r\n // This gives you useState-like behavior\r\n const existing = newShadowStore.get(currentKey) || {};\r\n newShadowStore.set(currentKey, { ...existing, value: valueToSet });\r\n }\r\n };\r\n\r\n updateValue(fullKey, newValue);\r\n get().notifyPathSubscribers(fullKey, { type: 'UPDATE', newValue });\r\n set({ shadowStateStore: newShadowStore });\r\n },\r\n selectedIndicesMap: new Map<string, string>(),\r\n getSelectedIndex: (arrayKey: string, validIds?: string[]): number => {\r\n const itemKey = get().selectedIndicesMap.get(arrayKey);\r\n\r\n if (!itemKey) return -1;\r\n\r\n // Use validIds if provided (for filtered views), otherwise use all arrayKeys\r\n const arrayKeys =\r\n validIds ||\r\n getGlobalStore.getState().getShadowMetadata(arrayKey, [])?.arrayKeys;\r\n\r\n if (!arrayKeys) return -1;\r\n\r\n return arrayKeys.indexOf(itemKey);\r\n },\r\n\r\n setSelectedIndex: (arrayKey: string, itemKey: string | undefined) => {\r\n set((state) => {\r\n const newMap = 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\r\n get().notifyPathSubscribers(itemKey, {\r\n type: 'THIS_SELECTED',\r\n });\r\n }\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'GET_SELECTED',\r\n });\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndex: ({ arrayKey }: { arrayKey: string }): void => {\r\n set((state) => {\r\n const newMap = state.selectedIndicesMap;\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 clearSelectedIndexesForState: (stateKey: string) => {\r\n set((state) => {\r\n const newOuterMap = new Map(state.selectedIndicesMap);\r\n const changed = newOuterMap.delete(stateKey);\r\n if (changed) {\r\n return { selectedIndicesMap: newOuterMap };\r\n } else {\r\n return {};\r\n }\r\n });\r\n },\r\n\r\n initialStateOptions: {},\r\n\r\n stateTimeline: {},\r\n cogsStateStore: {},\r\n stateLog: {},\r\n\r\n initialStateGlobal: {},\r\n\r\n validationErrors: new Map(),\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => {\r\n set((prev) => {\r\n const currentUpdates = prev.stateLog[key] ?? [];\r\n const newUpdates = updater(currentUpdates);\r\n return {\r\n stateLog: {\r\n ...prev.stateLog,\r\n [key]: newUpdates,\r\n },\r\n };\r\n });\r\n },\r\n\r\n addValidationError: (path, message) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n const existingMessages = updatedErrors.get(path) || [];\r\n console.log('addValidationError', path, message, existingMessages);\r\n // Append the new message instead of replacing\r\n updatedErrors.set(path, [...existingMessages, message]);\r\n return { validationErrors: updatedErrors };\r\n });\r\n },\r\n removeValidationError: (path) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n let doSomething = false;\r\n const pathArray = path.split('.');\r\n Array.from(updatedErrors.keys()).forEach((key) => {\r\n const keyArray = key.split('.');\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n if (keyArray[i] !== pathArray[i]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n doSomething = true;\r\n updatedErrors.delete(key);\r\n }\r\n }\r\n });\r\n\r\n return doSomething ? { validationErrors: updatedErrors } : prev;\r\n });\r\n },\r\n getValidationErrors: (path: string) => {\r\n const errors: string[] = [];\r\n const valErrors = get().validationErrors;\r\n const pathArray = path.split('.');\r\n\r\n // Helper to check if an index matches either a wildcard or is in an array of indices\r\n const isIndexMatch = (pathSegment: string, keySegment: string) => {\r\n if (pathSegment === '[*]') return true;\r\n if (Array.isArray(pathSegment)) {\r\n return pathSegment.includes(parseInt(keySegment));\r\n }\r\n return pathSegment === keySegment;\r\n };\r\n\r\n Array.from(valErrors.keys()).forEach((key) => {\r\n const keyArray = key.split('.');\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const pathSegment = pathArray[i];\r\n const keySegment = keyArray[i]!;\r\n\r\n // If current path segment is a number or [*], we need special handling\r\n if (pathSegment === '[*]' || Array.isArray(pathSegment)) {\r\n // Key segment should be a number if we're using [*] or array indices\r\n const keyIndex = parseInt(keySegment);\r\n if (isNaN(keyIndex)) {\r\n match = false;\r\n break;\r\n }\r\n\r\n if (!isIndexMatch(pathSegment, keySegment)) {\r\n match = false;\r\n break;\r\n }\r\n } else if (pathSegment !== keySegment) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n const errorMessages = valErrors.get(key);\r\n if (errorMessages) {\r\n errors.push(...errorMessages);\r\n }\r\n }\r\n }\r\n });\r\n\r\n return errors;\r\n },\r\n getInitialOptions: (key) => {\r\n return get().initialStateOptions[key];\r\n },\r\n\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: {\r\n ...prev.initialStateOptions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: {\r\n ...prev.initialStateGlobal,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { ...state, syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key: string) => get().syncInfoStore.get(key) || null,\r\n}));\r\n"],"names":["formRefStore","create","set","get","id","ref","state","newRefs","stateKey","allRefs","stateKeyPrefix","filteredRefs","isSimpleObject","value","getGlobalStore","key","path","options","newShadowStore","changed","setDirty","currentPath","fullKey","meta","parentPath","serverState","newMap","callback","subscribers","subsForPath","currentSubs","updatedPath","newValue","subs","initialState","existingShadowStore","processValue","nodeKey","childIds","item","itemId","ulid","index","fields","k","validArrayIds","shadowMeta","itemKey","reconstructedObject","fieldPath","metadata","existing","cacheKey","cacheData","arrayPath","newItem","arrayKey","parentMeta","newItemId","fullItemKey","newArrayKeys","processNewItem","v","itemPath","parentKey","arrayItemKey","prefixToDelete","updateValue","currentKey","valueToSet","fieldKey","childPath","childValue","validIds","arrayKeys","newOuterMap","updater","prev","currentUpdates","newUpdates","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","i","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","newState","syncInfo"],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from 'zustand';\r\nimport { ulid } from 'ulid';\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n StateKeys,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from './CogsState.js';\r\n\r\nimport type { ReactNode } from 'react';\r\n\r\ntype StateUpdater<StateValue> =\r\n | StateValue\r\n | ((prevValue: StateValue) => StateValue);\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype SyncLogType = {\r\n timeStamp: number;\r\n};\r\ntype StateValue = any;\r\n\r\nexport type 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 // New method to get all refs for a stateKey\r\n getFormRefsByStateKey: (\r\n stateKey: string\r\n ) => Map<string, React.RefObject<any>>;\r\n};\r\n\r\nexport const formRefStore = create<FormRefStoreState>((set, get) => ({\r\n formRefs: new Map(),\r\n\r\n registerFormRef: (id, ref) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.set(id, ref);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRef: (id) => get().formRefs.get(id),\r\n\r\n removeFormRef: (id) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.delete(id);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n // Get all refs that start with the stateKey prefix\r\n getFormRefsByStateKey: (stateKey) => {\r\n const allRefs = get().formRefs;\r\n const stateKeyPrefix = stateKey + '.';\r\n const filteredRefs = new Map();\r\n\r\n allRefs.forEach((ref, id) => {\r\n if (id.startsWith(stateKeyPrefix) || id === stateKey) {\r\n filteredRefs.set(id, ref);\r\n }\r\n });\r\n\r\n return filteredRefs;\r\n },\r\n}));\r\nexport type 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\nexport type ShadowMetadata = {\r\n id?: string;\r\n\r\n stateSource?: 'default' | 'server' | 'localStorage';\r\n lastServerSync?: number;\r\n isDirty?: boolean;\r\n baseServerState?: any;\r\n\r\n arrayKeys?: string[];\r\n\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 lastUpdated?: number;\r\n value?: any;\r\n classSignals?: Array<{\r\n // <-- ADD THIS BLOCK\r\n id: string;\r\n effect: string;\r\n lastClasses: string;\r\n deps: any[];\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 mapWrappers?: Array<{\r\n instanceId: string;\r\n path: string[];\r\n componentId: string;\r\n meta?: any;\r\n mapFn: (\r\n setter: any,\r\n index: number,\r\n\r\n arraySetter: any\r\n ) => ReactNode;\r\n containerRef: HTMLDivElement | null;\r\n rebuildStateShape: any;\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\nexport type ValidationStatus =\r\n | 'PRISTINE' // Untouched, matches initial state.\r\n | 'DIRTY' // Changed, but no validation run yet.\r\n | 'VALID_LIVE' // Valid while typing.\r\n | 'INVALID_LIVE' // Gentle error during typing.\r\n | 'VALIDATION_FAILED' // Hard error on blur/submit.\r\n | 'VALID_PENDING_SYNC' // Passed validation, ready for sync.\r\n | 'SYNCING' // Actively being sent to the server.\r\n | 'SYNCED' // Server confirmed success.\r\n | 'SYNC_FAILED'; // Server rejected the data.\r\n\r\nexport type ValidationState = {\r\n status: ValidationStatus;\r\n message?: string;\r\n lastValidated?: number;\r\n validatedValue?: any;\r\n};\r\nexport type CogsEvent =\r\n | { type: 'INSERT'; path: string; itemKey: string; index: number }\r\n | { type: 'REMOVE'; path: string; itemKey: string }\r\n | { type: 'UPDATE'; path: string; newValue: any }\r\n | { type: 'ITEMHEIGHT'; itemKey: string; height: number } // For full re-initializations (e.g., when a component is removed)\r\n | { type: 'RELOAD'; path: string }; // For full re-initializations\r\nexport type CogsGlobalState = {\r\n // --- Shadow State and Subscription System ---\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 shadowStateStore: Map<string, ShadowMetadata>;\r\n markAsDirty: (\r\n key: string,\r\n path: string[],\r\n options: { bubble: boolean }\r\n ) => void;\r\n // These method signatures stay the same\r\n initializeShadowState: (key: string, initialState: any) => void;\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => void;\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItem: any\r\n ) => void;\r\n removeShadowArrayElement: (key: string, arrayPath: string[]) => void;\r\n getShadowValue: (\r\n key: string,\r\n\r\n validArrayIds?: string[]\r\n ) => any;\r\n\r\n getShadowMetadata: (\r\n key: string,\r\n path: string[]\r\n ) => ShadowMetadata | undefined;\r\n setShadowMetadata: (\r\n key: string,\r\n path: string[],\r\n metadata: Omit<ShadowMetadata, 'id'>\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\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 // --- Core State and Updaters ---\r\n\r\n initialStateOptions: { [key: string]: OptionsType };\r\n\r\n initialStateGlobal: { [key: string]: StateValue };\r\n\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 // --- Validation ---\r\n validationErrors: Map<string, string[]>;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n removeValidationError: (path: string) => void;\r\n\r\n // --- Server Sync and Logging ---\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: { [key: string]: UpdateTypeDetail[] };\r\n syncInfoStore: Map<string, SyncInfo>;\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\nconst isSimpleObject = (value: any): boolean => {\r\n if (value === null || typeof value !== 'object') return false;\r\n\r\n // Handle special cases that should be treated as primitives\r\n if (\r\n value instanceof Uint8Array ||\r\n value instanceof Int8Array ||\r\n value instanceof Uint16Array ||\r\n value instanceof Int16Array ||\r\n value instanceof Uint32Array ||\r\n value instanceof Int32Array ||\r\n value instanceof Float32Array ||\r\n value instanceof Float64Array ||\r\n value instanceof ArrayBuffer ||\r\n value instanceof Date ||\r\n value instanceof RegExp ||\r\n value instanceof Map ||\r\n value instanceof Set\r\n ) {\r\n return false; // Treat as primitive\r\n }\r\n\r\n // Arrays and plain objects are complex\r\n return Array.isArray(value) || value.constructor === Object;\r\n};\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n addPathComponent: (stateKey, dependencyPath, fullComponentId) => {\r\n set((state) => {\r\n const newShadowStore = new Map(state.shadowStateStore);\r\n const dependencyKey = [stateKey, ...dependencyPath].join('.');\r\n\r\n // --- Part 1: Update the path's own metadata ---\r\n const pathMeta = newShadowStore.get(dependencyKey) || {};\r\n // Create a *new* Set to ensure immutability\r\n const pathComponents = new Set(pathMeta.pathComponents);\r\n pathComponents.add(fullComponentId);\r\n // Update the metadata for the specific path\r\n newShadowStore.set(dependencyKey, { ...pathMeta, pathComponents });\r\n\r\n // --- Part 2: Update the component's own list of paths ---\r\n const rootMeta = newShadowStore.get(stateKey) || {};\r\n const component = rootMeta.components?.get(fullComponentId);\r\n\r\n // If the component exists, update its `paths` set immutably\r\n if (component) {\r\n const newPaths = new Set(component.paths);\r\n newPaths.add(dependencyKey);\r\n\r\n const newComponentRegistration = { ...component, paths: newPaths };\r\n const newComponentsMap = new Map(rootMeta.components);\r\n newComponentsMap.set(fullComponentId, newComponentRegistration);\r\n\r\n // Update the root metadata with the new components map\r\n newShadowStore.set(stateKey, {\r\n ...rootMeta,\r\n components: newComponentsMap,\r\n });\r\n }\r\n\r\n // Return the final, updated state\r\n return { shadowStateStore: newShadowStore };\r\n });\r\n },\r\n registerComponent: (stateKey, fullComponentId, registration) => {\r\n set((state) => {\r\n // Create a new Map to ensure Zustand detects the change\r\n const newShadowStore = new Map(state.shadowStateStore);\r\n\r\n // Get the metadata for the ROOT of the state (where the components map lives)\r\n const rootMeta = newShadowStore.get(stateKey) || {};\r\n\r\n // Also clone the components map to avoid direct mutation\r\n const components = new Map(rootMeta.components);\r\n components.set(fullComponentId, registration);\r\n\r\n // Update the root metadata with the new components map\r\n newShadowStore.set(stateKey, { ...rootMeta, components });\r\n\r\n // Return the updated state\r\n return { shadowStateStore: newShadowStore };\r\n });\r\n },\r\n\r\n unregisterComponent: (stateKey, fullComponentId) => {\r\n set((state) => {\r\n const newShadowStore = new Map(state.shadowStateStore);\r\n const rootMeta = newShadowStore.get(stateKey);\r\n\r\n // If there's no metadata or no components map, do nothing\r\n if (!rootMeta?.components) {\r\n return state; // Return original state, no change needed\r\n }\r\n\r\n const components = new Map(rootMeta.components);\r\n const wasDeleted = components.delete(fullComponentId);\r\n\r\n // Only update state if something was actually deleted\r\n if (wasDeleted) {\r\n newShadowStore.set(stateKey, { ...rootMeta, components });\r\n return { shadowStateStore: newShadowStore };\r\n }\r\n\r\n return state; // Nothing changed\r\n });\r\n },\r\n markAsDirty: (key: string, path: string[], options = { bubble: true }) => {\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n let changed = false;\r\n\r\n const setDirty = (currentPath: string[]) => {\r\n const fullKey = [key, ...currentPath].join('.');\r\n const meta = newShadowStore.get(fullKey);\r\n\r\n // We mark something as dirty if it isn't already.\r\n // The original data source doesn't matter.\r\n if (meta && meta.isDirty !== true) {\r\n newShadowStore.set(fullKey, { ...meta, isDirty: true });\r\n changed = true;\r\n } else if (!meta) {\r\n // If there's no metadata, create it and mark it as dirty.\r\n // This handles newly created fields within an object.\r\n newShadowStore.set(fullKey, { isDirty: true });\r\n changed = true;\r\n }\r\n };\r\n\r\n // 1. Mark the target path itself as dirty.\r\n setDirty(path);\r\n\r\n // 2. If `bubble` is true, walk up the path and mark all parents as dirty.\r\n if (options.bubble) {\r\n let parentPath = [...path];\r\n while (parentPath.length > 0) {\r\n parentPath.pop();\r\n setDirty(parentPath);\r\n }\r\n }\r\n\r\n if (changed) {\r\n set({ shadowStateStore: newShadowStore });\r\n }\r\n },\r\n serverStateUpdates: new Map(),\r\n setServerStateUpdate: (key, serverState) => {\r\n set((state) => {\r\n const newMap = new Map(state.serverStateUpdates);\r\n newMap.set(key, serverState);\r\n return { serverStateUpdates: newMap };\r\n });\r\n\r\n // Notify all subscribers for this key\r\n get().notifyPathSubscribers(key, {\r\n type: 'SERVER_STATE_UPDATE',\r\n serverState,\r\n });\r\n },\r\n shadowStateStore: new Map(),\r\n pathSubscribers: new Map<string, Set<(newValue: any) => void>>(),\r\n\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\r\n if (subs) {\r\n subs.forEach((callback) => callback(newValue));\r\n }\r\n },\r\n\r\n initializeShadowState: (key: string, initialState: any) => {\r\n set((state) => {\r\n // 1. Make a copy of the current store to modify it\r\n const newShadowStore = new Map(state.shadowStateStore);\r\n\r\n // 2. PRESERVE the existing components map before doing anything else\r\n const existingRootMeta = newShadowStore.get(key);\r\n const preservedComponents = existingRootMeta?.components;\r\n\r\n // 3. Wipe all old shadow entries for this state key\r\n const prefixToDelete = key + '.';\r\n for (const k of Array.from(newShadowStore.keys())) {\r\n if (k === key || k.startsWith(prefixToDelete)) {\r\n newShadowStore.delete(k);\r\n }\r\n }\r\n\r\n // 4. Run your original logic to rebuild the state tree from scratch\r\n const processValue = (value: any, path: string[]) => {\r\n const nodeKey = [key, ...path].join('.');\r\n\r\n if (Array.isArray(value)) {\r\n const childIds: string[] = [];\r\n value.forEach(() => {\r\n const itemId = `id:${ulid()}`;\r\n childIds.push(nodeKey + '.' + itemId);\r\n });\r\n newShadowStore.set(nodeKey, { arrayKeys: childIds });\r\n value.forEach((item, index) => {\r\n const itemId = childIds[index]!.split('.').pop();\r\n processValue(item, [...path!, itemId!]);\r\n });\r\n } else if (isSimpleObject(value)) {\r\n const fields = Object.fromEntries(\r\n Object.keys(value).map((k) => [k, nodeKey + '.' + k])\r\n );\r\n newShadowStore.set(nodeKey, { fields });\r\n Object.keys(value).forEach((k) => {\r\n processValue(value[k], [...path, k]);\r\n });\r\n } else {\r\n newShadowStore.set(nodeKey, { value });\r\n }\r\n };\r\n processValue(initialState, []);\r\n\r\n // 5. RESTORE the preserved components map onto the new root metadata\r\n if (preservedComponents) {\r\n const newRootMeta = newShadowStore.get(key) || {};\r\n newShadowStore.set(key, {\r\n ...newRootMeta,\r\n components: preservedComponents,\r\n });\r\n }\r\n\r\n // 6. Return the completely updated state\r\n return { shadowStateStore: newShadowStore };\r\n });\r\n },\r\n\r\n getShadowValue: (fullKey: string, validArrayIds?: string[]) => {\r\n const shadowMeta = get().shadowStateStore.get(fullKey);\r\n\r\n // If no metadata found, return undefined\r\n if (!shadowMeta) {\r\n return undefined;\r\n }\r\n\r\n // For primitive values, return the value\r\n if (shadowMeta.value !== undefined) {\r\n return shadowMeta.value;\r\n }\r\n\r\n // For arrays, reconstruct with possible validArrayIds\r\n if (shadowMeta.arrayKeys) {\r\n const arrayKeys = validArrayIds ?? shadowMeta.arrayKeys;\r\n const items = arrayKeys.map((itemKey) => {\r\n // RECURSIVELY call getShadowValue for each item\r\n return get().getShadowValue(itemKey);\r\n });\r\n return items;\r\n }\r\n\r\n // For objects with fields, reconstruct object\r\n if (shadowMeta.fields) {\r\n const reconstructedObject: any = {};\r\n Object.entries(shadowMeta.fields).forEach(([key, fieldPath]) => {\r\n // RECURSIVELY call getShadowValue for each field\r\n reconstructedObject[key] = get().getShadowValue(fieldPath as string);\r\n });\r\n return reconstructedObject;\r\n }\r\n\r\n return undefined;\r\n },\r\n getShadowMetadata: (\r\n key: string,\r\n path: string[],\r\n validArrayIds?: string[]\r\n ) => {\r\n const fullKey = [key, ...path].join('.');\r\n let data = get().shadowStateStore.get(fullKey);\r\n\r\n return get().shadowStateStore.get(fullKey);\r\n },\r\n\r\n setShadowMetadata: (key, path, metadata) => {\r\n const fullKey = [key, ...path].join('.');\r\n const existingMeta = get().shadowStateStore.get(fullKey);\r\n\r\n // --- THIS IS THE TRAP ---\r\n // If the existing metadata HAS a components map, but the NEW metadata DOES NOT,\r\n // it means we are about to wipe it out. This is the bug.\r\n if (existingMeta?.components && !metadata.components) {\r\n console.group(\r\n '%c🚨 RACE CONDITION DETECTED! 🚨',\r\n 'color: red; font-size: 18px; font-weight: bold;'\r\n );\r\n console.error(\r\n `An overwrite is about to happen on stateKey: \"${key}\" at path: [${path.join(', ')}]`\r\n );\r\n console.log(\r\n 'The EXISTING metadata had a components map:',\r\n existingMeta.components\r\n );\r\n console.log(\r\n 'The NEW metadata is trying to save WITHOUT a components map:',\r\n metadata\r\n );\r\n console.log(\r\n '%cStack trace to the function that caused this overwrite:',\r\n 'font-weight: bold;'\r\n );\r\n console.trace(); // This prints the call stack, leading you to the bad code.\r\n console.groupEnd();\r\n }\r\n // --- END OF TRAP ---\r\n\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n const finalMeta = { ...(existingMeta || {}), ...metadata };\r\n newShadowStore.set(fullKey, finalMeta);\r\n set({ shadowStateStore: newShadowStore });\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 fullKey = [key, ...path].join('.');\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n const existing = newShadowStore.get(fullKey) || {};\r\n\r\n // Initialize transformCaches if it doesn't exist\r\n if (!existing.transformCaches) {\r\n existing.transformCaches = new Map();\r\n }\r\n\r\n // Update just the specific cache entry\r\n existing.transformCaches.set(cacheKey, cacheData);\r\n\r\n // Update shadow store WITHOUT notifying path subscribers\r\n newShadowStore.set(fullKey, existing);\r\n set({ shadowStateStore: newShadowStore });\r\n\r\n // Don't call notifyPathSubscribers here - cache updates shouldn't trigger renders\r\n },\r\n insertShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n newItem: any\r\n ) => {\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n const arrayKey = [key, ...arrayPath].join('.');\r\n const parentMeta = newShadowStore.get(arrayKey);\r\n\r\n if (!parentMeta || !parentMeta.arrayKeys) return;\r\n\r\n const newItemId = `id:${ulid()}`;\r\n const fullItemKey = arrayKey + '.' + newItemId;\r\n\r\n // Just add to the end (or at a specific index if provided)\r\n const newArrayKeys = [...parentMeta.arrayKeys];\r\n newArrayKeys.push(fullItemKey); // Or use splice if you have an index\r\n newShadowStore.set(arrayKey, { ...parentMeta, arrayKeys: newArrayKeys });\r\n\r\n // Process the new item - but use the correct logic\r\n const processNewItem = (value: any, path: string[]) => {\r\n const nodeKey = [key, ...path].join('.');\r\n\r\n if (Array.isArray(value)) {\r\n // Handle arrays...\r\n } else if (typeof value === 'object' && value !== null) {\r\n // Create fields mapping\r\n const fields = Object.fromEntries(\r\n Object.keys(value).map((k) => [k, nodeKey + '.' + k])\r\n );\r\n newShadowStore.set(nodeKey, { fields });\r\n\r\n // Process each field\r\n Object.entries(value).forEach(([k, v]) => {\r\n processNewItem(v, [...path, k]);\r\n });\r\n } else {\r\n // Primitive value\r\n newShadowStore.set(nodeKey, { value });\r\n }\r\n };\r\n\r\n processNewItem(newItem, [...arrayPath, newItemId]);\r\n set({ shadowStateStore: newShadowStore });\r\n\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'INSERT',\r\n path: arrayKey,\r\n itemKey: fullItemKey,\r\n });\r\n },\r\n removeShadowArrayElement: (key: string, itemPath: string[]) => {\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n\r\n // Get the full item key (e.g., \"stateKey.products.id:xxx\")\r\n const itemKey = [key, ...itemPath].join('.');\r\n\r\n // Extract parent path and item ID\r\n const parentPath = itemPath.slice(0, -1);\r\n const parentKey = [key, ...parentPath].join('.');\r\n\r\n // Get parent metadata\r\n const parentMeta = newShadowStore.get(parentKey);\r\n\r\n if (parentMeta && parentMeta.arrayKeys) {\r\n // Find the index of the item to remove\r\n const indexToRemove = parentMeta.arrayKeys.findIndex(\r\n (arrayItemKey) => arrayItemKey === itemKey\r\n );\r\n\r\n if (indexToRemove !== -1) {\r\n // Create new array keys with the item removed\r\n const newArrayKeys = parentMeta.arrayKeys.filter(\r\n (arrayItemKey) => arrayItemKey !== itemKey\r\n );\r\n\r\n // Update parent with new array keys\r\n newShadowStore.set(parentKey, {\r\n ...parentMeta,\r\n arrayKeys: newArrayKeys,\r\n });\r\n\r\n // Delete all data associated with the removed item\r\n const prefixToDelete = itemKey + '.';\r\n for (const k of Array.from(newShadowStore.keys())) {\r\n if (k === itemKey || k.startsWith(prefixToDelete)) {\r\n newShadowStore.delete(k);\r\n }\r\n }\r\n }\r\n }\r\n\r\n set({ shadowStateStore: newShadowStore });\r\n\r\n get().notifyPathSubscribers(parentKey, {\r\n type: 'REMOVE',\r\n path: parentKey,\r\n itemKey: itemKey, // The exact ID of the removed item\r\n });\r\n },\r\n updateShadowAtPath: (key, path, newValue) => {\r\n const newShadowStore = new Map(get().shadowStateStore);\r\n const fullKey = [key, ...path].join('.');\r\n\r\n const updateValue = (currentKey: string, valueToSet: any) => {\r\n const meta = newShadowStore.get(currentKey);\r\n\r\n // If it's a simple object with fields, update recursively\r\n if (isSimpleObject(valueToSet) && meta && meta.fields) {\r\n for (const fieldKey in valueToSet) {\r\n if (Object.prototype.hasOwnProperty.call(valueToSet, fieldKey)) {\r\n const childPath = meta.fields[fieldKey];\r\n const childValue = valueToSet[fieldKey];\r\n\r\n if (childPath) {\r\n updateValue(childPath as string, childValue);\r\n }\r\n }\r\n }\r\n } else {\r\n // For primitives (including Uint8Array), just replace the value\r\n // This gives you useState-like behavior\r\n const existing = newShadowStore.get(currentKey) || {};\r\n newShadowStore.set(currentKey, { ...existing, value: valueToSet });\r\n }\r\n };\r\n\r\n updateValue(fullKey, newValue);\r\n get().notifyPathSubscribers(fullKey, { type: 'UPDATE', newValue });\r\n set({ shadowStateStore: newShadowStore });\r\n },\r\n selectedIndicesMap: new Map<string, string>(),\r\n getSelectedIndex: (arrayKey: string, validIds?: string[]): number => {\r\n const itemKey = get().selectedIndicesMap.get(arrayKey);\r\n\r\n if (!itemKey) return -1;\r\n\r\n // Use validIds if provided (for filtered views), otherwise use all arrayKeys\r\n const arrayKeys =\r\n validIds ||\r\n getGlobalStore.getState().getShadowMetadata(arrayKey, [])?.arrayKeys;\r\n\r\n if (!arrayKeys) return -1;\r\n\r\n return arrayKeys.indexOf(itemKey);\r\n },\r\n\r\n setSelectedIndex: (arrayKey: string, itemKey: string | undefined) => {\r\n set((state) => {\r\n const newMap = 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\r\n get().notifyPathSubscribers(itemKey, {\r\n type: 'THIS_SELECTED',\r\n });\r\n }\r\n get().notifyPathSubscribers(arrayKey, {\r\n type: 'GET_SELECTED',\r\n });\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndex: ({ arrayKey }: { arrayKey: string }): void => {\r\n set((state) => {\r\n const newMap = state.selectedIndicesMap;\r\n const acutalKey = newMap.get(arrayKey);\r\n if (acutalKey) {\r\n get().notifyPathSubscribers(acutalKey, {\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 clearSelectedIndexesForState: (stateKey: string) => {\r\n set((state) => {\r\n const newOuterMap = new Map(state.selectedIndicesMap);\r\n const changed = newOuterMap.delete(stateKey);\r\n if (changed) {\r\n return { selectedIndicesMap: newOuterMap };\r\n } else {\r\n return {};\r\n }\r\n });\r\n },\r\n\r\n initialStateOptions: {},\r\n\r\n stateTimeline: {},\r\n cogsStateStore: {},\r\n stateLog: {},\r\n\r\n initialStateGlobal: {},\r\n\r\n validationErrors: new Map(),\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => {\r\n set((prev) => {\r\n const currentUpdates = prev.stateLog[key] ?? [];\r\n const newUpdates = updater(currentUpdates);\r\n return {\r\n stateLog: {\r\n ...prev.stateLog,\r\n [key]: newUpdates,\r\n },\r\n };\r\n });\r\n },\r\n\r\n addValidationError: (path, message) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n const existingMessages = updatedErrors.get(path) || [];\r\n console.log('addValidationError', path, message, existingMessages);\r\n // Append the new message instead of replacing\r\n updatedErrors.set(path, [...existingMessages, message]);\r\n return { validationErrors: updatedErrors };\r\n });\r\n },\r\n removeValidationError: (path) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n let doSomething = false;\r\n const pathArray = path.split('.');\r\n Array.from(updatedErrors.keys()).forEach((key) => {\r\n const keyArray = key.split('.');\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n if (keyArray[i] !== pathArray[i]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n doSomething = true;\r\n updatedErrors.delete(key);\r\n }\r\n }\r\n });\r\n\r\n return doSomething ? { validationErrors: updatedErrors } : prev;\r\n });\r\n },\r\n getValidationErrors: (path: string) => {\r\n const errors: string[] = [];\r\n const valErrors = get().validationErrors;\r\n const pathArray = path.split('.');\r\n\r\n // Helper to check if an index matches either a wildcard or is in an array of indices\r\n const isIndexMatch = (pathSegment: string, keySegment: string) => {\r\n if (pathSegment === '[*]') return true;\r\n if (Array.isArray(pathSegment)) {\r\n return pathSegment.includes(parseInt(keySegment));\r\n }\r\n return pathSegment === keySegment;\r\n };\r\n\r\n Array.from(valErrors.keys()).forEach((key) => {\r\n const keyArray = key.split('.');\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const pathSegment = pathArray[i];\r\n const keySegment = keyArray[i]!;\r\n\r\n // If current path segment is a number or [*], we need special handling\r\n if (pathSegment === '[*]' || Array.isArray(pathSegment)) {\r\n // Key segment should be a number if we're using [*] or array indices\r\n const keyIndex = parseInt(keySegment);\r\n if (isNaN(keyIndex)) {\r\n match = false;\r\n break;\r\n }\r\n\r\n if (!isIndexMatch(pathSegment, keySegment)) {\r\n match = false;\r\n break;\r\n }\r\n } else if (pathSegment !== keySegment) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n const errorMessages = valErrors.get(key);\r\n if (errorMessages) {\r\n errors.push(...errorMessages);\r\n }\r\n }\r\n }\r\n });\r\n\r\n return errors;\r\n },\r\n getInitialOptions: (key) => {\r\n return get().initialStateOptions[key];\r\n },\r\n\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: {\r\n ...prev.initialStateOptions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: {\r\n ...prev.initialStateGlobal,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { ...state, syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key: string) => get().syncInfoStore.get(key) || null,\r\n}));\r\n"],"names":["formRefStore","create","set","get","id","ref","state","newRefs","stateKey","allRefs","stateKeyPrefix","filteredRefs","isSimpleObject","value","getGlobalStore","dependencyPath","fullComponentId","newShadowStore","dependencyKey","pathMeta","pathComponents","rootMeta","component","newPaths","newComponentRegistration","newComponentsMap","registration","components","key","path","options","changed","setDirty","currentPath","fullKey","meta","parentPath","serverState","newMap","callback","subscribers","subsForPath","currentSubs","updatedPath","newValue","subs","initialState","preservedComponents","prefixToDelete","k","processValue","nodeKey","childIds","itemId","ulid","item","index","fields","newRootMeta","validArrayIds","shadowMeta","itemKey","reconstructedObject","fieldPath","metadata","existingMeta","finalMeta","cacheKey","cacheData","existing","arrayPath","newItem","arrayKey","parentMeta","newItemId","fullItemKey","newArrayKeys","processNewItem","v","itemPath","parentKey","arrayItemKey","updateValue","currentKey","valueToSet","fieldKey","childPath","childValue","validIds","arrayKeys","acutalKey","newOuterMap","updater","prev","currentUpdates","newUpdates","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","i","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","newState","syncInfo"],"mappings":";;AA4CO,MAAMA,IAAeC,EAA0B,CAACC,GAAKC,OAAS;AAAA,EACnE,8BAAc,IAAA;AAAA,EAEd,iBAAiB,CAACC,GAAIC,MACpBH,EAAI,CAACI,MAAU;AACb,UAAMC,IAAU,IAAI,IAAID,EAAM,QAAQ;AACtC,WAAAC,EAAQ,IAAIH,GAAIC,CAAG,GACZ,EAAE,UAAUE,EAAA;AAAA,EACrB,CAAC;AAAA,EAEH,YAAY,CAACH,MAAOD,IAAM,SAAS,IAAIC,CAAE;AAAA,EAEzC,eAAe,CAACA,MACdF,EAAI,CAACI,MAAU;AACb,UAAMC,IAAU,IAAI,IAAID,EAAM,QAAQ;AACtC,WAAAC,EAAQ,OAAOH,CAAE,GACV,EAAE,UAAUG,EAAA;AAAA,EACrB,CAAC;AAAA;AAAA,EAGH,uBAAuB,CAACC,MAAa;AACnC,UAAMC,IAAUN,IAAM,UAChBO,IAAiBF,IAAW,KAC5BG,wBAAmB,IAAA;AAEzB,WAAAF,EAAQ,QAAQ,CAACJ,GAAKD,MAAO;AAC3B,OAAIA,EAAG,WAAWM,CAAc,KAAKN,MAAOI,MAC1CG,EAAa,IAAIP,GAAIC,CAAG;AAAA,IAE5B,CAAC,GAEMM;AAAA,EACT;AACF,EAAE,GA4MIC,IAAiB,CAACC,MAClBA,MAAU,QAAQ,OAAOA,KAAU,YAIrCA,aAAiB,cACjBA,aAAiB,aACjBA,aAAiB,eACjBA,aAAiB,cACjBA,aAAiB,eACjBA,aAAiB,cACjBA,aAAiB,gBACjBA,aAAiB,gBACjBA,aAAiB,eACjBA,aAAiB,QACjBA,aAAiB,UACjBA,aAAiB,OACjBA,aAAiB,MAEV,KAIF,MAAM,QAAQA,CAAK,KAAKA,EAAM,gBAAgB,QAE1CC,IAAiBb,EAAwB,CAACC,GAAKC,OAAS;AAAA,EACnE,kBAAkB,CAACK,GAAUO,GAAgBC,MAAoB;AAC/D,IAAAd,EAAI,CAACI,MAAU;AACb,YAAMW,IAAiB,IAAI,IAAIX,EAAM,gBAAgB,GAC/CY,IAAgB,CAACV,GAAU,GAAGO,CAAc,EAAE,KAAK,GAAG,GAGtDI,IAAWF,EAAe,IAAIC,CAAa,KAAK,CAAA,GAEhDE,IAAiB,IAAI,IAAID,EAAS,cAAc;AACtD,MAAAC,EAAe,IAAIJ,CAAe,GAElCC,EAAe,IAAIC,GAAe,EAAE,GAAGC,GAAU,gBAAAC,GAAgB;AAGjE,YAAMC,IAAWJ,EAAe,IAAIT,CAAQ,KAAK,CAAA,GAC3Cc,IAAYD,EAAS,YAAY,IAAIL,CAAe;AAG1D,UAAIM,GAAW;AACb,cAAMC,IAAW,IAAI,IAAID,EAAU,KAAK;AACxC,QAAAC,EAAS,IAAIL,CAAa;AAE1B,cAAMM,IAA2B,EAAE,GAAGF,GAAW,OAAOC,EAAA,GAClDE,IAAmB,IAAI,IAAIJ,EAAS,UAAU;AACpD,QAAAI,EAAiB,IAAIT,GAAiBQ,CAAwB,GAG9DP,EAAe,IAAIT,GAAU;AAAA,UAC3B,GAAGa;AAAA,UACH,YAAYI;AAAA,QAAA,CACb;AAAA,MACH;AAGA,aAAO,EAAE,kBAAkBR,EAAA;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EACA,mBAAmB,CAACT,GAAUQ,GAAiBU,MAAiB;AAC9D,IAAAxB,EAAI,CAACI,MAAU;AAEb,YAAMW,IAAiB,IAAI,IAAIX,EAAM,gBAAgB,GAG/Ce,IAAWJ,EAAe,IAAIT,CAAQ,KAAK,CAAA,GAG3CmB,IAAa,IAAI,IAAIN,EAAS,UAAU;AAC9C,aAAAM,EAAW,IAAIX,GAAiBU,CAAY,GAG5CT,EAAe,IAAIT,GAAU,EAAE,GAAGa,GAAU,YAAAM,GAAY,GAGjD,EAAE,kBAAkBV,EAAA;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EAEA,qBAAqB,CAACT,GAAUQ,MAAoB;AAClD,IAAAd,EAAI,CAACI,MAAU;AACb,YAAMW,IAAiB,IAAI,IAAIX,EAAM,gBAAgB,GAC/Ce,IAAWJ,EAAe,IAAIT,CAAQ;AAG5C,UAAI,CAACa,GAAU;AACb,eAAOf;AAGT,YAAMqB,IAAa,IAAI,IAAIN,EAAS,UAAU;AAI9C,aAHmBM,EAAW,OAAOX,CAAe,KAIlDC,EAAe,IAAIT,GAAU,EAAE,GAAGa,GAAU,YAAAM,GAAY,GACjD,EAAE,kBAAkBV,EAAA,KAGtBX;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EACA,aAAa,CAACsB,GAAaC,GAAgBC,IAAU,EAAE,QAAQ,SAAW;AACxE,UAAMb,IAAiB,IAAI,IAAId,EAAA,EAAM,gBAAgB;AACrD,QAAI4B,IAAU;AAEd,UAAMC,IAAW,CAACC,MAA0B;AAC1C,YAAMC,IAAU,CAACN,GAAK,GAAGK,CAAW,EAAE,KAAK,GAAG,GACxCE,IAAOlB,EAAe,IAAIiB,CAAO;AAIvC,MAAIC,KAAQA,EAAK,YAAY,MAC3BlB,EAAe,IAAIiB,GAAS,EAAE,GAAGC,GAAM,SAAS,IAAM,GACtDJ,IAAU,MACAI,MAGVlB,EAAe,IAAIiB,GAAS,EAAE,SAAS,IAAM,GAC7CH,IAAU;AAAA,IAEd;AAMA,QAHAC,EAASH,CAAI,GAGTC,EAAQ,QAAQ;AAClB,UAAIM,IAAa,CAAC,GAAGP,CAAI;AACzB,aAAOO,EAAW,SAAS;AACzB,QAAAA,EAAW,IAAA,GACXJ,EAASI,CAAU;AAAA,IAEvB;AAEA,IAAIL,KACF7B,EAAI,EAAE,kBAAkBe,GAAgB;AAAA,EAE5C;AAAA,EACA,wCAAwB,IAAA;AAAA,EACxB,sBAAsB,CAACW,GAAKS,MAAgB;AAC1C,IAAAnC,EAAI,CAACI,MAAU;AACb,YAAMgC,IAAS,IAAI,IAAIhC,EAAM,kBAAkB;AAC/C,aAAAgC,EAAO,IAAIV,GAAKS,CAAW,GACpB,EAAE,oBAAoBC,EAAA;AAAA,IAC/B,CAAC,GAGDnC,EAAA,EAAM,sBAAsByB,GAAK;AAAA,MAC/B,MAAM;AAAA,MACN,aAAAS;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EACA,sCAAsB,IAAA;AAAA,EACtB,qCAAqB,IAAA;AAAA,EAErB,iBAAiB,CAACR,GAAMU,MAAa;AACnC,UAAMC,IAAcrC,IAAM,iBACpBsC,IAAcD,EAAY,IAAIX,CAAI,yBAAS,IAAA;AACjD,WAAAY,EAAY,IAAIF,CAAQ,GACxBC,EAAY,IAAIX,GAAMY,CAAW,GAE1B,MAAM;AACX,YAAMC,IAAcvC,EAAA,EAAM,gBAAgB,IAAI0B,CAAI;AAClD,MAAIa,MACFA,EAAY,OAAOH,CAAQ,GACvBG,EAAY,SAAS,KACvBvC,IAAM,gBAAgB,OAAO0B,CAAI;AAAA,IAGvC;AAAA,EACF;AAAA,EAEA,uBAAuB,CAACc,GAAaC,MAAa;AAEhD,UAAMC,IADc1C,IAAM,gBACD,IAAIwC,CAAW;AAExC,IAAIE,KACFA,EAAK,QAAQ,CAACN,MAAaA,EAASK,CAAQ,CAAC;AAAA,EAEjD;AAAA,EAEA,uBAAuB,CAAChB,GAAakB,MAAsB;AACzD,IAAA5C,EAAI,CAACI,MAAU;AAEb,YAAMW,IAAiB,IAAI,IAAIX,EAAM,gBAAgB,GAI/CyC,IADmB9B,EAAe,IAAIW,CAAG,GACD,YAGxCoB,IAAiBpB,IAAM;AAC7B,iBAAWqB,KAAK,MAAM,KAAKhC,EAAe,KAAA,CAAM;AAC9C,SAAIgC,MAAMrB,KAAOqB,EAAE,WAAWD,CAAc,MAC1C/B,EAAe,OAAOgC,CAAC;AAK3B,YAAMC,IAAe,CAACrC,GAAYgB,MAAmB;AACnD,cAAMsB,IAAU,CAACvB,GAAK,GAAGC,CAAI,EAAE,KAAK,GAAG;AAEvC,YAAI,MAAM,QAAQhB,CAAK,GAAG;AACxB,gBAAMuC,IAAqB,CAAA;AAC3B,UAAAvC,EAAM,QAAQ,MAAM;AAClB,kBAAMwC,IAAS,MAAMC,EAAA,CAAM;AAC3B,YAAAF,EAAS,KAAKD,IAAU,MAAME,CAAM;AAAA,UACtC,CAAC,GACDpC,EAAe,IAAIkC,GAAS,EAAE,WAAWC,GAAU,GACnDvC,EAAM,QAAQ,CAAC0C,GAAMC,MAAU;AAC7B,kBAAMH,IAASD,EAASI,CAAK,EAAG,MAAM,GAAG,EAAE,IAAA;AAC3C,YAAAN,EAAaK,GAAM,CAAC,GAAG1B,GAAOwB,CAAO,CAAC;AAAA,UACxC,CAAC;AAAA,QACH,WAAWzC,EAAeC,CAAK,GAAG;AAChC,gBAAM4C,IAAS,OAAO;AAAA,YACpB,OAAO,KAAK5C,CAAK,EAAE,IAAI,CAACoC,MAAM,CAACA,GAAGE,IAAU,MAAMF,CAAC,CAAC;AAAA,UAAA;AAEtD,UAAAhC,EAAe,IAAIkC,GAAS,EAAE,QAAAM,EAAA,CAAQ,GACtC,OAAO,KAAK5C,CAAK,EAAE,QAAQ,CAACoC,MAAM;AAChC,YAAAC,EAAarC,EAAMoC,CAAC,GAAG,CAAC,GAAGpB,GAAMoB,CAAC,CAAC;AAAA,UACrC,CAAC;AAAA,QACH;AACE,UAAAhC,EAAe,IAAIkC,GAAS,EAAE,OAAAtC,EAAA,CAAO;AAAA,MAEzC;AAIA,UAHAqC,EAAaJ,GAAc,EAAE,GAGzBC,GAAqB;AACvB,cAAMW,IAAczC,EAAe,IAAIW,CAAG,KAAK,CAAA;AAC/C,QAAAX,EAAe,IAAIW,GAAK;AAAA,UACtB,GAAG8B;AAAA,UACH,YAAYX;AAAA,QAAA,CACb;AAAA,MACH;AAGA,aAAO,EAAE,kBAAkB9B,EAAA;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,CAACiB,GAAiByB,MAA6B;AAC7D,UAAMC,IAAazD,EAAA,EAAM,iBAAiB,IAAI+B,CAAO;AAGrD,QAAK0B,GAKL;AAAA,UAAIA,EAAW,UAAU;AACvB,eAAOA,EAAW;AAIpB,UAAIA,EAAW;AAMb,gBALkBD,KAAiBC,EAAW,WACtB,IAAI,CAACC,MAEpB1D,EAAA,EAAM,eAAe0D,CAAO,CACpC;AAKH,UAAID,EAAW,QAAQ;AACrB,cAAME,IAA2B,CAAA;AACjC,sBAAO,QAAQF,EAAW,MAAM,EAAE,QAAQ,CAAC,CAAChC,GAAKmC,CAAS,MAAM;AAE9D,UAAAD,EAAoBlC,CAAG,IAAIzB,EAAA,EAAM,eAAe4D,CAAmB;AAAA,QACrE,CAAC,GACMD;AAAA,MACT;AAAA;AAAA,EAGF;AAAA,EACA,mBAAmB,CACjBlC,GACAC,GACA8B,MACG;AACH,UAAMzB,IAAU,CAACN,GAAK,GAAGC,CAAI,EAAE,KAAK,GAAG;AAC5B,WAAA1B,EAAA,EAAM,iBAAiB,IAAI+B,CAAO,GAEtC/B,EAAA,EAAM,iBAAiB,IAAI+B,CAAO;AAAA,EAC3C;AAAA,EAEA,mBAAmB,CAACN,GAAKC,GAAMmC,MAAa;AAC1C,UAAM9B,IAAU,CAACN,GAAK,GAAGC,CAAI,EAAE,KAAK,GAAG,GACjCoC,IAAe9D,EAAA,EAAM,iBAAiB,IAAI+B,CAAO;AAKvD,IAAI+B,GAAc,cAAc,CAACD,EAAS,eACxC,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,IAAA,GAEF,QAAQ;AAAA,MACN,iDAAiDpC,CAAG,eAAeC,EAAK,KAAK,IAAI,CAAC;AAAA,IAAA,GAEpF,QAAQ;AAAA,MACN;AAAA,MACAoC,EAAa;AAAA,IAAA,GAEf,QAAQ;AAAA,MACN;AAAA,MACAD;AAAA,IAAA,GAEF,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,IAAA,GAEF,QAAQ,MAAA,GACR,QAAQ,SAAA;AAIV,UAAM/C,IAAiB,IAAI,IAAId,EAAA,EAAM,gBAAgB,GAC/C+D,IAAY,EAAE,GAAID,KAAgB,CAAA,GAAK,GAAGD,EAAA;AAChD,IAAA/C,EAAe,IAAIiB,GAASgC,CAAS,GACrChE,EAAI,EAAE,kBAAkBe,GAAgB;AAAA,EAC1C;AAAA,EACA,mBAAmB,CACjBW,GACAC,GACAsC,GACAC,MACG;AACH,UAAMlC,IAAU,CAACN,GAAK,GAAGC,CAAI,EAAE,KAAK,GAAG,GACjCZ,IAAiB,IAAI,IAAId,EAAA,EAAM,gBAAgB,GAC/CkE,IAAWpD,EAAe,IAAIiB,CAAO,KAAK,CAAA;AAGhD,IAAKmC,EAAS,oBACZA,EAAS,sCAAsB,IAAA,IAIjCA,EAAS,gBAAgB,IAAIF,GAAUC,CAAS,GAGhDnD,EAAe,IAAIiB,GAASmC,CAAQ,GACpCnE,EAAI,EAAE,kBAAkBe,GAAgB;AAAA,EAG1C;AAAA,EACA,0BAA0B,CACxBW,GACA0C,GACAC,MACG;AACH,UAAMtD,IAAiB,IAAI,IAAId,EAAA,EAAM,gBAAgB,GAC/CqE,IAAW,CAAC5C,GAAK,GAAG0C,CAAS,EAAE,KAAK,GAAG,GACvCG,IAAaxD,EAAe,IAAIuD,CAAQ;AAE9C,QAAI,CAACC,KAAc,CAACA,EAAW,UAAW;AAE1C,UAAMC,IAAY,MAAMpB,EAAA,CAAM,IACxBqB,IAAcH,IAAW,MAAME,GAG/BE,IAAe,CAAC,GAAGH,EAAW,SAAS;AAC7C,IAAAG,EAAa,KAAKD,CAAW,GAC7B1D,EAAe,IAAIuD,GAAU,EAAE,GAAGC,GAAY,WAAWG,GAAc;AAGvE,UAAMC,IAAiB,CAAChE,GAAYgB,MAAmB;AACrD,YAAMsB,IAAU,CAACvB,GAAK,GAAGC,CAAI,EAAE,KAAK,GAAG;AAEvC,UAAI,OAAM,QAAQhB,CAAK,EAEvB,KAAW,OAAOA,KAAU,YAAYA,MAAU,MAAM;AAEtD,cAAM4C,IAAS,OAAO;AAAA,UACpB,OAAO,KAAK5C,CAAK,EAAE,IAAI,CAACoC,MAAM,CAACA,GAAGE,IAAU,MAAMF,CAAC,CAAC;AAAA,QAAA;AAEtD,QAAAhC,EAAe,IAAIkC,GAAS,EAAE,QAAAM,EAAA,CAAQ,GAGtC,OAAO,QAAQ5C,CAAK,EAAE,QAAQ,CAAC,CAACoC,GAAG6B,CAAC,MAAM;AACxC,UAAAD,EAAeC,GAAG,CAAC,GAAGjD,GAAMoB,CAAC,CAAC;AAAA,QAChC,CAAC;AAAA,MACH;AAEE,QAAAhC,EAAe,IAAIkC,GAAS,EAAE,OAAAtC,EAAA,CAAO;AAAA,IAEzC;AAEA,IAAAgE,EAAeN,GAAS,CAAC,GAAGD,GAAWI,CAAS,CAAC,GACjDxE,EAAI,EAAE,kBAAkBe,GAAgB,GAExCd,EAAA,EAAM,sBAAsBqE,GAAU;AAAA,MACpC,MAAM;AAAA,MACN,MAAMA;AAAA,MACN,SAASG;AAAA,IAAA,CACV;AAAA,EACH;AAAA,EACA,0BAA0B,CAAC/C,GAAamD,MAAuB;AAC7D,UAAM9D,IAAiB,IAAI,IAAId,EAAA,EAAM,gBAAgB,GAG/C0D,IAAU,CAACjC,GAAK,GAAGmD,CAAQ,EAAE,KAAK,GAAG,GAGrC3C,IAAa2C,EAAS,MAAM,GAAG,EAAE,GACjCC,IAAY,CAACpD,GAAK,GAAGQ,CAAU,EAAE,KAAK,GAAG,GAGzCqC,IAAaxD,EAAe,IAAI+D,CAAS;AAE/C,QAAIP,KAAcA,EAAW,aAELA,EAAW,UAAU;AAAA,MACzC,CAACQ,MAAiBA,MAAiBpB;AAAA,IAAA,MAGf,IAAI;AAExB,YAAMe,IAAeH,EAAW,UAAU;AAAA,QACxC,CAACQ,MAAiBA,MAAiBpB;AAAA,MAAA;AAIrC,MAAA5C,EAAe,IAAI+D,GAAW;AAAA,QAC5B,GAAGP;AAAA,QACH,WAAWG;AAAA,MAAA,CACZ;AAGD,YAAM5B,IAAiBa,IAAU;AACjC,iBAAWZ,KAAK,MAAM,KAAKhC,EAAe,KAAA,CAAM;AAC9C,SAAIgC,MAAMY,KAAWZ,EAAE,WAAWD,CAAc,MAC9C/B,EAAe,OAAOgC,CAAC;AAAA,IAG7B;AAGF,IAAA/C,EAAI,EAAE,kBAAkBe,GAAgB,GAExCd,EAAA,EAAM,sBAAsB6E,GAAW;AAAA,MACrC,MAAM;AAAA,MACN,MAAMA;AAAA,MACN,SAAAnB;AAAA;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EACA,oBAAoB,CAACjC,GAAKC,GAAMe,MAAa;AAC3C,UAAM3B,IAAiB,IAAI,IAAId,EAAA,EAAM,gBAAgB,GAC/C+B,IAAU,CAACN,GAAK,GAAGC,CAAI,EAAE,KAAK,GAAG,GAEjCqD,IAAc,CAACC,GAAoBC,MAAoB;AAC3D,YAAMjD,IAAOlB,EAAe,IAAIkE,CAAU;AAG1C,UAAIvE,EAAewE,CAAU,KAAKjD,KAAQA,EAAK;AAC7C,mBAAWkD,KAAYD;AACrB,cAAI,OAAO,UAAU,eAAe,KAAKA,GAAYC,CAAQ,GAAG;AAC9D,kBAAMC,IAAYnD,EAAK,OAAOkD,CAAQ,GAChCE,IAAaH,EAAWC,CAAQ;AAEtC,YAAIC,KACFJ,EAAYI,GAAqBC,CAAU;AAAA,UAE/C;AAAA,aAEG;AAGL,cAAMlB,IAAWpD,EAAe,IAAIkE,CAAU,KAAK,CAAA;AACnD,QAAAlE,EAAe,IAAIkE,GAAY,EAAE,GAAGd,GAAU,OAAOe,GAAY;AAAA,MACnE;AAAA,IACF;AAEA,IAAAF,EAAYhD,GAASU,CAAQ,GAC7BzC,EAAA,EAAM,sBAAsB+B,GAAS,EAAE,MAAM,UAAU,UAAAU,GAAU,GACjE1C,EAAI,EAAE,kBAAkBe,GAAgB;AAAA,EAC1C;AAAA,EACA,wCAAwB,IAAA;AAAA,EACxB,kBAAkB,CAACuD,GAAkBgB,MAAgC;AACnE,UAAM3B,IAAU1D,EAAA,EAAM,mBAAmB,IAAIqE,CAAQ;AAErD,QAAI,CAACX,EAAS,QAAO;AAGrB,UAAM4B,IACJD,KACA1E,EAAe,SAAA,EAAW,kBAAkB0D,GAAU,CAAA,CAAE,GAAG;AAE7D,WAAKiB,IAEEA,EAAU,QAAQ5B,CAAO,IAFT;AAAA,EAGzB;AAAA,EAEA,kBAAkB,CAACW,GAAkBX,MAAgC;AACnE,IAAA3D,EAAI,CAACI,MAAU;AACb,YAAMgC,IAAShC,EAAM;AAErB,aAAIuD,MAAY,SACdvB,EAAO,OAAOkC,CAAQ,KAElBlC,EAAO,IAAIkC,CAAQ,KACrBrE,EAAA,EAAM,sBAAsBmC,EAAO,IAAIkC,CAAQ,GAAI;AAAA,QACjD,MAAM;AAAA,MAAA,CACP,GAEHlC,EAAO,IAAIkC,GAAUX,CAAO,GAE5B1D,EAAA,EAAM,sBAAsB0D,GAAS;AAAA,QACnC,MAAM;AAAA,MAAA,CACP,IAEH1D,EAAA,EAAM,sBAAsBqE,GAAU;AAAA,QACpC,MAAM;AAAA,MAAA,CACP,GACM;AAAA,QACL,GAAGlE;AAAA,QACH,oBAAoBgC;AAAA,MAAA;AAAA,IAExB,CAAC;AAAA,EACH;AAAA,EACA,oBAAoB,CAAC,EAAE,UAAAkC,QAA2C;AAChE,IAAAtE,EAAI,CAACI,MAAU;AACb,YAAMgC,IAAShC,EAAM,oBACfoF,IAAYpD,EAAO,IAAIkC,CAAQ;AACrC,aAAIkB,KACFvF,EAAA,EAAM,sBAAsBuF,GAAW;AAAA,QACrC,MAAM;AAAA,MAAA,CACP,GAGHpD,EAAO,OAAOkC,CAAQ,GACtBrE,EAAA,EAAM,sBAAsBqE,GAAU;AAAA,QACpC,MAAM;AAAA,MAAA,CACP,GACM;AAAA,QACL,GAAGlE;AAAA,QACH,oBAAoBgC;AAAA,MAAA;AAAA,IAExB,CAAC;AAAA,EACH;AAAA,EACA,8BAA8B,CAAC9B,MAAqB;AAClD,IAAAN,EAAI,CAACI,MAAU;AACb,YAAMqF,IAAc,IAAI,IAAIrF,EAAM,kBAAkB;AAEpD,aADgBqF,EAAY,OAAOnF,CAAQ,IAElC,EAAE,oBAAoBmF,EAAA,IAEtB,CAAA;AAAA,IAEX,CAAC;AAAA,EACH;AAAA,EAEA,qBAAqB,CAAA;AAAA,EAErB,eAAe,CAAA;AAAA,EACf,gBAAgB,CAAA;AAAA,EAChB,UAAU,CAAA;AAAA,EAEV,oBAAoB,CAAA;AAAA,EAEpB,sCAAsB,IAAA;AAAA,EAEtB,aAAa,CACX/D,GACAgE,MACG;AACH,IAAA1F,EAAI,CAAC2F,MAAS;AACZ,YAAMC,IAAiBD,EAAK,SAASjE,CAAG,KAAK,CAAA,GACvCmE,IAAaH,EAAQE,CAAc;AACzC,aAAO;AAAA,QACL,UAAU;AAAA,UACR,GAAGD,EAAK;AAAA,UACR,CAACjE,CAAG,GAAGmE;AAAA,QAAA;AAAA,MACT;AAAA,IAEJ,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB,CAAClE,GAAMmE,MAAY;AACrC,IAAA9F,EAAI,CAAC2F,MAAS;AACZ,YAAMI,IAAgB,IAAI,IAAIJ,EAAK,gBAAgB,GAC7CK,IAAmBD,EAAc,IAAIpE,CAAI,KAAK,CAAA;AACpD,qBAAQ,IAAI,sBAAsBA,GAAMmE,GAASE,CAAgB,GAEjED,EAAc,IAAIpE,GAAM,CAAC,GAAGqE,GAAkBF,CAAO,CAAC,GAC/C,EAAE,kBAAkBC,EAAA;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EACA,uBAAuB,CAACpE,MAAS;AAC/B,IAAA3B,EAAI,CAAC2F,MAAS;AACZ,YAAMI,IAAgB,IAAI,IAAIJ,EAAK,gBAAgB;AAEnD,UAAIM,IAAc;AAClB,YAAMC,IAAYvE,EAAK,MAAM,GAAG;AAChC,mBAAM,KAAKoE,EAAc,KAAA,CAAM,EAAE,QAAQ,CAACrE,MAAQ;AAChD,cAAMyE,IAAWzE,EAAI,MAAM,GAAG;AAC9B,YAAIyE,EAAS,UAAUD,EAAU,QAAQ;AACvC,cAAIE,IAAQ;AACZ,mBAASC,IAAI,GAAGA,IAAIH,EAAU,QAAQG;AACpC,gBAAIF,EAASE,CAAC,MAAMH,EAAUG,CAAC,GAAG;AAChC,cAAAD,IAAQ;AACR;AAAA,YACF;AAGF,UAAIA,MACFH,IAAc,IACdF,EAAc,OAAOrE,CAAG;AAAA,QAE5B;AAAA,MACF,CAAC,GAEMuE,IAAc,EAAE,kBAAkBF,EAAA,IAAkBJ;AAAA,IAC7D,CAAC;AAAA,EACH;AAAA,EACA,qBAAqB,CAAChE,MAAiB;AACrC,UAAM2E,IAAmB,CAAA,GACnBC,IAAYtG,IAAM,kBAClBiG,IAAYvE,EAAK,MAAM,GAAG,GAG1B6E,IAAe,CAACC,GAAqBC,MACrCD,MAAgB,QAAc,KAC9B,MAAM,QAAQA,CAAW,IACpBA,EAAY,SAAS,SAASC,CAAU,CAAC,IAE3CD,MAAgBC;AAGzB,iBAAM,KAAKH,EAAU,KAAA,CAAM,EAAE,QAAQ,CAAC7E,MAAQ;AAC5C,YAAMyE,IAAWzE,EAAI,MAAM,GAAG;AAC9B,UAAIyE,EAAS,UAAUD,EAAU,QAAQ;AACvC,YAAIE,IAAQ;AACZ,iBAASC,IAAI,GAAGA,IAAIH,EAAU,QAAQG,KAAK;AACzC,gBAAMI,IAAcP,EAAUG,CAAC,GACzBK,IAAaP,EAASE,CAAC;AAG7B,cAAII,MAAgB,SAAS,MAAM,QAAQA,CAAW,GAAG;AAEvD,kBAAME,IAAW,SAASD,CAAU;AACpC,gBAAI,MAAMC,CAAQ,GAAG;AACnB,cAAAP,IAAQ;AACR;AAAA,YACF;AAEA,gBAAI,CAACI,EAAaC,GAAaC,CAAU,GAAG;AAC1C,cAAAN,IAAQ;AACR;AAAA,YACF;AAAA,UACF,WAAWK,MAAgBC,GAAY;AACrC,YAAAN,IAAQ;AACR;AAAA,UACF;AAAA,QACF;AAEA,YAAIA,GAAO;AACT,gBAAMQ,IAAgBL,EAAU,IAAI7E,CAAG;AACvC,UAAIkF,KACFN,EAAO,KAAK,GAAGM,CAAa;AAAA,QAEhC;AAAA,MACF;AAAA,IACF,CAAC,GAEMN;AAAA,EACT;AAAA,EACA,mBAAmB,CAAC5E,MACXzB,EAAA,EAAM,oBAAoByB,CAAG;AAAA,EAGtC,wBAAwB,CAACA,GAAKf,MAAU;AACtC,IAAAX,EAAI,CAAC2F,OAAU;AAAA,MACb,qBAAqB;AAAA,QACnB,GAAGA,EAAK;AAAA,QACR,CAACjE,CAAG,GAAGf;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,0BAA0B,CAACe,GAAKmF,MAAa;AAC3C,IAAA7G,EAAI,CAAC2F,OAAU;AAAA,MACb,oBAAoB;AAAA,QAClB,GAAGA,EAAK;AAAA,QACR,CAACjE,CAAG,GAAGmF;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EAEA,mCAAmB,IAAA;AAAA,EACnB,aAAa,CAACnF,GAAaoF,MACzB9G,EAAI,CAACI,MAAU;AACb,UAAMgC,IAAS,IAAI,IAAIhC,EAAM,aAAa;AAC1C,WAAAgC,EAAO,IAAIV,GAAKoF,CAAQ,GACjB,EAAE,GAAG1G,GAAO,eAAegC,EAAA;AAAA,EACpC,CAAC;AAAA,EACH,aAAa,CAACV,MAAgBzB,EAAA,EAAM,cAAc,IAAIyB,CAAG,KAAK;AAChE,EAAE;"}
@@ -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\nexport function getNestedValue<TStateObject extends unknown>(\r\n obj: TStateObject,\r\n pathArray: string[],\r\n stateKey: string // <-- ADD THIS ARGUMENT\r\n) {\r\n let value: any = obj;\r\n\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const key = pathArray[i]!;\r\n if (value === undefined || value === null) {\r\n return undefined;\r\n }\r\n\r\n if (typeof key === 'string' && key.startsWith('id:')) {\r\n if (!Array.isArray(value)) {\r\n console.error(\"Path segment with 'id:' requires an array.\", {\r\n path: pathArray,\r\n currentValue: value,\r\n });\r\n return undefined;\r\n }\r\n\r\n // --- START OF THE SURGICAL FIX ---\r\n\r\n // 1. Construct the FULL path of the item we are looking for.\r\n const parentPath = pathArray.slice(0, i);\r\n const fullItemPathToFind = [stateKey, ...parentPath, key].join('.');\r\n\r\n // 2. Get the metadata for the PARENT array.\r\n const parentShadowKey = [stateKey, ...parentPath].join('.');\r\n const parentShadowMeta = getGlobalStore\r\n .getState()\r\n .shadowStateStore.get(parentShadowKey);\r\n\r\n if (!parentShadowMeta?.arrayKeys) {\r\n console.error(\r\n 'No arrayKeys found in shadow state for parent path:',\r\n parentShadowKey\r\n );\r\n return undefined;\r\n }\r\n\r\n // 3. Find the INDEX of the full item path in the parent's arrayKeys.\r\n const itemIndex = parentShadowMeta.arrayKeys.indexOf(fullItemPathToFind);\r\n\r\n if (itemIndex === -1) {\r\n console.error(\r\n `Item key ${fullItemPathToFind} not found in parent's arrayKeys:`,\r\n parentShadowMeta.arrayKeys\r\n );\r\n return undefined;\r\n }\r\n\r\n // 4. Use that index to get the item from the plain JS array.\r\n value = value[itemIndex];\r\n\r\n // --- END OF THE SURGICAL FIX ---\r\n } else if (Array.isArray(value)) {\r\n value = value[parseInt(key)];\r\n } else {\r\n value = value[key];\r\n }\r\n }\r\n return value;\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","updateNestedProperty","path","state","update","head","tail","index","deleteNestedProperty","_","rest","getNestedValue","obj","pathArray","stateKey","value","parentPath","fullItemPathToFind","parentShadowKey","parentShadowMeta","getGlobalStore","itemIndex","getDifferences","obj1","obj2","differences","commonLength","i","longerArrayPath","keys1","keys2","deepMerge","target","source","output","getDifferencesArray","string","getArrayLengthDifferences","keys","getArrayLengthDifferencesArray","transformStateFunc","initialState","isInitialStateType","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 { 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\nexport function getNestedValue<TStateObject extends unknown>(\r\n obj: TStateObject,\r\n pathArray: string[],\r\n stateKey: string // <-- ADD THIS ARGUMENT\r\n) {\r\n let value: any = obj;\r\n\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const key = pathArray[i]!;\r\n if (value === undefined || value === null) {\r\n return undefined;\r\n }\r\n\r\n if (typeof key === 'string' && key.startsWith('id:')) {\r\n if (!Array.isArray(value)) {\r\n console.error(\"Path segment with 'id:' requires an array.\", {\r\n path: pathArray,\r\n currentValue: value,\r\n });\r\n return undefined;\r\n }\r\n\r\n // --- START OF THE SURGICAL FIX ---\r\n\r\n // 1. Construct the FULL path of the item we are looking for.\r\n const parentPath = pathArray.slice(0, i);\r\n const fullItemPathToFind = [stateKey, ...parentPath, key].join('.');\r\n\r\n // 2. Get the metadata for the PARENT array.\r\n const parentShadowKey = [stateKey, ...parentPath].join('.');\r\n const parentShadowMeta = getGlobalStore\r\n .getState()\r\n .shadowStateStore.get(parentShadowKey);\r\n\r\n if (!parentShadowMeta?.arrayKeys) {\r\n console.error(\r\n 'No arrayKeys found in shadow state for parent path:',\r\n parentShadowKey\r\n );\r\n return undefined;\r\n }\r\n\r\n // 3. Find the INDEX of the full item path in the parent's arrayKeys.\r\n const itemIndex = parentShadowMeta.arrayKeys.indexOf(fullItemPathToFind);\r\n\r\n if (itemIndex === -1) {\r\n console.error(\r\n `Item key ${fullItemPathToFind} not found in parent's arrayKeys:`,\r\n parentShadowMeta.arrayKeys\r\n );\r\n return undefined;\r\n }\r\n\r\n // 4. Use that index to get the item from the plain JS array.\r\n value = value[itemIndex];\r\n\r\n // --- END OF THE SURGICAL FIX ---\r\n } else if (Array.isArray(value)) {\r\n value = value[parseInt(key)];\r\n } else {\r\n value = value[key];\r\n }\r\n }\r\n return value;\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","updateNestedProperty","path","state","update","head","tail","index","deleteNestedProperty","_","rest","getNestedValue","obj","pathArray","stateKey","value","parentPath","fullItemPathToFind","parentShadowKey","parentShadowMeta","getGlobalStore","itemIndex","getDifferences","obj1","obj2","differences","commonLength","i","longerArrayPath","keys1","keys2","deepMerge","target","source","output","getDifferencesArray","string","getArrayLengthDifferences","keys","getArrayLengthDifferencesArray","transformStateFunc","initialState","isInitialStateType","initalOptions","transformInitialState","transformedState","debounce","func","wait","timeoutID","debounced","args"],"mappings":";AAEO,MAAMA,IAAW,CAACC,MAErBA,KAAQ,OAAOA,KAAS,YAAY,CAAC,MAAM,QAAQA,CAAI,KAAKA,MAAS,MAK5DC,IAAa,CACxBC,MACgD,OAAOA,KAAQ,YAEpDC,IAAU,CAACH,MACf,MAAM,QAAQA,CAAI,GAEdI,IAAc,CACzBC,GACAC,GACAC,IAA6B,CAAA,GAC7BC,IAAwB,OACZ;AACZ,MAAIT,EAASM,CAAO,KAAKN,EAASO,CAAO,GAAG;AAC1C,UAAMG,IAAW,OAAO,KAAKJ,CAAO,GAC9BK,IAAW,OAAO,KAAKJ,CAAO;AAEpC,QAAIG,EAAS,WAAWC,EAAS;AAE/B,aAAO;AAGT,aAASC,KAAOF,GAAU;AACxB,YAAMG,IAASP,EAAQM,CAAG,GACpBE,IAASP,EAAQK,CAAG;AAG1B,UAAI,EAAEA,KAAON,MAAY,EAAEM,KAAOL;AAEhC,eAAO;AAGT,YAAMQ,IAAU,CAAC,GAAGN,GAAaG,CAAG;AAIpC,UAAI,CAACP,EAAYQ,GAAQC,GAAQN,GAAMO,CAAO;AAE5C,eAAO;AAAA,IAEX;AACA,WAAO;AAAA,EACT,WAAWX,EAAQE,CAAO,KAAKF,EAAQG,CAAO,GAAG;AAC/C,QAAID,EAAQ,WAAWC,EAAQ;AAE7B,aAAO;AAGT,aAAS,IAAI,GAAG,IAAID,EAAQ,QAAQ;AAClC,UACE,CAACD,EAAYC,EAAQ,CAAC,GAAGC,EAAQ,CAAC,GAAGC,GAAM;AAAA,QACzC,GAAGC;AAAA,QACH,EAAE,SAAA;AAAA,MAAS,CACZ;AAGD,eAAO;AAGX,WAAO;AAAA,EACT;AACE,WACEH,MAAYC,KAAY,OAAO,MAAMD,CAAO,KAAK,OAAO,MAAMC,CAAO;AAG3E;AAEO,SAASS,EACdC,GACAC,GACAC,GACK;AACL,MAAI,CAACF,KAAQA,EAAK,WAAW,EAAG,QAAOE;AACvC,QAAMC,IAAOH,EAAK,CAAC,GACbI,IAAOJ,EAAK,MAAM,CAAC;AAEzB,MAAI,MAAM,QAAQC,CAAK,GAAG;AACxB,UAAMI,IAAQ,OAAOF,CAAI;AAEzB,QAAI,CAAC,MAAME,CAAK,KAAKA,KAAS,KAAKA,IAAQJ,EAAM;AAC/C,aAAO;AAAA,QACL,GAAGA,EAAM,MAAM,GAAGI,CAAK;AAAA,QACvBN,EAAqBK,GAAMH,EAAMI,CAAK,GAAGH,CAAM;AAAA,QAC/C,GAAGD,EAAM,MAAMI,IAAQ,CAAC;AAAA,MAAA;AAG1B,kBAAQ,IAAI,cAAcJ,GAAOD,CAAI,GAC/B,IAAI;AAAA,MACR,wBAAwBK,CAAK,cAAcL,EAAK,KAAK,GAAG,CAAC;AAAA,IAAA;AAAA,EAG/D,WAAW,OAAOC,KAAU,YAAYA,MAAU,MAAM;AACtD,QAAIE,KAAQA,KAAQF;AAClB,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,CAACE,CAAK,GAAGJ,EAAqBK,GAAMH,EAAME,CAAK,GAAGD,CAAM;AAAA,MAAA;AAG1D,kBAAQ,IAAI,oBAAoBC,GAAMC,GAAMJ,CAAI,GAC1C,IAAI;AAAA,MACR,qBAAqBG,CAAI,cAAcH,EAAK,KAAK,GAAG,CAAC;AAAA,IAAA;AAAA,EAG3D;AACE,UAAM,IAAI;AAAA,MACR,0CAA0CA,EAAK,KAAK,GAAG,CAAC;AAAA,IAAA;AAG9D;AAEO,SAASM,EAAqBN,GAAgBC,GAAiB;AACpE,MAAI,CAACD,KAAQA,EAAK,WAAW,EAAG,QAAOC;AACvC,QAAME,IAAOH,EAAK,CAAC,GACbI,IAAOJ,EAAK,MAAM,CAAC;AAEzB,MAAI,MAAM,QAAQC,CAAK,GAAG;AACxB,UAAMI,IAAQ,OAAOF,CAAI;AAEzB,QAAI,CAAC,MAAME,CAAK,KAAKA,KAAS,KAAKA,IAAQJ,EAAM;AAC/C,aAAIG,EAAK,WAAW,IAEX,CAAC,GAAGH,EAAM,MAAM,GAAGI,CAAK,GAAG,GAAGJ,EAAM,MAAMI,IAAQ,CAAC,CAAC,IAEpD;AAAA,QACL,GAAGJ,EAAM,MAAM,GAAGI,CAAK;AAAA,QACvBC,EAAqBF,GAAMH,EAAMI,CAAK,CAAC;AAAA,QACvC,GAAGJ,EAAM,MAAMI,IAAQ,CAAC;AAAA,MAAA;AAI5B,UAAM,IAAI;AAAA,MACR,wBAAwBA,CAAK,cAAcL,EAAK,KAAK,GAAG,CAAC;AAAA,IAAA;AAAA,EAG/D,WAAW,OAAOC,KAAU,YAAYA,MAAU;AAChD,QAAIG,EAAK,WAAW,GAAG;AAErB,YAAM,EAAE,CAACD,CAAI,GAAGI,GAAG,GAAGC,MAASP;AAC/B,aAAOO;AAAA,IACT,OAAA;AAAA,UAAWL,KAAQF;AACjB,eAAO;AAAA,UACL,GAAGA;AAAA,UACH,CAACE,CAAI,GAAGG,EAAqBF,GAAMH,EAAME,CAAI,CAAC;AAAA,QAAA;AAGhD,YAAM,IAAI;AAAA,QACR,qBAAqBA,CAAI,cAAcH,EAAK,KAAK,GAAG,CAAC;AAAA,MAAA;AAAA;AAAA;AAIzD,UAAM,IAAI;AAAA,MACR,0CAA0CA,EAAK,KAAK,GAAG,CAAC;AAAA,IAAA;AAG9D;AACO,SAASS,EACdC,GACAC,GACAC,GACA;AACA,MAAIC,IAAaH;AAEjB,WAAS,IAAI,GAAG,IAAIC,EAAU,QAAQ,KAAK;AACzC,UAAMhB,IAAMgB,EAAU,CAAC;AACvB,QAA2BE,KAAU;AACnC;AAGF,QAAI,OAAOlB,KAAQ,YAAYA,EAAI,WAAW,KAAK,GAAG;AACpD,UAAI,CAAC,MAAM,QAAQkB,CAAK,GAAG;AACzB,gBAAQ,MAAM,8CAA8C;AAAA,UAC1D,MAAMF;AAAA,UACN,cAAcE;AAAA,QAAA,CACf;AACD;AAAA,MACF;AAKA,YAAMC,IAAaH,EAAU,MAAM,GAAG,CAAC,GACjCI,IAAqB,CAACH,GAAU,GAAGE,GAAYnB,CAAG,EAAE,KAAK,GAAG,GAG5DqB,IAAkB,CAACJ,GAAU,GAAGE,CAAU,EAAE,KAAK,GAAG,GACpDG,IAAmBC,EACtB,SAAA,EACA,iBAAiB,IAAIF,CAAe;AAEvC,UAAI,CAACC,GAAkB,WAAW;AAChC,gBAAQ;AAAA,UACN;AAAA,UACAD;AAAA,QAAA;AAEF;AAAA,MACF;AAGA,YAAMG,IAAYF,EAAiB,UAAU,QAAQF,CAAkB;AAEvE,UAAII,MAAc,IAAI;AACpB,gBAAQ;AAAA,UACN,YAAYJ,CAAkB;AAAA,UAC9BE,EAAiB;AAAA,QAAA;AAEnB;AAAA,MACF;AAGA,MAAAJ,IAAQA,EAAMM,CAAS;AAAA,IAGzB,MAAA,CAAW,MAAM,QAAQN,CAAK,IAC5BA,IAAQA,EAAM,SAASlB,CAAG,CAAC,IAE3BkB,IAAQA,EAAMlB,CAAG;AAAA,EAErB;AACA,SAAOkB;AACT;AAIO,SAASO,EACdC,GACAC,GACA9B,IAAsB,IACL;AACjB,MAAI+B,IAA+B,CAAA;AAEnC,MAAI,OAAOF,KAAS,cAAc,OAAOC,KAAS;AAChD,WAAOC;AAET,MACEF,KAAS,QAETC,MAAS,QACTA,MAAS;AAET,WAAID,MAASC,IAEJ,CAAC9B,CAAW,IAEd+B;AAIT,MAAI,OAAOF,KAAS,YAAY,OAAOC,KAAS;AAC9C,WAAID,MAASC,IACJ,CAAC9B,CAAW,IAEd+B;AAIT,MAAI,MAAM,QAAQF,CAAI,KAAK,MAAM,QAAQC,CAAI,GAAG;AAE9C,IAAID,EAAK,WAAWC,EAAK,UACvBC,EAAY,KAAK,GAAG/B,CAAW,EAAE;AAInC,UAAMgC,IAAe,KAAK,IAAIH,EAAK,QAAQC,EAAK,MAAM;AACtD,aAASG,IAAI,GAAGA,IAAID,GAAcC;AAChC,MAAIJ,EAAKI,CAAC,MAAMH,EAAKG,CAAC,MACpBF,IAAcA,EAAY;AAAA,QACxBH;AAAA,UACEC,EAAKI,CAAC;AAAA,UACNH,EAAKG,CAAC;AAAA,UACNjC,IAAc,GAAGA,CAAW,IAAIiC,CAAC,KAAK,GAAGA,CAAC;AAAA,QAAA;AAAA,MAC5C;AAMN,QAAIJ,EAAK,WAAWC,EAAK,QAAQ;AAC/B,YAAMI,IAAkBL,EAAK,SAASC,EAAK,SAASD,IAAOC;AAC3D,eAASG,IAAID,GAAcC,IAAIC,EAAgB,QAAQD;AACrD,QAAAF,EAAY,KAAK/B,IAAc,GAAGA,CAAW,IAAIiC,CAAC,KAAK,GAAGA,CAAC,EAAE;AAAA,IAEjE;AACA,WAAOF;AAAA,EACT;AAEA,QAAMI,IAAQ,OAAO,KAAKN,CAAI,GACxBO,IAAQ,OAAO,KAAKN,CAAI;AAG9B,SAFgB,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAGK,GAAO,GAAGC,CAAK,CAAC,CAAC,EAEhD,QAAQ,CAACjC,MAAQ;AACvB,UAAMG,IAAUN,IAAc,GAAGA,CAAW,IAAIG,CAAG,KAAKA;AACxD,IAAA4B,IAAcA,EAAY;AAAA,MACxBH,EAAeC,EAAK1B,CAAG,GAAG2B,EAAK3B,CAAG,GAAGG,CAAO;AAAA,IAAA;AAAA,EAEhD,CAAC,GACMyB;AACT;AACO,SAASM,EAAUC,GAAaC,GAAkB;AACvD,QAAMC,IAAS,EAAE,GAAGF,EAAA;AACpB,SAAI/C,EAAS+C,CAAM,KAAK/C,EAASgD,CAAM,KACrC,OAAO,KAAKA,CAAM,EAAE,QAAQ,CAACpC,MAAQ;AACnC,IAAIZ,EAASgD,EAAOpC,CAAG,CAAC,IAChBA,KAAOmC,IAGXE,EAAOrC,CAAG,IAAIkC,EAAUC,EAAOnC,CAAG,GAAGoC,EAAOpC,CAAG,CAAC,IAFhD,OAAO,OAAOqC,GAAQ,EAAE,CAACrC,CAAG,GAAGoC,EAAOpC,CAAG,GAAG,IAK9C,OAAO,OAAOqC,GAAQ,EAAE,CAACrC,CAAG,GAAGoC,EAAOpC,CAAG,GAAG;AAAA,EAEhD,CAAC,GAEIqC;AACT;AAEO,SAASC,EAAoBZ,GAAWC,GAAW;AAQxD,SAPsBF,EAAeC,GAAMC,CAAI,EAAE;AAAA,IAAI,CAACY,MACpDA,EACG,QAAQ,cAAc,KAAK,EAC3B,MAAM,GAAG,EACT,OAAO,OAAO;AAAA,EAAA;AAIrB;AACO,SAASC,EACdd,GACAC,GACA9B,IAAsB,IACZ;AACV,MAAI+B,IAAwB,CAAA;AAG5B,MACEF,KAAS,QAETC,MAAS,QACTA,MAAS;AAET,WAAOC;AAIT,MAAI,MAAM,QAAQF,CAAI,KAAK,MAAM,QAAQC,CAAI;AAC3C,IAAID,EAAK,WAAWC,EAAK,UACvBC,EAAY,KAAK/B,CAAW;AAAA,WAErB,OAAO6B,KAAS,YAAY,OAAOC,KAAS,UAAU;AAE/D,UAAMc,IAAO,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAKf,CAAI,GAAG,GAAG,OAAO,KAAKC,CAAI,CAAC,CAAC;AACjE,eAAW3B,KAAOyC,GAAM;AACtB,YAAMtC,IAAUN,IAAc,GAAGA,CAAW,IAAIG,CAAG,KAAKA;AAGxD,OAAI,MAAM,QAAQ0B,EAAK1B,CAAG,CAAC,KAAK,MAAM,QAAQ2B,EAAK3B,CAAG,CAAC,OACrD4B,IAAcA,EAAY;AAAA,QACxBY,EAA0Bd,EAAK1B,CAAG,GAAG2B,EAAK3B,CAAG,GAAGG,CAAO;AAAA,MAAA;AAAA,IAG7D;AAAA,EACF;AAEA,SAAOyB;AACT;AAEO,SAASc,EAA+BhB,GAAWC,GAAW;AAQnE,SAPsBa,EAA0Bd,GAAMC,CAAI,EAAE;AAAA,IAAI,CAACY,MAC/DA,EACG,QAAQ,cAAc,KAAK,EAC3B,MAAM,GAAG,EACT,OAAO,OAAO;AAAA,EAAA;AAIrB;AAEO,SAASI,EAA0CC,GAAqB;AAC7E,QAAMC,IAAqB,CAACvC,MACnB,OAAO,OAAOA,CAAK,EAAE;AAAA,IAAK,CAACY,MAChCA,GAAO,eAAe,cAAc;AAAA,EAAA;AAGxC,MAAI4B,IAA+B,CAAA;AACnC,QAAMC,IAAwB,CAC5BzC,MACoC;AACpC,UAAM0C,IAAoD,CAAA;AAC1D,kBAAO,QAAQ1C,CAAK,EAAE,QAAQ,CAAC,CAACN,GAAKkB,CAAK,MAAM;AAC9C,MAAIA,GAAO,gBACT4B,IAAgB,EAAE,GAAIA,KAAiB,CAAA,GAAK,CAAC9C,CAAG,GAAGkB,EAAA,GAEnD8B,EAAiBhD,CAAG,IAAIkB,EAAM,gBAE9B8B,EAAiBhD,CAAG,IAAIkB;AAAA,IAE5B,CAAC,GAEM8B;AAAA,EACT;AAMA,SAAO,CAJyBH,EAAmBD,CAAY,IAC1DG,EAAsBH,CAAY,IAClCA,GAE4BE,CAAa;AAIhD;AAEO,SAASG,EACdC,GACAC,GAC4B;AAC5B,MAAIC,IAAmC;AAEvC,QAAMC,IAAiB,IAAIC,MAAwB;AACjD,IAAIF,KACF,aAAaA,CAAS,GAGxBA,IAAY,WAAW,MAAMF,EAAK,GAAGI,CAAI,GAAGH,CAAI;AAAA,EAClD;AAEA,SAAAE,EAAU,SAAS,MAAM;AACvB,IAAID,MACF,aAAaA,CAAS,GACtBA,IAAY;AAAA,EAEhB,GAEOC;AACT;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-state",
3
- "version": "0.5.434",
3
+ "version": "0.5.436",
4
4
  "description": "React state management library with form controls and server sync",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "url": "git+https://github.com/cogsbox/cogsbox-state.git"
23
23
  },
24
24
  "scripts": {
25
- "build": "rimraf dist && vite build",
25
+ "build": "rimraf dist && vite build && npm pack && node scripts/rename-pack.cjs",
26
26
  "lint": "eslint src --ext ts,tsx",
27
27
  "format": "prettier --write \"src/**/*.{ts,tsx}\"",
28
28
  "dev": "vite src/examples"
@@ -37,14 +37,14 @@
37
37
  "superjson": "^2.2.2",
38
38
  "ulid": "^3.0.1",
39
39
  "uuid": "^9.0.1",
40
- "zod": "^3.24.4",
41
40
  "zustand": "^5.0.3"
42
41
  },
43
42
  "peerDependencies": {
44
43
  "@trpc/next": "^10.0.0 || ^11.0.0",
45
44
  "@types/react": "^18.0.0",
46
45
  "react": "^18.2.0",
47
- "react-dom": "^18.2.0"
46
+ "react-dom": "^18.2.0",
47
+ "zod": "^3.25.0 || ^4.0.0"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@testing-library/react": "^16.3.0",
@@ -66,7 +66,8 @@
66
66
  "typescript": "^5.3.0",
67
67
  "vite": "^5.0.0",
68
68
  "vite-plugin-dts": "^3.7.0",
69
- "vitest": "^3.2.4"
69
+ "vitest": "^3.2.4",
70
+ "zod": "^3.25.0 || ^4.0.0"
70
71
  },
71
72
  "keywords": [
72
73
  "react",