cogsbox-state 0.5.279 → 0.5.281
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CogsState.d.ts +1 -0
- package/dist/CogsState.jsx +553 -502
- package/dist/CogsState.jsx.map +1 -1
- package/dist/store.js +23 -21
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
- package/src/CogsState.tsx +77 -10
- package/src/store.ts +8 -2
package/dist/store.js
CHANGED
|
@@ -35,7 +35,9 @@ const w = u((s, l) => ({
|
|
|
35
35
|
let a = o[e];
|
|
36
36
|
for (const i of r)
|
|
37
37
|
a[i] || (a[i] = {}), a = a[i];
|
|
38
|
-
return Object.
|
|
38
|
+
return Object.keys(t).forEach((i) => {
|
|
39
|
+
a[i] || (a[i] = {}), Object.assign(a[i], t[i]);
|
|
40
|
+
}), { shadowStateStore: o };
|
|
39
41
|
});
|
|
40
42
|
},
|
|
41
43
|
initializeShadowState: (e, r) => {
|
|
@@ -62,10 +64,10 @@ const w = u((s, l) => ({
|
|
|
62
64
|
const o = { ...n.shadowStateStore };
|
|
63
65
|
if (!o[e]) return n;
|
|
64
66
|
let a = o[e];
|
|
65
|
-
const i = [...r],
|
|
67
|
+
const i = [...r], S = i.pop();
|
|
66
68
|
for (const c of i)
|
|
67
69
|
a[c] || (a[c] = {}), a = a[c];
|
|
68
|
-
return
|
|
70
|
+
return S !== void 0 && (Array.isArray(t) ? a[S] = new Array(t.length) : typeof t == "object" && t !== null ? a[S] = {} : a[S] = a[S] || {}), { shadowStateStore: o };
|
|
69
71
|
});
|
|
70
72
|
},
|
|
71
73
|
insertShadowArrayElement: (e, r) => {
|
|
@@ -242,13 +244,13 @@ const w = u((s, l) => ({
|
|
|
242
244
|
return Array.from(t.keys()).forEach((a) => {
|
|
243
245
|
const i = a.split(".");
|
|
244
246
|
if (i.length >= o.length) {
|
|
245
|
-
let
|
|
247
|
+
let S = !0;
|
|
246
248
|
for (let c = 0; c < o.length; c++)
|
|
247
249
|
if (i[c] !== o[c]) {
|
|
248
|
-
|
|
250
|
+
S = !1;
|
|
249
251
|
break;
|
|
250
252
|
}
|
|
251
|
-
|
|
253
|
+
S && (n = !0, t.delete(a));
|
|
252
254
|
}
|
|
253
255
|
}), n ? { validationErrors: t } : r;
|
|
254
256
|
});
|
|
@@ -258,25 +260,25 @@ const w = u((s, l) => ({
|
|
|
258
260
|
return Array.from(t.keys()).forEach((a) => {
|
|
259
261
|
const i = a.split(".");
|
|
260
262
|
if (i.length >= n.length) {
|
|
261
|
-
let
|
|
263
|
+
let S = !0;
|
|
262
264
|
for (let c = 0; c < n.length; c++) {
|
|
263
|
-
const
|
|
264
|
-
if (
|
|
265
|
+
const d = n[c], f = i[c];
|
|
266
|
+
if (d === "[*]" || Array.isArray(d)) {
|
|
265
267
|
const p = parseInt(f);
|
|
266
268
|
if (isNaN(p)) {
|
|
267
|
-
|
|
269
|
+
S = !1;
|
|
268
270
|
break;
|
|
269
271
|
}
|
|
270
|
-
if (!o(
|
|
271
|
-
|
|
272
|
+
if (!o(d, f)) {
|
|
273
|
+
S = !1;
|
|
272
274
|
break;
|
|
273
275
|
}
|
|
274
|
-
} else if (
|
|
275
|
-
|
|
276
|
+
} else if (d !== f) {
|
|
277
|
+
S = !1;
|
|
276
278
|
break;
|
|
277
279
|
}
|
|
278
280
|
}
|
|
279
|
-
if (
|
|
281
|
+
if (S) {
|
|
280
282
|
const c = t.get(a);
|
|
281
283
|
c && r.push(...c);
|
|
282
284
|
}
|
|
@@ -287,21 +289,21 @@ const w = u((s, l) => ({
|
|
|
287
289
|
getNestedState: (e, r) => {
|
|
288
290
|
const t = l().cogsStateStore[e], n = (o, a) => {
|
|
289
291
|
if (a.length === 0) return o;
|
|
290
|
-
const i = a[0],
|
|
292
|
+
const i = a[0], S = a.slice(1);
|
|
291
293
|
if (i === "[*]") {
|
|
292
294
|
if (!Array.isArray(o)) {
|
|
293
295
|
console.warn("Asterisk notation used on non-array value");
|
|
294
296
|
return;
|
|
295
297
|
}
|
|
296
|
-
if (
|
|
297
|
-
const
|
|
298
|
-
(f) => n(f,
|
|
298
|
+
if (S.length === 0) return o;
|
|
299
|
+
const d = o.map(
|
|
300
|
+
(f) => n(f, S)
|
|
299
301
|
);
|
|
300
|
-
return Array.isArray(
|
|
302
|
+
return Array.isArray(d[0]) ? d.flat() : d;
|
|
301
303
|
}
|
|
302
304
|
const c = o[i];
|
|
303
305
|
if (c !== void 0)
|
|
304
|
-
return n(c,
|
|
306
|
+
return n(c, S);
|
|
305
307
|
};
|
|
306
308
|
return n(t, r);
|
|
307
309
|
},
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n StateKeys,\r\n SyncActionsType,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from \"./CogsState.js\";\r\n\r\ntype StateUpdater<StateValue> =\r\n | StateValue\r\n | ((prevValue: StateValue) => StateValue);\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype SyncLogType = {\r\n timeStamp: number;\r\n};\r\ntype StateValue = any;\r\n\r\nexport type TrieNode = {\r\n subscribers: Set<string>;\r\n children: Map<string, TrieNode>;\r\n};\r\nexport type ComponentsType = {\r\n components: Map<\r\n string,\r\n {\r\n forceUpdate: () => void;\r\n paths: Set<string>;\r\n deps?: any[];\r\n depsFunction?: (state: any) => any[] | true;\r\n reactiveType: ReactivityType[] | ReactivityType;\r\n }\r\n >;\r\n};\r\nexport type FormRefStoreState = {\r\n formRefs: Map<string, React.RefObject<any>>;\r\n registerFormRef: (id: string, ref: React.RefObject<any>) => void;\r\n getFormRef: (id: string) => React.RefObject<any> | undefined;\r\n removeFormRef: (id: string) => void;\r\n // New method to get all refs for a stateKey\r\n getFormRefsByStateKey: (\r\n stateKey: string\r\n ) => Map<string, React.RefObject<any>>;\r\n};\r\n\r\nexport const formRefStore = create<FormRefStoreState>((set, get) => ({\r\n formRefs: new Map(),\r\n\r\n registerFormRef: (id, ref) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.set(id, ref);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRef: (id) => get().formRefs.get(id),\r\n\r\n removeFormRef: (id) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.delete(id);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n // Get all refs that start with the stateKey prefix\r\n getFormRefsByStateKey: (stateKey) => {\r\n const allRefs = get().formRefs;\r\n const stateKeyPrefix = stateKey + \".\";\r\n const filteredRefs = new Map();\r\n\r\n allRefs.forEach((ref, id) => {\r\n if (id.startsWith(stateKeyPrefix) || id === stateKey) {\r\n filteredRefs.set(id, ref);\r\n }\r\n });\r\n\r\n return filteredRefs;\r\n },\r\n}));\r\n\r\ntype ShadowMetadata = {\r\n virtualisedState?: { listItemHeight: number };\r\n syncInfo?: { status: string };\r\n // Add other metadata fields you need\r\n};\r\n\r\ntype ShadowState<T> =\r\n T extends Array<infer U>\r\n ? Array<ShadowState<U>> & ShadowMetadata\r\n : T extends object\r\n ? { [K in keyof T]: ShadowState<T[K]> } & ShadowMetadata\r\n : ShadowMetadata;\r\nexport type CogsGlobalState = {\r\n shadowStateStore: { [key: string]: any };\r\n initializeShadowState: (key: string, initialState: any) => void;\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => void;\r\n insertShadowArrayElement: (key: string, arrayPath: string[]) => void;\r\n removeShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n index: number\r\n ) => void;\r\n getShadowMetadata: (key: string, path: string[]) => any;\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => void;\r\n\r\n selectedIndicesMap: Map<string, Map<string, number>>; // stateKey -> (parentPath -> selectedIndex)\r\n\r\n // Add these new methods\r\n getSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string\r\n ) => number | undefined;\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => void;\r\n clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => void;\r\n clearSelectedIndexesForState: (stateKey: string) => void;\r\n updaterState: { [key: string]: any };\r\n initialStateOptions: { [key: string]: OptionsType };\r\n cogsStateStore: { [key: string]: StateValue };\r\n isLoadingGlobal: { [key: string]: boolean };\r\n\r\n initialStateGlobal: { [key: string]: StateValue };\r\n iniitialCreatedState: { [key: string]: StateValue };\r\n validationErrors: Map<string, string[]>;\r\n\r\n serverState: { [key: string]: StateValue };\r\n serverSyncActions: { [key: string]: SyncActionsType<any> };\r\n\r\n serverSyncLog: { [key: string]: SyncLogType[] };\r\n serverSideOrNot: { [key: string]: boolean };\r\n setServerSyncLog: (key: string, newValue: SyncLogType) => void;\r\n\r\n setServerSideOrNot: (key: string, value: boolean) => void;\r\n getServerSideOrNot: (key: string) => boolean | undefined;\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => void;\r\n\r\n getThisLocalUpdate: (key: string) => UpdateTypeDetail[] | undefined;\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => void;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n updateInitialCreatedState: (key: string, newState: StateValue) => void;\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n getUpdaterState: (key: string) => StateUpdater<StateValue>;\r\n setUpdaterState: (key: string, newUpdater: any) => void;\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => StateValue;\r\n getNestedState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n path: string[]\r\n ) => StateValue;\r\n setState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateUpdater<StateValue>\r\n ) => void;\r\n setInitialStates: (initialState: StateValue) => void;\r\n setCreatedState: (initialState: StateValue) => void;\r\n stateLog: { [key: string]: UpdateTypeDetail[] };\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setIsLoadingGlobal: (key: string, value: boolean) => void;\r\n\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n removeValidationError: (path: string) => void;\r\n signalDomElements: Map<\r\n string,\r\n Set<{\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }>\r\n >;\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: {\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }\r\n ) => void;\r\n removeSignalElement: (signalId: string, instanceId: string) => void;\r\n reRenderTriggerPrevValue: Record<string, any>;\r\n\r\n reactiveDeps: Record<\r\n string,\r\n {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n >;\r\n setReactiveDeps: (\r\n key: string,\r\n record: {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n ) => void;\r\n deleteReactiveDeps: (key: string) => void;\r\n subscribe: (listener: () => void) => () => void;\r\n\r\n stateComponents: Map<string, ComponentsType>;\r\n syncInfoStore: Map<string, SyncInfo>;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\n\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n shadowStateStore: {},\r\n getShadowMetadata: (key: string, path: string[]) => {\r\n const shadow = get().shadowStateStore[key];\r\n if (!shadow) return null;\r\n\r\n let current = shadow;\r\n for (const segment of path) {\r\n current = current?.[segment];\r\n if (!current) return null;\r\n }\r\n\r\n return current;\r\n },\r\n\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n if (!newShadow[key]) return state;\r\n\r\n newShadow[key] = JSON.parse(JSON.stringify(newShadow[key]));\r\n\r\n let current = newShadow[key];\r\n for (const segment of path) {\r\n if (!current[segment]) current[segment] = {};\r\n current = current[segment];\r\n }\r\n\r\n Object.assign(current, metadata);\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n initializeShadowState: (key: string, initialState: any) => {\r\n const createShadowStructure = (obj: any): any => {\r\n if (Array.isArray(obj)) {\r\n return new Array(obj.length)\r\n .fill(null)\r\n .map((_, i) => createShadowStructure(obj[i]));\r\n }\r\n if (typeof obj === \"object\" && obj !== null) {\r\n const shadow: any = {};\r\n for (const k in obj) {\r\n shadow[k] = createShadowStructure(obj[k]);\r\n }\r\n return shadow;\r\n }\r\n return {}; // Leaf node - empty object for metadata\r\n };\r\n\r\n set((state) => ({\r\n shadowStateStore: {\r\n ...state.shadowStateStore,\r\n [key]: createShadowStructure(initialState),\r\n },\r\n }));\r\n },\r\n\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n if (!newShadow[key]) return state;\r\n\r\n let current = newShadow[key];\r\n const pathCopy = [...path];\r\n const lastSegment = pathCopy.pop();\r\n\r\n // Navigate to parent\r\n for (const segment of pathCopy) {\r\n if (!current[segment]) current[segment] = {};\r\n current = current[segment];\r\n }\r\n\r\n // Update shadow structure to match new value structure\r\n if (lastSegment !== undefined) {\r\n if (Array.isArray(newValue)) {\r\n current[lastSegment] = new Array(newValue.length);\r\n } else if (typeof newValue === \"object\" && newValue !== null) {\r\n current[lastSegment] = {};\r\n } else {\r\n current[lastSegment] = current[lastSegment] || {};\r\n }\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n\r\n insertShadowArrayElement: (key: string, arrayPath: string[]) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n let current = newShadow[key];\r\n\r\n for (const segment of arrayPath) {\r\n current = current?.[segment];\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n current.push({});\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n\r\n removeShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n index: number\r\n ) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n let current = newShadow[key];\r\n\r\n for (const segment of arrayPath) {\r\n current = current?.[segment];\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n current.splice(index, 1);\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n selectedIndicesMap: new Map<string, Map<string, number>>(),\r\n\r\n // Add the new methods\r\n getSelectedIndex: (stateKey: string, parentPath: string) => {\r\n const stateMap = get().selectedIndicesMap.get(stateKey);\r\n if (!stateMap) return undefined;\r\n return stateMap.get(parentPath);\r\n },\r\n\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n let stateMap = newMap.get(stateKey);\r\n\r\n if (!stateMap) {\r\n stateMap = new Map<string, number>();\r\n newMap.set(stateKey, stateMap);\r\n }\r\n\r\n if (index === undefined) {\r\n stateMap.delete(parentPath);\r\n } else {\r\n stateMap.set(parentPath, index);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n const stateMap = newMap.get(stateKey);\r\n if (!stateMap) return state;\r\n const parentPath = path.join(\".\");\r\n stateMap.delete(parentPath);\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndexesForState: (stateKey: string) => {\r\n set((state) => {\r\n const newOuterMap = new Map(state.selectedIndicesMap);\r\n const changed = newOuterMap.delete(stateKey);\r\n if (changed) {\r\n console.log(\r\n `Cleared selected indices map entry for stateKey: ${stateKey}`\r\n );\r\n return { selectedIndicesMap: newOuterMap };\r\n } else {\r\n return {};\r\n }\r\n });\r\n },\r\n stateComponents: new Map(),\r\n subscribe: (listener: () => void) => {\r\n // zustand's subscribe returns an unsubscribe function\r\n return get().subscribe(listener);\r\n },\r\n\r\n reactiveDeps: {},\r\n setReactiveDeps: (key, record) =>\r\n set((state) => ({\r\n ...state,\r\n reactiveDeps: {\r\n ...state.reactiveDeps,\r\n [key]: record,\r\n },\r\n })),\r\n deleteReactiveDeps: (key) =>\r\n set((state) => {\r\n const { [key]: _, ...rest } = state.reactiveDeps;\r\n return {\r\n ...state,\r\n reactiveDeps: rest,\r\n };\r\n }),\r\n\r\n reRenderTriggerPrevValue: {},\r\n signalDomElements: new Map(),\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: { instanceId: string; parentId: string; position: number }\r\n ) => {\r\n const current = get().signalDomElements;\r\n if (!current.has(signalId)) {\r\n current.set(signalId, new Set());\r\n }\r\n current.get(signalId)!.add(elementInfo);\r\n\r\n set({ signalDomElements: new Map(current) }); // Create new reference to trigger update\r\n },\r\n removeSignalElement: (signalId: string, instanceId: string) => {\r\n const current = get().signalDomElements;\r\n const elements = current.get(signalId);\r\n if (elements) {\r\n elements.forEach((el) => {\r\n if (el.instanceId === instanceId) {\r\n elements.delete(el);\r\n }\r\n });\r\n }\r\n set({ signalDomElements: new Map(current) });\r\n },\r\n initialStateOptions: {},\r\n updaterState: {},\r\n stateTimeline: {},\r\n cogsStateStore: {},\r\n stateLog: {},\r\n isLoadingGlobal: {},\r\n\r\n initialStateGlobal: {},\r\n iniitialCreatedState: {},\r\n updateInitialCreatedState: (key, newState) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.iniitialCreatedState,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n\r\n validationErrors: new Map(),\r\n\r\n serverState: {},\r\n\r\n serverSyncActions: {},\r\n\r\n serverSyncLog: {},\r\n serverSideOrNot: {},\r\n setServerSyncLog: (key, newValue) => {\r\n set((state) => ({\r\n serverSyncLog: {\r\n ...state.serverSyncLog,\r\n [key]: [...(state.serverSyncLog[key] ?? []), newValue],\r\n },\r\n }));\r\n },\r\n setServerSideOrNot: (key, value) => {\r\n set((state) => ({\r\n serverSideOrNot: {\r\n ...state.serverSideOrNot,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n getServerSideOrNot: (key) => {\r\n return get().serverSideOrNot[key];\r\n },\r\n\r\n getThisLocalUpdate: (key: string) => {\r\n return get().stateLog[key];\r\n },\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => {\r\n set((prev) => ({\r\n serverState: {\r\n ...prev.serverState,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => {\r\n set((prev) => {\r\n const currentUpdates = prev.stateLog[key] ?? [];\r\n const newUpdates = updater(currentUpdates);\r\n return {\r\n stateLog: {\r\n ...prev.stateLog,\r\n [key]: newUpdates,\r\n },\r\n };\r\n });\r\n },\r\n setIsLoadingGlobal: (key: string, value: boolean) => {\r\n set((prev) => ({\r\n isLoadingGlobal: {\r\n ...prev.isLoadingGlobal,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => {\r\n set((prev) => ({\r\n serverSyncActions: {\r\n ...prev.serverSyncActions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n addValidationError: (path, message) => {\r\n console.log(\"addValidationError---\");\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n const existingMessages = updatedErrors.get(path) || [];\r\n console.log(\"addValidationError\", path, message, existingMessages);\r\n // Append the new message instead of replacing\r\n updatedErrors.set(path, [...existingMessages, message]);\r\n return { validationErrors: updatedErrors };\r\n });\r\n },\r\n removeValidationError: (path) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n let doSomething = false;\r\n const pathArray = path.split(\".\");\r\n Array.from(updatedErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n if (keyArray[i] !== pathArray[i]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n doSomething = true;\r\n updatedErrors.delete(key);\r\n }\r\n }\r\n });\r\n\r\n return doSomething ? { validationErrors: updatedErrors } : prev;\r\n });\r\n },\r\n getValidationErrors: (path: string) => {\r\n const errors: string[] = [];\r\n const valErrors = get().validationErrors;\r\n const pathArray = path.split(\".\");\r\n\r\n // Helper to check if an index matches either a wildcard or is in an array of indices\r\n const isIndexMatch = (pathSegment: string, keySegment: string) => {\r\n if (pathSegment === \"[*]\") return true;\r\n if (Array.isArray(pathSegment)) {\r\n return pathSegment.includes(parseInt(keySegment));\r\n }\r\n return pathSegment === keySegment;\r\n };\r\n\r\n Array.from(valErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const pathSegment = pathArray[i];\r\n const keySegment = keyArray[i]!;\r\n\r\n // If current path segment is a number or [*], we need special handling\r\n if (pathSegment === \"[*]\" || Array.isArray(pathSegment)) {\r\n // Key segment should be a number if we're using [*] or array indices\r\n const keyIndex = parseInt(keySegment);\r\n if (isNaN(keyIndex)) {\r\n match = false;\r\n break;\r\n }\r\n\r\n if (!isIndexMatch(pathSegment, keySegment)) {\r\n match = false;\r\n break;\r\n }\r\n } else if (pathSegment !== keySegment) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n const errorMessages = valErrors.get(key);\r\n if (errorMessages) {\r\n errors.push(...errorMessages);\r\n }\r\n }\r\n }\r\n });\r\n\r\n return errors;\r\n },\r\n getInitialOptions: (key) => {\r\n return get().initialStateOptions[key];\r\n },\r\n getNestedState: (key: string, path: string[]) => {\r\n const rootState = get().cogsStateStore[key];\r\n\r\n const getValueWithAsterisk = (obj: any, pathArray: string[]): any => {\r\n if (pathArray.length === 0) return obj;\r\n\r\n const currentPath = pathArray[0];\r\n const remainingPath = pathArray.slice(1);\r\n\r\n if (currentPath === \"[*]\") {\r\n if (!Array.isArray(obj)) {\r\n console.warn(\"Asterisk notation used on non-array value\");\r\n return undefined;\r\n }\r\n\r\n if (remainingPath.length === 0) return obj;\r\n\r\n // Get result for each array item\r\n const results = obj.map((item) =>\r\n getValueWithAsterisk(item, remainingPath)\r\n );\r\n\r\n // If the next path segment exists and returns arrays, flatten them\r\n if (Array.isArray(results[0])) {\r\n return results.flat();\r\n }\r\n\r\n return results;\r\n }\r\n\r\n const value = obj[currentPath as keyof typeof obj];\r\n if (value === undefined) return undefined;\r\n\r\n return getValueWithAsterisk(value, remainingPath);\r\n };\r\n\r\n // This will still get the value but we need to make it reactive only to specific paths\r\n return getValueWithAsterisk(rootState, path);\r\n },\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: {\r\n ...prev.initialStateOptions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: {\r\n ...prev.initialStateGlobal,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n getUpdaterState: (key) => {\r\n return get().updaterState[key];\r\n },\r\n setUpdaterState: (key, newUpdater) => {\r\n const current = get().updaterState;\r\n\r\n if (!key || !newUpdater) return;\r\n\r\n set({ updaterState: { ...(current ?? {}), [key]: newUpdater } });\r\n },\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => {\r\n return get().cogsStateStore[key];\r\n },\r\n\r\n setState: <StateKey extends StateKeys>(key: StateKey, value: StateValue) => {\r\n set((prev) => {\r\n return {\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n [key]:\r\n typeof value === \"function\"\r\n ? value(prev.cogsStateStore[key])\r\n : value,\r\n },\r\n };\r\n });\r\n },\r\n setInitialStates: <StateKey extends StateKeys>(initialState: StateValue) => {\r\n set((prev) => ({\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n setCreatedState: (initialState: StateValue) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { ...state, syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key: string) => get().syncInfoStore.get(key) || null,\r\n}));\r\n"],"names":["formRefStore","create","set","get","id","ref","state","newRefs","stateKey","allRefs","stateKeyPrefix","filteredRefs","getGlobalStore","key","path","shadow","current","segment","metadata","newShadow","initialState","createShadowStructure","obj","_","i","k","newValue","pathCopy","lastSegment","arrayPath","index","parentPath","stateMap","newMap","newOuterMap","listener","record","rest","signalId","elementInfo","instanceId","elements","el","newState","prev","value","updater","currentUpdates","newUpdates","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","rootState","getValueWithAsterisk","currentPath","remainingPath","results","item","newUpdater","syncInfo"],"mappings":";AAqDO,MAAMA,IAAeC,EAA0B,CAACC,GAAKC,OAAS;AAAA,EACnE,8BAAc,IAAI;AAAA,EAElB,iBAAiB,CAACC,GAAIC,MACpBH,EAAI,CAACI,MAAU;AACb,UAAMC,IAAU,IAAI,IAAID,EAAM,QAAQ;AAC9B,WAAAC,EAAA,IAAIH,GAAIC,CAAG,GACZ,EAAE,UAAUE,EAAQ;AAAA,EAAA,CAC5B;AAAA,EAEH,YAAY,CAACH,MAAOD,EAAM,EAAA,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,EAAQ;AAAA,EAAA,CAC5B;AAAA;AAAA,EAGH,uBAAuB,CAACC,MAAa;AAC7B,UAAAC,IAAUN,IAAM,UAChBO,IAAiBF,IAAW,KAC5BG,wBAAmB,IAAI;AAErB,WAAAF,EAAA,QAAQ,CAACJ,GAAKD,MAAO;AAC3B,OAAIA,EAAG,WAAWM,CAAc,KAAKN,MAAOI,MAC7BG,EAAA,IAAIP,GAAIC,CAAG;AAAA,IAC1B,CACD,GAEMM;AAAA,EAAA;AAEX,EAAE,GAmJWC,IAAiBX,EAAwB,CAACC,GAAKC,OAAS;AAAA,EACnE,kBAAkB,CAAC;AAAA,EACnB,mBAAmB,CAACU,GAAaC,MAAmB;AAClD,UAAMC,IAASZ,IAAM,iBAAiBU,CAAG;AACrC,QAAA,CAACE,EAAe,QAAA;AAEpB,QAAIC,IAAUD;AACd,eAAWE,KAAWH;AAEhB,UADJE,IAAUA,IAAUC,CAAO,GACvB,CAACD,EAAgB,QAAA;AAGhB,WAAAA;AAAA,EACT;AAAA,EAEA,mBAAmB,CAACH,GAAaC,GAAgBI,MAAkB;AACjE,IAAAhB,EAAI,CAACI,MAAU;AACb,YAAMa,IAAY,EAAE,GAAGb,EAAM,iBAAiB;AAC9C,UAAI,CAACa,EAAUN,CAAG,EAAU,QAAAP;AAElB,MAAAa,EAAAN,CAAG,IAAI,KAAK,MAAM,KAAK,UAAUM,EAAUN,CAAG,CAAC,CAAC;AAEtD,UAAAG,IAAUG,EAAUN,CAAG;AAC3B,iBAAWI,KAAWH;AACpB,QAAKE,EAAQC,CAAO,MAAWD,EAAAC,CAAO,IAAI,CAAC,IAC3CD,IAAUA,EAAQC,CAAO;AAGpB,oBAAA,OAAOD,GAASE,CAAQ,GAExB,EAAE,kBAAkBC,EAAU;AAAA,IAAA,CACtC;AAAA,EACH;AAAA,EACA,uBAAuB,CAACN,GAAaO,MAAsB;AACnD,UAAAC,IAAwB,CAACC,MAAkB;AAC3C,UAAA,MAAM,QAAQA,CAAG;AACnB,eAAO,IAAI,MAAMA,EAAI,MAAM,EACxB,KAAK,IAAI,EACT,IAAI,CAACC,GAAGC,MAAMH,EAAsBC,EAAIE,CAAC,CAAC,CAAC;AAEhD,UAAI,OAAOF,KAAQ,YAAYA,MAAQ,MAAM;AAC3C,cAAMP,IAAc,CAAC;AACrB,mBAAWU,KAAKH;AACd,UAAAP,EAAOU,CAAC,IAAIJ,EAAsBC,EAAIG,CAAC,CAAC;AAEnC,eAAAV;AAAA,MAAA;AAET,aAAO,CAAC;AAAA,IACV;AAEA,IAAAb,EAAI,CAACI,OAAW;AAAA,MACd,kBAAkB;AAAA,QAChB,GAAGA,EAAM;AAAA,QACT,CAACO,CAAG,GAAGQ,EAAsBD,CAAY;AAAA,MAAA;AAAA,IAC3C,EACA;AAAA,EACJ;AAAA,EAEA,oBAAoB,CAACP,GAAaC,GAAgBY,MAAkB;AAClE,IAAAxB,EAAI,CAACI,MAAU;AACb,YAAMa,IAAY,EAAE,GAAGb,EAAM,iBAAiB;AAC9C,UAAI,CAACa,EAAUN,CAAG,EAAU,QAAAP;AAExB,UAAAU,IAAUG,EAAUN,CAAG;AACrB,YAAAc,IAAW,CAAC,GAAGb,CAAI,GACnBc,IAAcD,EAAS,IAAI;AAGjC,iBAAWV,KAAWU;AACpB,QAAKX,EAAQC,CAAO,MAAWD,EAAAC,CAAO,IAAI,CAAC,IAC3CD,IAAUA,EAAQC,CAAO;AAI3B,aAAIW,MAAgB,WACd,MAAM,QAAQF,CAAQ,IACxBV,EAAQY,CAAW,IAAI,IAAI,MAAMF,EAAS,MAAM,IACvC,OAAOA,KAAa,YAAYA,MAAa,OAC9CV,EAAAY,CAAW,IAAI,CAAC,IAExBZ,EAAQY,CAAW,IAAIZ,EAAQY,CAAW,KAAK,CAAC,IAI7C,EAAE,kBAAkBT,EAAU;AAAA,IAAA,CACtC;AAAA,EACH;AAAA,EAEA,0BAA0B,CAACN,GAAagB,MAAwB;AAC9D,IAAA3B,EAAI,CAACI,MAAU;AACb,YAAMa,IAAY,EAAE,GAAGb,EAAM,iBAAiB;AAC1C,UAAAU,IAAUG,EAAUN,CAAG;AAE3B,iBAAWI,KAAWY;AACpB,QAAAb,IAAUA,IAAUC,CAAO;AAGzB,aAAA,MAAM,QAAQD,CAAO,KACfA,EAAA,KAAK,EAAE,GAGV,EAAE,kBAAkBG,EAAU;AAAA,IAAA,CACtC;AAAA,EACH;AAAA,EAEA,0BAA0B,CACxBN,GACAgB,GACAC,MACG;AACH,IAAA5B,EAAI,CAACI,MAAU;AACb,YAAMa,IAAY,EAAE,GAAGb,EAAM,iBAAiB;AAC1C,UAAAU,IAAUG,EAAUN,CAAG;AAE3B,iBAAWI,KAAWY;AACpB,QAAAb,IAAUA,IAAUC,CAAO;AAGzB,aAAA,MAAM,QAAQD,CAAO,KACfA,EAAA,OAAOc,GAAO,CAAC,GAGlB,EAAE,kBAAkBX,EAAU;AAAA,IAAA,CACtC;AAAA,EACH;AAAA,EACA,wCAAwB,IAAiC;AAAA;AAAA,EAGzD,kBAAkB,CAACX,GAAkBuB,MAAuB;AAC1D,UAAMC,IAAW7B,EAAA,EAAM,mBAAmB,IAAIK,CAAQ;AAClD,QAACwB;AACE,aAAAA,EAAS,IAAID,CAAU;AAAA,EAChC;AAAA,EAEA,kBAAkB,CAChBvB,GACAuB,GACAD,MACG;AACH,IAAA5B,EAAI,CAACI,MAAU;AACb,YAAM2B,IAAS,IAAI,IAAI3B,EAAM,kBAAkB;AAC3C,UAAA0B,IAAWC,EAAO,IAAIzB,CAAQ;AAElC,aAAKwB,MACHA,wBAAe,IAAoB,GAC5BC,EAAA,IAAIzB,GAAUwB,CAAQ,IAG3BF,MAAU,SACZE,EAAS,OAAOD,CAAU,IAEjBC,EAAA,IAAID,GAAYD,CAAK,GAGzB;AAAA,QACL,GAAGxB;AAAA,QACH,oBAAoB2B;AAAA,MACtB;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EACA,oBAAoB,CAAC;AAAA,IACnB,UAAAzB;AAAA,IACA,MAAAM;AAAA,EAAA,MAII;AACJ,IAAAZ,EAAI,CAACI,MAAU;AACb,YAAM2B,IAAS,IAAI,IAAI3B,EAAM,kBAAkB,GACzC0B,IAAWC,EAAO,IAAIzB,CAAQ;AAChC,UAAA,CAACwB,EAAiB,QAAA1B;AAChB,YAAAyB,IAAajB,EAAK,KAAK,GAAG;AAChC,aAAAkB,EAAS,OAAOD,CAAU,GACnB;AAAA,QACL,GAAGzB;AAAA,QACH,oBAAoB2B;AAAA,MACtB;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EACA,8BAA8B,CAACzB,MAAqB;AAClD,IAAAN,EAAI,CAACI,MAAU;AACb,YAAM4B,IAAc,IAAI,IAAI5B,EAAM,kBAAkB;AAEpD,aADgB4B,EAAY,OAAO1B,CAAQ,KAEjC,QAAA;AAAA,QACN,oDAAoDA,CAAQ;AAAA,MAC9D,GACO,EAAE,oBAAoB0B,EAAY,KAElC,CAAC;AAAA,IACV,CACD;AAAA,EACH;AAAA,EACA,qCAAqB,IAAI;AAAA,EACzB,WAAW,CAACC,MAEHhC,EAAA,EAAM,UAAUgC,CAAQ;AAAA,EAGjC,cAAc,CAAC;AAAA,EACf,iBAAiB,CAACtB,GAAKuB,MACrBlC,EAAI,CAACI,OAAW;AAAA,IACd,GAAGA;AAAA,IACH,cAAc;AAAA,MACZ,GAAGA,EAAM;AAAA,MACT,CAACO,CAAG,GAAGuB;AAAA,IAAA;AAAA,EACT,EACA;AAAA,EACJ,oBAAoB,CAACvB,MACnBX,EAAI,CAACI,MAAU;AACP,UAAA,EAAE,CAACO,CAAG,GAAGU,GAAG,GAAGc,EAAA,IAAS/B,EAAM;AAC7B,WAAA;AAAA,MACL,GAAGA;AAAA,MACH,cAAc+B;AAAA,IAChB;AAAA,EAAA,CACD;AAAA,EAEH,0BAA0B,CAAC;AAAA,EAC3B,uCAAuB,IAAI;AAAA,EAC3B,kBAAkB,CAChBC,GACAC,MACG;AACG,UAAAvB,IAAUb,IAAM;AACtB,IAAKa,EAAQ,IAAIsB,CAAQ,KACvBtB,EAAQ,IAAIsB,GAAc,oBAAA,IAAA,CAAK,GAEjCtB,EAAQ,IAAIsB,CAAQ,EAAG,IAAIC,CAAW,GAEtCrC,EAAI,EAAE,mBAAmB,IAAI,IAAIc,CAAO,GAAG;AAAA,EAC7C;AAAA,EACA,qBAAqB,CAACsB,GAAkBE,MAAuB;AACvD,UAAAxB,IAAUb,IAAM,mBAChBsC,IAAWzB,EAAQ,IAAIsB,CAAQ;AACrC,IAAIG,KACOA,EAAA,QAAQ,CAACC,MAAO;AACnB,MAAAA,EAAG,eAAeF,KACpBC,EAAS,OAAOC,CAAE;AAAA,IACpB,CACD,GAEHxC,EAAI,EAAE,mBAAmB,IAAI,IAAIc,CAAO,GAAG;AAAA,EAC7C;AAAA,EACA,qBAAqB,CAAC;AAAA,EACtB,cAAc,CAAC;AAAA,EACf,eAAe,CAAC;AAAA,EAChB,gBAAgB,CAAC;AAAA,EACjB,UAAU,CAAC;AAAA,EACX,iBAAiB,CAAC;AAAA,EAElB,oBAAoB,CAAC;AAAA,EACrB,sBAAsB,CAAC;AAAA,EACvB,2BAA2B,CAACH,GAAK8B,MAAa;AAC5C,IAAAzC,EAAI,CAAC0C,OAAU;AAAA,MACb,sBAAsB;AAAA,QACpB,GAAGA,EAAK;AAAA,QACR,CAAC/B,CAAG,GAAG8B;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EAEA,sCAAsB,IAAI;AAAA,EAE1B,aAAa,CAAC;AAAA,EAEd,mBAAmB,CAAC;AAAA,EAEpB,eAAe,CAAC;AAAA,EAChB,iBAAiB,CAAC;AAAA,EAClB,kBAAkB,CAAC9B,GAAKa,MAAa;AACnC,IAAAxB,EAAI,CAACI,OAAW;AAAA,MACd,eAAe;AAAA,QACb,GAAGA,EAAM;AAAA,QACT,CAACO,CAAG,GAAG,CAAC,GAAIP,EAAM,cAAcO,CAAG,KAAK,CAAA,GAAKa,CAAQ;AAAA,MAAA;AAAA,IACvD,EACA;AAAA,EACJ;AAAA,EACA,oBAAoB,CAACb,GAAKgC,MAAU;AAClC,IAAA3C,EAAI,CAACI,OAAW;AAAA,MACd,iBAAiB;AAAA,QACf,GAAGA,EAAM;AAAA,QACT,CAACO,CAAG,GAAGgC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,oBAAoB,CAAChC,MACZV,EAAA,EAAM,gBAAgBU,CAAG;AAAA,EAGlC,oBAAoB,CAACA,MACZV,EAAA,EAAM,SAASU,CAAG;AAAA,EAE3B,gBAAgB,CACdA,GACAgC,MACG;AACH,IAAA3C,EAAI,CAAC0C,OAAU;AAAA,MACb,aAAa;AAAA,QACX,GAAGA,EAAK;AAAA,QACR,CAAC/B,CAAG,GAAGgC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EAEA,aAAa,CACXhC,GACAiC,MACG;AACH,IAAA5C,EAAI,CAAC0C,MAAS;AACZ,YAAMG,IAAiBH,EAAK,SAAS/B,CAAG,KAAK,CAAC,GACxCmC,IAAaF,EAAQC,CAAc;AAClC,aAAA;AAAA,QACL,UAAU;AAAA,UACR,GAAGH,EAAK;AAAA,UACR,CAAC/B,CAAG,GAAGmC;AAAA,QAAA;AAAA,MAEX;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EACA,oBAAoB,CAACnC,GAAagC,MAAmB;AACnD,IAAA3C,EAAI,CAAC0C,OAAU;AAAA,MACb,iBAAiB;AAAA,QACf,GAAGA,EAAK;AAAA,QACR,CAAC/B,CAAG,GAAGgC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,sBAAsB,CAAChC,GAAagC,MAAgC;AAClE,IAAA3C,EAAI,CAAC0C,OAAU;AAAA,MACb,mBAAmB;AAAA,QACjB,GAAGA,EAAK;AAAA,QACR,CAAC/B,CAAG,GAAGgC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,oBAAoB,CAAC/B,GAAMmC,MAAY;AACrC,YAAQ,IAAI,uBAAuB,GACnC/C,EAAI,CAAC0C,MAAS;AACZ,YAAMM,IAAgB,IAAI,IAAIN,EAAK,gBAAgB,GAC7CO,IAAmBD,EAAc,IAAIpC,CAAI,KAAK,CAAC;AACrD,qBAAQ,IAAI,sBAAsBA,GAAMmC,GAASE,CAAgB,GAEjED,EAAc,IAAIpC,GAAM,CAAC,GAAGqC,GAAkBF,CAAO,CAAC,GAC/C,EAAE,kBAAkBC,EAAc;AAAA,IAAA,CAC1C;AAAA,EACH;AAAA,EACA,uBAAuB,CAACpC,MAAS;AAC/B,IAAAZ,EAAI,CAAC0C,MAAS;AACZ,YAAMM,IAAgB,IAAI,IAAIN,EAAK,gBAAgB;AAEnD,UAAIQ,IAAc;AACZ,YAAAC,IAAYvC,EAAK,MAAM,GAAG;AAChC,mBAAM,KAAKoC,EAAc,KAAM,CAAA,EAAE,QAAQ,CAACrC,MAAQ;AAC1C,cAAAyC,IAAWzC,EAAI,MAAM,GAAG;AAC1B,YAAAyC,EAAS,UAAUD,EAAU,QAAQ;AACvC,cAAIE,IAAQ;AACZ,mBAAS/B,IAAI,GAAGA,IAAI6B,EAAU,QAAQ7B;AACpC,gBAAI8B,EAAS9B,CAAC,MAAM6B,EAAU7B,CAAC,GAAG;AACxB,cAAA+B,IAAA;AACR;AAAA,YAAA;AAIJ,UAAIA,MACYH,IAAA,IACdF,EAAc,OAAOrC,CAAG;AAAA,QAC1B;AAAA,MACF,CACD,GAEMuC,IAAc,EAAE,kBAAkBF,EAAkB,IAAAN;AAAA,IAAA,CAC5D;AAAA,EACH;AAAA,EACA,qBAAqB,CAAC9B,MAAiB;AACrC,UAAM0C,IAAmB,CAAC,GACpBC,IAAYtD,IAAM,kBAClBkD,IAAYvC,EAAK,MAAM,GAAG,GAG1B4C,IAAe,CAACC,GAAqBC,MACrCD,MAAgB,QAAc,KAC9B,MAAM,QAAQA,CAAW,IACpBA,EAAY,SAAS,SAASC,CAAU,CAAC,IAE3CD,MAAgBC;AAGzB,iBAAM,KAAKH,EAAU,KAAM,CAAA,EAAE,QAAQ,CAAC5C,MAAQ;AACtC,YAAAyC,IAAWzC,EAAI,MAAM,GAAG;AAC1B,UAAAyC,EAAS,UAAUD,EAAU,QAAQ;AACvC,YAAIE,IAAQ;AACZ,iBAAS/B,IAAI,GAAGA,IAAI6B,EAAU,QAAQ7B,KAAK;AACnC,gBAAAmC,IAAcN,EAAU7B,CAAC,GACzBoC,IAAaN,EAAS9B,CAAC;AAG7B,cAAImC,MAAgB,SAAS,MAAM,QAAQA,CAAW,GAAG;AAEjD,kBAAAE,IAAW,SAASD,CAAU;AAChC,gBAAA,MAAMC,CAAQ,GAAG;AACX,cAAAN,IAAA;AACR;AAAA,YAAA;AAGF,gBAAI,CAACG,EAAaC,GAAaC,CAAU,GAAG;AAClC,cAAAL,IAAA;AACR;AAAA,YAAA;AAAA,UACF,WACSI,MAAgBC,GAAY;AAC7B,YAAAL,IAAA;AACR;AAAA,UAAA;AAAA,QACF;AAGF,YAAIA,GAAO;AACH,gBAAAO,IAAgBL,EAAU,IAAI5C,CAAG;AACvC,UAAIiD,KACKN,EAAA,KAAK,GAAGM,CAAa;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CACD,GAEMN;AAAA,EACT;AAAA,EACA,mBAAmB,CAAC3C,MACXV,EAAA,EAAM,oBAAoBU,CAAG;AAAA,EAEtC,gBAAgB,CAACA,GAAaC,MAAmB;AAC/C,UAAMiD,IAAY5D,IAAM,eAAeU,CAAG,GAEpCmD,IAAuB,CAAC1C,GAAU+B,MAA6B;AAC/D,UAAAA,EAAU,WAAW,EAAU,QAAA/B;AAE7B,YAAA2C,IAAcZ,EAAU,CAAC,GACzBa,IAAgBb,EAAU,MAAM,CAAC;AAEvC,UAAIY,MAAgB,OAAO;AACzB,YAAI,CAAC,MAAM,QAAQ3C,CAAG,GAAG;AACvB,kBAAQ,KAAK,2CAA2C;AACjD;AAAA,QAAA;AAGL,YAAA4C,EAAc,WAAW,EAAU,QAAA5C;AAGvC,cAAM6C,IAAU7C,EAAI;AAAA,UAAI,CAAC8C,MACvBJ,EAAqBI,GAAMF,CAAa;AAAA,QAC1C;AAGA,eAAI,MAAM,QAAQC,EAAQ,CAAC,CAAC,IACnBA,EAAQ,KAAK,IAGfA;AAAA,MAAA;AAGH,YAAAtB,IAAQvB,EAAI2C,CAA+B;AAC7C,UAAApB,MAAU;AAEP,eAAAmB,EAAqBnB,GAAOqB,CAAa;AAAA,IAClD;AAGO,WAAAF,EAAqBD,GAAWjD,CAAI;AAAA,EAC7C;AAAA,EACA,wBAAwB,CAACD,GAAKgC,MAAU;AACtC,IAAA3C,EAAI,CAAC0C,OAAU;AAAA,MACb,qBAAqB;AAAA,QACnB,GAAGA,EAAK;AAAA,QACR,CAAC/B,CAAG,GAAGgC;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,0BAA0B,CAAChC,GAAK8B,MAAa;AAC3C,IAAAzC,EAAI,CAAC0C,OAAU;AAAA,MACb,oBAAoB;AAAA,QAClB,GAAGA,EAAK;AAAA,QACR,CAAC/B,CAAG,GAAG8B;AAAA,MAAA;AAAA,IACT,EACA;AAAA,EACJ;AAAA,EACA,iBAAiB,CAAC9B,MACTV,EAAA,EAAM,aAAaU,CAAG;AAAA,EAE/B,iBAAiB,CAACA,GAAKwD,MAAe;AAC9B,UAAArD,IAAUb,IAAM;AAElB,IAAA,CAACU,KAAO,CAACwD,KAEbnE,EAAI,EAAE,cAAc,EAAE,GAAIc,KAAW,CAAA,GAAK,CAACH,CAAG,GAAGwD,EAAW,GAAG;AAAA,EACjE;AAAA,EACA,aAAa,CAA6BxD,MACjCV,EAAA,EAAM,eAAeU,CAAG;AAAA,EAGjC,UAAU,CAA6BA,GAAegC,MAAsB;AAC1E,IAAA3C,EAAI,CAAC0C,OACI;AAAA,MACL,gBAAgB;AAAA,QACd,GAAGA,EAAK;AAAA,QACR,CAAC/B,CAAG,GACF,OAAOgC,KAAU,aACbA,EAAMD,EAAK,eAAe/B,CAAG,CAAC,IAC9BgC;AAAA,MAAA;AAAA,IAEV,EACD;AAAA,EACH;AAAA,EACA,kBAAkB,CAA6BzB,MAA6B;AAC1E,IAAAlB,EAAI,CAAC0C,OAAU;AAAA,MACb,gBAAgB;AAAA,QACd,GAAGA,EAAK;AAAA,QACR,GAAGxB;AAAA,MAAA;AAAA,IACL,EACA;AAAA,EACJ;AAAA,EACA,iBAAiB,CAACA,MAA6B;AAC7C,IAAAlB,EAAI,CAAC0C,OAAU;AAAA,MACb,sBAAsB;AAAA,QACpB,GAAGA,EAAK;AAAA,QACR,GAAGxB;AAAA,MAAA;AAAA,IACL,EACA;AAAA,EACJ;AAAA,EAEA,mCAAmB,IAAsB;AAAA,EACzC,aAAa,CAACP,GAAayD,MACzBpE,EAAI,CAACI,MAAU;AACb,UAAM2B,IAAS,IAAI,IAAI3B,EAAM,aAAa;AACnC,WAAA2B,EAAA,IAAIpB,GAAKyD,CAAQ,GACjB,EAAE,GAAGhE,GAAO,eAAe2B,EAAO;AAAA,EAAA,CAC1C;AAAA,EACH,aAAa,CAACpB,MAAgBV,EAAA,EAAM,cAAc,IAAIU,CAAG,KAAK;AAChE,EAAE;"}
|
|
1
|
+
{"version":3,"file":"store.js","sources":["../src/store.ts"],"sourcesContent":["import { create } from \"zustand\";\r\nimport type {\r\n OptionsType,\r\n ReactivityType,\r\n StateKeys,\r\n SyncActionsType,\r\n SyncInfo,\r\n UpdateTypeDetail,\r\n} from \"./CogsState.js\";\r\n\r\ntype StateUpdater<StateValue> =\r\n | StateValue\r\n | ((prevValue: StateValue) => StateValue);\r\n\r\nexport type FreshValuesObject = {\r\n pathsToValues?: string[];\r\n prevValue?: any;\r\n newValue?: any;\r\n timeStamp: number;\r\n};\r\n\r\ntype SyncLogType = {\r\n timeStamp: number;\r\n};\r\ntype StateValue = any;\r\n\r\nexport type TrieNode = {\r\n subscribers: Set<string>;\r\n children: Map<string, TrieNode>;\r\n};\r\nexport type ComponentsType = {\r\n components: Map<\r\n string,\r\n {\r\n forceUpdate: () => void;\r\n paths: Set<string>;\r\n deps?: any[];\r\n depsFunction?: (state: any) => any[] | true;\r\n reactiveType: ReactivityType[] | ReactivityType;\r\n }\r\n >;\r\n};\r\nexport type FormRefStoreState = {\r\n formRefs: Map<string, React.RefObject<any>>;\r\n registerFormRef: (id: string, ref: React.RefObject<any>) => void;\r\n getFormRef: (id: string) => React.RefObject<any> | undefined;\r\n removeFormRef: (id: string) => void;\r\n // New method to get all refs for a stateKey\r\n getFormRefsByStateKey: (\r\n stateKey: string\r\n ) => Map<string, React.RefObject<any>>;\r\n};\r\n\r\nexport const formRefStore = create<FormRefStoreState>((set, get) => ({\r\n formRefs: new Map(),\r\n\r\n registerFormRef: (id, ref) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.set(id, ref);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n getFormRef: (id) => get().formRefs.get(id),\r\n\r\n removeFormRef: (id) =>\r\n set((state) => {\r\n const newRefs = new Map(state.formRefs);\r\n newRefs.delete(id);\r\n return { formRefs: newRefs };\r\n }),\r\n\r\n // Get all refs that start with the stateKey prefix\r\n getFormRefsByStateKey: (stateKey) => {\r\n const allRefs = get().formRefs;\r\n const stateKeyPrefix = stateKey + \".\";\r\n const filteredRefs = new Map();\r\n\r\n allRefs.forEach((ref, id) => {\r\n if (id.startsWith(stateKeyPrefix) || id === stateKey) {\r\n filteredRefs.set(id, ref);\r\n }\r\n });\r\n\r\n return filteredRefs;\r\n },\r\n}));\r\n\r\ntype ShadowMetadata = {\r\n virtualisedState?: { listItemHeight: number };\r\n syncInfo?: { status: string };\r\n // Add other metadata fields you need\r\n};\r\n\r\ntype ShadowState<T> =\r\n T extends Array<infer U>\r\n ? Array<ShadowState<U>> & ShadowMetadata\r\n : T extends object\r\n ? { [K in keyof T]: ShadowState<T[K]> } & ShadowMetadata\r\n : ShadowMetadata;\r\nexport type CogsGlobalState = {\r\n shadowStateStore: { [key: string]: any };\r\n initializeShadowState: (key: string, initialState: any) => void;\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => void;\r\n insertShadowArrayElement: (key: string, arrayPath: string[]) => void;\r\n removeShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n index: number\r\n ) => void;\r\n getShadowMetadata: (key: string, path: string[]) => any;\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => void;\r\n\r\n selectedIndicesMap: Map<string, Map<string, number>>; // stateKey -> (parentPath -> selectedIndex)\r\n\r\n // Add these new methods\r\n getSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string\r\n ) => number | undefined;\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => void;\r\n clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => void;\r\n clearSelectedIndexesForState: (stateKey: string) => void;\r\n updaterState: { [key: string]: any };\r\n initialStateOptions: { [key: string]: OptionsType };\r\n cogsStateStore: { [key: string]: StateValue };\r\n isLoadingGlobal: { [key: string]: boolean };\r\n\r\n initialStateGlobal: { [key: string]: StateValue };\r\n iniitialCreatedState: { [key: string]: StateValue };\r\n validationErrors: Map<string, string[]>;\r\n\r\n serverState: { [key: string]: StateValue };\r\n serverSyncActions: { [key: string]: SyncActionsType<any> };\r\n\r\n serverSyncLog: { [key: string]: SyncLogType[] };\r\n serverSideOrNot: { [key: string]: boolean };\r\n setServerSyncLog: (key: string, newValue: SyncLogType) => void;\r\n\r\n setServerSideOrNot: (key: string, value: boolean) => void;\r\n getServerSideOrNot: (key: string) => boolean | undefined;\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => void;\r\n\r\n getThisLocalUpdate: (key: string) => UpdateTypeDetail[] | undefined;\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => void;\r\n addValidationError: (path: string, message: string) => void;\r\n getValidationErrors: (path: string) => string[];\r\n updateInitialStateGlobal: (key: string, newState: StateValue) => void;\r\n updateInitialCreatedState: (key: string, newState: StateValue) => void;\r\n getInitialOptions: (key: string) => OptionsType | undefined;\r\n getUpdaterState: (key: string) => StateUpdater<StateValue>;\r\n setUpdaterState: (key: string, newUpdater: any) => void;\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => StateValue;\r\n getNestedState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n path: string[]\r\n ) => StateValue;\r\n setState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateUpdater<StateValue>\r\n ) => void;\r\n setInitialStates: (initialState: StateValue) => void;\r\n setCreatedState: (initialState: StateValue) => void;\r\n stateLog: { [key: string]: UpdateTypeDetail[] };\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => void;\r\n setIsLoadingGlobal: (key: string, value: boolean) => void;\r\n\r\n setInitialStateOptions: (key: string, value: OptionsType) => void;\r\n removeValidationError: (path: string) => void;\r\n signalDomElements: Map<\r\n string,\r\n Set<{\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }>\r\n >;\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: {\r\n instanceId: string;\r\n parentId: string;\r\n position: number;\r\n effect?: string;\r\n map?: string;\r\n }\r\n ) => void;\r\n removeSignalElement: (signalId: string, instanceId: string) => void;\r\n reRenderTriggerPrevValue: Record<string, any>;\r\n\r\n reactiveDeps: Record<\r\n string,\r\n {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n >;\r\n setReactiveDeps: (\r\n key: string,\r\n record: {\r\n deps: any[];\r\n updaters: Set<() => void>;\r\n depsFunction: ((state: any) => any[] | true) | null;\r\n }\r\n ) => void;\r\n deleteReactiveDeps: (key: string) => void;\r\n subscribe: (listener: () => void) => () => void;\r\n\r\n stateComponents: Map<string, ComponentsType>;\r\n syncInfoStore: Map<string, SyncInfo>;\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) => void;\r\n getSyncInfo: (key: string) => SyncInfo | null;\r\n};\r\n\r\nexport const getGlobalStore = create<CogsGlobalState>((set, get) => ({\r\n shadowStateStore: {},\r\n getShadowMetadata: (key: string, path: string[]) => {\r\n const shadow = get().shadowStateStore[key];\r\n if (!shadow) return null;\r\n\r\n let current = shadow;\r\n for (const segment of path) {\r\n current = current?.[segment];\r\n if (!current) return null;\r\n }\r\n\r\n return current;\r\n },\r\n\r\n setShadowMetadata: (key: string, path: string[], metadata: any) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n if (!newShadow[key]) return state;\r\n\r\n newShadow[key] = JSON.parse(JSON.stringify(newShadow[key]));\r\n\r\n let current: any = newShadow[key];\r\n for (const segment of path) {\r\n if (!current[segment]) current[segment] = {};\r\n current = current[segment];\r\n }\r\n\r\n // Merge the metadata into the existing structure\r\n Object.keys(metadata).forEach((category) => {\r\n if (!current[category]) {\r\n current[category] = {};\r\n }\r\n Object.assign(current[category], metadata[category]);\r\n });\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n initializeShadowState: (key: string, initialState: any) => {\r\n const createShadowStructure = (obj: any): any => {\r\n if (Array.isArray(obj)) {\r\n return new Array(obj.length)\r\n .fill(null)\r\n .map((_, i) => createShadowStructure(obj[i]));\r\n }\r\n if (typeof obj === \"object\" && obj !== null) {\r\n const shadow: any = {};\r\n for (const k in obj) {\r\n shadow[k] = createShadowStructure(obj[k]);\r\n }\r\n return shadow;\r\n }\r\n return {}; // Leaf node - empty object for metadata\r\n };\r\n\r\n set((state) => ({\r\n shadowStateStore: {\r\n ...state.shadowStateStore,\r\n [key]: createShadowStructure(initialState),\r\n },\r\n }));\r\n },\r\n\r\n updateShadowAtPath: (key: string, path: string[], newValue: any) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n if (!newShadow[key]) return state;\r\n\r\n let current = newShadow[key];\r\n const pathCopy = [...path];\r\n const lastSegment = pathCopy.pop();\r\n\r\n // Navigate to parent\r\n for (const segment of pathCopy) {\r\n if (!current[segment]) current[segment] = {};\r\n current = current[segment];\r\n }\r\n\r\n // Update shadow structure to match new value structure\r\n if (lastSegment !== undefined) {\r\n if (Array.isArray(newValue)) {\r\n current[lastSegment] = new Array(newValue.length);\r\n } else if (typeof newValue === \"object\" && newValue !== null) {\r\n current[lastSegment] = {};\r\n } else {\r\n current[lastSegment] = current[lastSegment] || {};\r\n }\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n\r\n insertShadowArrayElement: (key: string, arrayPath: string[]) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n let current = newShadow[key];\r\n\r\n for (const segment of arrayPath) {\r\n current = current?.[segment];\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n current.push({});\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n\r\n removeShadowArrayElement: (\r\n key: string,\r\n arrayPath: string[],\r\n index: number\r\n ) => {\r\n set((state) => {\r\n const newShadow = { ...state.shadowStateStore };\r\n let current = newShadow[key];\r\n\r\n for (const segment of arrayPath) {\r\n current = current?.[segment];\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n current.splice(index, 1);\r\n }\r\n\r\n return { shadowStateStore: newShadow };\r\n });\r\n },\r\n selectedIndicesMap: new Map<string, Map<string, number>>(),\r\n\r\n // Add the new methods\r\n getSelectedIndex: (stateKey: string, parentPath: string) => {\r\n const stateMap = get().selectedIndicesMap.get(stateKey);\r\n if (!stateMap) return undefined;\r\n return stateMap.get(parentPath);\r\n },\r\n\r\n setSelectedIndex: (\r\n stateKey: string,\r\n parentPath: string,\r\n index: number | undefined\r\n ) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n let stateMap = newMap.get(stateKey);\r\n\r\n if (!stateMap) {\r\n stateMap = new Map<string, number>();\r\n newMap.set(stateKey, stateMap);\r\n }\r\n\r\n if (index === undefined) {\r\n stateMap.delete(parentPath);\r\n } else {\r\n stateMap.set(parentPath, index);\r\n }\r\n\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndex: ({\r\n stateKey,\r\n path,\r\n }: {\r\n stateKey: string;\r\n path: string[];\r\n }) => {\r\n set((state) => {\r\n const newMap = new Map(state.selectedIndicesMap);\r\n const stateMap = newMap.get(stateKey);\r\n if (!stateMap) return state;\r\n const parentPath = path.join(\".\");\r\n stateMap.delete(parentPath);\r\n return {\r\n ...state,\r\n selectedIndicesMap: newMap,\r\n };\r\n });\r\n },\r\n clearSelectedIndexesForState: (stateKey: string) => {\r\n set((state) => {\r\n const newOuterMap = new Map(state.selectedIndicesMap);\r\n const changed = newOuterMap.delete(stateKey);\r\n if (changed) {\r\n console.log(\r\n `Cleared selected indices map entry for stateKey: ${stateKey}`\r\n );\r\n return { selectedIndicesMap: newOuterMap };\r\n } else {\r\n return {};\r\n }\r\n });\r\n },\r\n stateComponents: new Map(),\r\n subscribe: (listener: () => void) => {\r\n // zustand's subscribe returns an unsubscribe function\r\n return get().subscribe(listener);\r\n },\r\n\r\n reactiveDeps: {},\r\n setReactiveDeps: (key, record) =>\r\n set((state) => ({\r\n ...state,\r\n reactiveDeps: {\r\n ...state.reactiveDeps,\r\n [key]: record,\r\n },\r\n })),\r\n deleteReactiveDeps: (key) =>\r\n set((state) => {\r\n const { [key]: _, ...rest } = state.reactiveDeps;\r\n return {\r\n ...state,\r\n reactiveDeps: rest,\r\n };\r\n }),\r\n\r\n reRenderTriggerPrevValue: {},\r\n signalDomElements: new Map(),\r\n addSignalElement: (\r\n signalId: string,\r\n elementInfo: { instanceId: string; parentId: string; position: number }\r\n ) => {\r\n const current = get().signalDomElements;\r\n if (!current.has(signalId)) {\r\n current.set(signalId, new Set());\r\n }\r\n current.get(signalId)!.add(elementInfo);\r\n\r\n set({ signalDomElements: new Map(current) }); // Create new reference to trigger update\r\n },\r\n removeSignalElement: (signalId: string, instanceId: string) => {\r\n const current = get().signalDomElements;\r\n const elements = current.get(signalId);\r\n if (elements) {\r\n elements.forEach((el) => {\r\n if (el.instanceId === instanceId) {\r\n elements.delete(el);\r\n }\r\n });\r\n }\r\n set({ signalDomElements: new Map(current) });\r\n },\r\n initialStateOptions: {},\r\n updaterState: {},\r\n stateTimeline: {},\r\n cogsStateStore: {},\r\n stateLog: {},\r\n isLoadingGlobal: {},\r\n\r\n initialStateGlobal: {},\r\n iniitialCreatedState: {},\r\n updateInitialCreatedState: (key, newState) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.iniitialCreatedState,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n\r\n validationErrors: new Map(),\r\n\r\n serverState: {},\r\n\r\n serverSyncActions: {},\r\n\r\n serverSyncLog: {},\r\n serverSideOrNot: {},\r\n setServerSyncLog: (key, newValue) => {\r\n set((state) => ({\r\n serverSyncLog: {\r\n ...state.serverSyncLog,\r\n [key]: [...(state.serverSyncLog[key] ?? []), newValue],\r\n },\r\n }));\r\n },\r\n setServerSideOrNot: (key, value) => {\r\n set((state) => ({\r\n serverSideOrNot: {\r\n ...state.serverSideOrNot,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n getServerSideOrNot: (key) => {\r\n return get().serverSideOrNot[key];\r\n },\r\n\r\n getThisLocalUpdate: (key: string) => {\r\n return get().stateLog[key];\r\n },\r\n setServerState: <StateKey extends StateKeys>(\r\n key: StateKey,\r\n value: StateValue\r\n ) => {\r\n set((prev) => ({\r\n serverState: {\r\n ...prev.serverState,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n\r\n setStateLog: (\r\n key: string,\r\n updater: (prevUpdates: UpdateTypeDetail[]) => UpdateTypeDetail[]\r\n ) => {\r\n set((prev) => {\r\n const currentUpdates = prev.stateLog[key] ?? [];\r\n const newUpdates = updater(currentUpdates);\r\n return {\r\n stateLog: {\r\n ...prev.stateLog,\r\n [key]: newUpdates,\r\n },\r\n };\r\n });\r\n },\r\n setIsLoadingGlobal: (key: string, value: boolean) => {\r\n set((prev) => ({\r\n isLoadingGlobal: {\r\n ...prev.isLoadingGlobal,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n setServerSyncActions: (key: string, value: SyncActionsType<any>) => {\r\n set((prev) => ({\r\n serverSyncActions: {\r\n ...prev.serverSyncActions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n addValidationError: (path, message) => {\r\n console.log(\"addValidationError---\");\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n const existingMessages = updatedErrors.get(path) || [];\r\n console.log(\"addValidationError\", path, message, existingMessages);\r\n // Append the new message instead of replacing\r\n updatedErrors.set(path, [...existingMessages, message]);\r\n return { validationErrors: updatedErrors };\r\n });\r\n },\r\n removeValidationError: (path) => {\r\n set((prev) => {\r\n const updatedErrors = new Map(prev.validationErrors);\r\n\r\n let doSomething = false;\r\n const pathArray = path.split(\".\");\r\n Array.from(updatedErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n if (keyArray[i] !== pathArray[i]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n doSomething = true;\r\n updatedErrors.delete(key);\r\n }\r\n }\r\n });\r\n\r\n return doSomething ? { validationErrors: updatedErrors } : prev;\r\n });\r\n },\r\n getValidationErrors: (path: string) => {\r\n const errors: string[] = [];\r\n const valErrors = get().validationErrors;\r\n const pathArray = path.split(\".\");\r\n\r\n // Helper to check if an index matches either a wildcard or is in an array of indices\r\n const isIndexMatch = (pathSegment: string, keySegment: string) => {\r\n if (pathSegment === \"[*]\") return true;\r\n if (Array.isArray(pathSegment)) {\r\n return pathSegment.includes(parseInt(keySegment));\r\n }\r\n return pathSegment === keySegment;\r\n };\r\n\r\n Array.from(valErrors.keys()).forEach((key) => {\r\n const keyArray = key.split(\".\");\r\n if (keyArray.length >= pathArray.length) {\r\n let match = true;\r\n for (let i = 0; i < pathArray.length; i++) {\r\n const pathSegment = pathArray[i];\r\n const keySegment = keyArray[i]!;\r\n\r\n // If current path segment is a number or [*], we need special handling\r\n if (pathSegment === \"[*]\" || Array.isArray(pathSegment)) {\r\n // Key segment should be a number if we're using [*] or array indices\r\n const keyIndex = parseInt(keySegment);\r\n if (isNaN(keyIndex)) {\r\n match = false;\r\n break;\r\n }\r\n\r\n if (!isIndexMatch(pathSegment, keySegment)) {\r\n match = false;\r\n break;\r\n }\r\n } else if (pathSegment !== keySegment) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n\r\n if (match) {\r\n const errorMessages = valErrors.get(key);\r\n if (errorMessages) {\r\n errors.push(...errorMessages);\r\n }\r\n }\r\n }\r\n });\r\n\r\n return errors;\r\n },\r\n getInitialOptions: (key) => {\r\n return get().initialStateOptions[key];\r\n },\r\n getNestedState: (key: string, path: string[]) => {\r\n const rootState = get().cogsStateStore[key];\r\n\r\n const getValueWithAsterisk = (obj: any, pathArray: string[]): any => {\r\n if (pathArray.length === 0) return obj;\r\n\r\n const currentPath = pathArray[0];\r\n const remainingPath = pathArray.slice(1);\r\n\r\n if (currentPath === \"[*]\") {\r\n if (!Array.isArray(obj)) {\r\n console.warn(\"Asterisk notation used on non-array value\");\r\n return undefined;\r\n }\r\n\r\n if (remainingPath.length === 0) return obj;\r\n\r\n // Get result for each array item\r\n const results = obj.map((item) =>\r\n getValueWithAsterisk(item, remainingPath)\r\n );\r\n\r\n // If the next path segment exists and returns arrays, flatten them\r\n if (Array.isArray(results[0])) {\r\n return results.flat();\r\n }\r\n\r\n return results;\r\n }\r\n\r\n const value = obj[currentPath as keyof typeof obj];\r\n if (value === undefined) return undefined;\r\n\r\n return getValueWithAsterisk(value, remainingPath);\r\n };\r\n\r\n // This will still get the value but we need to make it reactive only to specific paths\r\n return getValueWithAsterisk(rootState, path);\r\n },\r\n setInitialStateOptions: (key, value) => {\r\n set((prev) => ({\r\n initialStateOptions: {\r\n ...prev.initialStateOptions,\r\n [key]: value,\r\n },\r\n }));\r\n },\r\n updateInitialStateGlobal: (key, newState) => {\r\n set((prev) => ({\r\n initialStateGlobal: {\r\n ...prev.initialStateGlobal,\r\n [key]: newState,\r\n },\r\n }));\r\n },\r\n getUpdaterState: (key) => {\r\n return get().updaterState[key];\r\n },\r\n setUpdaterState: (key, newUpdater) => {\r\n const current = get().updaterState;\r\n\r\n if (!key || !newUpdater) return;\r\n\r\n set({ updaterState: { ...(current ?? {}), [key]: newUpdater } });\r\n },\r\n getKeyState: <StateKey extends StateKeys>(key: StateKey) => {\r\n return get().cogsStateStore[key];\r\n },\r\n\r\n setState: <StateKey extends StateKeys>(key: StateKey, value: StateValue) => {\r\n set((prev) => {\r\n return {\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n [key]:\r\n typeof value === \"function\"\r\n ? value(prev.cogsStateStore[key])\r\n : value,\r\n },\r\n };\r\n });\r\n },\r\n setInitialStates: <StateKey extends StateKeys>(initialState: StateValue) => {\r\n set((prev) => ({\r\n cogsStateStore: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n setCreatedState: (initialState: StateValue) => {\r\n set((prev) => ({\r\n iniitialCreatedState: {\r\n ...prev.cogsStateStore,\r\n ...initialState,\r\n },\r\n }));\r\n },\r\n\r\n syncInfoStore: new Map<string, SyncInfo>(),\r\n setSyncInfo: (key: string, syncInfo: SyncInfo) =>\r\n set((state) => {\r\n const newMap = new Map(state.syncInfoStore);\r\n newMap.set(key, syncInfo);\r\n return { ...state, syncInfoStore: newMap };\r\n }),\r\n getSyncInfo: (key: string) => get().syncInfoStore.get(key) || null,\r\n}));\r\n"],"names":["formRefStore","create","set","get","id","ref","state","newRefs","stateKey","allRefs","stateKeyPrefix","filteredRefs","getGlobalStore","key","path","shadow","current","segment","metadata","newShadow","category","initialState","createShadowStructure","obj","_","i","k","newValue","pathCopy","lastSegment","arrayPath","index","parentPath","stateMap","newMap","newOuterMap","listener","record","rest","signalId","elementInfo","instanceId","elements","el","newState","prev","value","updater","currentUpdates","newUpdates","message","updatedErrors","existingMessages","doSomething","pathArray","keyArray","match","errors","valErrors","isIndexMatch","pathSegment","keySegment","keyIndex","errorMessages","rootState","getValueWithAsterisk","currentPath","remainingPath","results","item","newUpdater","syncInfo"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/CogsState.tsx
CHANGED
|
@@ -37,6 +37,7 @@ import { z } from "zod";
|
|
|
37
37
|
import { formRefStore, getGlobalStore, type ComponentsType } from "./store.js";
|
|
38
38
|
import { useCogsConfig } from "./CogsStateClient.js";
|
|
39
39
|
import { applyPatch } from "fast-json-patch";
|
|
40
|
+
import useMeasure from "react-use-measure";
|
|
40
41
|
|
|
41
42
|
type Prettify<T> = { [K in keyof T]: T[K] } & {};
|
|
42
43
|
|
|
@@ -179,6 +180,15 @@ export type ArrayEndType<TShape extends unknown> = {
|
|
|
179
180
|
arraySetter: StateObject<TShape>
|
|
180
181
|
) => void
|
|
181
182
|
) => any;
|
|
183
|
+
stateList: (
|
|
184
|
+
callbackfn: (
|
|
185
|
+
value: InferArrayElement<TShape>,
|
|
186
|
+
setter: StateObject<InferArrayElement<TShape>>,
|
|
187
|
+
index: number,
|
|
188
|
+
array: TShape,
|
|
189
|
+
arraySetter: StateObject<TShape>
|
|
190
|
+
) => void
|
|
191
|
+
) => any;
|
|
182
192
|
stateMap: (
|
|
183
193
|
callbackfn: (
|
|
184
194
|
value: InferArrayElement<TShape>,
|
|
@@ -1808,7 +1818,12 @@ function createProxyHandler<T>(
|
|
|
1808
1818
|
startIndex: 0,
|
|
1809
1819
|
endIndex: 10,
|
|
1810
1820
|
});
|
|
1811
|
-
|
|
1821
|
+
const getItemHeight = useCallback((index: number) => {
|
|
1822
|
+
const metadata = getGlobalStore
|
|
1823
|
+
.getState()
|
|
1824
|
+
.getShadowMetadata(stateKey, [...path, index.toString()]);
|
|
1825
|
+
return metadata?.virtualizer?.itemHeight || options.itemHeight;
|
|
1826
|
+
}, []);
|
|
1812
1827
|
// --- State Tracking Refs ---
|
|
1813
1828
|
const isAtBottomRef = useRef(stickToBottom);
|
|
1814
1829
|
const previousTotalCountRef = useRef(0);
|
|
@@ -2132,7 +2147,53 @@ function createProxyHandler<T>(
|
|
|
2132
2147
|
});
|
|
2133
2148
|
};
|
|
2134
2149
|
}
|
|
2150
|
+
if (prop === "stateList") {
|
|
2151
|
+
return (
|
|
2152
|
+
callbackfn: (
|
|
2153
|
+
value: InferArrayElement<T>,
|
|
2154
|
+
setter: StateObject<InferArrayElement<T>>,
|
|
2155
|
+
index: number,
|
|
2156
|
+
array: T,
|
|
2157
|
+
arraySetter: StateObject<T>
|
|
2158
|
+
) => any
|
|
2159
|
+
) => {
|
|
2160
|
+
const arrayToMap = getGlobalStore
|
|
2161
|
+
.getState()
|
|
2162
|
+
.getNestedState(stateKey, path) as any[];
|
|
2135
2163
|
|
|
2164
|
+
if (!Array.isArray(arrayToMap)) {
|
|
2165
|
+
console.warn(
|
|
2166
|
+
`stateList called on a non-array value at path: ${path.join(".")}.`
|
|
2167
|
+
);
|
|
2168
|
+
return null;
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2171
|
+
const indicesToMap =
|
|
2172
|
+
meta?.validIndices ||
|
|
2173
|
+
Array.from({ length: arrayToMap.length }, (_, i) => i);
|
|
2174
|
+
|
|
2175
|
+
return indicesToMap.map((originalIndex, localIndex) => {
|
|
2176
|
+
const item = arrayToMap[originalIndex];
|
|
2177
|
+
const finalPath = [...path, originalIndex.toString()];
|
|
2178
|
+
const setter = rebuildStateShape(item, finalPath, meta);
|
|
2179
|
+
const itemComponentId = `${componentId}-${path.join(".")}-${originalIndex}`;
|
|
2180
|
+
|
|
2181
|
+
return createElement(CogsItemWrapper, {
|
|
2182
|
+
key: originalIndex,
|
|
2183
|
+
stateKey,
|
|
2184
|
+
itemComponentId,
|
|
2185
|
+
itemPath: finalPath,
|
|
2186
|
+
children: callbackfn(
|
|
2187
|
+
item,
|
|
2188
|
+
setter,
|
|
2189
|
+
localIndex,
|
|
2190
|
+
arrayToMap as any,
|
|
2191
|
+
rebuildStateShape(arrayToMap as any, path, meta)
|
|
2192
|
+
),
|
|
2193
|
+
});
|
|
2194
|
+
});
|
|
2195
|
+
};
|
|
2196
|
+
}
|
|
2136
2197
|
if (prop === "stateFlattenOn") {
|
|
2137
2198
|
return (fieldName: string) => {
|
|
2138
2199
|
const arrayToMap = currentState as any[];
|
|
@@ -2851,7 +2912,7 @@ export function $cogsSignalStore(proxy: {
|
|
|
2851
2912
|
);
|
|
2852
2913
|
return createElement("text", {}, String(value));
|
|
2853
2914
|
}
|
|
2854
|
-
|
|
2915
|
+
|
|
2855
2916
|
function CogsItemWrapper({
|
|
2856
2917
|
stateKey,
|
|
2857
2918
|
itemComponentId,
|
|
@@ -2863,10 +2924,19 @@ function CogsItemWrapper({
|
|
|
2863
2924
|
itemPath: string[];
|
|
2864
2925
|
children: React.ReactNode;
|
|
2865
2926
|
}) {
|
|
2866
|
-
// This is a real component, so we can safely call hooks.
|
|
2867
2927
|
const [, forceUpdate] = useState({});
|
|
2928
|
+
const [ref, bounds] = useMeasure();
|
|
2929
|
+
|
|
2930
|
+
useEffect(() => {
|
|
2931
|
+
if (bounds.height > 0) {
|
|
2932
|
+
getGlobalStore.getState().setShadowMetadata(stateKey, itemPath, {
|
|
2933
|
+
virtualizer: {
|
|
2934
|
+
itemHeight: bounds.height,
|
|
2935
|
+
},
|
|
2936
|
+
});
|
|
2937
|
+
}
|
|
2938
|
+
}, [bounds.height]);
|
|
2868
2939
|
|
|
2869
|
-
// We use useLayoutEffect to register the component and clean up when it unmounts.
|
|
2870
2940
|
useLayoutEffect(() => {
|
|
2871
2941
|
const fullComponentId = `${stateKey}////${itemComponentId}`;
|
|
2872
2942
|
const stateEntry = getGlobalStore
|
|
@@ -2875,15 +2945,13 @@ function CogsItemWrapper({
|
|
|
2875
2945
|
components: new Map(),
|
|
2876
2946
|
};
|
|
2877
2947
|
|
|
2878
|
-
// Register the component with its unique ID and its specific, atomic path.
|
|
2879
2948
|
stateEntry.components.set(fullComponentId, {
|
|
2880
2949
|
forceUpdate: () => forceUpdate({}),
|
|
2881
|
-
paths: new Set([itemPath.join(".")]),
|
|
2950
|
+
paths: new Set([itemPath.join(".")]),
|
|
2882
2951
|
});
|
|
2883
2952
|
|
|
2884
2953
|
getGlobalStore.getState().stateComponents.set(stateKey, stateEntry);
|
|
2885
2954
|
|
|
2886
|
-
// Return a cleanup function to unregister on unmount.
|
|
2887
2955
|
return () => {
|
|
2888
2956
|
const currentEntry = getGlobalStore
|
|
2889
2957
|
.getState()
|
|
@@ -2892,8 +2960,7 @@ function CogsItemWrapper({
|
|
|
2892
2960
|
currentEntry.components.delete(fullComponentId);
|
|
2893
2961
|
}
|
|
2894
2962
|
};
|
|
2895
|
-
}, [stateKey, itemComponentId, itemPath.join(".")]);
|
|
2963
|
+
}, [stateKey, itemComponentId, itemPath.join(".")]);
|
|
2896
2964
|
|
|
2897
|
-
|
|
2898
|
-
return <>{children}</>;
|
|
2965
|
+
return <div ref={ref}>{children}</div>;
|
|
2899
2966
|
}
|
package/src/store.ts
CHANGED
|
@@ -253,13 +253,19 @@ export const getGlobalStore = create<CogsGlobalState>((set, get) => ({
|
|
|
253
253
|
|
|
254
254
|
newShadow[key] = JSON.parse(JSON.stringify(newShadow[key]));
|
|
255
255
|
|
|
256
|
-
let current = newShadow[key];
|
|
256
|
+
let current: any = newShadow[key];
|
|
257
257
|
for (const segment of path) {
|
|
258
258
|
if (!current[segment]) current[segment] = {};
|
|
259
259
|
current = current[segment];
|
|
260
260
|
}
|
|
261
261
|
|
|
262
|
-
|
|
262
|
+
// Merge the metadata into the existing structure
|
|
263
|
+
Object.keys(metadata).forEach((category) => {
|
|
264
|
+
if (!current[category]) {
|
|
265
|
+
current[category] = {};
|
|
266
|
+
}
|
|
267
|
+
Object.assign(current[category], metadata[category]);
|
|
268
|
+
});
|
|
263
269
|
|
|
264
270
|
return { shadowStateStore: newShadow };
|
|
265
271
|
});
|