@mgarlik/datastore 0.1.0 → 0.1.2
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/README.md +28 -1
- package/dist/chunk-7XDRKNJQ.js +14 -0
- package/dist/chunk-7XDRKNJQ.js.map +1 -0
- package/dist/expo-sqlite.cjs +210 -0
- package/dist/expo-sqlite.cjs.map +1 -0
- package/dist/expo-sqlite.d.cts +31 -0
- package/dist/expo-sqlite.d.ts +31 -0
- package/dist/expo-sqlite.js +166 -0
- package/dist/expo-sqlite.js.map +1 -0
- package/dist/index.cjs +990 -1097
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +117 -75
- package/dist/index.d.ts +117 -75
- package/dist/index.js +1005 -1101
- package/dist/index.js.map +1 -1
- package/dist/storage-D_xv8gFb.d.cts +18 -0
- package/dist/storage-D_xv8gFb.d.ts +18 -0
- package/package.json +16 -6
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/DataStoreProvider.tsx","../src/log.ts","../src/handleSocketMessage.ts","../src/handleData.ts","../src/utils.ts","../src/dotPath.ts","../src/templates.ts","../src/database.ts","../src/useDataProvider.tsx","../src/useDocument.ts","../src/useProviderActions.tsx","../src/logColors.ts"],"sourcesContent":["export { default as DataStoreProvider } from \"./DataStoreProvider\";\nexport * from \"./DataStoreProvider\";\nexport * from \"./types\";\nexport * from \"./providerTypes\";\nexport * from \"./useDataProvider\";\nexport * from \"./useDocument\";\nexport * from \"./useProviderActions\";\nexport * from \"./utils\";\nexport * from \"./logColors\";\n","import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { handleSocketMessage } from \"./handleSocketMessage\";\nimport { getData, deleteData, patchData, postData } from \"./handleData\";\nimport { filterDocuments, dataStoreFilterObject, doesObjectMatchFilter, recalculateObjectWithDocument, uuid } from \"./utils\";\nimport { io as ioSockets } from \"socket.io-client\";\nimport axios from \"axios\";\nimport { getLocales } from \"expo-localization\";\nimport { renderJSONTemplate } from \"./templates\";\nimport { systemLog } from \"./log\";\nimport isEqual from \"lodash/isEqual.js\";\nimport { SQLite as DBSQLite } from \"./database\";\nimport { DataProvider, ProviderTypes } from \"./providerTypes\";\nimport { DataStore, DataStoreProps, DispatcherActionType, DispatcherType, JSONType, SocketItem, Uuid } from \"./types\";\n\nexport const SQLite = new DBSQLite(\"modelaz.db\");\n\ntype DataStoreMetaType = Pick<DataStore, \"isLive\" | \"isSynchronizing\" | \"sockets\" | \"counterProviders\" | \"counterDocuments\">;\ntype DataStoreActionsType = Pick<\n DataStore,\n | \"dispatch\"\n | \"initProvider\"\n | \"resetProvider\"\n | \"registerProvider\"\n | \"unregisterProvider\"\n | \"updateProviderListeners\"\n | \"resetDataStore\"\n | \"startSockets\"\n | \"stopSockets\"\n | \"registerProviderSockets\"\n | \"unregisterProviderSockets\"\n | \"updateDocuments\"\n | \"presetProviders\"\n>;\n\ntype DataStoreStableType = {\n dispatch: DataStore[\"dispatch\"];\n presetProviders: DataStore[\"presetProviders\"];\n updateProviderListeners: DataStore[\"updateProviderListeners\"];\n subscribeToProvider: (providerId: string, callback: () => void) => () => void;\n getProviderLastUpdate: (providerId: string) => string | null;\n getExternalDocuments: () => Record<string, any>;\n getExternalProviders: () => Record<string, any>;\n};\n\n/** Meta (isLive, isSynchronizing, sockets, counters) */\nexport const DataStoreContext = createContext<DataStoreMetaType>({} as DataStoreMetaType);\n/** Raw documents map */\nexport const DataStoreDocumentsContext = createContext<Record<string, any>>({});\n/** Raw providers map */\nexport const DataStoreProvidersContext = createContext<Record<string, any>>({});\n/** Stable action callbacks */\nexport const DataStoreActionsContext = createContext<DataStoreActionsType>({} as DataStoreActionsType);\n/** Stable datastore API for provider-scoped subscriptions */\nexport const DataStoreStableContext = createContext<DataStoreStableType>({} as DataStoreStableType);\n\n/** Returns all stable action callbacks. Components using this hook never re-render due to document changes. */\nexport const useDataStoreActions = () => useContext(DataStoreActionsContext);\n\n/**\n *\n * @param filter - objekt filteru\n * @param resultType - \"object\"(default) | \"array\"\n * @returns {documents, filter}\n */\n\nexport const useFilteredDocuments = (filter: Record<string, any>) => {\n const [activeFilter, setFilter] = useState(filter);\n const [data, setData] = useState<any[]>();\n\n const documents = useContext(DataStoreDocumentsContext);\n\n useEffect(() => {\n setFilter(filter);\n }, [JSON.stringify(filter)]);\n\n useEffect(() => {\n console.time(\"Filter\");\n // console.log(\"Filter\", activeFilter);\n if (activeFilter && documents && Object.keys(documents).length > 0 && Object.keys(activeFilter).length > 0) {\n const result = dataStoreFilterObject(documents, activeFilter);\n const dataArray = Object.keys(result).map((id) => ({\n id,\n ...result[id],\n }));\n if (!isEqual(data, dataArray)) setData(dataArray);\n }\n console.timeEnd(\"Filter\");\n }, [activeFilter, documents]);\n\n return { documents: data || documents, setFilter };\n};\n\n/**\n * Vrati objekt vsech dokumentu\n *\n * @returns {} documentu\n */\nexport const useDocuments = (): { [key: string]: any } => {\n const documents = useContext(DataStoreDocumentsContext);\n return { documents };\n};\n\n/**\n * Vrati object of documents daneho providera. Dokumenty lze vyfiltrovat\n *\n * @param {*} provider\n * @param {*} filter\n * @returns\n */\nexport const useProviderDocuments = (\n provider: ProviderTypes,\n settings?: { filter?: Record<string, any>; documentId?: Uuid; document?: Record<string, any> },\n): { [key: string]: any } => {\n const documents = useContext(DataStoreDocumentsContext);\n const providers = useContext(DataStoreProvidersContext);\n\n const docs = useMemo(() => {\n console.log(\"useProviderDocuments\", provider);\n const d: Record<string, any> = {};\n providers[provider]?.data.forEach((id: string) => {\n // console.log(\"useProviderDocuments\", id);\n\n // Pokud je nastaveny filter a polozka ho nesplnuje, nevracime nic\n if (settings?.filter && !doesObjectMatchFilter(documents[id], settings.filter)) return;\n\n let result = documents[id];\n // Pokud je dokument, podle ktereho se ma prepocitat, tak prepocitame\n if (providers[provider].depend) {\n // console.log(\"1\");\n // console.log(\"PRED\", JSON.stringify(documents[id], null, 2));\n result = recalculateObjectWithDocument(documents[id], documents[providers[provider].depend]);\n // console.log(\"PO\", JSON.stringify(result, null, 2));\n } else if (settings?.documentId) {\n result = recalculateObjectWithDocument(documents[id], documents[settings.documentId]);\n } else if (settings?.document) {\n // console.log(\"2\");\n result = recalculateObjectWithDocument(documents[id], settings.document);\n }\n d[id] = result;\n // return (d[id] = result);\n });\n\n // Nevim proc, ale je to cca 100x pomalejsi\n // const d = Object.fromEntries(\n // Object.entries(documents).filter(([key, value]) =>\n // providers[provider]?.data.includes(key)\n // )\n // );\n return d;\n }, [providers[provider]?.lastUpdate, documents[providers[provider]?.depend], settings?.filter, settings?.documentId, settings?.document]);\n return { documents: docs };\n};\n\nexport const useProvider = (val: ProviderTypes) => {\n const providers = useContext(DataStoreProvidersContext);\n return providers[val];\n};\n\n/** Full DataStore — merges all sub-contexts. Components using this re-render on any state change. */\nexport const useDataStore = (): DataStore => {\n const meta = useContext(DataStoreContext);\n const documents = useContext(DataStoreDocumentsContext);\n const providers = useContext(DataStoreProvidersContext);\n const actions = useContext(DataStoreActionsContext);\n return { ...meta, documents, providers, ...actions };\n};\n\nconst modelTemplateIdMap: Record<string, string> = {\n brands: \"brandId\",\n payments: \"paymentId\",\n profiles: \"profileId\",\n user: \"userId\",\n};\n\nconst buildDocumentTemplateParams = (model: string, documentId: Uuid) => {\n const templateIdKey = modelTemplateIdMap[model] || `${model.replace(/s$/, \"\")}Id`;\n\n return {\n id: documentId,\n documentId,\n productId: documentId,\n [templateIdKey]: documentId,\n };\n};\n\nconst DataStoreProvider = ({ socketServer, restServer, usePersistentStorage = true, ...props }: DataStoreProps) => {\n const [isLive, setIsLive] = useState(false);\n const [isSynchronizing, setIsSynchronizing] = useState(true);\n\n const [sockets, setSockets] = useState<Record<string, SocketItem>>({});\n const [providers, setProviders] = useState<Record<string, any>>({});\n const [documents, setDocuments] = useState<Record<string, any>>({});\n\n const externalProvidersRef = useRef<Record<string, any>>({});\n const externalDocumentsRef = useRef<Record<string, any>>({});\n const providerSubscribersRef = useRef<Map<string, Set<() => void>>>(new Map());\n const previousProviderUpdateIdsRef = useRef<Record<string, string | null>>({});\n\n const [dispatcher, setDispatcher] = useState<DispatcherType>({ isBussy: false, actions: [] });\n\n const [counterProviders, setCounterProviders] = useState<Record<string, number>>({});\n const [counterDocuments, setCounterDocuments] = useState<Record<string, number>>({});\n const didInitialLiveSyncRef = useRef(false);\n\n useEffect(() => {\n if (!restServer) return;\n const localization = getLocales();\n axios.defaults.baseURL = restServer;\n axios.defaults.headers.common[\"Accept-Language\"] = localization[0]?.languageCode;\n systemLog(\"dsp\", \"[INIT] Axios baseURL:\", restServer);\n\n async function checkServer() {\n try {\n const response = await axios.head(\"/\", {\n timeout: 7000,\n validateStatus: () => true,\n });\n systemLog(\"dsp\", \"[INIT] Axios Success, status:\", response.status);\n } catch (e) {\n if (axios.isAxiosError(e)) {\n systemLog(\"dsp\", \"[INIT] Axios Error:\", e.code ?? \"UNKNOWN\", e.message);\n } else {\n systemLog(\"dsp\", \"[INIT] Axios Error:\", String(e));\n }\n } finally {\n systemLog(\"dsp\", \"[INIT] Axios check done\");\n }\n }\n\n checkServer();\n }, [restServer]);\n\n const socketRoomHandlersRef = useRef<Record<string, (msg: string) => void>>({});\n const socketActionHandlersRef = useRef<{ dispatch?: typeof dispatch; updateDocument?: typeof updateDocument }>({});\n\n systemLog(\"dsp\", \"START\");\n // const socket = ioSockets(socketServer?.url, socketServer?.params);\n const socket = useMemo(() => ioSockets(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);\n const handleSocketConnect = useCallback(() => setIsLive(true), []);\n const handleSocketDisconnect = useCallback(() => setIsLive(false), []);\n\n const getSocketAuthToken = useCallback(() => {\n const authorizationHeader = axios.defaults.headers.common[\"Authorization\"];\n if (typeof authorizationHeader === \"string\" && authorizationHeader.length > 0) {\n return authorizationHeader.startsWith(\"Bearer \") ? authorizationHeader : `Bearer ${authorizationHeader}`;\n }\n return \"Bearer \";\n }, []);\n\n const subscribeToProvider = useCallback((providerId: string, callback: () => void) => {\n const subscribersByProvider = providerSubscribersRef.current;\n const providerSubscribers = subscribersByProvider.get(providerId) || new Set<() => void>();\n providerSubscribers.add(callback);\n subscribersByProvider.set(providerId, providerSubscribers);\n\n return () => {\n const activeSubscribers = subscribersByProvider.get(providerId);\n if (!activeSubscribers) return;\n activeSubscribers.delete(callback);\n if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);\n };\n }, []);\n\n const getProviderLastUpdate = useCallback((providerId: string) => {\n return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;\n }, []);\n\n const getExternalDocuments = useCallback(() => externalDocumentsRef.current, []);\n const getExternalProviders = useCallback(() => externalProvidersRef.current, []);\n\n useEffect(() => {\n externalProvidersRef.current = providers;\n const currentUpdateIds: Record<string, string | null> = {};\n\n Object.keys(providers).forEach((providerId) => {\n currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;\n if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {\n const subscribers = providerSubscribersRef.current.get(providerId);\n subscribers?.forEach((callback) => callback());\n }\n });\n\n Object.keys(previousProviderUpdateIdsRef.current).forEach((providerId) => {\n if (!(providerId in currentUpdateIds)) {\n const subscribers = providerSubscribersRef.current.get(providerId);\n subscribers?.forEach((callback) => callback());\n }\n });\n\n previousProviderUpdateIdsRef.current = currentUpdateIds;\n }, [providers]);\n\n useEffect(() => {\n externalDocumentsRef.current = documents;\n }, [documents]);\n\n const persistDocument = useCallback(\n async ({\n documentId,\n model,\n data,\n lastUpdate = new Date().toISOString(),\n }: {\n documentId: Uuid;\n model: string;\n data: JSONType;\n lastUpdate?: string;\n }) => {\n if (!usePersistentStorage) return;\n await SQLite.query(\"INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES (?, ?, ?, ?)\", [\n documentId,\n JSON.stringify(data),\n model,\n lastUpdate,\n ]);\n },\n [usePersistentStorage],\n );\n\n const removePersistedDocument = useCallback(\n async (documentId: Uuid) => {\n if (!usePersistentStorage) return;\n await SQLite.query(\"DELETE FROM documents WHERE id = ?\", [documentId]);\n },\n [usePersistentStorage],\n );\n\n const synchronizeDataStore = useCallback(async () => {\n setIsSynchronizing(true);\n const stats = { processed: 0, updated: 0, failed: 0 };\n try {\n for (const key of Object.keys(providers)) {\n stats.processed++;\n try {\n // console.log(\"Obnovuji\", key, \"-\", providers[key].lastUpdate.time);\n const { data, lastUpdate, ...rest } = providers[key];\n const response = await getData({\n id: key,\n ...rest,\n changeTime: lastUpdate.time,\n });\n\n if (response.length > 0) {\n // console.log(key, \":\", response.length);\n // Prevedeme data na object\n const updateData: Record<string, any> = {};\n response.forEach((item: any) => {\n const { id, ...d } = item;\n updateData[id] = d;\n });\n // console.log(JSON.stringify(updateData, null, 2));\n await updateDocuments({ model: key, documents: updateData, mode: \"replace\" });\n stats.updated++;\n }\n } catch (e) {\n stats.failed++;\n console.error(\"[DSP] synchronizeDataStore provider error:\", key, e);\n }\n }\n } finally {\n setIsSynchronizing(false);\n systemLog(\"dsp\", \"[synchronizeDataStore] Hotovo:\", stats);\n }\n }, [providers]);\n\n useEffect(() => {\n if (isLive) {\n // Prechod do aktivnich sockets\n systemLog(\"dsp\", \"useEffect[isLive] Sockets: \", JSON.stringify(sockets, null, 2));\n const ss = Object.keys(sockets);\n systemLog(\"dsp\", \"useEffect[isLive] registruji\", ss);\n if (ss?.length > 0) socket.emit(\"joinRooms\", JSON.stringify(ss));\n if (!didInitialLiveSyncRef.current) {\n didInitialLiveSyncRef.current = true;\n systemLog(\"dsp\", \"useEffect[isLive] Zacinam synchronizovat\");\n synchronizeDataStore();\n }\n } else {\n didInitialLiveSyncRef.current = false;\n // alert(\"OffLine\");\n }\n }, [isLive, socket, sockets, synchronizeDataStore]);\n\n const presetProviders = props.providers;\n\n // const contextRef = useRef();\n\n // Inicializace\n useEffect(() => {\n // contextRef.current = { dispatch, updateDocument };\n socket.on(\"connect\", handleSocketConnect);\n socket.on(\"disconnect\", handleSocketDisconnect);\n return () => {\n socket.off(\"connect\", handleSocketConnect);\n socket.off(\"disconnect\", handleSocketDisconnect);\n };\n }, [socket, handleSocketConnect, handleSocketDisconnect]);\n\n /**\n * Zapne Sockets pro sledovani dat\n */\n const startSockets = useCallback(() => {\n socket.auth = {\n ...((socket.auth as Record<string, any>) || {}),\n ...(socketServer?.params?.auth || {}),\n token: getSocketAuthToken(),\n };\n systemLog(\"dsp\", \"PRIPOJUJI LIVE SOCKETS\");\n socket.connect();\n }, [socket, socketServer?.params?.auth, getSocketAuthToken]);\n\n /**\n * Ukonci Sockets pro sledovani dat\n */\n const stopSockets = useCallback(() => {\n systemLog(\"dsp\", \"[DSP] ODPOJUJI LIVE SOCKETS\");\n socket.disconnect();\n }, [socket]);\n\n const resetDataStore = useCallback(async () => {\n console.time(\"[DSP] resetDataStore\");\n if (usePersistentStorage) {\n await SQLite.emptyTable(\"documents\");\n }\n // await SQLite.resetDatabase();\n setSockets({});\n setProviders({});\n setDocuments({});\n // setDispatcher({ actions: [], isBussy: false });\n setCounterProviders({});\n setCounterDocuments({});\n console.timeEnd(\"[DSP] resetDataStore\");\n }, [usePersistentStorage]);\n\n const resetProvider = useCallback(\n async (provider: string) => {\n if (!usePersistentStorage) return;\n await SQLite.query(`DELETE FROM documents WHERE model='${provider}'`);\n },\n [usePersistentStorage],\n );\n\n const initProvider = useCallback(\n async (id: string, data?: any): Promise<DataProvider | boolean> => {\n const providerPreset = presetProviders[id as keyof typeof presetProviders];\n const prov = renderJSONTemplate<DataProvider>({ ...(providerPreset || {}), id: id as ProviderTypes }, data);\n systemLog(\"dsp\", \"[INIT PROVIDER] \", id, \"(\", data || \"\", \")\");\n if (typeof prov !== \"boolean\") {\n return await registerProvider(prov);\n }\n\n return false;\n },\n [presetProviders],\n );\n\n const dispatch = useCallback((action: DispatcherActionType, data: any, callback?: (data: JSONType) => void) => {\n systemLog(\"dsp\", \"[DSP] DISPATCH Ukladam akci\", action, \",\", data);\n setDispatcher((prev) => ({\n isBussy: prev.isBussy,\n actions: [...prev.actions, { action, data, callback }],\n }));\n }, []);\n\n useEffect(() => {\n async function processDispatcher() {\n if (dispatcher.actions.length > 0) {\n let result;\n systemLog(\"dsp\", \"[DSP] DISPATCHER Zpracovavam\", dispatcher.actions[0].action);\n const timeCode = uuid();\n console.time(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);\n setDispatcher((prev) => ({ ...prev, isBussy: true }));\n const item = dispatcher.actions[0];\n // setDispatcherHistory((prev) => [...prev, item]);\n switch (item.action) {\n case \"registerProvider\": // DataProvider, useDataProvider\n await registerProvider(item.data);\n break;\n case \"unregisterProvider\": // DataProvider, useDataProvider\n await unregisterProvider(item.data);\n break;\n case \"updateDataStore\": // DataProvider\n result = await updateDataStore(item.data);\n break;\n case \"createDocument\": // handleSocketMessage\n await createDocument(item.data);\n break;\n case \"updateDocument\": // handleSocketMessage\n await updateDocument(item.data);\n break;\n case \"updateDocuments\": // handleSocketMessage\n await updateDocuments(item.data);\n break;\n case \"removeItem\": // handleSocketMessage\n // await removeItem(item.data);\n break;\n case \"deleteDocument\": // handleSocketMessage\n await deleteDocument(item.data);\n break;\n case \"createProviderItem\": // DataProvider\n result = await createProviderItem(item.data);\n break;\n case \"deleteProviderItem\": // DataProvider\n result = await deleteProviderItem(item.data);\n break;\n default:\n console.error(\"Unknown Action \", item.action, \"Data: \", item.data);\n }\n item.callback && item.callback(result);\n\n setDispatcher((prev) => ({\n isBussy: false,\n actions: prev.actions.slice(1),\n }));\n console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);\n }\n }\n if (!dispatcher.isBussy) processDispatcher();\n }, [dispatcher]);\n\n //TODO: Dat vedet spravnym providerum ze doslo k updatu, a zkontrolovat jestli providerovi porad patri vsechna data\n //TODO: Zajistit, aby setProviders bylo zavolano az po updatu setDocuments - problem pri > 2000 updatovanych dokumentu\n /**\n *\n * @param {*} model - nazev modelu\n * @param {*} documents - objekt dokumentu: {id: {data}, ...} nebo pole dokumentu: [{id: 123, name: \"Michal\", ...}, ...]\n * @param {*} mode - update (default) | replace - update jen updatuje, replace nahradi kompletni dokument. Replace je vhodne, pokud se maji nektere polozky smazat\n *\n * Updatuje nekolik dokumentu zaroven\n */\n const updateDocuments = useCallback(\n async ({\n model,\n documents: uDocuments,\n mode = \"update\",\n }: {\n model: string;\n documents: any;\n mode?: \"update\" | \"replace\";\n }): Promise<void> => {\n systemLog(\"dsp\", \"[DSP] updateDocuments updatuji model:\", model, \"Documents:\", Object.keys(uDocuments).length);\n\n const modelProvider = providers[model];\n if (!modelProvider) {\n systemLog(\"dsp\", \"[DSP] updateDocuments - provider neexistuje:\", model);\n return;\n }\n\n let data = [...(modelProvider.data || [])];\n const documentsToPersist: Array<{ id: Uuid; data: JSONType }> = [];\n const documentIdsToDelete: Uuid[] = [];\n\n setDocuments((prev) => {\n console.time(\"updateDocuments\");\n\n let newDocs = { ...prev };\n if (Array.isArray(uDocuments)) {\n uDocuments.forEach((document) => {\n const { id, ...doc } = document;\n switch (mode) {\n case \"replace\":\n systemLog(\"dsp\", \"updateDocuments - replace\", id);\n newDocs[id] = doc;\n if (doc._deleted) {\n data = data.filter((d) => d !== id);\n documentIdsToDelete.push(id);\n delete newDocs[id];\n } else {\n if (!data.includes(id)) data.push(id);\n documentsToPersist.push({ id, data: newDocs[id] });\n }\n break;\n case \"update\":\n default:\n if (!newDocs[id]) {\n // console.log(\"Vytvarim\", id);\n systemLog(\"dsp\", \"updateDocuments - vytvarim\", id);\n // Pridavame novy dokument\n data.push(id);\n newDocs[id] = doc;\n documentsToPersist.push({ id, data: newDocs[id] });\n } else if (doc._deleted) {\n // Mazeme dokument - je _deleted\n // console.log(\"Mazu\", id);\n systemLog(\"dsp\", \"updateDocuments - mazu\", id);\n data = data.filter((d) => d !== id);\n documentIdsToDelete.push(id);\n delete newDocs[id];\n } else {\n // Updatujeme dokument\n // console.log(\"Updatuji\", id);\n systemLog(\"dsp\", \"updateDocuments - updatuji\", id);\n newDocs[id] = { ...newDocs[id], ...doc };\n documentsToPersist.push({ id, data: newDocs[id] });\n }\n break;\n }\n });\n } else {\n for (const key in uDocuments) {\n // console.log(\"Key\", key, \"mode\", mode);\n switch (mode) {\n case \"replace\":\n if (!newDocs[key]) {\n // Pridavame novy dokument\n data.push(key);\n }\n if (uDocuments[key]._deleted) {\n // Mazeme dokument - je _deleted\n data = data.filter((d) => d !== key);\n documentIdsToDelete.push(key);\n }\n // Prepisujeme puvodni dokument\n newDocs[key] = uDocuments[key];\n if (uDocuments[key]._deleted) {\n delete newDocs[key];\n } else {\n documentsToPersist.push({ id: key, data: newDocs[key] });\n }\n break;\n case \"update\":\n default:\n if (!newDocs[key]) {\n // Pridavame novy dokument\n data.push(key);\n newDocs[key] = uDocuments[key];\n documentsToPersist.push({ id: key, data: newDocs[key] });\n break;\n }\n if (uDocuments[key]._deleted) {\n // Mazeme dokument - je _deleted\n data = data.filter((d) => d !== key);\n documentIdsToDelete.push(key);\n delete newDocs[key];\n } else {\n // updatujeme puvodni dokument\n newDocs[key] = { ...newDocs[key], ...uDocuments[key] };\n documentsToPersist.push({ id: key, data: newDocs[key] });\n }\n break;\n }\n }\n }\n console.timeEnd(\"updateDocuments\");\n return newDocs;\n });\n const unique = uuid();\n setProviders((prev) => {\n const newP = { ...prev };\n newP[model] = {\n ...newP[model],\n data,\n lastUpdate: { id: unique, time: new Date() },\n };\n // console.log(\"Provider \", model, \" updated\", data.length, unique);\n return newP;\n });\n\n if (modelProvider?.isPersisting && usePersistentStorage) {\n await Promise.all(documentsToPersist.map((item) => persistDocument({ documentId: item.id, model, data: item.data })));\n await Promise.all(documentIdsToDelete.map((documentId) => removePersistedDocument(documentId)));\n }\n },\n [providers, setDocuments, setProviders, persistDocument, removePersistedDocument],\n );\n\n const updateDocument = useCallback(\n async ({ documentId, model, fields, data: pData }: { documentId: Uuid; model: ProviderTypes; fields?: any[]; data?: any }) => {\n systemLog(\"dsp\", \"[updateDocument]:\", documentId, \", model:\", model);\n // TODO: Myslim ze by melo byt premistene az do samotneho update s prev hodnotou dokumentu (setDocuments).\n let data = pData;\n // Pokud jsou data dana funkci, predame ji aktualni stav dokumentu\n if (typeof pData === \"function\") data = pData(documents[documentId]);\n\n // console.time(\"[DSP UPDATE DOCUMENT]\");\n // systemLog(\"dsp\", \"[updateDocument] data: \", JSON.stringify(data, null, 2));\n if (fields) {\n // Ziskame polozky ze serveru a pak s nimi zaktualizujeme dokument\n systemLog(\"dsp\", \"[updateDocument] Stahovani \", model, \", document: \", documentId, \", fields: \", fields);\n systemLog(\"dsp\", \"[updateDocument] Providers: \", Object.keys(providers));\n const provider = presetProviders[model];\n systemLog(\"dsp\", \"[updateDocument]\", provider);\n let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));\n if (dP) {\n const dataFromSource = await getData({\n id: dP.id,\n dataSource: { ...dP.dataSource, params: { select: fields.join(\" \") } },\n isPersisting: !!dP.isPersisting && usePersistentStorage,\n schema: dP.schema,\n SQLite,\n });\n systemLog(\"dsp\", \"[updateDocument] DATA: \", dataFromSource);\n data = dataFromSource;\n }\n }\n if (data) {\n // console.log(\"[updateDocument]:\", documentId, \", model:\", model);\n var listeningProviders = 0; // seznam provideru, kteri maji v kolekci dokument\n var isProvidersUpdated = false; // pokud nejaky provider s dokumentem v kolekci pribude/zmizi, budeme aktualizovat documentCounters\n // console.time(\"[DSP UPDATE PROVIDERS OUTSIDE]\", documentId, \", model:\", model);\n const rand = uuid();\n setProviders((prev) => {\n systemLog(\"dsp\", \"[updateDocument] setProviders\", rand);\n console.time(\"[DSP UPDATE PROVIDERS INSIDE]\");\n var newProviders = { ...prev };\n Object.keys(newProviders).forEach((key) => {\n const provider = newProviders[key];\n const providerNext = {\n ...provider,\n data: Array.isArray(provider?.data) ? [...provider.data] : [],\n };\n // Sezbirame cemu provider nasloucha. Pokud v tom bude nova polozka, prozeneme ji filterem. Pokud bude platny, pridame ji\n var socketListeners = providerNext.dataSource?.socketListeners || [];\n if (socketListeners.length === 0) {\n // Pokud provider nema zadne listeners a ma polozku v datech, tak jen zaradime do seznamu naslouchajicich Provideru\n if (providerNext.data.includes(documentId)) {\n if (!providerNext.dataSource?.filter || filterDocuments(data, providerNext.dataSource?.filter)) {\n systemLog(\"dsp\", \"[updateDocument] - zustava v Provider bez Listeners:\", key);\n listeningProviders++;\n // Nastavime, ze provider ma update\n providerNext.lastUpdate = {\n id: uuid(),\n time: new Date(),\n documentId: documentId,\n };\n } else {\n providerNext.data = providerNext.data.filter((item: string) => item !== documentId);\n isProvidersUpdated = true;\n // Nastavime, ze provider ma update\n providerNext.lastUpdate = {\n id: uuid(),\n time: new Date(),\n documentId: documentId,\n };\n }\n }\n // Pokud provider nema zadny listeners nebo listeners obsahuje model nebo document\n } else if (\n socketListeners.includes(model) ||\n // socketListeners.includes(documentId) ||\n key === model\n ) {\n // Provider resi dokument. Zjistime, jestli ho nechame, smazeme nebo pridame\n // console.log(\"KEY: \", key);\n if (!providerNext.dataSource.filter || filterDocuments(data, providerNext.dataSource.filter)) {\n // Dokument prosel filterem, Pokud neni v kolekci tak jej pridame, jinak jen pridame Providera do seznamu naslouchajicich Provideru\n listeningProviders++;\n providerNext.lastUpdate = {\n id: uuid(),\n time: new Date(),\n documentId: documentId,\n };\n if (!providerNext.data.includes(documentId)) {\n // Pokud neni v kolekci Providera, tak jej pridame a nastavime zmenu seznamu kolekci\n providerNext.data.push(documentId);\n isProvidersUpdated = true;\n // Nastavime, ze provider ma update\n }\n } else {\n // Dokument neprosel filterem => nepatri jiz do kolekce. Pokud je v kolekci, tak jej smazeme a nastavime zmenu seznamu kolekci\n if (providerNext.data.includes(documentId)) {\n systemLog(\"dsp\", \"[updateDocument] - mazu:\", key);\n providerNext.data = providerNext.data.filter((item: string) => item !== documentId);\n isProvidersUpdated = true;\n // Nastavime, ze provider ma update\n providerNext.lastUpdate = {\n id: uuid(),\n time: new Date(),\n documentId: documentId,\n };\n }\n }\n }\n\n newProviders[key] = providerNext;\n });\n console.timeEnd(\"[DSP UPDATE PROVIDERS INSIDE]\");\n\n // Zaktualizujeme/smazeme/vytvorime dokument a listenery\n console.time(\"[DSP UPDATE DOCUMENTS OUTSIDE]\");\n setDocuments((prev) => {\n console.time(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n if (prev[documentId]) {\n if (listeningProviders === 0) {\n // Nikdo nema dokument v kolekci, tak jej mazeme\n const newD = { ...prev };\n delete newD[documentId];\n console.timeEnd(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n return newD;\n } else {\n // Updatujeme dokument\n console.timeEnd(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n return {\n ...prev,\n [documentId]: { ...prev[documentId], ...data },\n };\n }\n } else if (listeningProviders > 0) {\n // Dokument neexistuje, a nekdo ho ma v kolekci, tak jej vytvorime\n console.timeEnd(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n return { ...prev, [documentId]: data };\n }\n console.timeEnd(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n return prev;\n });\n console.timeEnd(\"[DSP UPDATE DOCUMENTS OUTSIDE]\");\n systemLog(\"dsp\", \"OUTSIDE\", documentId);\n // return prev;\n return newProviders;\n });\n // console.timeEnd(\"[DSP UPDATE PROVIDERS OUTSIDE]\");\n\n // Pokud nejaky Provider zacal/skoncil s naslouchanim dokumentu na novy pocet Provideru\n systemLog(\"dsp\", \"updateDocument - meni se pocet naslouchajicich Provideru ?\", isProvidersUpdated ? \"true\" : \"false\");\n if (isProvidersUpdated) {\n systemLog(\"dsp\", \"updateDocument - menim counterDocuments pro\", listeningProviders, \"Providers\");\n\n setCounterDocuments((prev) => {\n if (listeningProviders === 0) {\n // Mazeme pocitadlo\n const newD = { ...prev };\n delete newD[documentId];\n return newD;\n } else {\n // Updatujeme nebo vytvarime pocitadlo\n return { ...prev, [documentId]: listeningProviders };\n }\n });\n } else {\n systemLog(\"dsp\", \"updateDocument - nemenim counterDocuments. Dokument zustava v\", listeningProviders, \"Providers\");\n }\n\n if (providers[model]?.isPersisting && usePersistentStorage) {\n if (listeningProviders > 0) {\n await persistDocument({\n documentId,\n model,\n data: { ...documents[documentId], ...data },\n });\n } else {\n await removePersistedDocument(documentId);\n }\n }\n }\n // console.timeEnd(\"[DSP UPDATE DOCUMENT]\");\n },\n [documents, providers, setDocuments, setProviders, setCounterDocuments, persistDocument, removePersistedDocument],\n );\n\n const updateDataStore = useCallback(\n async ({\n id,\n documentId,\n params,\n variant,\n data,\n }: {\n id: ProviderTypes;\n documentId: Uuid;\n params?: any;\n variant?: string;\n data: any;\n }) => {\n // console.log(\"DataSSS:\", providers[id]);\n if (!providers[id]) {\n systemLog(\"dsp\", \"[updateDataStore] Provider neexistuje:\", id);\n return;\n }\n // Lokalni update bez synchronizace na server\n if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {\n // console.log(\n // \"UPDATUJI Lokalne\",\n // id,\n // \"documentId\",\n // documentId,\n // \"data: \",\n // data\n // );\n //Pokud document neexistuje, a model ma povolene automaticke vytvareni, tak jej vytvorime\n if (!documents[documentId] && providers[id]?.autoCreate) {\n await createProviderItem({ id, data: { id: documentId, ...data } });\n } else updateDocument({ documentId, model: id, data });\n return true;\n }\n // Update se synchronizaci na server\n systemLog(\n \"dsp\",\n \"[updateDataStore] Posilam patchData: \",\n id,\n \",\\n params: \",\n JSON.stringify(params, null, 2),\n \"\\n data: \",\n JSON.stringify(data, null, 2),\n );\n const result = await patchData({\n dataSource: renderJSONTemplate(providers[id].dataSource, params),\n variant,\n data,\n });\n if (typeof result === \"object\") {\n const { id: rDocumentId, ...document } = result;\n // updateDocument({model:})\n // Pokud nebezi Sockets, tak updatujeme dokument\n if (!isLive) {\n systemLog(\"dsp\", \"[updateDataStore] UPDATE DATA STORE RESULT: \", result);\n updateDocument({ documentId: rDocumentId, model: id, data: document });\n } else {\n systemLog(\"dsp\", \"[updateDataStore] Updatuje Socket\");\n }\n }\n return result;\n },\n [providers, documents, isLive, updateDocument],\n );\n\n useEffect(() => {\n socketActionHandlersRef.current = { dispatch, updateDocument };\n }, [dispatch, updateDocument]);\n\n const createDocument = useCallback(\n async ({ model, documentId, data }: { model: ProviderTypes; documentId: Uuid; data: any }) => {\n const newDocument = data;\n systemLog(\"dsp\", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);\n\n var providerListenersCount = 0;\n Object.keys(providers).forEach((key) => {\n const provider = providers[key];\n // Sezbirame cemu provider nasloucha. Pokud v tom bude nova polozka, prozeneme ji filterem. Pokud bude platny, pridame ji\n var socketListeners = provider.dataSource?.socketListeners;\n // Pokud polozka projde filterem, tak ji zpracujeme\n if (\n (socketListeners?.includes(model) || key === model) &&\n (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))\n ) {\n systemLog(\"dsp\", \"[createDocument] Provider data: \", provider.data.length, \" Bytes, documentId: \", documentId);\n if (!provider.data.includes(documentId)) {\n // Do Providera pridame polozku\n providerListenersCount++;\n setProviders((prev) => ({\n ...prev,\n [key]: {\n ...prev[key],\n data: [...prev[key].data, documentId],\n lastUpdate: { id: uuid(), time: new Date() },\n },\n }));\n }\n }\n });\n\n // Pokud se document zaregistroval do nejakych provideru, tak jej vytvorime a nastavime mu prislusny pocet listeneru na document a sockets\n if (providerListenersCount > 0) {\n if (providers[model]?.isPersisting && usePersistentStorage) {\n await persistDocument({ documentId, model, data: newDocument });\n }\n setCounterDocuments((prev) => {\n const newC = { ...prev };\n if (newC[documentId]) {\n setDocuments((prev) => ({\n ...prev,\n [documentId]: { ...prev[documentId], ...newDocument },\n }));\n newC[documentId] = prev[documentId] + providerListenersCount;\n } else {\n setDocuments((prev) => ({ ...prev, [documentId]: newDocument }));\n newC[documentId] = providerListenersCount;\n }\n return newC;\n });\n return { id: documentId, document: newDocument };\n } else return false;\n },\n [providers, setProviders, setCounterDocuments, setDocuments, persistDocument],\n );\n\n const deleteDocument = useCallback(\n async ({ documentId }: { documentId: Uuid }) => {\n systemLog(\"dsp\", `[deleteDocument] Mazu document ${documentId}}`);\n\n await removePersistedDocument(documentId);\n\n setDocuments((prev) => {\n const newDocs = { ...prev };\n systemLog(\"dsp\", \"[deleteDocument] MAZU \", documentId, \" z \", newDocs);\n delete newDocs[documentId];\n systemLog(\"dsp\", \"[deleteDocument] NEW DOCS: \", newDocs);\n return newDocs;\n });\n setCounterDocuments((prev) => {\n const newC = { ...prev };\n delete newC[documentId];\n return newC;\n });\n\n setProviders((prev) => {\n var deletedCount = 0;\n const updatedDataObj = { ...prev };\n for (const key in updatedDataObj) {\n const initialLength = updatedDataObj[key].data.length;\n updatedDataObj[key].data = updatedDataObj[key].data.filter((element: string) => element !== documentId);\n // Nastaveni zmeny providera pro znovunacteni dat v useDataProvider\n updatedDataObj[key].lastUpdate = { id: uuid(), time: new Date() };\n deletedCount += initialLength - updatedDataObj[key].data.length;\n if (initialLength - updatedDataObj[key].data.length > 0) systemLog(\"dsp\", \"[deleteDocument] Smazan zaznam...\", deletedCount);\n }\n\n // console.log(\"Jdu smazat \", deletedCount, \" socketu \", documentId);\n // unregisterProviderSockets(Array(deletedCount).fill(documentId));\n\n return updatedDataObj;\n });\n },\n [setDocuments, setCounterDocuments, setProviders, removePersistedDocument],\n );\n\n const createProviderItem = useCallback(\n async ({ id, data }: { id: ProviderTypes; data: any }) => {\n if (!providers[id]) {\n systemLog(\"dsp\", \"[createProviderItem] Provider neexistuje:\", id);\n return;\n }\n if (!providers[id].dataSource) {\n const { id: dId, ...rData } = data;\n const documentId = dId || uuid();\n const result = createDocument({ model: id, documentId, data: rData });\n return result;\n }\n const result = await postData({\n dataSource: providers[id].dataSource,\n schema: providers[id].schema,\n val: data,\n });\n return result;\n },\n [providers, createDocument],\n );\n\n const deleteProviderItem = useCallback(\n async ({ providerId, data, params }: { providerId: ProviderTypes; data: any; params?: any }) => {\n if (!providers[providerId]) {\n systemLog(\"dsp\", \"[deleteProviderItem] Provider neexistuje:\", providerId);\n return;\n }\n // console.log(\"Params:\", params);\n // console.log(\"DataSource: \", renderJSONTemplate(providers[providerId].dataSource, params));\n const response = await deleteData({\n dataSource: renderJSONTemplate(providers[providerId].dataSource, params),\n // dataSource: providers[providerId].dataSource,\n data,\n });\n return response;\n },\n [providers],\n );\n\n const registerProviderSockets = useCallback(\n (sockets: string | string[]): void => {\n if (sockets) {\n systemLog(\"dsp\", \"[registerProviderSockets]\", sockets);\n var d = Array.isArray(sockets) ? sockets : [sockets];\n setSockets((prev) => {\n const newS = { ...prev };\n d.forEach((item) => {\n if (newS[item]) {\n newS[item].listeners = newS[item].listeners + 1;\n } else {\n const roomHandler = (msg: string) => {\n const { dispatch: currentDispatch, updateDocument: currentUpdateDocument } = socketActionHandlersRef.current;\n handleSocketMessage(item, msg, {\n dispatch: currentDispatch as any,\n updateDocument: currentUpdateDocument as any,\n });\n };\n\n socketRoomHandlersRef.current[item] = roomHandler;\n newS[item] = { listeners: 1, data: [] };\n socket.emit(\"joinRoom\", item);\n socket.on(item, roomHandler);\n }\n });\n return newS;\n });\n }\n },\n [setSockets, socket],\n );\n\n const unregisterProviderSockets = useCallback(\n (sockets: string | string[]): void => {\n systemLog(\"dsp\", \"[unregisterProviderSockets] Mazu sockety \", JSON.stringify(sockets, null, 2));\n var removeSocketListeners: string[] = [];\n var d = Array.isArray(sockets) ? sockets : [sockets];\n setSockets((prev) => {\n const newS = { ...prev };\n d.forEach((item) => {\n // console.log(\"Snizuju \", item);\n if (newS[item]?.listeners <= 1) {\n removeSocketListeners.push(item);\n const roomHandler = socketRoomHandlersRef.current[item];\n if (roomHandler) {\n socket.off(item, roomHandler);\n delete socketRoomHandlersRef.current[item];\n }\n delete newS[item];\n } else if (newS[item]) newS[item].listeners = newS[item].listeners - 1;\n });\n if (removeSocketListeners.length > 0) {\n socket.emit(\"leaveRooms\", JSON.stringify(removeSocketListeners));\n }\n return newS;\n });\n },\n [setSockets, socket],\n );\n\n /**\n * Pouziva se pokud Provider jiz existuje. Jen navysi jeho counterProviders\n * Pri mazani Providera snizuje counterProviders.\n * Pokud je Provider kompletne smazany, tak snizuje counteDocuments vsech jeho dokumentu.\n * @param {*} id - ID providera\n * @param {*} val - o kolik se meni counterProviders\n */\n const updateProviderListeners = useCallback(\n async (id: string, val: number) => {\n systemLog(\"dsp\", `[updateProviderListeners] provider:`, id, \"menim o\", val);\n setCounterProviders((prev) => {\n if (!prev[id]) return prev;\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] ${\n // val > 0 ? \"Navysuji\" : \"Snizuji\"\n // } listeners: ${id} ${prev[id]} -> ${prev[id] + val}`\n // );\n // Provider zustava, jen se meni jeho counterProviders\n if (prev[id] + val > 0) {\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] Provider zustava, menime counterProviders`\n // );\n return {\n ...prev,\n [id]: prev[id] + val,\n };\n }\n // Provider je kompletne smazany\n else {\n // systemLog(\"dsp\", `[updateProviderListeners] Provider ${id} se maze.`);\n setProviders((prevP) => {\n // Update socketu\n systemLog(\"dsp\", \"[DSP] UPDATE PROVIDER - mazu sockets \", id);\n setSockets((prevS) => {\n var removeSocketListeners: string[] = [];\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] Mazu sockety providera.`,\n // id\n // );\n const newS = { ...prevS };\n const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];\n providerSocketListeners.forEach((socketName: string) => {\n if (!newS[socketName]) return;\n if (newS[socketName].listeners + val <= 0) {\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] Mazu socket `,\n // newS[socketName]\n // );\n const roomHandler = socketRoomHandlersRef.current[socketName];\n if (roomHandler) {\n socket.off(socketName, roomHandler);\n delete socketRoomHandlersRef.current[socketName];\n }\n delete newS[socketName];\n removeSocketListeners.push(socketName);\n } else {\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] Snizuji socket `,\n // newS[socketName]\n // );\n newS[socketName].listeners = newS[socketName].listeners + val;\n }\n });\n // Zrusime naslouchani smazanych socketListeners\n if (removeSocketListeners.length > 0) {\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] EMITUJI SOCKET LEAVE \",\n // removeSocketListeners\n // );\n // socket.removeAllListeners(removeSocketListeners);\n socket.emit(\"leaveRooms\", JSON.stringify(removeSocketListeners));\n }\n return newS;\n });\n\n // Update dokumentu\n setCounterDocuments((prevC) => {\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] Updatuji Documents Counter...\"\n // );\n const newC = { ...prevC };\n // projedeme vsechny dokumenty, ktere prislusi danemu Providerovi\n prevP[id].data.forEach((document: string) => {\n if (newC[document] + val <= 0) {\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] Mazu Documents Counter...\",\n // document\n // );\n\n setDocuments((prev) => {\n const newD = { ...prev };\n delete newD[document];\n return newD;\n });\n delete newC[document];\n } else {\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] Updatuji Documents Counter\",\n // newC[document],\n // \"->\",\n // newC[document] + val\n // );\n newC[document] = newC[document] + val;\n }\n });\n return newC;\n });\n // Smazani Providera\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] UPDATE PROVIDER - mazu provider \",\n // id\n // );\n const newP = { ...prevP };\n delete newP[id];\n return newP;\n });\n\n // Smazani pocitadla providera\n const newProvs = { ...prev };\n delete newProvs[id];\n return newProvs;\n }\n });\n },\n [setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket],\n );\n\n const registerProvider = useCallback(\n async (newItem: DataProvider): Promise<any> => {\n systemLog(\"dsp\", \"[registerProvider]\", newItem.id);\n let result: any;\n const { id, ...provider } = newItem;\n if (providers[id]) {\n // systemLog(\"dsp\", \"[registerProvider] Provider\", id, \"existuje. Jen navysuji\");\n\n // Pokud Provider jiz existuje, tak jen navysime pocitadlo listeners\n setCounterProviders((prev) => {\n systemLog(\"dsp\", \"[registerProvider] Pouze navysuji \", id, \" \", prev[id], \" -> \", prev[id] + 1);\n return {\n ...prev,\n [id]: prev[id] + 1,\n };\n });\n result = providers[id];\n // Pokud jeste neexistuje, vytvorime novy Provider\n } else {\n // systemLog(\"dsp\", \"[registerProvider] vytvarim novy provider\", id);\n // TODO: Zkusime nacist data z databaze\n // TODO: A zjistit jestli nejsou nejake updaty z posledni zmeny\n const dataFromSource = await getData({\n schema: newItem.schema,\n dataSource: newItem.dataSource || {},\n id: newItem.id,\n isPersisting: !!newItem.isPersisting && usePersistentStorage,\n SQLite,\n });\n // const dataFromSource = await getData({ ...newItem, SQLite });\n console.time(`[DSP] VYTVARENI PROVIDERA ${id}`);\n var dataList: string[] = []; // seznam id pro provider\n var items: Record<string, any> = {};\n // Stazene dokumenty dame do pole dataS\n const dataS = Array.isArray(dataFromSource) ? dataFromSource : [dataFromSource];\n // systemLog(\n // \"dsp\",\n // \"[registerProvider] Mam \",\n // dataS.length,\n // \" polozky \",\n // id\n // );\n // Vytvorime je jeden po druhem, pripadne, pokud jej jiz mame, tak jej rozsirime o nove data\n dataS.forEach((item) => {\n if (!item) return; // getData muze vratit prazdny zaznam pri chybe\n // oddelime id a data z dokumentu\n const { id: itId, ...data } = item;\n // Pokud nema dokument id, vytvorime jej\n const id = itId || uuid();\n // Vlozime id do seznamu pro registraci providera\n dataList.push(id);\n // Pokud jiz dokument existuje, rozsirime jej a navysime pocitadlo naslouchajicich provideru\n if (documents[id]) {\n items[id] = {\n ...documents[id],\n ...data,\n };\n // TODO: Smazat listeners\n // setCounterDocuments((prev) => ({ ...prev, [id]: prev[id] + 1 }));\n }\n // Pokud neexistuje, vytvorime jej, pocitadlo naslouchajicich provideru = 1\n else {\n items[id] = data;\n }\n // TODO: Smazat listeners\n // setCounterDocuments((prev) => ({ ...prev, [id]: 1 }));\n });\n // Zaktualizujeme counterDocuments pro dokumenty prirazene Providerovi\n setCounterDocuments((prev) => {\n {\n const newC = { ...prev };\n dataList.forEach((i) => {\n // systemLog(\n // \"dsp\",\n // \"[registerProvider] Navysovani Documents Counter \",\n // i,\n // \" - \",\n // prev[i]\n // );\n if (newC[i]) {\n // systemLog(\n // \"dsp\",\n // \"[registerProvider] Navysuji Documents Counter \",\n // i,\n // \"na\",\n // newC[i] + 1\n // );\n newC[i] = newC[i] + 1;\n } else {\n // systemLog(\n // \"dsp\",\n // \"[registerProvider] Nastavuji Documents Counter \",\n // i,\n // \"na 1\"\n // );\n newC[i] = 1;\n }\n });\n return newC;\n }\n });\n // Zaktualizujeme dokumenty\n if (Object.keys(items).length > 0)\n // systemLog(\n // \"dsp\",\n // \"[registerProvider] Aktualizuji \",\n // items.length,\n // \"dokumenty \"\n // );\n setDocuments((prev) => ({ ...prev, ...items }));\n\n // TODO: Pokud je Provider persistant, tak ulozime dokumenty do databaze\n // TODO: Pokud je Provider persistant, tak zaktualizujeme providera v databazi\n // Vytvorime providera se seznamem dokumentu\n result = {\n ...provider,\n data: dataList,\n lastUpdate: { id: uuid(), time: new Date() },\n };\n // console.log(\"Set providera \", id, \" s daty: \", dataList);\n setProviders((prev) => ({\n ...prev,\n [id]: result,\n }));\n\n // Vytvorime pocitadlo Provideru\n setCounterProviders((prev) => ({\n ...prev,\n [id]: 1,\n }));\n dataList;\n // Zaregistrujeme naslouchani prislusnych socketu\n if (provider.dataSource?.socketListeners) registerProviderSockets(provider.dataSource.socketListeners);\n\n console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);\n }\n return result;\n },\n [providers, SQLite, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets],\n );\n\n const unregisterProvider = useCallback(\n async (itemId: string) => {\n setCounterProviders((prev) => {\n if (prev[itemId]) {\n // Pokud je pocet naslouchajicich providerovi > 1, tak jen snizime pocet naslouchajicich\n if (prev[itemId] > 1) {\n systemLog(\"dsp\", \"[unregisterProvider] snizuji \", itemId, \"z \", prev[itemId], \" na \", prev[itemId] - 1);\n return {\n ...prev,\n [itemId]: prev[itemId] - 1,\n };\n } else {\n // Smazeme providera, sockety a prislusne dokumenty, pokud je posledni kdo je pouziva\n systemLog(\"dsp\", \"[unregisterProvider] mazu \", Object.keys(providers));\n // Smazeme naslouchajici sockety\n unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);\n\n // Smazeme prislusne dokumenty\n systemLog(\"dsp\", \"[unregisterProvider] Mazu dokumenty providera \", itemId);\n setCounterDocuments((cd) => {\n const newC = { ...cd };\n const deleteDocumentIds: string[] = [];\n providers[itemId].data.forEach((docId: string) => {\n if (newC[docId] <= 1) {\n deleteDocumentIds.push(docId);\n delete newC[docId];\n } else newC[docId] = newC[docId] - 1;\n });\n if (deleteDocumentIds.length > 0) {\n setDocuments((pd) => {\n const newD = { ...pd };\n deleteDocumentIds.forEach((docId) => {\n delete newD[docId];\n });\n return newD;\n });\n }\n return newC;\n });\n\n // Smazeme providera\n setProviders((pp) => {\n const newProvs = { ...pp };\n delete newProvs[itemId];\n return newProvs;\n });\n\n // Smazeme pocitadlo provideru\n const newProvs = { ...prev };\n delete newProvs[itemId];\n return newProvs;\n }\n } else return prev;\n });\n },\n [setCounterProviders, providers, setCounterDocuments, setDocuments, setProviders, unregisterProviderSockets],\n );\n\n // Memoize actions — changes only when providers change (not when documents change)\n const actionsValue = useMemo<DataStoreActionsType>(\n () => ({\n dispatch,\n initProvider,\n resetProvider,\n registerProvider,\n unregisterProvider,\n updateProviderListeners,\n resetDataStore,\n startSockets,\n stopSockets,\n registerProviderSockets,\n unregisterProviderSockets,\n updateDocuments,\n presetProviders,\n }),\n [\n dispatch,\n initProvider,\n resetProvider,\n registerProvider,\n unregisterProvider,\n updateProviderListeners,\n resetDataStore,\n startSockets,\n stopSockets,\n registerProviderSockets,\n unregisterProviderSockets,\n updateDocuments,\n presetProviders,\n ],\n );\n\n // Memoize meta — changes only when isLive/isSynchronizing/sockets/counters change\n const metaValue = useMemo<DataStoreMetaType>(\n () => ({ isLive, isSynchronizing, sockets, counterProviders, counterDocuments }),\n [isLive, isSynchronizing, sockets, counterProviders, counterDocuments],\n );\n\n const stableValue = useMemo<DataStoreStableType>(\n () => ({\n dispatch,\n presetProviders,\n updateProviderListeners,\n subscribeToProvider,\n getProviderLastUpdate,\n getExternalDocuments,\n getExternalProviders,\n }),\n [\n dispatch,\n presetProviders,\n updateProviderListeners,\n subscribeToProvider,\n getProviderLastUpdate,\n getExternalDocuments,\n getExternalProviders,\n ],\n );\n\n systemLog(\"dsp\", \"END\");\n return (\n // <DatabaseProvider>\n <DataStoreStableContext.Provider value={stableValue}>\n <DataStoreActionsContext.Provider value={actionsValue}>\n <DataStoreProvidersContext.Provider value={providers}>\n <DataStoreDocumentsContext.Provider value={documents}>\n <DataStoreContext.Provider value={metaValue}>{props.children}</DataStoreContext.Provider>\n </DataStoreDocumentsContext.Provider>\n </DataStoreProvidersContext.Provider>\n </DataStoreActionsContext.Provider>\n </DataStoreStableContext.Provider>\n // </DatabaseProvider>\n );\n};\n\nexport default DataStoreProvider;\n","export function systemLog(..._args: unknown[]): void {\n // No-op by default in the package. Consumers can wrap these calls if needed.\n}\n\nexport function systemLogError(...args: unknown[]): void {\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\n console.error(...args);\n }\n}\n","import { systemLog } from \"./log\";\n\ntype DataProviderType = {\n dispatch?: (\n action?: \"createDocument\" | \"updateDocuments\" | \"removeItem\" | \"deleteDocument\",\n data?: {\n model?: string;\n documentId?: string;\n data?: any;\n documents?: string[];\n }\n ) => void;\n updateDocument?: (data: { model: string; documentId: string; data?: any; documents?: string[] }) => void;\n updateDocuments?: () => void;\n};\n\nexport const handleSocketMessage = (model: string, msg: string, dataProvider: DataProviderType) => {\n const { dispatch, updateDocument } = dataProvider;\n // console.log(COLOR_SOCKET, `[SOCKET] model: ${model}, data: ${msg}`)\n const data: { action: \"create\" | \"update\" | \"delete\" | \"deleteItem\"; model: string; documentId: string; data: any } = JSON.parse(msg);\n\n switch (data.action) {\n case \"create\":\n systemLog(\"sockets\", \"[create] \", data.model, \", document: \", data.documentId);\n // console.log(COLOR_SOCKET, \"[SOCKETS] CREATING model:\", model, \", document: \", data.documentId, \" data:\", data.data)\n dispatch?.(\"createDocument\", { model: data.model, documentId: data.documentId, data: data.data });\n break;\n case \"update\":\n // systemLog(\"sockets\", `[${Device.deviceName}] (room: ${model}) UPDATE model: `, data.model, \", documentId: \", data.documentId)\n systemLog(\"sockets\", `[update] ${JSON.stringify(data)}`);\n // systemLog(\"sockets\", `[update] ${JSON.stringify(data, null, 2)}`)\n // dispatch(\"updateDocument\", { model: data.model, documentId: data.documentId, data: data.data })\n // Pokud jsou data pole - je to update vice dokumentu najednou\n if (Array.isArray(data.data)) dispatch?.(\"updateDocuments\", { model: data.model, documents: data.data });\n else updateDocument?.({ model: data.model, documentId: data.documentId, data: data.data });\n break;\n case \"delete\":\n systemLog(\"sockets\", \"[delete] model:\", data.model, \", document: \", data.documentId);\n dispatch?.(\"deleteDocument\", { documentId: data.documentId, data: data.data });\n break;\n case \"deleteItem\":\n systemLog(\"sockets\", \"DELETE ITEM \", model, \", model: \", data.model, \", data: \", data.data);\n dispatch?.(\"removeItem\", { model, documentId: data.data.id });\n break;\n default:\n console.error(`Unknown command ${data.action}`);\n }\n};\n","import axios from \"axios\";\nimport { COLOR_AXIOS } from \"./logColors\";\nimport { systemLog } from \"./log\";\nimport { uuid } from \"./utils\";\nimport { JSONType, Uuid } from \"./types\";\nimport { SQLite } from \"./database\";\nimport { ProviderDataSource } from \"./providerTypes\";\n\n// axios.interceptors.request.use((config) => {\n// config.headers[\"private-api-token\"] =\n// \"fbd660-g-07860-8y80oxx9n8zdd0dqlymncuon9qhgqz58\";\n// return config;\n// });\n\ntype DataSource = Partial<ProviderDataSource> & {\n /**\n * Nazev modelu - vytvari se nejjednodussi dotaz\n */\n model?: string;\n /**\n * Parametry do dotazu na server\n */\n params?: any;\n /**\n * Filter do dotazu na server\n */\n filter?: JSONType;\n select?: any;\n /**\n * Soubor s daty v public\n */\n file?: string;\n};\n\nconst saveData = async ({\n providerId,\n newData,\n dateUpdate,\n SQLite,\n}: {\n providerId: Uuid;\n newData: any;\n dateUpdate: string;\n SQLite: SQLite;\n}) => {\n console.time(`[SQL] saveData ${providerId}`);\n const batchSize = 8000;\n const placeholders = \"(?,?,?,?)\";\n var i = 0;\n\n for (i = 0; i < newData.length / batchSize; i++) {\n const values = [];\n for (let j = 0; j < batchSize; j++) {\n if (i * batchSize + j < newData.length) {\n const { id, ...item } = newData[i * batchSize + j];\n values.push(id, JSON.stringify(item), providerId, dateUpdate);\n }\n }\n const placeholdersArray = Array.from({ length: Math.ceil(values.length / 4) }, () => placeholders).join(\",\");\n\n if (placeholdersArray.length < 10) console.log(\"DATA TO UPDATE\", JSON.stringify(values, null, 2));\n const row = await SQLite.query(`INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES ${placeholdersArray}`, values);\n systemLog(\"axios\", \"saveData result: \", JSON.stringify(row));\n }\n console.timeEnd(`[SQL] saveData ${providerId}`);\n};\n\nconst buildUri = ({\n method,\n dataSource,\n variant,\n}: {\n method: \"create\" | \"read\" | \"update\" | \"delete\";\n dataSource: DataSource;\n variant?: string;\n}) => {\n // console.log(\"[HANDLE DATA] BUILD URI method \", method, \" from\", dataSource)\n if (dataSource.crud) {\n if (method === \"update\" && dataSource.crud.updates) {\n if (variant && dataSource.crud.updates[variant]) return dataSource.crud.updates[variant];\n if (dataSource.crud[method]) return dataSource.crud[method];\n\n const firstUpdateUri = Object.values(dataSource.crud.updates)[0];\n if (firstUpdateUri) return firstUpdateUri;\n }\n\n const crudUri = dataSource.crud[method];\n if (crudUri) return crudUri;\n }\n\n return dataSource.uri || `${dataSource.model || \"\"}/`;\n\n // if (dataSource.crud && dataSource.crud?.[method]) {\n // // console.log(\"[HANDLE DATA] posilam url \", dataSource.crud[method])\n // if (variant && dataSource.crud[method + \"s\"]) {\n // if (dataSource.crud[method + \"s\"][variant])\n // return dataSource.crud[method + \"s\"][variant]\n // else return dataSource.crud[method]\n // } else {\n // return dataSource.crud[method]\n // }\n // } else {\n // // console.log(\"[HANDLE DATA] posilam url \", dataSource.uri || `${dataSource.model}/`)\n // return dataSource.uri || `${dataSource.model}/`\n // }\n};\n\ninterface GetDataProps {\n id: Uuid;\n dataSource: DataSource;\n isPersisting: boolean;\n schema: any;\n SQLite: SQLite;\n changeTime?: string;\n}\n\nexport const getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime }: GetDataProps): Promise<any> => {\n if (dataSource) systemLog(\"axios\", \"GET Data Source: \", buildUri({ dataSource, method: \"read\" }));\n else systemLog(\"axios\", \"No DataSource for \", id);\n let persistedData = [];\n var params = { ...dataSource?.params };\n if (dataSource?.filter) params.filter = dataSource.filter;\n if (dataSource?.select) params.select = dataSource.select;\n try {\n var newData: any;\n // nacitani z primo dodanych dat\n if (dataSource?.data) {\n newData = dataSource.data;\n }\n // Nacitani ze souboru v public\n else if (dataSource?.file) {\n const response = await fetch(`${process.env.PUBLIC_URL}/${dataSource.file}`);\n newData = await response.json();\n }\n // Nacitani ze serveru\n else {\n // console.log(\"Nacitani ze serveru\", SQLite);\n // Pokud je nastaveny changeTime, vyzadame pouze data, ktera se zmenila po changeTime\n if (changeTime) {\n params.changeTime = changeTime;\n }\n // Pokud jsou data Persisting a mame pripojenou databazi, a mame nacitat data z databaze, zjistime posledni datum aktualizace a vyzadame update dat\n else if (isPersisting && SQLite) {\n console.time(\"Persisted Data\");\n const qDatum: any[] = await SQLite.read(`SELECT * FROM documents WHERE model = '${id}' ORDER BY lastUpdate DESC`);\n // console.log(\"Persisted data\", qDatum[0]?.lastUpdate);\n systemLog(\"axios\", \"SQLite.read Posledni datum update: \", qDatum[0]?.lastUpdate);\n if (qDatum[0]?.lastUpdate) params.changeTime = qDatum[0].lastUpdate;\n persistedData = qDatum.map((item) => ({ id: item.id, ...JSON.parse(item.data) }));\n // console.log(\"Pocet data v DB\", persistedData.length);\n console.timeEnd(\"Persisted Data\");\n }\n\n if (dataSource) {\n systemLog(\"axios\", \"Params: \", JSON.stringify(params));\n const axiosResponse = await axios.get(buildUri({ dataSource, method: \"read\" }), { params: params });\n // console.log(\"DATA SOURCE STAHUJI: \", data.data)\n if (schema && !dataSource.readAllFields) {\n if (Array.isArray(axiosResponse.data.data)) {\n newData = [];\n axiosResponse.data.data.forEach((element: any) => {\n // Pokud ma document nastaveny priznak _deleted, tak s nim nic nedelame a priznak mu nechame\n if (element._deleted) {\n newData.push(element);\n return;\n }\n var newRow: { [key: string]: any } = {};\n Object.keys(schema).forEach((key) => {\n if (typeof element === \"object\") {\n newRow[key] = schema[key].source ? element[schema[key].source] : element[key];\n } else {\n newRow[key] = element;\n }\n });\n // Pokud dokument nema definovane ID, tak jej vytvorime\n if (!newRow.id && [\"payments\", \"deliveries\"].includes(id)) {\n // console.log(\"Pridavam UUID pro \", id)\n if (element.id) {\n newRow.id = id + \"-\" + element.id;\n } else {\n newRow.id = uuid();\n }\n }\n newData.push(newRow);\n });\n } else {\n // console.log(\"SINGLE ITEM\")\n newData = {};\n Object.keys(schema).forEach((key) => {\n newData[key] = schema[key].source ? axiosResponse.data.data[schema[key].source] : axiosResponse.data.data[key];\n });\n }\n } else {\n newData = axiosResponse.data.data;\n }\n systemLog(\n \"axios\",\n `(SERVER TIME: ${axiosResponse.data.queryTime}) Data:`,\n newData.length || \"single\",\n \"items, Size:\",\n JSON.stringify(newData).length,\n \"Bytes\"\n );\n\n // Pokud je Provider Persisting a mame pripojenou databazi, ulozime nove data do databaze\n if (isPersisting && SQLite) {\n await saveData({ providerId: id, newData, SQLite, dateUpdate: axiosResponse.data.queryAt || new Date().toISOString() });\n }\n }\n }\n // console.log(\"Pocet polozek\", id, \": \", [...persitedData, ...newData]?.length)\n // console.log(\"Pocet persisting polozek\", id, \": \", persitedData?.length)\n // console.log(\"Persisting zaznam\", id, \": \", JSON.stringify(persitedData?.[0]))\n if (Array.isArray(newData)) {\n // Pokud byl nejaky zaznam updatovany, zobrazime novy\n\n console.time(\"Maping\");\n const map = new Map();\n persistedData.forEach((item) => map.set(item.id, item));\n newData.forEach((item) => map.set(item.id, item));\n let updatedArray = [];\n updatedArray.push(...map.values());\n systemLog(\n \"axios\",\n `getData - Polozky ${id} persisted: ${persistedData.length}, newData: ${newData.length}, vysledek: ${updatedArray.length}`\n );\n console.timeEnd(\"Maping\");\n return updatedArray;\n } else {\n return newData || [];\n }\n } catch (e) {\n console.error(`[AXIOS] CHYBA PRI NACITANI DAT Z: ${JSON.stringify(dataSource, null, 2)}\\n${e}`);\n return [];\n }\n};\n\ninterface PostDataProps {\n dataSource: DataSource;\n variant?: string;\n schema?: any;\n val: any;\n}\n\nexport const postData = async ({ dataSource, variant, schema, val }: PostDataProps): Promise<any> => {\n try {\n systemLog(\"axios\", \"POST\", buildUri({ dataSource, variant, method: \"create\" }), \", Data: \", JSON.stringify(val, null, 2));\n const response = await axios.post(`${buildUri({ dataSource, variant, method: \"create\" })}`, val);\n systemLog(\"axios\", \"POST Query Time: \", response.data.queryTime);\n systemLog(\"axios\", \"POST Response Data: \", response.data.data.length, \" B\");\n return response.data.data;\n } catch (e) {\n console.error(`POST DATA: ${e}`);\n return e;\n }\n};\n\ninterface PatchDataProps {\n dataSource: DataSource;\n variant?: string;\n data: any;\n}\n\nexport const patchData = async ({ dataSource, variant, data }: PatchDataProps): Promise<any> => {\n try {\n systemLog(\"axios\", \"PATCH: \", buildUri({ dataSource, variant, method: \"update\" }), \", Data: \", JSON.stringify(data, null, 2));\n const response = await axios.patch(buildUri({ dataSource, variant, method: \"update\" }), data);\n response.data?.queryTime && systemLog(\"axios\", \"PATCH Server Query Time: \", response.data.queryTime);\n systemLog(\"axios\", \"PATCH Response Data: \", response.data.data.length, \" Bytes\");\n //TODO: Prevest data na schema (nazvy)\n return response.data.data;\n } catch (e) {\n console.error(`[AXIOS] PATCH DATA: ${e}`);\n }\n};\n\ninterface DeleteDataProps {\n dataSource: DataSource;\n data: any;\n}\n\nexport const deleteData = async ({ dataSource, data }: DeleteDataProps): Promise<any> => {\n try {\n systemLog(\"axios\", \"deleteData DS:\", dataSource);\n const response = await axios.delete(`${buildUri({ dataSource, method: \"delete\" })}`, data);\n response.data?.queryTime && systemLog(\"axios\", \"deleteData - Query Time: \", response.data.queryTime);\n systemLog(\"axios\", \"deleteData Data response: \", response.data.data);\n return response.data.data;\n } catch (e) {\n console.error(`DELETE DATA: ${e}`);\n return e;\n }\n};\n","import * as Crypto from \"expo-crypto\";\nimport { getValueByDotPath } from \"./dotPath\";\nimport dayjs from \"dayjs\";\n\nfunction escapeRegExp(string: string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"); // $& means the whole matched string\n}\n\nexport function recalculateObjectWithDocument(obj: any, document: any): any {\n if (obj === undefined) return;\n if (Array.isArray(obj)) {\n const results: any[] = [];\n obj.forEach((item) => {\n const result = recalculateObjectWithDocument(item, document);\n if (result !== undefined) {\n results.push(result);\n }\n });\n return results;\n } else if (typeof obj === \"object\") {\n const keys = Object.keys(obj);\n if (keys.some((item) => item.startsWith(\"$\"))) {\n if (keys.includes(\"$rule\")) {\n // console.log(\"Test je \", obj[\"$rule\"])\n const res = doesObjectMatchFilter(document, obj[\"$rule\"]);\n // console.log(\"Rule\", obj[\"$rule\"])\n // const res = recalculateObjectWithDocument(obj[\"$rule\"], document)\n if (res && obj[\"$value\"] !== undefined) {\n // console.log(\"Volam recaluclate\", obj[\"$value\"])\n return recalculateObjectWithDocument(obj[\"$value\"], document);\n } else if (obj[\"$value\"] === undefined) {\n // console.log(\"Tady\", obj[\"$rule\"], res)\n return res;\n }\n } else if (keys.includes(\"$or\")) {\n // return value.some((condition) => doesObjectMatchFilter(obj, condition));\n return obj[\"$or\"].some((condition: any) => {\n const res = doesObjectMatchFilter(document, condition);\n if (typeof res === \"boolean\") return res;\n // console.log(\"Mam Chybu\", res)\n const error = res;\n return false;\n });\n } else if (keys.includes(\"$and\")) {\n return obj[\"$and\"].every((condition: any) => {\n const res = doesObjectMatchFilter(document, condition);\n if (typeof res === \"boolean\") return res;\n // console.log(\"Mam Chybu\", res)\n const error = res;\n return false;\n });\n } else if (keys.includes(\"$min\")) {\n const res = recalculateObjectWithDocument(obj[\"$min\"], document);\n if (res.length === 0) return undefined;\n // console.log(\"Vybiram z \", res)\n return Math.min(...res);\n } else if (keys.includes(\"$max\")) {\n const res = recalculateObjectWithDocument(obj[\"$max\"], document);\n if (res.length === 0) return undefined;\n return Math.max(...res);\n } else if (keys.includes(\"$sum\")) {\n const res = recalculateObjectWithDocument(obj[\"$sum\"], document);\n if (res) return res.reduce((acc: number, val: number) => acc + val, 0);\n else return undefined;\n } else if (keys.includes(\"$avg\")) {\n const res = recalculateObjectWithDocument(obj[\"$avg\"], document);\n const sum = res.reduce((acc: number, val: number) => acc + val, 0);\n return sum / res.length;\n } else if (keys.includes(\"$median\")) {\n const res = recalculateObjectWithDocument(obj[\"$median\"], document);\n const sortedArray = res.slice().sort((a: number, b: number) => a - b);\n let median;\n const middleIndex = Math.floor(sortedArray.length / 2);\n\n if (sortedArray.length % 2 === 0) {\n // Even number of elements\n median = (sortedArray[middleIndex - 1] + sortedArray[middleIndex]) / 2;\n } else {\n // Odd number of elements\n median = sortedArray[middleIndex];\n }\n return median;\n } else if (keys.includes(\"$val\") || keys.includes(\"$value\")) {\n const res = recalculateObjectWithDocument(obj[\"$val\"] || obj[\"$value\"], document);\n if (res.length === 1) return res[0];\n return res;\n } else if (keys.includes(\"$first\")) {\n const res = recalculateObjectWithDocument(obj[\"$first\"], document);\n return res?.[0];\n } else if (keys.includes(\"$last\")) {\n const res = recalculateObjectWithDocument(obj[\"$last\"], document);\n return res?.[res.length - 1];\n } else if (keys.includes(\"$concat\")) {\n const res = recalculateObjectWithDocument(obj[\"$concat\"], document);\n return res.join(\"\");\n } else if (keys.includes(\"$plus\")) {\n const res = recalculateObjectWithDocument(obj[\"$plus\"], document);\n return res.reduce((accumulator: number, currentValue: any) => accumulator + Number(currentValue), 0);\n } else if (keys.includes(\"$minus\")) {\n const res = recalculateObjectWithDocument(obj[\"$minus\"], document);\n if (res?.length > 0) {\n const first = res.shift();\n return res.reduce((accumulator: number, currentValue: any) => accumulator - Number(currentValue), first);\n }\n return res;\n } else if (keys.includes(\"$times\")) {\n const res = recalculateObjectWithDocument(obj[\"$times\"], document);\n return res.reduce((accumulator: number, currentValue: any) => accumulator * Number(currentValue), 1);\n } else if (keys.includes(\"$div\") || keys.includes(\"$divide\")) {\n const res = recalculateObjectWithDocument(obj[\"$div\"] || obj[\"$divide\"], document);\n // if (res?.length >= 2) {\n const first = res.shift();\n return res.reduce((accumulator: number, currentValue: any) => accumulator / Number(currentValue), first);\n // } else return false\n } else if (keys.includes(\"$mod\")) {\n const res = recalculateObjectWithDocument(obj[\"$mod\"], document);\n return res[0] % res[1];\n } else if (keys.includes(\"$round\")) {\n const res = recalculateObjectWithDocument(obj[\"$round\"], document);\n if (Array.isArray(res)) {\n const decimals = res[1] || 0;\n return Math.round(res[0] * Math.pow(10, decimals)) / Math.pow(10, decimals);\n }\n return Math.round(res);\n } else if (keys.includes(\"$ceil\")) {\n const res = recalculateObjectWithDocument(obj[\"$ceil\"], document);\n if (Array.isArray(res)) {\n const decimals = res[1] || 0;\n return Math.ceil(res[0] * Math.pow(10, decimals)) / Math.pow(10, decimals);\n }\n return Math.floor(res);\n } else if (keys.includes(\"$floor\")) {\n const res = recalculateObjectWithDocument(obj[\"$floor\"], document);\n return Math.floor(res);\n } else if (keys.includes(\"$gt\")) {\n const res = recalculateObjectWithDocument(obj[\"$gt\"], document);\n return res[0] > res[1];\n } else if (keys.includes(\"$gte\")) {\n const res = recalculateObjectWithDocument(obj[\"$gte\"], document);\n return res[0] >= res[1];\n } else if (keys.includes(\"$lt\")) {\n const res = recalculateObjectWithDocument(obj[\"$lt\"], document);\n return res[0] < res[1];\n } else if (keys.includes(\"$lte\")) {\n const res = recalculateObjectWithDocument(obj[\"$lte\"], document);\n return res[0] <= res[1];\n } else if (keys.includes(\"$eq\")) {\n const res = recalculateObjectWithDocument(obj[\"$eq\"], document);\n return res[0] === res[1];\n } else if (keys.includes(\"$neq\")) {\n const res = recalculateObjectWithDocument(obj[\"$neq\"], document);\n return res[0] !== res[1];\n } else {\n // console.log(\"String obj\", obj)\n // console.log(\"Data:\", document)\n let data = getValueByDotPath(document, Object.keys(obj)[0].substring(1));\n if (typeof obj === \"object\") {\n data = getObjectValue(data, obj[Object.keys(obj)[0]], document);\n }\n return data;\n }\n // const a = {\n // \"$and\": [\n // { \"name\": { \"$regex\": { \"$neq\": \"LED\" } } },\n // { \"name\": { \"$regex\": \"UV\" } },\n // { \"name\": { \"$regex\": \"Lamp\" } },\n // { \"categories\": \"ce82bfa4-b2c7-11ec-9c66-246e96436e9c\" }\n // ]\n // }\n } else {\n const result: Record<string, any> = {};\n // console.log(\"Obj\", obj)\n // console.log(\"Documents\", keys, JSON.stringify(document, null, 2))\n // console.log(\"klic\", obj, JSON.stringify(document, null, 2))\n // console.log(\"KKK\", getValueByDotPath(\"$\" + keys[0], document))\n keys.forEach((key) => (result[key] = recalculateObjectWithDocument(getValueByDotPath(obj[key]), document)));\n // console.log(\"Result je\", result)\n return result;\n }\n }\n // Je to jen hodnota, vracime ji\n else {\n if (typeof obj === \"string\" && obj.startsWith(\"$\")) return getValueByDotPath(document, obj.substring(1));\n else return obj;\n }\n}\n\nfunction getObjectValue(ddd: any, obj: any, documents: any): any {\n const data = Array.isArray(ddd)\n ? ddd.length > 0\n ? [...ddd]\n : undefined\n : typeof ddd === \"object\"\n ? Object.keys(ddd).length > 0\n ? { ...ddd }\n : undefined\n : ddd;\n if (!data) return undefined;\n // console.log(\"DATA v getObjectValue\", data)\n // console.log(\"getObjectValue\", obj)\n switch (Object.keys(obj)[0]) {\n case \"$pipe\":\n let result = data;\n // console.log(\"PIPE\")\n for (const action of obj.$pipe) {\n // console.log(\"Action\", action, result)\n if (result) result = getObjectValue(result, action, documents);\n }\n return result;\n case \"$filter\":\n // console.log(\"Data\", data[0], obj.$filter)\n const filterRes = data\n .map((d: any) => {\n if (typeof d === \"object\") {\n if (doesObjectMatchFilter(d, obj.$filter, documents)) return d;\n } else {\n if (doesValueMatchFilter(d, obj.$filter, documents)) return d;\n }\n })\n .filter((u: any) => u);\n // console.log(\"FILTER RESULT\", filterRes)\n return filterRes;\n case \"$sort\":\n console.log(\"Sorting\", obj.$sort);\n if (typeof obj.$sort === \"object\") {\n const rr = data.sortBy(obj.$sort);\n // console.log(\"Sorting result\", JSON.stringify(rr, null, 2))\n return rr;\n } else return obj.$sort === \"ASC\" ? data.sort((a: number, b: number) => a - b) : data.sort((a: number, b: number) => b - a);\n case \"$limit\":\n let limit = Array.isArray(obj.$limit) ? [...obj.$limit] : [obj.$limit];\n // console.log(\"Limiting\", limit)\n if (limit.length === 1) limit.unshift(0);\n else limit[1] = limit[1] + limit[0];\n const res = data.slice(...limit);\n // console.log(\"Limit res\", res)\n return res;\n case \"$project\":\n // console.log(\"Project\", obj.$project)\n if (!Array.isArray(obj.$project)) obj.$project = [obj.$project];\n return data.map((o: any) => Object.fromEntries(Object.entries(o).filter(([key]) => obj.$project.includes(key))));\n case \"$extract\":\n // console.log(\"Extract\", obj.$extract)\n // return data.map(o => o[obj.$extract])\n const sres = data.map((o: any) => {\n const res = getValueByDotPath(o, obj.$extract);\n // console.log(\"EXTRACT RES\", res)\n return res;\n });\n // console.log(\"SRES JE \", sres.flat())\n return sres.flat();\n // return sres\n case \"$extractValue\":\n const rv = data.map((o: any) => o[obj.$extract]);\n if (rv.length === 1) return rv[0];\n else return rv;\n default:\n // console.log(\"JE TU NEZNAMY\", Object.keys(obj)[0])\n }\n return data;\n}\n\nexport function getValueByRules(data: any, document: any, { mode, ruleId }: { mode?: any; ruleId?: any }): any {\n // Porovname hodnotu dokumentu s pravidlem\n if (Array.isArray(data)) {\n const results: any[] = [];\n data.forEach((item) => {\n const res = getValueByRules(item, document, { mode, ruleId });\n if (res !== undefined) results.push(res);\n });\n switch (mode) {\n case \"min\":\n // console.log(\"Vybiram z hodnot\", results)\n if (results.length === 0) return undefined;\n return Math.min(...results);\n case \"max\":\n return Math.max(...results);\n case \"array\":\n return results;\n case \"value\":\n default:\n if (results.length === 1) return results[0];\n return results;\n }\n }\n if (typeof data === \"object\") {\n if (data._value !== undefined) {\n if (data._rules) {\n // Pokud je pole ruznych pravidel s id, tak vybereme pravidlo podle ruleId\n if (Array.isArray(data._rules)) {\n if (doesObjectMatchFilter(document, data._rules.find((rule: any) => rule._id === ruleId)._rules)) {\n return data._value;\n }\n // Pravidlo je jen jedno\n } else if (doesObjectMatchFilter(document, data._rules)) {\n // console.log(\"Jedno pravidlo\", data._rules, \"Vysledek: \", data._value)\n return data._value;\n }\n return undefined;\n }\n return data._value;\n }\n return data;\n }\n // Pokud data neni ani pole, ani object, tak to je hodnota a vratime ji\n return data;\n}\n\nexport function doesValueMatchFilter(objVal: any, value: any, documents: any = {}): any {\n // if (!value) return true\n if (value === undefined) return true;\n\n if (typeof value === \"object\") {\n switch (Object.keys(value)[0]) {\n case \"$filter\":\n return doesObjectMatchFilter(\n objVal.filter((o: any) => doesObjectMatchFilter(o, value.$filter, documents)),\n value.$next\n );\n case \"$or\":\n return value.$or.some((filter: any) => doesValueMatchFilter(objVal, filter));\n case \"$and\":\n return value.$and.every((filter: any) => doesValueMatchFilter(objVal, filter));\n case \"$not\":\n return !doesValueMatchFilter(objVal, value.$not);\n case \"$sum\":\n // console.log(\"SUM objVal\", objVal)\n if (Array.isArray(objVal))\n return doesValueMatchFilter(\n objVal.reduce((acc, val) => acc + val, 0),\n value.$sum\n );\n return doesValueMatchFilter(objVal, value.$sum);\n case \"$length\":\n if (Array.isArray(objVal)) return doesValueMatchFilter(objVal.length, value.$length);\n return doesValueMatchFilter(1, value.$length);\n case \"$eq\":\n if (Array.isArray(objVal)) return objVal.some((o) => value.$eq === o);\n return value.$eq === objVal;\n case \"$neq\":\n if (Array.isArray(objVal)) return objVal.some((o) => value.$neq !== o);\n return value.$neq !== objVal;\n case \"$some\":\n // if (objVal.length === 20) console.log(\"SOME\", objVal)\n if (Array.isArray(objVal)) return objVal.some((o) => doesValueMatchFilter(o, value.$some));\n return doesValueMatchFilter(objVal, value.$some);\n case \"$nsome\":\n if (Array.isArray(objVal)) return objVal.some((o) => doesValueMatchFilter(o, value.$nsome));\n return doesValueMatchFilter(objVal, value.$nsome);\n case \"$every\":\n if (Array.isArray(objVal)) return objVal.every((o) => doesValueMatchFilter(o, value.$every));\n return doesValueMatchFilter(objVal, value.$every);\n case \"$nevery\":\n if (Array.isArray(objVal)) return objVal.every((o) => doesValueMatchFilter(o, value.$nevery));\n return doesValueMatchFilter(objVal, value.$nevery);\n case \"$in\":\n // console.log(\"IN\")\n // MICHAL: Overit!!!\n value.$in = recalculateObjectWithDocument(value.$in, documents);\n // value.$in = recalculateObjectWithDocument(value.$in, documents)\n // MICHAL: ˆˆˆˆˆˆˆ\n // console.log(\"V JE\", typeof value.$in)\n if (!Array.isArray(value.$in)) value.$in = [value.$in];\n if (Array.isArray(objVal)) {\n return objVal.some((o) => {\n const result = value.$in.some((v: any) => {\n // console.log(\"CALL \", o, v)\n const ret = doesValueMatchFilter(o, v);\n // console.log(\"RET JE \", ret)\n return ret;\n });\n // console.log(\"Call doesValueMatchFilter \", result)\n return result;\n });\n }\n return value.$in.some((v: any) => doesValueMatchFilter(objVal, v));\n // return value.$in.includes(objVal);\n // MICHAL: Pokud bude spravne fungovat $in tak podle toho predelat $nin\n case \"$nin\":\n if (!Array.isArray(value.$nin)) value.$nin = [value.$nin];\n if (Array.isArray(objVal)) return objVal.some((o) => !value.$nin.includes(o));\n return !value.$nin.includes(objVal);\n // Every in array\n case \"$ein\":\n if (!Array.isArray(value.$ein)) value.$ein = [value.$ein];\n if (Array.isArray(objVal)) return objVal.every((o) => value.$ein.includes(o));\n return value.$ein.includes(objVal);\n // Not every in array\n case \"$nein\":\n if (!Array.isArray(value.$nein)) value.$nein = [value.$nein];\n if (Array.isArray(objVal)) return objVal.every((o) => !value.$nein.includes(o));\n return !value.$nein.includes(objVal);\n // case \"$include\":\n // case \"$incl\":\n // return objVal?.includes(value.$include);\n case \"$gt\":\n return objVal > value.$gt;\n case \"$gte\":\n // console.log(\"Jsem GTE\", value.$gte, recalculateObjectWithDocument(value.$gte, documents))\n return objVal >= recalculateObjectWithDocument(value.$gte, documents);\n case \"$lt\":\n return objVal < value.$lt;\n case \"$lte\":\n return objVal <= value.$lte;\n case \"$regex\":\n // console.log(\"Testuji Regex\", value.$regex, objVal)\n const regex = new RegExp(escapeRegExp(value.$regex));\n if (regex) return regex.test(objVal);\n else return false;\n case \"$iregex\": // Neni case sensitive\n const iregex = new RegExp(escapeRegExp(value.$iregex), \"i\");\n if (iregex) return iregex.test(objVal);\n else return false;\n\n // Pomocne - lze resit regexem\n case \"$sw\":\n return value.$sw.startsWith(objVal);\n case \"$ew\":\n return value.$sw.endsWith(objVal);\n case \"$nsw\":\n return !value.$sw.startsWith(objVal);\n case \"$new\":\n return !value.$sw.endsWith(objVal);\n\n default:\n // console.log(\"Posilam default doesValueMatchFilter\")\n return doesObjectMatchFilter(objVal, value, documents);\n }\n } else {\n if (Array.isArray(objVal)) return objVal.some((o) => value === o);\n return objVal === value;\n }\n}\n\nexport function doesObjectMatchFilter(obj: any, filter: any, documents: any = {}): any {\n // console.log(\"doesObjectMatchFilter\")\n // if (filter.brandId === \"4f15daae-4605-4890-895c-c7e9602ea3db\") console.log(obj)\n if (!filter) return true; // Pokud neni nastaveny filter, vracime true\n\n if (Object.keys(filter)?.includes(\"$rule\")) {\n // console.log(\"Pravidloo: \", filter.$rule)\n const result = doesObjectMatchFilter(obj, filter.$rule, documents);\n if (result === true) {\n // console.log(\"Vracim result\", result)\n return result;\n } else {\n // console.log(\"Vracim chybovou message \", filter.$message)\n return filter.$message || false;\n }\n }\n\n let error;\n const result = Object.entries(filter).every(([key, value]: [key: string, value: any]) => {\n let objVal;\n // Pokud je key systemova promena, zjistime ji\n //TODO: Dodelat moment(date()) z Timers pro TimeShift\n if (key.startsWith(\"$\")) {\n switch (key) {\n case \"$date\":\n objVal = dayjs().format(\"YYYY-MM-DD\");\n break;\n case \"$time\":\n objVal = dayjs().format(\"HH:mm:ss\");\n break;\n case \"$datetime\":\n objVal = dayjs().format(\"YYYY-MM-DD HH:mm:ss\");\n break;\n case \"$day\":\n objVal = dayjs().day();\n break;\n case \"$or\":\n // return value.some((condition) => doesObjectMatchFilter(obj, condition));\n return value.some((condition: any) => {\n const res = doesObjectMatchFilter(obj, condition, documents);\n if (typeof res === \"boolean\") return res;\n // console.log(\"Mam Chybu\", res)\n error = res;\n return false;\n });\n case \"$and\":\n return value.every((condition: any) => {\n const res = doesObjectMatchFilter(obj, condition, documents);\n if (typeof res === \"boolean\") return res;\n // console.log(\"Mam Chybu\", res)\n error = res;\n return false;\n });\n case \"$first\":\n // console.log(\"Resim first pro\", obj, \"pravidlo\", JSON.stringify(value))\n if (Array.isArray(value)) {\n for (const v of value) {\n if (Object.keys(v)?.includes(\"$rule\")) {\n if (doesObjectMatchFilter(documents, v.$rule, documents)) {\n return doesValueMatchFilter(obj, v.$value);\n }\n } else {\n return doesValueMatchFilter(obj, v);\n }\n }\n return false;\n } else return doesObjectMatchFilter(obj, value, documents);\n case \"$last\":\n if (Array.isArray(value)) {\n for (const v of value.reverse()) {\n // console.log(\"V \", v)\n if (Object.keys(v)?.includes(\"$rule\")) {\n if (doesObjectMatchFilter(documents, v.$rule, documents)) {\n return doesValueMatchFilter(obj, v.$value);\n }\n } else {\n return doesValueMatchFilter(obj, v);\n }\n }\n return false;\n } else return doesObjectMatchFilter(obj, value, documents);\n\n case \"$gt\":\n case \"$gte\":\n case \"$lt\":\n case \"$lte\":\n case \"$eq\":\n case \"$neq\":\n // console.log(\"Dotaz:\", filter, \"Obj\", obj)\n const resp = recalculateObjectWithDocument(filter, obj);\n // console.log(\"Result dotazu\", resp)\n return resp;\n default:\n objVal = getValueByDotPath(obj, key.substring(1));\n }\n } else {\n objVal = getValueByDotPath(obj, key);\n // console.log(\n // // \"Obj\", JSON.stringify(obj, null, 2),\n // \"\\nKey\", JSON.stringify(key, null, 2),\n // \"\\nHodnota:\", JSON.stringify(objVal, null, 2))\n }\n\n // Pokud je key nepovinny (konci otaznikem) a v obj neexistuje, tak vratime true (ignoruje se)\n if (key.endsWith(\"?\") && objVal === undefined) return true;\n // Pokud je key povinny a neexistuje, vracime false\n if (objVal === undefined) return false;\n\n // console.log(\"Volam doesValueMatchFilter\", objVal, value)\n // Volam doesValueMatchFilter 39 {\"$gte\": 10}\n const rrr = doesValueMatchFilter(objVal, value, documents);\n // console.log(\"A je to \", rrr)\n return rrr;\n });\n\n return error || result;\n}\n\n/**\n *\n * Filteruje pole dokumentu podle filteru\n *\n * @param {*} documents Pole dokumentu\n * @param {*} filter object filteru\n * @returns vraci pole vyfilterovanych dokumentu\n */\nexport const filterDocuments = <T>(documents: T[] | T, filter: any): any => {\n if (!filter) return documents;\n if (!documents) return undefined;\n if (!Array.isArray(documents)) {\n if (doesObjectMatchFilter(documents, filter)) return documents;\n else return null;\n } else return documents.filter((item) => doesObjectMatchFilter(item, filter));\n};\n\nexport const filterDocumentsAsync = async <T>(documents: T[] | T, filter: any): Promise<any> => {\n return new Promise((resolve) => {\n const response = filterDocuments(documents, filter);\n resolve(response);\n });\n};\n\nexport const dataStoreFilterObject = (obj: any, filter: any): any => {\n if (!filter) return obj;\n if (!obj) return undefined;\n\n const result: Record<string, any> = {};\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n if (doesObjectMatchFilter(obj[key], filter)) {\n result[key] = obj[key];\n }\n }\n }\n return result;\n};\n\n/**\n *\n * @returns UUID v4\n *\n * Vygeneruje unikatni UUID v4\n */\nexport function uuid(): string {\n return Crypto.randomUUID();\n}\n\nexport function isUuid(val: string) {\n if (typeof val !== \"string\") return false;\n const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidPattern.test(val);\n}\n","function getArrayIndex(head: string, obj: unknown[]) {\n if (head === \"$end\") {\n head = String(Math.max(obj.length - 1, 0));\n }\n if (!/^\\+?\\d+$/.test(head)) {\n throw new Error(`Array index '${head}' has to be an integer`);\n }\n return parseInt(head, 10);\n}\n\nfunction propToArray(prop: string) {\n return prop.split(\".\").reduce<string[]>((ret, el, index, list) => {\n const last = index > 0 && list[index - 1];\n if (last && /(?:^|[^\\\\])\\\\$/.test(last)) {\n const prev = ret.pop() || \"\";\n ret.push(prev.slice(0, -1) + \".\" + el);\n } else {\n ret.push(el);\n }\n return ret;\n }, []);\n}\n\nexport function setValueByDotPath(obj: any, prop: string | number | string[], value: any) {\n prop =\n typeof prop === \"number\"\n ? propToArray(prop.toString())\n : typeof prop === \"string\"\n ? propToArray(prop)\n : prop;\n\n const setPropImmutableRec = (target: any, parts: string[], nextValue: any, i: number): any => {\n let clone: any;\n let head: string | number = parts[i];\n\n if (parts.length > i) {\n if (Array.isArray(target)) {\n head = getArrayIndex(String(head), target);\n clone = target.slice();\n } else {\n clone = Object.assign({}, target);\n }\n clone[head] = setPropImmutableRec(\n target?.[head] !== undefined ? target[head] : {},\n parts,\n nextValue,\n i + 1,\n );\n return clone;\n }\n\n return typeof nextValue === \"function\" ? nextValue(target) : nextValue;\n };\n\n return setPropImmutableRec(obj, prop as string[], value, 0);\n}\n\nexport function getValueByDotPath(obj: any, prop?: string | number | string[] | undefined, value?: any): any {\n prop =\n typeof prop === \"number\"\n ? propToArray(prop.toString())\n : typeof prop === \"string\"\n ? propToArray(prop)\n : prop;\n\n let currentObj = obj;\n for (let i = 0; i < (prop?.length || 0); i += 1) {\n if (currentObj === null || typeof currentObj !== \"object\") {\n return value;\n }\n let head: any = (prop as string[])[i];\n if (Array.isArray(currentObj)) {\n const results: any[] = [];\n for (let j = 0; j < currentObj.length; j += 1) {\n const result = getValueByDotPath(currentObj[j], (prop as string[]).slice(i), value);\n if (result !== value) {\n results.push(result);\n }\n }\n return results.flat();\n }\n if (head === \"$end\" && Array.isArray(currentObj)) {\n head = currentObj.length - 1;\n }\n currentObj = currentObj[head];\n }\n if (typeof currentObj === \"undefined\") {\n return value;\n }\n return currentObj;\n}\n","// import { template } from \"lodash\";\n// import Mustache from 'mustache';\n\ntype TemplateData = Record<string, unknown>;\n\nconst _renderMyTemplate = (templateString: string, data: TemplateData): string => {\n return templateString.replace(/<%=(.*?)%>/g, (match: string, variable: string) => {\n const key = variable.trim();\n return data[key] !== undefined ? String(data[key]) : match;\n // return data[key] !== undefined ? data[key] : `<%=${variable}%>`;\n });\n};\n\nexport function renderTemplate(val: string, data: TemplateData): string {\n const renderedOutput = _renderMyTemplate(val, data);\n return renderedOutput;\n}\n\nexport function renderJSONTemplate<T>(val: T, data?: TemplateData): T {\n if (val == null) return val;\n if (!data) return val;\n // Regularni vyrazy zabezpecime\n const valString = JSON.stringify(val, (_key, value) => {\n if (value instanceof RegExp) {\n return { __regex__: value.source };\n }\n return value;\n });\n\n const renderedOutput = _renderMyTemplate(valString, data);\n\n // Regularni vyrazy vratime\n const parsedObj = JSON.parse(renderedOutput, (_key, value) => {\n if (typeof value === \"object\" && value !== null && Object.prototype.hasOwnProperty.call(value, \"__regex__\")) {\n const regexValue = (value as { __regex__: string }).__regex__;\n return new RegExp(regexValue);\n }\n return value;\n });\n\n return parsedObj;\n}\n\nexport const replaceRegexPlaceholders = (obj: unknown, placeholder = \"$regex\"): unknown => {\n if (typeof obj === \"object\") {\n if (Array.isArray(obj)) {\n return obj.map((o) => replaceRegexPlaceholders(o, placeholder));\n } else {\n if (obj === null) return obj;\n\n const sourceObj = obj as { [key: string]: unknown };\n const newObj: { [key: string]: unknown } = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[key] = replaceRegexPlaceholders(sourceObj[key], placeholder);\n }\n }\n if (Object.prototype.hasOwnProperty.call(newObj, placeholder)) {\n const regexStr = newObj[placeholder];\n try {\n const regex = new RegExp(String(regexStr));\n return regex;\n } catch (error) {\n console.error(`Invalid regular expression: ${regexStr}`);\n return newObj;\n }\n }\n return newObj;\n }\n } else {\n return obj;\n }\n};\n","import * as SQL from \"expo-sqlite\";\nimport { systemLog, systemLogError } from \"./log\";\n\nexport class SQLite {\n dbName: string;\n private db: SQL.SQLiteDatabase | null = null;\n\n constructor(name?: string) {\n this.dbName = name || \"modelaz.db\";\n this.initDB();\n }\n\n private async initDB(): Promise<void> {\n if (!this.db) {\n try {\n systemLog(\"sql\", \"[initDB]\");\n this.db = await SQL.openDatabaseAsync(this.dbName);\n // await this.createTable(\"documents\", \"id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT\");\n // await this.createTable(\"logs\", \"time TEXT PRIMARY KEY, module TEXT, message TEXT\");\n await this.createTables({\n documents: \"id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT\",\n // logs: \"time TEXT PRIMARY KEY, module TEXT, message TEXT\",\n });\n // await this.createTable(\"providers\", \"id TEXT PRIMARY KEY, data TEXT, lastUpdate TEXT\");\n // await this.db?.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);\n } catch (e) {\n console.log(\"INITDB ERROR\", e);\n // systemLogError(\"sql\", \"[initDB]\", e);\n throw e;\n }\n }\n }\n\n private async getDb(): Promise<SQL.SQLiteDatabase> {\n if (!this.db) {\n await this.initDB();\n }\n\n if (!this.db) {\n throw new Error(\"Database is not initialized\");\n }\n\n return this.db;\n }\n\n private async createTable(table: string, tableSchema: string): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", \"[createTable]\", table);\n const db = await this.getDb();\n const result = await db.runAsync(`CREATE TABLE IF NOT EXISTS '${table}' (${tableSchema})`);\n systemLog(\"sql\", \"[createTable] result: \", JSON.stringify(result));\n return result;\n } catch (e) {\n systemLogError(\"sql\", \"[createTable]\", e);\n throw e;\n }\n }\n private async createTables(tables: { [key: string]: string }): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", \"[createTables]\", tables);\n const query = Object.entries(tables).reduce((acc, [table, schema]) => {\n return acc + `CREATE TABLE IF NOT EXISTS '${table}' (${schema});`;\n }, \"\");\n // console.log(\"Query: \", query);\n const db = await this.getDb();\n const result = await db.runAsync(query);\n systemLog(\"sql\", \"[createTables] result: \", JSON.stringify(result));\n return result;\n } catch (e) {\n systemLogError(\"sql\", \"[createTable]\", e);\n throw e;\n }\n }\n\n /**\n * Smazani starych logu\n */\n private async deleteLogs(): Promise<void> {\n systemLog(\"sql\", \"[query] delete old Logs\", this.db);\n try {\n const db = await this.getDb();\n await db.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);\n } catch (error) {\n throw error;\n }\n }\n\n public async read<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]> {\n try {\n // Smazani starych zaznamu z logu\n systemLog(\"sql\", \"[read]\", query);\n const db = await this.getDb();\n const result = args === undefined ? await db.getAllAsync<T>(query) : await db.getAllAsync<T>(query, args);\n systemLog(\"sql\", \"[read] result \", result.length);\n return result;\n } catch (e) {\n systemLogError(\"sql\", \"[read]\", e);\n throw e;\n }\n }\n\n public async query<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]> {\n try {\n systemLog(\"sql\", \"[query]->\", query);\n const db = await this.getDb();\n const result = args === undefined ? await db.getAllAsync<T>(query) : await db.getAllAsync<T>(query, args);\n systemLog(\"sql\", result);\n return result;\n } catch (error) {\n console.error(\"INSERT ERROR\", error);\n systemLogError(\"sql\", error);\n throw error;\n }\n }\n\n public async dropTable(table: string): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", \"dropTable\", table);\n console.time(\"[SQL] dropTable\");\n const db = await this.getDb();\n const result = await db.runAsync(`DROP TABLE ${table}`);\n console.timeEnd(\"[SQL] dropTable\");\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n public async emptyTable(table: string): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", `[emptyTable]`, table);\n const db = await this.getDb();\n const result = await db.runAsync(`DELETE FROM '${table}'`);\n systemLog(\"sql\", \"[emptyTable] result\", result);\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n public async getTables() {\n systemLog(\"sql\", \"Jdu zkusit nacist tabulky z \", JSON.stringify(this.dbName));\n try {\n const db = await this.getDb();\n const result = await db.getAllAsync('SELECT name FROM sqlite_master WHERE type=\"table\"');\n systemLog(\"sql\", \"DB Result:\", result);\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n public async resetDatabase() {\n try {\n systemLog(\"sql\", \"Reset database\", this.dbName);\n console.time(\"DELETING\");\n systemLog(\"sql\", \"Closing\");\n const db = await this.getDb();\n await db.closeAsync();\n systemLog(\"sql\", \"Deleting\");\n await SQL.deleteDatabaseAsync(this.dbName);\n console.timeEnd(\"DELETING\");\n console.time(\"INIT\");\n this.db = null;\n systemLog(\"sql\", \"Zacinam inicializovat databazi databaze\");\n await this.initDB();\n systemLog(\"sql\", \"Inicializovana databaze\");\n console.timeEnd(\"INIT\");\n } catch (e) {\n systemLogError(\"sql\", \"[resetDatabase]\", e);\n }\n }\n}\n","import { useCallback, useContext, useEffect, useMemo, useState, useSyncExternalStore } from \"react\";\nimport { DataStoreStableContext } from \"./DataStoreProvider\";\nimport { renderJSONTemplate } from \"./templates\";\nimport { filterDocuments, recalculateObjectWithDocument } from \"./utils\";\nimport { systemLog } from \"./log\";\nimport { JSONType, Uuid } from \"./types\";\nimport { ProviderTypes } from \"./providerTypes\";\n\n/**\n *\n * @param id ID providera z ProviderTypes\n * @param params parametry pro doplneni URI adresy z dataProviders\n * @param dataFilter Filter dat providera\n * @param settings documentId ID dokumentu pouziteho k prepocitani dokumentu providera, document: JSON dokument k prepocitani dokumentu providera\n * @returns void\n */\nexport const useDataProvider = (\n /**\n * Provider id nebo objekt data {key: value}\n */\n id: ProviderTypes | { [key: string]: any },\n /**\n * Parametry pro prerenderovani providera (profiles/<%= profileId %>)\n */\n params?: { [key: string]: string } | null,\n /**\n * Filtrovani dat\n */\n dataFilter?: JSONType | null,\n /**\n * Nejake nastaveni\n */\n settings?: {\n documentId?: string;\n document?: JSONType;\n },\n) => {\n const [providerId, setProviderId] = useState<string | null>(null);\n const [filter, setFilter] = useState<JSONType | null>(null);\n const {\n dispatch,\n presetProviders,\n updateProviderListeners,\n subscribeToProvider,\n getProviderLastUpdate,\n getExternalDocuments,\n getExternalProviders,\n } = useContext(DataStoreStableContext);\n\n const providerVersion = useSyncExternalStore(\n useCallback(\n (onStoreChange) => {\n if (!providerId) return () => {};\n return subscribeToProvider(providerId, onStoreChange);\n },\n [providerId, subscribeToProvider],\n ),\n useCallback(() => {\n if (!providerId) return null;\n return getProviderLastUpdate(providerId);\n }, [providerId, getProviderLastUpdate]),\n () => null,\n );\n\n systemLog(\"usedp\", `${id} - ${providerId}`);\n\n // useEffect(() => {\n // if (filter) console.log(\"Filter: \", JSON.stringify(filter, 0, 2));\n // }, [filter]);\n\n useEffect(() => {\n if (id === undefined || (typeof id === \"boolean\" && id === false)) return;\n var retId: string;\n const currentProviders = getExternalProviders();\n if (dataFilter) setFilter(dataFilter);\n // Provider je primo definovany objektem v id\n if (typeof id === \"object\") {\n const prov = renderJSONTemplate(id, params ?? undefined);\n // console.log(\"Registruji\", prov.id);\n setProviderId(prov.id);\n retId = prov.id;\n dispatch(\"registerProvider\", prov);\n // registerProvider(prov);\n } else {\n // Provider je dany jen id providera\n if (presetProviders[id]) {\n const prov = renderJSONTemplate(presetProviders[id], params ?? undefined);\n // customLog(\"usedp\",\"Register Provider: \", prov.id);\n // console.log(\"Registruji\", prov.id);\n setProviderId(prov.id);\n retId = prov.id;\n if (currentProviders[prov.id]) {\n systemLog(\"usedp\", \"Provider:\", prov.id, \"existuje\");\n if (!currentProviders[prov.id]?.isPermanent) updateProviderListeners(prov.id, 1);\n // registerProvider(prov);\n // dispatch(\"registerProvider\", prov);\n } else {\n systemLog(\"usedp\", \"Registruji novy provider:\", prov.id);\n dispatch(\"registerProvider\", prov);\n // registerProvider(prov);\n }\n } else {\n systemLog(\"usedp\", \"Neznamy provider \", id, params, dataFilter, settings);\n }\n }\n // console.log(\"PROVIDER RETID JE \", retId);\n return () => {\n // unregisterProvider(retId);\n // updateProviderListeners(retId, -1);\n const activeProviders = getExternalProviders();\n const presetProvider = presetProviders[retId as ProviderTypes];\n if (!presetProvider?.isPermanent && !activeProviders[retId]?.isPermanent) {\n systemLog(\"usedp\", \"Unregister Provider: \", retId, \"-\", activeProviders[retId]);\n // console.log(\"usedp\", \"Unregister Provider: \", retId, \"-\", providers[retId]);\n dispatch(\"unregisterProvider\", retId);\n // unregisterProvider(retId);\n }\n };\n }, []);\n\n const update = (val: JSONType) => {\n systemLog(\"usedp\", \"UPDATUJI: \", providerId, \", data: \", val);\n dispatch(\"updateDataStore\", { id: providerId, data: val });\n };\n\n /**\n *\n * @param {*} param0 {params, data, variant - varianta url adresy v dataProviders}\n * @param {*} callback\n */\n const updateItem = (\n { params, data, variant, documentId = undefined }: { params?: JSONType; data?: JSONType; variant?: string; documentId?: string },\n callback?: (resp: JSONType) => void,\n ) => {\n systemLog(\"usedp\", \"UPDATUJI:\", providerId, \", variant:\", variant, \", documentId: \", documentId, \", params:\", params, \", data:\", data);\n dispatch(\"updateDataStore\", { id: providerId, variant, params, data, documentId }, callback);\n };\n\n const deleteItem = ({ params, data }: { params?: JSONType; data?: JSONType }, callback?: (resp: JSONType) => void) => {\n systemLog(\"usedp\", \"DELETE FROM:\", providerId, \", params:\", params, \"data:\", data);\n dispatch(\"deleteProviderItem\", { providerId, data, params }, callback);\n };\n\n const createItem = (data: JSONType, callback?: () => void) => {\n // console.log(\"createItem Prov. id:\", id);\n dispatch(\"createProviderItem\", { id, data }, callback);\n };\n\n const provider = useMemo(() => {\n // console.time(`[USEDP] useMemo ${providerId}`);\n systemLog(\"usedp\", \"Vytvoreni dat: \", filter);\n const providers = getExternalProviders();\n const documents = getExternalDocuments();\n if (!providerId || !providers[providerId]) {\n return {\n data: [] as Array<Record<string, any>>,\n schema: undefined,\n };\n }\n\n let docs: Array<Record<string, any>> = [];\n providers[providerId]?.data.forEach((docId: string) => {\n let dData = documents[docId];\n\n if (providers[providerId].depend) {\n dData = recalculateObjectWithDocument(documents[docId], documents[providers[providerId].depend]);\n } else if (settings?.documentId) {\n dData = recalculateObjectWithDocument(documents[docId], documents[settings.documentId]);\n } else if (settings?.document) {\n dData = recalculateObjectWithDocument(documents[docId], settings.document);\n }\n\n docs.push({\n id: docId,\n ...dData,\n });\n });\n systemLog(\"usedp\", \"KonecVytvoreni dat: \", providerId);\n // customLog(\"usedp\", JSON.stringify(docs, 0, 2));\n if (filter) {\n systemLog(\"usedp\", \"Jdu filterovat: \", JSON.stringify(filter));\n docs = filterDocuments(docs, filter);\n systemLog(\"usedp\", \"Konec filteru: \");\n }\n\n // console.timeEnd(`[USEDP] useMemo ${providerId}`);\n\n return {\n ...providers[providerId],\n data: docs,\n };\n }, [providerId, providerVersion, settings?.document, settings?.documentId, getExternalProviders, getExternalDocuments]);\n\n systemLog(\"usedp\", `${providerId} END`);\n return {\n // provider,\n documents: provider.data,\n schema: provider.schema,\n // dispatch,\n update,\n updateItem,\n deleteItem,\n createItem,\n };\n};\n","import { useContext, useEffect, useMemo, useState } from \"react\";\nimport { systemLog } from \"./log\";\nimport { DataStoreActionsContext, DataStoreDocumentsContext } from \"./DataStoreProvider\";\nimport { Uuid } from \"./types\";\n\n/**\n * blabla\n */\ninterface UseDocumentParams {\n /**\n * UUID dokumentu\n */\n documentId: Uuid;\n model?: string;\n /**\n * nazev Providera, nebo objekt definice Providera\n */\n provider?: string | {};\n /**\n * Polozky ktere chceme ziskat. Ty co nejsou ulozene se pokusi stahnout z modelu nebo podle definice Providera a doplnit. Pokud nejsou nastavena zadne polozky, tak vrati to co ma v zarizeni.\n */\n fields?: string[];\n /**\n * true|false - pozadujeme kompletni dokument.\n */\n allFields?: boolean;\n}\n\ninterface UseDocumentResult {\n /**\n * Vraci neco\n */\n document: Record<string, any>;\n}\n\n/**\n * Provider dokumentu z DataProvider\n *\n * Example: useDocument({documentId: \"123-123123-123123-12\", model: \"products\", fields: [\"name\", \"image\"]})\n *\n * @param documentId - ID dokumentu\n * @param model - nazev modelu\n * @param provider - nazev providera\n * @param fields - seznam polozek dokumentu ktere chceme ziskat\n * @param allFields - kompletni dokument\n *\n * @returns - vraci dokument\n */\nexport const useDocument = ({ documentId, model, provider, fields, allFields }: UseDocumentParams): UseDocumentResult => {\n const documents = useContext(DataStoreDocumentsContext);\n const { dispatch } = useContext(DataStoreActionsContext);\n\n systemLog(\"useDocument\", \"USE DOCUMENT\", documentId);\n\n const documentResult = useMemo(() => {\n systemLog(\"useDocument\", \"Hledam v Documents\", fields);\n let missingFields: string[] = [];\n let result: Record<string, any> = {};\n\n if (documents[documentId]) {\n if (Array.isArray(fields) && fields.length > 0) {\n for (const field of fields) {\n if (!Object.prototype.hasOwnProperty.call(documents[documentId], field)) {\n missingFields.push(field);\n } else {\n result[field] = documents[documentId][field];\n }\n }\n } else {\n result = documents[documentId];\n }\n if (missingFields.length > 0) {\n systemLog(\"useDocument\", \"Musim jeste stahnout\", missingFields);\n dispatch(\"updateDocument\", {\n documentId: documentId,\n model,\n fields: missingFields,\n });\n }\n } else {\n result = {};\n }\n systemLog(\"useDocument\", JSON.stringify(result));\n return { document: result };\n }, [documentId, JSON.stringify(fields), documents[documentId]]);\n\n return documentResult;\n};\n","import { useContext, useEffect, useMemo, useState } from \"react\";\nimport { DataStoreActionsContext, DataStoreProvidersContext } from \"./DataStoreProvider\";\nimport { renderJSONTemplate } from \"./templates\";\nimport { systemLog } from \"./log\";\nimport { JSONType, Uuid } from \"./types\";\nimport { ProviderTypes } from \"./providerTypes\";\n\nexport const useProviderActions = (providerId: Uuid, data?: JSONType) => {\n const providers = useContext(DataStoreProvidersContext);\n const { dispatch, presetProviders, updateProviderListeners } = useContext(DataStoreActionsContext);\n const providerKey = providerId as ProviderTypes;\n\n systemLog(\"usedp\", `${providerId}`);\n\n useEffect(() => {\n // Provider jiz je registrovany\n if (providers[providerId]) {\n systemLog(\"usedp\", \"Provider:\", providerId, \"existuje\");\n if (!providers[providerId].isPermanent) updateProviderListeners(providerId, 1);\n }\n // Provider jeste neni registrovany\n else {\n if (presetProviders[providerKey]) {\n const templateData =\n typeof data === \"object\" && data !== null && !Array.isArray(data) ? (data as Record<string, unknown>) : undefined;\n const prov = renderJSONTemplate(presetProviders[providerKey], templateData);\n systemLog(\"usedp\", \"Registruji novy provider:\", providerId);\n dispatch(\"registerProvider\", prov);\n } else {\n systemLog(\"usedp\", \"Neznamy provider \", providerId);\n }\n\n return () => {\n if (!presetProviders[providerKey]?.isPermanent && !providers[providerId]?.isPermanent) {\n dispatch(\"unregisterProvider\", providerId);\n }\n };\n }\n }, []);\n\n const update = (val: JSONType) => {\n systemLog(\"usedp\", \"UPDATUJI: \", providerId, \", data: \", val);\n dispatch(\"updateDataStore\", { id: providerId, data: val });\n };\n\n /**\n *\n * @param {*} param0 {params, data, variant - varianta url adresy v dataProviders}\n * @param {*} callback\n */\n const updateItem = (\n { params, data, variant, documentId = undefined }: { params?: JSONType; data?: any; variant?: string; documentId?: Uuid },\n callback?: (value: JSONType) => void,\n ) => {\n dispatch(\"updateDataStore\", { id: providerId, variant, params, data, documentId }, callback);\n };\n\n const deleteItem = (\n { params, data }: { params: JSONType; data?: JSONType }, // Destructuring parameters\n callback?: () => void, // Optional callback function\n ) => {\n dispatch(\"deleteProviderItem\", { providerId, data, params }, callback);\n };\n\n const createItem = (data: JSONType, callback?: (value: JSONType) => void) => {\n systemLog(\"usedp\", \"createItem Prov. id:\", providerId);\n dispatch(\"createProviderItem\", { id: providerId, data }, callback);\n };\n return {\n schema: providers[providerId]?.schema,\n update,\n updateItem,\n deleteItem,\n createItem,\n };\n};\n","/**\n * Black: \\x1b[30m\n * Red: \\x1b[31m\n * Green: \\x1b[32m\n *Yellow: \\x1b[33m\n * Blue: \\x1b[34m\n * Magenta: \\x1b[35m\n * Cyan: \\x1b[36m\n * White: \\x1b[37m\n */\n\n\nexport const COLOR_WHITE = `\\x1b[37m%s\\x1b[0m`\nexport const COLOR_MAGENTA = `\\x1b[35m%s\\x1b[0m`\nexport const COLOR_BLUE = `\\x1b[34m%s\\x1b[0m`\nexport const COLOR_CYAN = `\\x1b[36m%s\\x1b[0m`\nexport const COLOR_GREEN = `\\x1b[32m%s\\x1b[0m`\nexport const COLOR_RED = `\\x1b[31m%s\\x1b[0m`\nexport const COLOR_ERROR = `\\x1b[31m%s\\x1b[0m`\nexport const COLOR_YELLOW = `\\x1b[33m%s\\x1b[0m`\nexport const COLOR_ORANGE = `\\x1b[38;5;208m%s\\x1b[0m`;\n\nexport const COLOR_WARNING = `\\x1b[33m%s\\x1b[0m`\n\nexport const COLOR_PROVIDER = COLOR_MAGENTA\nexport const COLOR_CONTEXT = COLOR_MAGENTA\nexport const COLOR_RENDER = COLOR_BLUE\nexport const COLOR_FUNCTION = COLOR_CYAN\nexport const COLOR_SCREEN = COLOR_GREEN\n\nexport const COLOR_SOCKET = COLOR_CYAN\nexport const COLOR_SOCKETS = COLOR_YELLOW\nexport const COLOR_AXIOS = COLOR_YELLOW\n\nexport const COLOR_APP = COLOR_BLUE\nexport const COLOR_DS = COLOR_MAGENTA\n"],"mappings":"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","names":["SQLite","res","result","dayjs","SQLite","axios","import_axios","SQLite","isEqual","axios","ioSockets","prev","result","sockets","id","newProvs","import_react","params","import_react","import_react","data"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/DataStoreProvider.tsx","../src/log.ts","../src/handleSocketMessage.ts","../src/handleData.ts","../src/dotPath.ts","../src/utils.ts","../src/templates.ts","../src/useDataProvider.tsx","../src/useDocument.ts","../src/useProviderActions.tsx","../src/logColors.ts"],"sourcesContent":["/**\n * Veřejný vstupní bod balíčku @mgarlik/datastore.\n *\n * Reexportuje provider, hooky, pomocné typy a utility.\n */\nexport { default as DataStoreProvider } from \"./DataStoreProvider\";\nexport * from \"./DataStoreProvider\";\nexport * from \"./types\";\nexport * from \"./providerTypes\";\nexport * from \"./useDataProvider\";\nexport * from \"./useDocument\";\nexport * from \"./useProviderActions\";\nexport * from \"./utils\";\nexport * from \"./logColors\";\nexport * from \"./storage\";\n","import React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { handleSocketMessage } from \"./handleSocketMessage\";\nimport { getData, deleteData, patchData, postData } from \"./handleData\";\nimport { filterDocuments, dataStoreFilterObject, doesObjectMatchFilter, recalculateObjectWithDocument, uuid } from \"./utils\";\nimport { io as ioSockets } from \"socket.io-client\";\nimport axios from \"axios\";\nimport { renderJSONTemplate } from \"./templates\";\nimport { systemLog } from \"./log\";\nimport isEqual from \"lodash/isEqual.js\";\nimport { DataProvider, ProviderTypes } from \"./providerTypes\";\nimport { DataStore, DataStoreProps, DispatcherActionType, DispatcherType, JSONType, SocketItem, Uuid } from \"./types\";\nimport type { DataStoreStorage } from \"./storage\";\n\ntype DataStoreMetaType = Pick<DataStore, \"isLive\" | \"isSynchronizing\" | \"sockets\" | \"counterProviders\" | \"counterDocuments\">;\ntype DataStoreActionsType = Pick<\n DataStore,\n | \"dispatch\"\n | \"initProvider\"\n | \"resetProvider\"\n | \"registerProvider\"\n | \"unregisterProvider\"\n | \"updateProviderListeners\"\n | \"resetDataStore\"\n | \"startSockets\"\n | \"stopSockets\"\n | \"registerProviderSockets\"\n | \"unregisterProviderSockets\"\n | \"updateDocuments\"\n | \"presetProviders\"\n>;\n\ntype DataStoreStableType = {\n dispatch: DataStore[\"dispatch\"];\n presetProviders: DataStore[\"presetProviders\"];\n updateProviderListeners: DataStore[\"updateProviderListeners\"];\n subscribeToProvider: (providerId: string, callback: () => void) => () => void;\n getProviderLastUpdate: (providerId: string) => string | null;\n getExternalDocuments: () => Record<string, any>;\n getExternalProviders: () => Record<string, any>;\n};\n\n/** Meta informace (isLive, isSynchronizing, sockets, čítače). */\nexport const DataStoreContext = createContext<DataStoreMetaType>({} as DataStoreMetaType);\n/** Surová mapa dokumentů */\nexport const DataStoreDocumentsContext = createContext<Record<string, any>>({});\n/** Surová mapa providerů */\nexport const DataStoreProvidersContext = createContext<Record<string, any>>({});\n/** Stabilní action callbacky */\nexport const DataStoreActionsContext = createContext<DataStoreActionsType>({} as DataStoreActionsType);\n/** Stabilní datastore API pro provider-scoped subscriptions */\nexport const DataStoreStableContext = createContext<DataStoreStableType>({} as DataStoreStableType);\n\n/** Vrací všechny stabilní action callbacky. Komponenty s tímto hookem se nepřerenderují při změnách dokumentů. */\nexport const useDataStoreActions = () => useContext(DataStoreActionsContext);\n\n/**\n *\n * @param filter - objekt filteru\n * @param resultType - \"object\"(default) | \"array\"\n * @returns {documents, filter}\n */\n\n/**\n * Vyfiltruje všechny datastore dokumenty podle matcher objektu a vrátí reaktivní výsledek.\n */\nexport const useFilteredDocuments = (filter: Record<string, any>) => {\n const [activeFilter, setFilter] = useState(filter);\n const [data, setData] = useState<any[]>();\n\n const documents = useContext(DataStoreDocumentsContext);\n\n useEffect(() => {\n setFilter(filter);\n }, [JSON.stringify(filter)]);\n\n useEffect(() => {\n console.time(\"Filter\");\n // console.log(\"Filter\", activeFilter);\n if (activeFilter && documents && Object.keys(documents).length > 0 && Object.keys(activeFilter).length > 0) {\n const result = dataStoreFilterObject(documents, activeFilter);\n const dataArray = Object.keys(result).map((id) => ({\n id,\n ...result[id],\n }));\n if (!isEqual(data, dataArray)) setData(dataArray);\n }\n console.timeEnd(\"Filter\");\n }, [activeFilter, documents]);\n\n return { documents: data || documents, setFilter };\n};\n\n/**\n * Vrati objekt vsech dokumentu\n *\n * @returns {} documentu\n */\nexport const useDocuments = (): { [key: string]: any } => {\n const documents = useContext(DataStoreDocumentsContext);\n return { documents };\n};\n\n/**\n * Vrati object of documents daneho providera. Dokumenty lze vyfiltrovat\n *\n * @param {*} provider\n * @returns\n */\nexport const useProviderDocuments = (\n provider: ProviderTypes,\n settings?: { filter?: Record<string, any>; documentId?: Uuid; document?: Record<string, any> },\n): { [key: string]: any } => {\n const documents = useContext(DataStoreDocumentsContext);\n const providers = useContext(DataStoreProvidersContext);\n\n const docs = useMemo(() => {\n console.log(\"useProviderDocuments\", provider);\n const d: Record<string, any> = {};\n providers[provider]?.data.forEach((id: string) => {\n // console.log(\"useProviderDocuments\", id);\n\n // Pokud je nastaveny filter a polozka ho nesplnuje, nevracime nic\n if (settings?.filter && !doesObjectMatchFilter(documents[id], settings.filter)) return;\n\n let result = documents[id];\n // Pokud je dokument, podle ktereho se ma prepocitat, tak prepocitame\n if (providers[provider].depend) {\n // console.log(\"1\");\n // console.log(\"PRED\", JSON.stringify(documents[id], null, 2));\n result = recalculateObjectWithDocument(documents[id], documents[providers[provider].depend]);\n // console.log(\"PO\", JSON.stringify(result, null, 2));\n } else if (settings?.documentId) {\n result = recalculateObjectWithDocument(documents[id], documents[settings.documentId]);\n } else if (settings?.document) {\n // console.log(\"2\");\n result = recalculateObjectWithDocument(documents[id], settings.document);\n }\n d[id] = result;\n // return (d[id] = result);\n });\n\n // Nevim proc, ale je to cca 100x pomalejsi\n // const d = Object.fromEntries(\n // Object.entries(documents).filter(([key, value]) =>\n // providers[provider]?.data.includes(key)\n // )\n // );\n return d;\n }, [providers[provider]?.lastUpdate, documents[providers[provider]?.depend], settings?.filter, settings?.documentId, settings?.document]);\n return { documents: docs };\n};\n\n/** Vrací surový stav providera podle provider id. */\nexport const useProvider = (val: ProviderTypes) => {\n const providers = useContext(DataStoreProvidersContext);\n return providers[val];\n};\n\n/** Kompletní DataStore - spojuje všechny sub-contexty. Komponenty s tímto hookem se přerenderují při jakékoliv změně stavu. */\nexport const useDataStore = (): DataStore => {\n const meta = useContext(DataStoreContext);\n const documents = useContext(DataStoreDocumentsContext);\n const providers = useContext(DataStoreProvidersContext);\n const actions = useContext(DataStoreActionsContext);\n return { ...meta, documents, providers, ...actions };\n};\n\nconst modelTemplateIdMap: Record<string, string> = {\n brands: \"brandId\",\n payments: \"paymentId\",\n profiles: \"profileId\",\n user: \"userId\",\n};\n\nconst buildDocumentTemplateParams = (model: string, documentId: Uuid) => {\n const templateIdKey = modelTemplateIdMap[model] || `${model.replace(/s$/, \"\")}Id`;\n\n return {\n id: documentId,\n documentId,\n productId: documentId,\n [templateIdKey]: documentId,\n };\n};\n\nconst resolveLocale = () => {\n if (typeof Intl !== \"undefined\" && typeof Intl.DateTimeFormat === \"function\") {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n if (locale) return locale;\n }\n\n if (typeof navigator !== \"undefined\") {\n if (typeof navigator.language === \"string\" && navigator.language.length > 0) {\n return navigator.language;\n }\n\n if (Array.isArray(navigator.languages) && navigator.languages.length > 0) {\n const firstLocale = navigator.languages.find((value) => typeof value === \"string\" && value.length > 0);\n if (firstLocale) return firstLocale;\n }\n }\n\n return undefined;\n};\n\n/**\n * Imperativní API `DataStoreProvider` vystavené přes `ref`.\n *\n * Umožňuje volat akce DataStore přímo z rodiče (např. `App.tsx`)\n * bez nutnosti použití `useDataStoreActions` hooku uvnitř stromové hierarchie.\n *\n * @example\n * ```tsx\n * const dsRef = useRef<DataStoreRef>(null);\n *\n * <DataStoreProvider ref={dsRef} ...>\n * <AppProvider\n * onLogin={({ userId }) => {\n * dsRef.current?.startSockets();\n * dsRef.current?.registerProviderSockets(userId);\n * }}\n * onLogout={({ userId }) => {\n * dsRef.current?.unregisterProviderSockets(userId);\n * dsRef.current?.stopSockets();\n * }}\n * />\n * </DataStoreProvider>\n * ```\n */\nexport type DataStoreRef = DataStoreActionsType;\n\n/**\n * Kořenový provider, který propojuje DataStore contexty, REST načítání, sockety a volitelnou persistenci.\n *\n * Podporuje volitelný `ref` (`DataStoreRef`) pro imperativní přístup k akcím\n * přímo z rodičovské komponenty bez použití kontextového hooku.\n */\nconst DataStoreProvider = forwardRef<DataStoreRef, DataStoreProps>(\n ({ socketServer, restServer, usePersistentStorage = true, locale, storage = null, ...props }: DataStoreProps, ref) => {\n const [isLive, setIsLive] = useState(false);\n const [isSynchronizing, setIsSynchronizing] = useState(true);\n\n const [sockets, setSockets] = useState<Record<string, SocketItem>>({});\n const [providers, setProviders] = useState<Record<string, any>>({});\n const [documents, setDocuments] = useState<Record<string, any>>({});\n\n const externalProvidersRef = useRef<Record<string, any>>({});\n const externalDocumentsRef = useRef<Record<string, any>>({});\n const providerSubscribersRef = useRef<Map<string, Set<() => void>>>(new Map());\n const previousProviderUpdateIdsRef = useRef<Record<string, string | null>>({});\n\n const [dispatcher, setDispatcher] = useState<DispatcherType>({ isBussy: false, actions: [] });\n\n const [counterProviders, setCounterProviders] = useState<Record<string, number>>({});\n const [counterDocuments, setCounterDocuments] = useState<Record<string, number>>({});\n const didInitialLiveSyncRef = useRef(false);\n const persistenceStorage: DataStoreStorage | null = useMemo(\n () => (usePersistentStorage ? storage : null),\n [storage, usePersistentStorage],\n );\n\n useEffect(() => {\n if (!restServer) return;\n const resolvedLocale = locale || resolveLocale();\n axios.defaults.baseURL = restServer;\n if (resolvedLocale) {\n axios.defaults.headers.common[\"Accept-Language\"] = resolvedLocale;\n }\n systemLog(\"dsp\", \"[INIT] Axios baseURL:\", restServer);\n\n async function checkServer() {\n try {\n const response = await axios.head(\"/\", {\n timeout: 7000,\n validateStatus: () => true,\n });\n systemLog(\"dsp\", \"[INIT] Axios Success, status:\", response.status);\n } catch (e) {\n if (axios.isAxiosError(e)) {\n systemLog(\"dsp\", \"[INIT] Axios Error:\", e.code ?? \"UNKNOWN\", e.message);\n } else {\n systemLog(\"dsp\", \"[INIT] Axios Error:\", String(e));\n }\n } finally {\n systemLog(\"dsp\", \"[INIT] Axios check done\");\n }\n }\n\n checkServer();\n }, [locale, restServer]);\n\n useEffect(() => {\n if (usePersistentStorage && !storage) {\n systemLog(\"dsp\", \"[INIT] Persistence is enabled but no storage adapter was provided.\");\n }\n }, [persistenceStorage, storage, usePersistentStorage]);\n\n const socketRoomHandlersRef = useRef<Record<string, (msg: string) => void>>({});\n const socketActionHandlersRef = useRef<{ dispatch?: typeof dispatch; updateDocument?: typeof updateDocument }>({});\n\n systemLog(\"dsp\", \"START\");\n // const socket = ioSockets(socketServer?.url, socketServer?.params);\n const socket = useMemo(() => ioSockets(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);\n const handleSocketConnect = useCallback(() => setIsLive(true), []);\n const handleSocketDisconnect = useCallback(() => setIsLive(false), []);\n\n const getSocketAuthToken = useCallback(() => {\n const authorizationHeader = axios.defaults.headers.common[\"Authorization\"];\n if (typeof authorizationHeader === \"string\" && authorizationHeader.length > 0) {\n return authorizationHeader.startsWith(\"Bearer \") ? authorizationHeader : `Bearer ${authorizationHeader}`;\n }\n return \"Bearer \";\n }, []);\n\n const subscribeToProvider = useCallback((providerId: string, callback: () => void) => {\n const subscribersByProvider = providerSubscribersRef.current;\n const providerSubscribers = subscribersByProvider.get(providerId) || new Set<() => void>();\n providerSubscribers.add(callback);\n subscribersByProvider.set(providerId, providerSubscribers);\n\n return () => {\n const activeSubscribers = subscribersByProvider.get(providerId);\n if (!activeSubscribers) return;\n activeSubscribers.delete(callback);\n if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);\n };\n }, []);\n\n const getProviderLastUpdate = useCallback((providerId: string) => {\n return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;\n }, []);\n\n const getExternalDocuments = useCallback(() => externalDocumentsRef.current, []);\n const getExternalProviders = useCallback(() => externalProvidersRef.current, []);\n\n useEffect(() => {\n externalProvidersRef.current = providers;\n const currentUpdateIds: Record<string, string | null> = {};\n\n Object.keys(providers).forEach((providerId) => {\n currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;\n if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {\n const subscribers = providerSubscribersRef.current.get(providerId);\n subscribers?.forEach((callback) => callback());\n }\n });\n\n Object.keys(previousProviderUpdateIdsRef.current).forEach((providerId) => {\n if (!(providerId in currentUpdateIds)) {\n const subscribers = providerSubscribersRef.current.get(providerId);\n subscribers?.forEach((callback) => callback());\n }\n });\n\n previousProviderUpdateIdsRef.current = currentUpdateIds;\n }, [providers]);\n\n useEffect(() => {\n externalDocumentsRef.current = documents;\n }, [documents]);\n\n const persistDocument = useCallback(\n async ({\n documentId,\n model,\n data,\n lastUpdate = new Date().toISOString(),\n }: {\n documentId: Uuid;\n model: string;\n data: JSONType;\n lastUpdate?: string;\n }) => {\n if (!persistenceStorage) return;\n await persistenceStorage.query(\"INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES (?, ?, ?, ?)\", [\n documentId,\n JSON.stringify(data),\n model,\n lastUpdate,\n ]);\n },\n [persistenceStorage],\n );\n\n const removePersistedDocument = useCallback(\n async (documentId: Uuid) => {\n if (!persistenceStorage) return;\n await persistenceStorage.query(\"DELETE FROM documents WHERE id = ?\", [documentId]);\n },\n [persistenceStorage],\n );\n\n const synchronizeDataStore = useCallback(async () => {\n setIsSynchronizing(true);\n const stats = { processed: 0, updated: 0, failed: 0 };\n try {\n for (const key of Object.keys(providers)) {\n stats.processed++;\n try {\n // console.log(\"Obnovuji\", key, \"-\", providers[key].lastUpdate.time);\n const { data, lastUpdate, ...rest } = providers[key];\n const response = await getData({\n id: key,\n ...rest,\n changeTime: lastUpdate.time,\n });\n\n if (response.length > 0) {\n // console.log(key, \":\", response.length);\n // Prevedeme data na object\n const updateData: Record<string, any> = {};\n response.forEach((item: any) => {\n const { id, ...d } = item;\n updateData[id] = d;\n });\n // console.log(JSON.stringify(updateData, null, 2));\n await updateDocuments({ model: key, documents: updateData, mode: \"replace\" });\n stats.updated++;\n }\n } catch (e) {\n stats.failed++;\n console.error(\"[DSP] synchronizeDataStore provider error:\", key, e);\n }\n }\n } finally {\n setIsSynchronizing(false);\n systemLog(\"dsp\", \"[synchronizeDataStore] Hotovo:\", stats);\n }\n }, [providers]);\n\n useEffect(() => {\n if (isLive) {\n // Prechod do aktivnich sockets\n systemLog(\"dsp\", \"useEffect[isLive] Sockets: \", JSON.stringify(sockets, null, 2));\n const ss = Object.keys(sockets);\n systemLog(\"dsp\", \"useEffect[isLive] registruji\", ss);\n if (ss?.length > 0) socket.emit(\"joinRooms\", JSON.stringify(ss));\n if (!didInitialLiveSyncRef.current) {\n didInitialLiveSyncRef.current = true;\n systemLog(\"dsp\", \"useEffect[isLive] Zacinam synchronizovat\");\n synchronizeDataStore();\n }\n } else {\n didInitialLiveSyncRef.current = false;\n // alert(\"OffLine\");\n }\n }, [isLive, socket, sockets, synchronizeDataStore]);\n\n const presetProviders = props.providers;\n\n // const contextRef = useRef();\n\n // Inicializace\n useEffect(() => {\n // contextRef.current = { dispatch, updateDocument };\n socket.on(\"connect\", handleSocketConnect);\n socket.on(\"disconnect\", handleSocketDisconnect);\n return () => {\n socket.off(\"connect\", handleSocketConnect);\n socket.off(\"disconnect\", handleSocketDisconnect);\n };\n }, [socket, handleSocketConnect, handleSocketDisconnect]);\n\n /**\n * Zapne Sockets pro sledovani dat\n */\n const startSockets = useCallback(() => {\n socket.auth = {\n ...((socket.auth as Record<string, any>) || {}),\n ...(socketServer?.params?.auth || {}),\n token: getSocketAuthToken(),\n };\n systemLog(\"dsp\", \"PRIPOJUJI LIVE SOCKETS\");\n socket.connect();\n }, [socket, socketServer?.params?.auth, getSocketAuthToken]);\n\n /**\n * Ukonci Sockets pro sledovani dat\n */\n const stopSockets = useCallback(() => {\n systemLog(\"dsp\", \"[DSP] ODPOJUJI LIVE SOCKETS\");\n socket.disconnect();\n }, [socket]);\n\n const resetDataStore = useCallback(async () => {\n console.time(\"[DSP] resetDataStore\");\n if (persistenceStorage?.emptyTable) {\n await persistenceStorage.emptyTable(\"documents\");\n }\n // await persistenceStorage?.resetDatabase?.();\n setSockets({});\n setProviders({});\n setDocuments({});\n // setDispatcher({ actions: [], isBussy: false });\n setCounterProviders({});\n setCounterDocuments({});\n console.timeEnd(\"[DSP] resetDataStore\");\n }, [persistenceStorage]);\n\n const resetProvider = useCallback(\n async (provider: string) => {\n if (!persistenceStorage) return;\n await persistenceStorage.query(`DELETE FROM documents WHERE model='${provider}'`);\n },\n [persistenceStorage],\n );\n\n const initProvider = useCallback(\n async (id: string, data?: any): Promise<DataProvider | boolean> => {\n const providerPreset = presetProviders[id as keyof typeof presetProviders];\n const prov = renderJSONTemplate<DataProvider>({ ...(providerPreset || {}), id: id as ProviderTypes }, data);\n systemLog(\"dsp\", \"[INIT PROVIDER] \", id, \"(\", data || \"\", \")\");\n if (typeof prov !== \"boolean\") {\n return await registerProvider(prov);\n }\n\n return false;\n },\n [persistenceStorage, presetProviders, usePersistentStorage],\n );\n\n const dispatch = useCallback((action: DispatcherActionType, data: any, callback?: (data: JSONType) => void) => {\n systemLog(\"dsp\", \"[DSP] DISPATCH Ukladam akci\", action, \",\", data);\n setDispatcher((prev) => ({\n isBussy: prev.isBussy,\n actions: [...prev.actions, { action, data, callback }],\n }));\n }, []);\n\n useEffect(() => {\n async function processDispatcher() {\n if (dispatcher.actions.length > 0) {\n let result;\n systemLog(\"dsp\", \"[DSP] DISPATCHER Zpracovavam\", dispatcher.actions[0].action);\n const timeCode = uuid();\n console.time(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);\n setDispatcher((prev) => ({ ...prev, isBussy: true }));\n const item = dispatcher.actions[0];\n // setDispatcherHistory((prev) => [...prev, item]);\n switch (item.action) {\n case \"registerProvider\": // DataProvider, useDataProvider\n await registerProvider(item.data);\n break;\n case \"unregisterProvider\": // DataProvider, useDataProvider\n await unregisterProvider(item.data);\n break;\n case \"updateDataStore\": // DataProvider\n result = await updateDataStore(item.data);\n break;\n case \"createDocument\": // handleSocketMessage\n await createDocument(item.data);\n break;\n case \"updateDocument\": // handleSocketMessage\n await updateDocument(item.data);\n break;\n case \"updateDocuments\": // handleSocketMessage\n await updateDocuments(item.data);\n break;\n case \"removeItem\": // handleSocketMessage\n // await removeItem(item.data);\n break;\n case \"deleteDocument\": // handleSocketMessage\n await deleteDocument(item.data);\n break;\n case \"createProviderItem\": // DataProvider\n result = await createProviderItem(item.data);\n break;\n case \"deleteProviderItem\": // DataProvider\n result = await deleteProviderItem(item.data);\n break;\n default:\n console.error(\"Unknown Action \", item.action, \"Data: \", item.data);\n }\n item.callback && item.callback(result);\n\n setDispatcher((prev) => ({\n isBussy: false,\n actions: prev.actions.slice(1),\n }));\n console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);\n }\n }\n if (!dispatcher.isBussy) processDispatcher();\n }, [dispatcher]);\n\n //TODO: Dat vedet spravnym providerum ze doslo k updatu, a zkontrolovat jestli providerovi porad patri vsechna data\n //TODO: Zajistit, aby setProviders bylo zavolano az po updatu setDocuments - problem pri > 2000 updatovanych dokumentu\n /**\n *\n * @param {*} model - nazev modelu\n * @param {*} documents - objekt dokumentu: {id: {data}, ...} nebo pole dokumentu: [{id: 123, name: \"Michal\", ...}, ...]\n * @param {*} mode - update (default) | replace - update jen updatuje, replace nahradi kompletni dokument. Replace je vhodne, pokud se maji nektere polozky smazat\n *\n * Updatuje nekolik dokumentu zaroven\n */\n const updateDocuments = useCallback(\n async ({\n model,\n documents: uDocuments,\n mode = \"update\",\n }: {\n model: string;\n documents: any;\n mode?: \"update\" | \"replace\";\n }): Promise<void> => {\n systemLog(\"dsp\", \"[DSP] updateDocuments updatuji model:\", model, \"Documents:\", Object.keys(uDocuments).length);\n\n const modelProvider = providers[model];\n if (!modelProvider) {\n systemLog(\"dsp\", \"[DSP] updateDocuments - provider neexistuje:\", model);\n return;\n }\n\n let data = [...(modelProvider.data || [])];\n const documentsToPersist: Array<{ id: Uuid; data: JSONType }> = [];\n const documentIdsToDelete: Uuid[] = [];\n\n setDocuments((prev) => {\n console.time(\"updateDocuments\");\n\n let newDocs = { ...prev };\n if (Array.isArray(uDocuments)) {\n uDocuments.forEach((document) => {\n const { id, ...doc } = document;\n switch (mode) {\n case \"replace\":\n systemLog(\"dsp\", \"updateDocuments - replace\", id);\n newDocs[id] = doc;\n if (doc._deleted) {\n data = data.filter((d) => d !== id);\n documentIdsToDelete.push(id);\n delete newDocs[id];\n } else {\n if (!data.includes(id)) data.push(id);\n documentsToPersist.push({ id, data: newDocs[id] });\n }\n break;\n case \"update\":\n default:\n if (!newDocs[id]) {\n // console.log(\"Vytvarim\", id);\n systemLog(\"dsp\", \"updateDocuments - vytvarim\", id);\n // Pridavame novy dokument\n data.push(id);\n newDocs[id] = doc;\n documentsToPersist.push({ id, data: newDocs[id] });\n } else if (doc._deleted) {\n // Mazeme dokument - je _deleted\n // console.log(\"Mazu\", id);\n systemLog(\"dsp\", \"updateDocuments - mazu\", id);\n data = data.filter((d) => d !== id);\n documentIdsToDelete.push(id);\n delete newDocs[id];\n } else {\n // Updatujeme dokument\n // console.log(\"Updatuji\", id);\n systemLog(\"dsp\", \"updateDocuments - updatuji\", id);\n newDocs[id] = { ...newDocs[id], ...doc };\n documentsToPersist.push({ id, data: newDocs[id] });\n }\n break;\n }\n });\n } else {\n for (const key in uDocuments) {\n // console.log(\"Key\", key, \"mode\", mode);\n switch (mode) {\n case \"replace\":\n if (!newDocs[key]) {\n // Pridavame novy dokument\n data.push(key);\n }\n if (uDocuments[key]._deleted) {\n // Mazeme dokument - je _deleted\n data = data.filter((d) => d !== key);\n documentIdsToDelete.push(key);\n }\n // Prepisujeme puvodni dokument\n newDocs[key] = uDocuments[key];\n if (uDocuments[key]._deleted) {\n delete newDocs[key];\n } else {\n documentsToPersist.push({ id: key, data: newDocs[key] });\n }\n break;\n case \"update\":\n default:\n if (!newDocs[key]) {\n // Pridavame novy dokument\n data.push(key);\n newDocs[key] = uDocuments[key];\n documentsToPersist.push({ id: key, data: newDocs[key] });\n break;\n }\n if (uDocuments[key]._deleted) {\n // Mazeme dokument - je _deleted\n data = data.filter((d) => d !== key);\n documentIdsToDelete.push(key);\n delete newDocs[key];\n } else {\n // updatujeme puvodni dokument\n newDocs[key] = { ...newDocs[key], ...uDocuments[key] };\n documentsToPersist.push({ id: key, data: newDocs[key] });\n }\n break;\n }\n }\n }\n console.timeEnd(\"updateDocuments\");\n return newDocs;\n });\n const unique = uuid();\n setProviders((prev) => {\n const newP = { ...prev };\n newP[model] = {\n ...newP[model],\n data,\n lastUpdate: { id: unique, time: new Date() },\n };\n // console.log(\"Provider \", model, \" updated\", data.length, unique);\n return newP;\n });\n\n if (modelProvider?.isPersisting && persistenceStorage) {\n await Promise.all(documentsToPersist.map((item) => persistDocument({ documentId: item.id, model, data: item.data })));\n await Promise.all(documentIdsToDelete.map((documentId) => removePersistedDocument(documentId)));\n }\n },\n [providers, setDocuments, setProviders, persistDocument, removePersistedDocument, persistenceStorage],\n );\n\n const updateDocument = useCallback(\n async ({ documentId, model, fields, data: pData }: { documentId: Uuid; model: ProviderTypes; fields?: any[]; data?: any }) => {\n systemLog(\"dsp\", \"[updateDocument]:\", documentId, \", model:\", model);\n // TODO: Myslim ze by melo byt premistene az do samotneho update s prev hodnotou dokumentu (setDocuments).\n let data = pData;\n // Pokud jsou data dana funkci, predame ji aktualni stav dokumentu\n if (typeof pData === \"function\") data = pData(documents[documentId]);\n\n // console.time(\"[DSP UPDATE DOCUMENT]\");\n // systemLog(\"dsp\", \"[updateDocument] data: \", JSON.stringify(data, null, 2));\n if (fields) {\n // Ziskame polozky ze serveru a pak s nimi zaktualizujeme dokument\n systemLog(\"dsp\", \"[updateDocument] Stahovani \", model, \", document: \", documentId, \", fields: \", fields);\n systemLog(\"dsp\", \"[updateDocument] Providers: \", Object.keys(providers));\n const provider = presetProviders[model];\n systemLog(\"dsp\", \"[updateDocument]\", provider);\n let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));\n if (dP) {\n const dataFromSource = await getData({\n id: dP.id,\n dataSource: { ...dP.dataSource, params: { select: fields.join(\" \") } },\n isPersisting: !!dP.isPersisting && !!persistenceStorage,\n schema: dP.schema,\n SQLite: persistenceStorage || undefined,\n });\n systemLog(\"dsp\", \"[updateDocument] DATA: \", dataFromSource);\n data = dataFromSource;\n }\n }\n if (data) {\n // console.log(\"[updateDocument]:\", documentId, \", model:\", model);\n var listeningProviders = 0; // seznam provideru, kteri maji v kolekci dokument\n var isProvidersUpdated = false; // pokud nejaky provider s dokumentem v kolekci pribude/zmizi, budeme aktualizovat documentCounters\n // console.time(\"[DSP UPDATE PROVIDERS OUTSIDE]\", documentId, \", model:\", model);\n const rand = uuid();\n setProviders((prev) => {\n systemLog(\"dsp\", \"[updateDocument] setProviders\", rand);\n console.time(\"[DSP UPDATE PROVIDERS INSIDE]\");\n var newProviders = { ...prev };\n Object.keys(newProviders).forEach((key) => {\n const provider = newProviders[key];\n const providerNext = {\n ...provider,\n data: Array.isArray(provider?.data) ? [...provider.data] : [],\n };\n // Sezbirame cemu provider nasloucha. Pokud v tom bude nova polozka, prozeneme ji filterem. Pokud bude platny, pridame ji\n var socketListeners = providerNext.dataSource?.socketListeners || [];\n if (socketListeners.length === 0) {\n // Pokud provider nema zadne listeners a ma polozku v datech, tak jen zaradime do seznamu naslouchajicich Provideru\n if (providerNext.data.includes(documentId)) {\n if (!providerNext.dataSource?.filter || filterDocuments(data, providerNext.dataSource?.filter)) {\n systemLog(\"dsp\", \"[updateDocument] - zustava v Provider bez Listeners:\", key);\n listeningProviders++;\n // Nastavime, ze provider ma update\n providerNext.lastUpdate = {\n id: uuid(),\n time: new Date(),\n documentId: documentId,\n };\n } else {\n providerNext.data = providerNext.data.filter((item: string) => item !== documentId);\n isProvidersUpdated = true;\n // Nastavime, ze provider ma update\n providerNext.lastUpdate = {\n id: uuid(),\n time: new Date(),\n documentId: documentId,\n };\n }\n }\n // Pokud provider nema zadny listeners nebo listeners obsahuje model nebo document\n } else if (\n socketListeners.includes(model) ||\n // socketListeners.includes(documentId) ||\n key === model\n ) {\n // Provider resi dokument. Zjistime, jestli ho nechame, smazeme nebo pridame\n // console.log(\"KEY: \", key);\n if (!providerNext.dataSource.filter || filterDocuments(data, providerNext.dataSource.filter)) {\n // Dokument prosel filterem, Pokud neni v kolekci tak jej pridame, jinak jen pridame Providera do seznamu naslouchajicich Provideru\n listeningProviders++;\n providerNext.lastUpdate = {\n id: uuid(),\n time: new Date(),\n documentId: documentId,\n };\n if (!providerNext.data.includes(documentId)) {\n // Pokud neni v kolekci Providera, tak jej pridame a nastavime zmenu seznamu kolekci\n providerNext.data.push(documentId);\n isProvidersUpdated = true;\n // Nastavime, ze provider ma update\n }\n } else {\n // Dokument neprosel filterem => nepatri jiz do kolekce. Pokud je v kolekci, tak jej smazeme a nastavime zmenu seznamu kolekci\n if (providerNext.data.includes(documentId)) {\n systemLog(\"dsp\", \"[updateDocument] - mazu:\", key);\n providerNext.data = providerNext.data.filter((item: string) => item !== documentId);\n isProvidersUpdated = true;\n // Nastavime, ze provider ma update\n providerNext.lastUpdate = {\n id: uuid(),\n time: new Date(),\n documentId: documentId,\n };\n }\n }\n }\n\n newProviders[key] = providerNext;\n });\n console.timeEnd(\"[DSP UPDATE PROVIDERS INSIDE]\");\n\n // Zaktualizujeme/smazeme/vytvorime dokument a listenery\n console.time(\"[DSP UPDATE DOCUMENTS OUTSIDE]\");\n setDocuments((prev) => {\n console.time(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n if (prev[documentId]) {\n if (listeningProviders === 0) {\n // Nikdo nema dokument v kolekci, tak jej mazeme\n const newD = { ...prev };\n delete newD[documentId];\n console.timeEnd(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n return newD;\n } else {\n // Updatujeme dokument\n console.timeEnd(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n return {\n ...prev,\n [documentId]: { ...prev[documentId], ...data },\n };\n }\n } else if (listeningProviders > 0) {\n // Dokument neexistuje, a nekdo ho ma v kolekci, tak jej vytvorime\n console.timeEnd(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n return { ...prev, [documentId]: data };\n }\n console.timeEnd(\"[DSP UPDATE DOCUMENTS INSIDE]\");\n return prev;\n });\n console.timeEnd(\"[DSP UPDATE DOCUMENTS OUTSIDE]\");\n systemLog(\"dsp\", \"OUTSIDE\", documentId);\n // return prev;\n return newProviders;\n });\n // console.timeEnd(\"[DSP UPDATE PROVIDERS OUTSIDE]\");\n\n // Pokud nejaky Provider zacal/skoncil s naslouchanim dokumentu na novy pocet Provideru\n systemLog(\"dsp\", \"updateDocument - meni se pocet naslouchajicich Provideru ?\", isProvidersUpdated ? \"true\" : \"false\");\n if (isProvidersUpdated) {\n systemLog(\"dsp\", \"updateDocument - menim counterDocuments pro\", listeningProviders, \"Providers\");\n\n setCounterDocuments((prev) => {\n if (listeningProviders === 0) {\n // Mazeme pocitadlo\n const newD = { ...prev };\n delete newD[documentId];\n return newD;\n } else {\n // Updatujeme nebo vytvarime pocitadlo\n return { ...prev, [documentId]: listeningProviders };\n }\n });\n } else {\n systemLog(\"dsp\", \"updateDocument - nemenim counterDocuments. Dokument zustava v\", listeningProviders, \"Providers\");\n }\n\n if (providers[model]?.isPersisting && persistenceStorage) {\n if (listeningProviders > 0) {\n await persistDocument({\n documentId,\n model,\n data: { ...documents[documentId], ...data },\n });\n } else {\n await removePersistedDocument(documentId);\n }\n }\n }\n // console.timeEnd(\"[DSP UPDATE DOCUMENT]\");\n },\n [documents, providers, setDocuments, setProviders, setCounterDocuments, persistDocument, removePersistedDocument, persistenceStorage],\n );\n\n const updateDataStore = useCallback(\n async ({\n id,\n documentId,\n params,\n variant,\n data,\n }: {\n id: ProviderTypes;\n documentId: Uuid;\n params?: any;\n variant?: string;\n data: any;\n }) => {\n // console.log(\"DataSSS:\", providers[id]);\n if (!providers[id]) {\n systemLog(\"dsp\", \"[updateDataStore] Provider neexistuje:\", id);\n return;\n }\n // Lokalni update bez synchronizace na server\n if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {\n // console.log(\n // \"UPDATUJI Lokalne\",\n // id,\n // \"documentId\",\n // documentId,\n // \"data: \",\n // data\n // );\n //Pokud document neexistuje, a model ma povolene automaticke vytvareni, tak jej vytvorime\n if (!documents[documentId] && providers[id]?.autoCreate) {\n await createProviderItem({ id, data: { id: documentId, ...data } });\n } else updateDocument({ documentId, model: id, data });\n return true;\n }\n // Update se synchronizaci na server\n systemLog(\n \"dsp\",\n \"[updateDataStore] Posilam patchData: \",\n id,\n \",\\n params: \",\n JSON.stringify(params, null, 2),\n \"\\n data: \",\n JSON.stringify(data, null, 2),\n );\n const result = await patchData({\n dataSource: renderJSONTemplate(providers[id].dataSource, params),\n variant,\n data,\n });\n if (typeof result === \"object\") {\n const { id: rDocumentId, ...document } = result;\n // updateDocument({model:})\n // Pokud nebezi Sockets, tak updatujeme dokument\n if (!isLive) {\n systemLog(\"dsp\", \"[updateDataStore] UPDATE DATA STORE RESULT: \", result);\n updateDocument({ documentId: rDocumentId, model: id, data: document });\n } else {\n systemLog(\"dsp\", \"[updateDataStore] Updatuje Socket\");\n }\n }\n return result;\n },\n [providers, documents, isLive, updateDocument],\n );\n\n useEffect(() => {\n socketActionHandlersRef.current = { dispatch, updateDocument };\n }, [dispatch, updateDocument]);\n\n const createDocument = useCallback(\n async ({ model, documentId, data }: { model: ProviderTypes; documentId: Uuid; data: any }) => {\n const newDocument = data;\n systemLog(\"dsp\", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);\n\n var providerListenersCount = 0;\n Object.keys(providers).forEach((key) => {\n const provider = providers[key];\n // Sezbirame cemu provider nasloucha. Pokud v tom bude nova polozka, prozeneme ji filterem. Pokud bude platny, pridame ji\n var socketListeners = provider.dataSource?.socketListeners;\n // Pokud polozka projde filterem, tak ji zpracujeme\n if (\n (socketListeners?.includes(model) || key === model) &&\n (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))\n ) {\n systemLog(\"dsp\", \"[createDocument] Provider data: \", provider.data.length, \" Bytes, documentId: \", documentId);\n if (!provider.data.includes(documentId)) {\n // Do Providera pridame polozku\n providerListenersCount++;\n setProviders((prev) => ({\n ...prev,\n [key]: {\n ...prev[key],\n data: [...prev[key].data, documentId],\n lastUpdate: { id: uuid(), time: new Date() },\n },\n }));\n }\n }\n });\n\n // Pokud se document zaregistroval do nejakych provideru, tak jej vytvorime a nastavime mu prislusny pocet listeneru na document a sockets\n if (providerListenersCount > 0) {\n if (providers[model]?.isPersisting && persistenceStorage) {\n await persistDocument({ documentId, model, data: newDocument });\n }\n setCounterDocuments((prev) => {\n const newC = { ...prev };\n if (newC[documentId]) {\n setDocuments((prev) => ({\n ...prev,\n [documentId]: { ...prev[documentId], ...newDocument },\n }));\n newC[documentId] = prev[documentId] + providerListenersCount;\n } else {\n setDocuments((prev) => ({ ...prev, [documentId]: newDocument }));\n newC[documentId] = providerListenersCount;\n }\n return newC;\n });\n return { id: documentId, document: newDocument };\n } else return false;\n },\n [providers, setProviders, setCounterDocuments, setDocuments, persistDocument, persistenceStorage],\n );\n\n const deleteDocument = useCallback(\n async ({ documentId }: { documentId: Uuid }) => {\n systemLog(\"dsp\", `[deleteDocument] Mazu document ${documentId}}`);\n\n await removePersistedDocument(documentId);\n\n setDocuments((prev) => {\n const newDocs = { ...prev };\n systemLog(\"dsp\", \"[deleteDocument] MAZU \", documentId, \" z \", newDocs);\n delete newDocs[documentId];\n systemLog(\"dsp\", \"[deleteDocument] NEW DOCS: \", newDocs);\n return newDocs;\n });\n setCounterDocuments((prev) => {\n const newC = { ...prev };\n delete newC[documentId];\n return newC;\n });\n\n setProviders((prev) => {\n var deletedCount = 0;\n const updatedDataObj = { ...prev };\n for (const key in updatedDataObj) {\n const initialLength = updatedDataObj[key].data.length;\n updatedDataObj[key].data = updatedDataObj[key].data.filter((element: string) => element !== documentId);\n // Nastaveni zmeny providera pro znovunacteni dat v useDataProvider\n updatedDataObj[key].lastUpdate = { id: uuid(), time: new Date() };\n deletedCount += initialLength - updatedDataObj[key].data.length;\n if (initialLength - updatedDataObj[key].data.length > 0) systemLog(\"dsp\", \"[deleteDocument] Smazan zaznam...\", deletedCount);\n }\n\n // console.log(\"Jdu smazat \", deletedCount, \" socketu \", documentId);\n // unregisterProviderSockets(Array(deletedCount).fill(documentId));\n\n return updatedDataObj;\n });\n },\n [setDocuments, setCounterDocuments, setProviders, removePersistedDocument],\n );\n\n const createProviderItem = useCallback(\n async ({ id, data }: { id: ProviderTypes; data: any }) => {\n if (!providers[id]) {\n systemLog(\"dsp\", \"[createProviderItem] Provider neexistuje:\", id);\n return;\n }\n if (!providers[id].dataSource) {\n const { id: dId, ...rData } = data;\n const documentId = dId || uuid();\n const result = createDocument({ model: id, documentId, data: rData });\n return result;\n }\n const result = await postData({\n dataSource: providers[id].dataSource,\n schema: providers[id].schema,\n val: data,\n });\n return result;\n },\n [providers, createDocument],\n );\n\n const deleteProviderItem = useCallback(\n async ({ providerId, data, params }: { providerId: ProviderTypes; data: any; params?: any }) => {\n if (!providers[providerId]) {\n systemLog(\"dsp\", \"[deleteProviderItem] Provider neexistuje:\", providerId);\n return;\n }\n // console.log(\"Params:\", params);\n // console.log(\"DataSource: \", renderJSONTemplate(providers[providerId].dataSource, params));\n const response = await deleteData({\n dataSource: renderJSONTemplate(providers[providerId].dataSource, params),\n // dataSource: providers[providerId].dataSource,\n data,\n });\n return response;\n },\n [providers],\n );\n\n const registerProviderSockets = useCallback(\n (sockets: string | string[]): void => {\n if (sockets) {\n systemLog(\"dsp\", \"[registerProviderSockets]\", sockets);\n var d = Array.isArray(sockets) ? sockets : [sockets];\n setSockets((prev) => {\n const newS = { ...prev };\n d.forEach((item) => {\n if (newS[item]) {\n newS[item].listeners = newS[item].listeners + 1;\n } else {\n const roomHandler = (msg: string) => {\n const { dispatch: currentDispatch, updateDocument: currentUpdateDocument } = socketActionHandlersRef.current;\n handleSocketMessage(item, msg, {\n dispatch: currentDispatch as any,\n updateDocument: currentUpdateDocument as any,\n });\n };\n\n socketRoomHandlersRef.current[item] = roomHandler;\n newS[item] = { listeners: 1, data: [] };\n socket.emit(\"joinRoom\", item);\n socket.on(item, roomHandler);\n }\n });\n return newS;\n });\n }\n },\n [setSockets, socket],\n );\n\n const unregisterProviderSockets = useCallback(\n (sockets: string | string[]): void => {\n systemLog(\"dsp\", \"[unregisterProviderSockets] Mazu sockety \", JSON.stringify(sockets, null, 2));\n var removeSocketListeners: string[] = [];\n var d = Array.isArray(sockets) ? sockets : [sockets];\n setSockets((prev) => {\n const newS = { ...prev };\n d.forEach((item) => {\n // console.log(\"Snizuju \", item);\n if (newS[item]?.listeners <= 1) {\n removeSocketListeners.push(item);\n const roomHandler = socketRoomHandlersRef.current[item];\n if (roomHandler) {\n socket.off(item, roomHandler);\n delete socketRoomHandlersRef.current[item];\n }\n delete newS[item];\n } else if (newS[item]) newS[item].listeners = newS[item].listeners - 1;\n });\n if (removeSocketListeners.length > 0) {\n socket.emit(\"leaveRooms\", JSON.stringify(removeSocketListeners));\n }\n return newS;\n });\n },\n [setSockets, socket],\n );\n\n /**\n * Pouziva se pokud Provider jiz existuje. Jen navysi jeho counterProviders\n * Pri mazani Providera snizuje counterProviders.\n * Pokud je Provider kompletne smazany, tak snizuje counteDocuments vsech jeho dokumentu.\n * @param {*} id - ID providera\n * @param {*} val - o kolik se meni counterProviders\n */\n const updateProviderListeners = useCallback(\n async (id: string, val: number) => {\n systemLog(\"dsp\", `[updateProviderListeners] provider:`, id, \"menim o\", val);\n setCounterProviders((prev) => {\n if (!prev[id]) return prev;\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] ${\n // val > 0 ? \"Navysuji\" : \"Snizuji\"\n // } listeners: ${id} ${prev[id]} -> ${prev[id] + val}`\n // );\n // Provider zustava, jen se meni jeho counterProviders\n if (prev[id] + val > 0) {\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] Provider zustava, menime counterProviders`\n // );\n return {\n ...prev,\n [id]: prev[id] + val,\n };\n }\n // Provider je kompletne smazany\n else {\n // systemLog(\"dsp\", `[updateProviderListeners] Provider ${id} se maze.`);\n setProviders((prevP) => {\n // Update socketu\n systemLog(\"dsp\", \"[DSP] UPDATE PROVIDER - mazu sockets \", id);\n setSockets((prevS) => {\n var removeSocketListeners: string[] = [];\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] Mazu sockety providera.`,\n // id\n // );\n const newS = { ...prevS };\n const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];\n providerSocketListeners.forEach((socketName: string) => {\n if (!newS[socketName]) return;\n if (newS[socketName].listeners + val <= 0) {\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] Mazu socket `,\n // newS[socketName]\n // );\n const roomHandler = socketRoomHandlersRef.current[socketName];\n if (roomHandler) {\n socket.off(socketName, roomHandler);\n delete socketRoomHandlersRef.current[socketName];\n }\n delete newS[socketName];\n removeSocketListeners.push(socketName);\n } else {\n // systemLog(\n // \"dsp\",\n // `[updateProviderListeners] Snizuji socket `,\n // newS[socketName]\n // );\n newS[socketName].listeners = newS[socketName].listeners + val;\n }\n });\n // Zrusime naslouchani smazanych socketListeners\n if (removeSocketListeners.length > 0) {\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] EMITUJI SOCKET LEAVE \",\n // removeSocketListeners\n // );\n // socket.removeAllListeners(removeSocketListeners);\n socket.emit(\"leaveRooms\", JSON.stringify(removeSocketListeners));\n }\n return newS;\n });\n\n // Update dokumentu\n setCounterDocuments((prevC) => {\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] Updatuji Documents Counter...\"\n // );\n const newC = { ...prevC };\n // projedeme vsechny dokumenty, ktere prislusi danemu Providerovi\n prevP[id].data.forEach((document: string) => {\n if (newC[document] + val <= 0) {\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] Mazu Documents Counter...\",\n // document\n // );\n\n setDocuments((prev) => {\n const newD = { ...prev };\n delete newD[document];\n return newD;\n });\n delete newC[document];\n } else {\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] Updatuji Documents Counter\",\n // newC[document],\n // \"->\",\n // newC[document] + val\n // );\n newC[document] = newC[document] + val;\n }\n });\n return newC;\n });\n // Smazani Providera\n // systemLog(\n // \"dsp\",\n // \"[updateProviderListeners] UPDATE PROVIDER - mazu provider \",\n // id\n // );\n const newP = { ...prevP };\n delete newP[id];\n return newP;\n });\n\n // Smazani pocitadla providera\n const newProvs = { ...prev };\n delete newProvs[id];\n return newProvs;\n }\n });\n },\n [setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket],\n );\n\n const registerProvider = useCallback(\n async (newItem: DataProvider): Promise<any> => {\n systemLog(\"dsp\", \"[registerProvider]\", newItem.id);\n let result: any;\n const { id, ...provider } = newItem;\n if (providers[id]) {\n // systemLog(\"dsp\", \"[registerProvider] Provider\", id, \"existuje. Jen navysuji\");\n\n // Pokud Provider jiz existuje, tak jen navysime pocitadlo listeners\n setCounterProviders((prev) => {\n systemLog(\"dsp\", \"[registerProvider] Pouze navysuji \", id, \" \", prev[id], \" -> \", prev[id] + 1);\n return {\n ...prev,\n [id]: prev[id] + 1,\n };\n });\n result = providers[id];\n // Pokud jeste neexistuje, vytvorime novy Provider\n } else {\n try {\n const dataFromSource = await getData({\n schema: newItem.schema,\n dataSource: newItem.dataSource || {},\n id: newItem.id,\n isPersisting: !!newItem.isPersisting && !!persistenceStorage,\n SQLite: persistenceStorage || undefined,\n });\n console.time(`[DSP] VYTVARENI PROVIDERA ${id}`);\n var dataList: string[] = [];\n var items: Record<string, any> = {};\n const dataS = Array.isArray(dataFromSource) ? dataFromSource : [dataFromSource];\n dataS.forEach((item) => {\n if (!item) return;\n const { id: itId, ...data } = item;\n const normalizedId = itId || uuid();\n dataList.push(normalizedId);\n if (documents[normalizedId]) {\n items[normalizedId] = {\n ...documents[normalizedId],\n ...data,\n };\n } else {\n items[normalizedId] = data;\n }\n });\n setCounterDocuments((prev) => {\n const newC = { ...prev };\n dataList.forEach((itemId) => {\n if (newC[itemId]) {\n newC[itemId] = newC[itemId] + 1;\n } else {\n newC[itemId] = 1;\n }\n });\n return newC;\n });\n if (Object.keys(items).length > 0) {\n setDocuments((prev) => ({ ...prev, ...items }));\n }\n result = {\n ...provider,\n data: dataList,\n lastUpdate: { id: uuid(), time: new Date() },\n };\n setProviders((prev) => ({\n ...prev,\n [id]: result,\n }));\n setCounterProviders((prev) => ({\n ...prev,\n [id]: 1,\n }));\n if (provider.dataSource?.socketListeners) {\n registerProviderSockets(provider.dataSource.socketListeners);\n }\n\n console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);\n } catch (error) {\n console.error(\"[DataStoreProvider] registerProvider:error\", { id: newItem.id, error });\n throw error;\n }\n }\n return result;\n },\n [providers, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets, persistenceStorage],\n );\n\n const unregisterProvider = useCallback(\n async (itemId: string) => {\n setCounterProviders((prev) => {\n if (prev[itemId]) {\n // Pokud je pocet naslouchajicich providerovi > 1, tak jen snizime pocet naslouchajicich\n if (prev[itemId] > 1) {\n systemLog(\"dsp\", \"[unregisterProvider] snizuji \", itemId, \"z \", prev[itemId], \" na \", prev[itemId] - 1);\n return {\n ...prev,\n [itemId]: prev[itemId] - 1,\n };\n } else {\n // Smazeme providera, sockety a prislusne dokumenty, pokud je posledni kdo je pouziva\n systemLog(\"dsp\", \"[unregisterProvider] mazu \", Object.keys(providers));\n // Smazeme naslouchajici sockety\n unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);\n\n // Smazeme prislusne dokumenty\n systemLog(\"dsp\", \"[unregisterProvider] Mazu dokumenty providera \", itemId);\n setCounterDocuments((cd) => {\n const newC = { ...cd };\n const deleteDocumentIds: string[] = [];\n providers[itemId].data.forEach((docId: string) => {\n if (newC[docId] <= 1) {\n deleteDocumentIds.push(docId);\n delete newC[docId];\n } else newC[docId] = newC[docId] - 1;\n });\n if (deleteDocumentIds.length > 0) {\n setDocuments((pd) => {\n const newD = { ...pd };\n deleteDocumentIds.forEach((docId) => {\n delete newD[docId];\n });\n return newD;\n });\n }\n return newC;\n });\n\n // Smazeme providera\n setProviders((pp) => {\n const newProvs = { ...pp };\n delete newProvs[itemId];\n return newProvs;\n });\n\n // Smazeme pocitadlo provideru\n const newProvs = { ...prev };\n delete newProvs[itemId];\n return newProvs;\n }\n } else return prev;\n });\n },\n [setCounterProviders, providers, setCounterDocuments, setDocuments, setProviders, unregisterProviderSockets],\n );\n\n // Memoize actions — changes only when providers change (not when documents change)\n const actionsValue = useMemo<DataStoreActionsType>(\n () => ({\n dispatch,\n initProvider,\n resetProvider,\n registerProvider,\n unregisterProvider,\n updateProviderListeners,\n resetDataStore,\n startSockets,\n stopSockets,\n registerProviderSockets,\n unregisterProviderSockets,\n updateDocuments,\n presetProviders,\n }),\n [\n dispatch,\n initProvider,\n resetProvider,\n registerProvider,\n unregisterProvider,\n updateProviderListeners,\n resetDataStore,\n startSockets,\n stopSockets,\n registerProviderSockets,\n unregisterProviderSockets,\n updateDocuments,\n presetProviders,\n ],\n );\n\n // Memoize meta — changes only when isLive/isSynchronizing/sockets/counters change\n const metaValue = useMemo<DataStoreMetaType>(\n () => ({ isLive, isSynchronizing, sockets, counterProviders, counterDocuments }),\n [isLive, isSynchronizing, sockets, counterProviders, counterDocuments],\n );\n\n const stableValue = useMemo<DataStoreStableType>(\n () => ({\n dispatch,\n presetProviders,\n updateProviderListeners,\n subscribeToProvider,\n getProviderLastUpdate,\n getExternalDocuments,\n getExternalProviders,\n }),\n [\n dispatch,\n presetProviders,\n updateProviderListeners,\n subscribeToProvider,\n getProviderLastUpdate,\n getExternalDocuments,\n getExternalProviders,\n ],\n );\n\n useImperativeHandle(ref, () => actionsValue, [actionsValue]);\n\n systemLog(\"dsp\", \"END\");\n return (\n // <DatabaseProvider>\n <DataStoreStableContext.Provider value={stableValue}>\n <DataStoreActionsContext.Provider value={actionsValue}>\n <DataStoreProvidersContext.Provider value={providers}>\n <DataStoreDocumentsContext.Provider value={documents}>\n <DataStoreContext.Provider value={metaValue}>{props.children}</DataStoreContext.Provider>\n </DataStoreDocumentsContext.Provider>\n </DataStoreProvidersContext.Provider>\n </DataStoreActionsContext.Provider>\n </DataStoreStableContext.Provider>\n // </DatabaseProvider>\n );\n },\n);\n\nexport default DataStoreProvider;\n","export function systemLog(..._args: unknown[]): void {\n // No-op by default in the package. Consumers can wrap these calls if needed.\n}\n\nexport function systemLogError(...args: unknown[]): void {\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\n console.error(...args);\n }\n}\n","import { systemLog } from \"./log\";\n\ntype DataProviderType = {\n dispatch?: (\n action?: \"createDocument\" | \"updateDocuments\" | \"removeItem\" | \"deleteDocument\",\n data?: {\n model?: string;\n documentId?: string;\n data?: any;\n documents?: string[];\n }\n ) => void;\n updateDocument?: (data: { model: string; documentId: string; data?: any; documents?: string[] }) => void;\n updateDocuments?: () => void;\n};\n\nexport const handleSocketMessage = (model: string, msg: string, dataProvider: DataProviderType) => {\n const { dispatch, updateDocument } = dataProvider;\n // console.log(COLOR_SOCKET, `[SOCKET] model: ${model}, data: ${msg}`)\n const data: { action: \"create\" | \"update\" | \"delete\" | \"deleteItem\"; model: string; documentId: string; data: any } = JSON.parse(msg);\n\n switch (data.action) {\n case \"create\":\n systemLog(\"sockets\", \"[create] \", data.model, \", document: \", data.documentId);\n // console.log(COLOR_SOCKET, \"[SOCKETS] CREATING model:\", model, \", document: \", data.documentId, \" data:\", data.data)\n dispatch?.(\"createDocument\", { model: data.model, documentId: data.documentId, data: data.data });\n break;\n case \"update\":\n // systemLog(\"sockets\", `[${Device.deviceName}] (room: ${model}) UPDATE model: `, data.model, \", documentId: \", data.documentId)\n systemLog(\"sockets\", `[update] ${JSON.stringify(data)}`);\n // systemLog(\"sockets\", `[update] ${JSON.stringify(data, null, 2)}`)\n // dispatch(\"updateDocument\", { model: data.model, documentId: data.documentId, data: data.data })\n // Pokud jsou data pole - je to update vice dokumentu najednou\n if (Array.isArray(data.data)) dispatch?.(\"updateDocuments\", { model: data.model, documents: data.data });\n else updateDocument?.({ model: data.model, documentId: data.documentId, data: data.data });\n break;\n case \"delete\":\n systemLog(\"sockets\", \"[delete] model:\", data.model, \", document: \", data.documentId);\n dispatch?.(\"deleteDocument\", { documentId: data.documentId, data: data.data });\n break;\n case \"deleteItem\":\n systemLog(\"sockets\", \"DELETE ITEM \", model, \", model: \", data.model, \", data: \", data.data);\n dispatch?.(\"removeItem\", { model, documentId: data.data.id });\n break;\n default:\n console.error(`Unknown command ${data.action}`);\n }\n};\n","import axios from \"axios\";\nimport { COLOR_AXIOS } from \"./logColors\";\nimport { systemLog } from \"./log\";\nimport { uuid } from \"./utils\";\nimport { JSONType, Uuid } from \"./types\";\nimport type { DataStoreStorage } from \"./storage\";\nimport { ProviderDataSource } from \"./providerTypes\";\n\n// axios.interceptors.request.use((config) => {\n// config.headers[\"private-api-token\"] =\n// \"fbd660-g-07860-8y80oxx9n8zdd0dqlymncuon9qhgqz58\";\n// return config;\n// });\n\ntype DataSource = Partial<ProviderDataSource> & {\n /**\n * Nazev modelu - vytvari se nejjednodussi dotaz\n */\n model?: string;\n /**\n * Parametry do dotazu na server\n */\n params?: any;\n /**\n * Filter do dotazu na server\n */\n filter?: JSONType;\n select?: any;\n /**\n * Soubor s daty v public\n */\n file?: string;\n};\n\nconst saveData = async ({\n providerId,\n newData,\n dateUpdate,\n SQLite,\n}: {\n providerId: Uuid;\n newData: any;\n dateUpdate: string;\n SQLite: DataStoreStorage;\n}) => {\n console.time(`[SQL] saveData ${providerId}`);\n const batchSize = 8000;\n const placeholders = \"(?,?,?,?)\";\n var i = 0;\n\n for (i = 0; i < newData.length / batchSize; i++) {\n const values = [];\n for (let j = 0; j < batchSize; j++) {\n if (i * batchSize + j < newData.length) {\n const { id, ...item } = newData[i * batchSize + j];\n values.push(id, JSON.stringify(item), providerId, dateUpdate);\n }\n }\n const placeholdersArray = Array.from({ length: Math.ceil(values.length / 4) }, () => placeholders).join(\",\");\n const row = await SQLite.query(`INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES ${placeholdersArray}`, values);\n systemLog(\"axios\", \"saveData result: \", JSON.stringify(row));\n }\n console.timeEnd(`[SQL] saveData ${providerId}`);\n};\n\nconst buildUri = ({\n method,\n dataSource,\n variant,\n}: {\n method: \"create\" | \"read\" | \"update\" | \"delete\";\n dataSource: DataSource;\n variant?: string;\n}) => {\n // console.log(\"[HANDLE DATA] BUILD URI method \", method, \" from\", dataSource)\n if (dataSource.crud) {\n if (method === \"update\" && dataSource.crud.updates) {\n if (variant && dataSource.crud.updates[variant]) return dataSource.crud.updates[variant];\n if (dataSource.crud[method]) return dataSource.crud[method];\n\n const firstUpdateUri = Object.values(dataSource.crud.updates)[0];\n if (firstUpdateUri) return firstUpdateUri;\n }\n\n const crudUri = dataSource.crud[method];\n if (crudUri) return crudUri;\n }\n\n return dataSource.uri || `${dataSource.model || \"\"}/`;\n\n // if (dataSource.crud && dataSource.crud?.[method]) {\n // // console.log(\"[HANDLE DATA] posilam url \", dataSource.crud[method])\n // if (variant && dataSource.crud[method + \"s\"]) {\n // if (dataSource.crud[method + \"s\"][variant])\n // return dataSource.crud[method + \"s\"][variant]\n // else return dataSource.crud[method]\n // } else {\n // return dataSource.crud[method]\n // }\n // } else {\n // // console.log(\"[HANDLE DATA] posilam url \", dataSource.uri || `${dataSource.model}/`)\n // return dataSource.uri || `${dataSource.model}/`\n // }\n};\n\ninterface GetDataProps {\n id: Uuid;\n dataSource: DataSource;\n isPersisting: boolean;\n schema: any;\n SQLite?: DataStoreStorage;\n changeTime?: string;\n}\n\nexport const getData = async ({ id, dataSource, isPersisting, schema, SQLite, changeTime }: GetDataProps): Promise<any> => {\n if (dataSource) systemLog(\"axios\", \"GET Data Source: \", buildUri({ dataSource, method: \"read\" }));\n else systemLog(\"axios\", \"No DataSource for \", id);\n let persistedData: Array<{ id: string;[key: string]: any }> = [];\n var params = { ...dataSource?.params };\n if (dataSource?.filter) params.filter = dataSource.filter;\n if (dataSource?.select) params.select = dataSource.select;\n try {\n var newData: any;\n // nacitani z primo dodanych dat\n if (dataSource?.data) {\n newData = dataSource.data;\n }\n // Nacitani ze souboru v public\n else if (dataSource?.file) {\n const response = await fetch(`${process.env.PUBLIC_URL}/${dataSource.file}`);\n newData = await response.json();\n }\n // Nacitani ze serveru\n else {\n // console.log(\"Nacitani ze serveru\", SQLite);\n // Pokud je nastaveny changeTime, vyzadame pouze data, ktera se zmenila po changeTime\n if (changeTime) {\n params.changeTime = changeTime;\n }\n // Pokud jsou data Persisting a mame pripojenou databazi, a mame nacitat data z databaze, zjistime posledni datum aktualizace a vyzadame update dat\n else if (isPersisting && SQLite) {\n console.time(\"Persisted Data\");\n const qDatum: any[] = await SQLite.read(`SELECT * FROM documents WHERE model = '${id}' ORDER BY lastUpdate DESC`);\n // console.log(\"Persisted data\", qDatum[0]?.lastUpdate);\n systemLog(\"axios\", \"SQLite.read Posledni datum update: \", qDatum[0]?.lastUpdate);\n if (qDatum[0]?.lastUpdate) params.changeTime = qDatum[0].lastUpdate;\n persistedData = qDatum\n .map((item) => {\n try {\n const parsedData = typeof item.data === \"string\" ? JSON.parse(item.data) : item.data;\n if (!parsedData || typeof parsedData !== \"object\" || Array.isArray(parsedData)) {\n systemLog(\"axios\", \"SQLite.read Preskakuji neplatny dokument:\", item.id);\n return null;\n }\n return { id: item.id, ...parsedData };\n } catch (error) {\n console.error(\"[datastore] Nepodarilo se zpracovat SQL data pro dokument\", item.id, error);\n return null;\n }\n })\n .filter((item): item is { id: string;[key: string]: any } => item !== null);\n // console.log(\"Pocet data v DB\", persistedData.length);\n console.timeEnd(\"Persisted Data\");\n }\n\n if (dataSource) {\n systemLog(\"axios\", \"Params: \", JSON.stringify(params));\n const axiosResponse = await axios.get(buildUri({ dataSource, method: \"read\" }), { params: params });\n // console.log(\"DATA SOURCE STAHUJI: \", data.data)\n if (schema && !dataSource.readAllFields) {\n if (Array.isArray(axiosResponse.data.data)) {\n newData = [];\n axiosResponse.data.data.forEach((element: any) => {\n // Pokud ma document nastaveny priznak _deleted, tak s nim nic nedelame a priznak mu nechame\n if (element._deleted) {\n newData.push(element);\n return;\n }\n var newRow: { [key: string]: any } = {};\n Object.keys(schema).forEach((key) => {\n if (typeof element === \"object\") {\n newRow[key] = schema[key].source ? element[schema[key].source] : element[key];\n } else {\n newRow[key] = element;\n }\n });\n // Pokud dokument nema definovane ID, tak jej vytvorime\n if (!newRow.id && [\"payments\", \"deliveries\"].includes(id)) {\n // console.log(\"Pridavam UUID pro \", id)\n if (element.id) {\n newRow.id = id + \"-\" + element.id;\n } else {\n newRow.id = uuid();\n }\n }\n newData.push(newRow);\n });\n } else {\n // console.log(\"SINGLE ITEM\")\n newData = {};\n Object.keys(schema).forEach((key) => {\n newData[key] = schema[key].source ? axiosResponse.data.data[schema[key].source] : axiosResponse.data.data[key];\n });\n }\n } else {\n newData = axiosResponse.data.data;\n }\n systemLog(\n \"axios\",\n `(SERVER TIME: ${axiosResponse.data.queryTime}) Data:`,\n newData.length || \"single\",\n \"items, Size:\",\n JSON.stringify(newData).length,\n \"Bytes\"\n );\n\n // Pokud je Provider Persisting a mame pripojenou databazi, ulozime nove data do databaze\n if (isPersisting && SQLite) {\n await saveData({ providerId: id, newData, SQLite, dateUpdate: axiosResponse.data.queryAt || new Date().toISOString() });\n }\n }\n }\n // console.log(\"Pocet polozek\", id, \": \", [...persitedData, ...newData]?.length)\n // console.log(\"Pocet persisting polozek\", id, \": \", persitedData?.length)\n // console.log(\"Persisting zaznam\", id, \": \", JSON.stringify(persitedData?.[0]))\n if (Array.isArray(newData)) {\n // Pokud byl nejaky zaznam updatovany, zobrazime novy\n\n console.time(\"Maping\");\n const map = new Map();\n persistedData.forEach((item) => map.set(item.id, item));\n newData.forEach((item) => map.set(item.id, item));\n let updatedArray = [];\n updatedArray.push(...map.values());\n systemLog(\n \"axios\",\n `getData - Polozky ${id} persisted: ${persistedData.length}, newData: ${newData.length}, vysledek: ${updatedArray.length}`\n );\n console.timeEnd(\"Maping\");\n return updatedArray;\n } else {\n return newData || [];\n }\n } catch (e) {\n console.error(`[AXIOS] CHYBA PRI NACITANI DAT Z: ${JSON.stringify(dataSource, null, 2)}\\n${e}`);\n return [];\n }\n};\n\ninterface PostDataProps {\n dataSource: DataSource;\n variant?: string;\n schema?: any;\n val: any;\n}\n\nexport const postData = async ({ dataSource, variant, schema, val }: PostDataProps): Promise<any> => {\n try {\n systemLog(\"axios\", \"POST\", buildUri({ dataSource, variant, method: \"create\" }), \", Data: \", JSON.stringify(val, null, 2));\n const response = await axios.post(`${buildUri({ dataSource, variant, method: \"create\" })}`, val);\n systemLog(\"axios\", \"POST Query Time: \", response.data.queryTime);\n systemLog(\"axios\", \"POST Response Data: \", response.data.data.length, \" B\");\n return response.data.data;\n } catch (e) {\n console.error(`POST DATA: ${e}`);\n return e;\n }\n};\n\ninterface PatchDataProps {\n dataSource: DataSource;\n variant?: string;\n data: any;\n}\n\nexport const patchData = async ({ dataSource, variant, data }: PatchDataProps): Promise<any> => {\n try {\n systemLog(\"axios\", \"PATCH: \", buildUri({ dataSource, variant, method: \"update\" }), \", Data: \", JSON.stringify(data, null, 2));\n const response = await axios.patch(buildUri({ dataSource, variant, method: \"update\" }), data);\n response.data?.queryTime && systemLog(\"axios\", \"PATCH Server Query Time: \", response.data.queryTime);\n systemLog(\"axios\", \"PATCH Response Data: \", response.data.data.length, \" Bytes\");\n //TODO: Prevest data na schema (nazvy)\n return response.data.data;\n } catch (e) {\n console.error(`[AXIOS] PATCH DATA: ${e}`);\n }\n};\n\ninterface DeleteDataProps {\n dataSource: DataSource;\n data: any;\n}\n\nexport const deleteData = async ({ dataSource, data }: DeleteDataProps): Promise<any> => {\n try {\n systemLog(\"axios\", \"deleteData DS:\", dataSource);\n const response = await axios.delete(`${buildUri({ dataSource, method: \"delete\" })}`, data);\n response.data?.queryTime && systemLog(\"axios\", \"deleteData - Query Time: \", response.data.queryTime);\n systemLog(\"axios\", \"deleteData Data response: \", response.data.data);\n return response.data.data;\n } catch (e) {\n console.error(`DELETE DATA: ${e}`);\n return e;\n }\n};\n","function getArrayIndex(head: string, obj: unknown[]) {\n if (head === \"$end\") {\n head = String(Math.max(obj.length - 1, 0));\n }\n if (!/^\\+?\\d+$/.test(head)) {\n throw new Error(`Array index '${head}' has to be an integer`);\n }\n return parseInt(head, 10);\n}\n\nfunction propToArray(prop: string) {\n return prop.split(\".\").reduce<string[]>((ret, el, index, list) => {\n const last = index > 0 && list[index - 1];\n if (last && /(?:^|[^\\\\])\\\\$/.test(last)) {\n const prev = ret.pop() || \"\";\n ret.push(prev.slice(0, -1) + \".\" + el);\n } else {\n ret.push(el);\n }\n return ret;\n }, []);\n}\n\nexport function setValueByDotPath(obj: any, prop: string | number | string[], value: any) {\n prop =\n typeof prop === \"number\"\n ? propToArray(prop.toString())\n : typeof prop === \"string\"\n ? propToArray(prop)\n : prop;\n\n const setPropImmutableRec = (target: any, parts: string[], nextValue: any, i: number): any => {\n let clone: any;\n let head: string | number = parts[i];\n\n if (parts.length > i) {\n if (Array.isArray(target)) {\n head = getArrayIndex(String(head), target);\n clone = target.slice();\n } else {\n clone = Object.assign({}, target);\n }\n clone[head] = setPropImmutableRec(\n target?.[head] !== undefined ? target[head] : {},\n parts,\n nextValue,\n i + 1,\n );\n return clone;\n }\n\n return typeof nextValue === \"function\" ? nextValue(target) : nextValue;\n };\n\n return setPropImmutableRec(obj, prop as string[], value, 0);\n}\n\nexport function getValueByDotPath(obj: any, prop?: string | number | string[] | undefined, value?: any): any {\n prop =\n typeof prop === \"number\"\n ? propToArray(prop.toString())\n : typeof prop === \"string\"\n ? propToArray(prop)\n : prop;\n\n let currentObj = obj;\n for (let i = 0; i < (prop?.length || 0); i += 1) {\n if (currentObj === null || typeof currentObj !== \"object\") {\n return value;\n }\n let head: any = (prop as string[])[i];\n if (Array.isArray(currentObj)) {\n const results: any[] = [];\n for (let j = 0; j < currentObj.length; j += 1) {\n const result = getValueByDotPath(currentObj[j], (prop as string[]).slice(i), value);\n if (result !== value) {\n results.push(result);\n }\n }\n return results.flat();\n }\n if (head === \"$end\" && Array.isArray(currentObj)) {\n head = currentObj.length - 1;\n }\n currentObj = currentObj[head];\n }\n if (typeof currentObj === \"undefined\") {\n return value;\n }\n return currentObj;\n}\n","import { getValueByDotPath } from \"./dotPath\";\nimport dayjs from \"dayjs\";\n\nfunction randomUuidSegment(template: string): string {\n return template.replace(/[xy]/g, (char) => {\n const random = Math.floor(Math.random() * 16);\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n\nfunction escapeRegExp(string: string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"); // $& means the whole matched string\n}\n\nexport function recalculateObjectWithDocument(obj: any, document: any): any {\n if (obj === undefined) return;\n if (Array.isArray(obj)) {\n const results: any[] = [];\n obj.forEach((item) => {\n const result = recalculateObjectWithDocument(item, document);\n if (result !== undefined) {\n results.push(result);\n }\n });\n return results;\n } else if (typeof obj === \"object\") {\n const keys = Object.keys(obj);\n if (keys.some((item) => item.startsWith(\"$\"))) {\n if (keys.includes(\"$rule\")) {\n // console.log(\"Test je \", obj[\"$rule\"])\n const res = doesObjectMatchFilter(document, obj[\"$rule\"]);\n // console.log(\"Rule\", obj[\"$rule\"])\n // const res = recalculateObjectWithDocument(obj[\"$rule\"], document)\n if (res && obj[\"$value\"] !== undefined) {\n // console.log(\"Volam recaluclate\", obj[\"$value\"])\n return recalculateObjectWithDocument(obj[\"$value\"], document);\n } else if (obj[\"$value\"] === undefined) {\n // console.log(\"Tady\", obj[\"$rule\"], res)\n return res;\n }\n } else if (keys.includes(\"$or\")) {\n // return value.some((condition) => doesObjectMatchFilter(obj, condition));\n return obj[\"$or\"].some((condition: any) => {\n const res = doesObjectMatchFilter(document, condition);\n if (typeof res === \"boolean\") return res;\n // console.log(\"Mam Chybu\", res)\n const error = res;\n return false;\n });\n } else if (keys.includes(\"$and\")) {\n return obj[\"$and\"].every((condition: any) => {\n const res = doesObjectMatchFilter(document, condition);\n if (typeof res === \"boolean\") return res;\n // console.log(\"Mam Chybu\", res)\n const error = res;\n return false;\n });\n } else if (keys.includes(\"$min\")) {\n const res = recalculateObjectWithDocument(obj[\"$min\"], document);\n if (res.length === 0) return undefined;\n // console.log(\"Vybiram z \", res)\n return Math.min(...res);\n } else if (keys.includes(\"$max\")) {\n const res = recalculateObjectWithDocument(obj[\"$max\"], document);\n if (res.length === 0) return undefined;\n return Math.max(...res);\n } else if (keys.includes(\"$sum\")) {\n const res = recalculateObjectWithDocument(obj[\"$sum\"], document);\n if (res) return res.reduce((acc: number, val: number) => acc + val, 0);\n else return undefined;\n } else if (keys.includes(\"$avg\")) {\n const res = recalculateObjectWithDocument(obj[\"$avg\"], document);\n const sum = res.reduce((acc: number, val: number) => acc + val, 0);\n return sum / res.length;\n } else if (keys.includes(\"$median\")) {\n const res = recalculateObjectWithDocument(obj[\"$median\"], document);\n const sortedArray = res.slice().sort((a: number, b: number) => a - b);\n let median;\n const middleIndex = Math.floor(sortedArray.length / 2);\n\n if (sortedArray.length % 2 === 0) {\n // Even number of elements\n median = (sortedArray[middleIndex - 1] + sortedArray[middleIndex]) / 2;\n } else {\n // Odd number of elements\n median = sortedArray[middleIndex];\n }\n return median;\n } else if (keys.includes(\"$val\") || keys.includes(\"$value\")) {\n const res = recalculateObjectWithDocument(obj[\"$val\"] || obj[\"$value\"], document);\n if (res.length === 1) return res[0];\n return res;\n } else if (keys.includes(\"$first\")) {\n const res = recalculateObjectWithDocument(obj[\"$first\"], document);\n return res?.[0];\n } else if (keys.includes(\"$last\")) {\n const res = recalculateObjectWithDocument(obj[\"$last\"], document);\n return res?.[res.length - 1];\n } else if (keys.includes(\"$concat\")) {\n const res = recalculateObjectWithDocument(obj[\"$concat\"], document);\n return res.join(\"\");\n } else if (keys.includes(\"$plus\")) {\n const res = recalculateObjectWithDocument(obj[\"$plus\"], document);\n return res.reduce((accumulator: number, currentValue: any) => accumulator + Number(currentValue), 0);\n } else if (keys.includes(\"$minus\")) {\n const res = recalculateObjectWithDocument(obj[\"$minus\"], document);\n if (res?.length > 0) {\n const first = res.shift();\n return res.reduce((accumulator: number, currentValue: any) => accumulator - Number(currentValue), first);\n }\n return res;\n } else if (keys.includes(\"$times\")) {\n const res = recalculateObjectWithDocument(obj[\"$times\"], document);\n return res.reduce((accumulator: number, currentValue: any) => accumulator * Number(currentValue), 1);\n } else if (keys.includes(\"$div\") || keys.includes(\"$divide\")) {\n const res = recalculateObjectWithDocument(obj[\"$div\"] || obj[\"$divide\"], document);\n // if (res?.length >= 2) {\n const first = res.shift();\n return res.reduce((accumulator: number, currentValue: any) => accumulator / Number(currentValue), first);\n // } else return false\n } else if (keys.includes(\"$mod\")) {\n const res = recalculateObjectWithDocument(obj[\"$mod\"], document);\n return res[0] % res[1];\n } else if (keys.includes(\"$round\")) {\n const res = recalculateObjectWithDocument(obj[\"$round\"], document);\n if (Array.isArray(res)) {\n const decimals = res[1] || 0;\n return Math.round(res[0] * Math.pow(10, decimals)) / Math.pow(10, decimals);\n }\n return Math.round(res);\n } else if (keys.includes(\"$ceil\")) {\n const res = recalculateObjectWithDocument(obj[\"$ceil\"], document);\n if (Array.isArray(res)) {\n const decimals = res[1] || 0;\n return Math.ceil(res[0] * Math.pow(10, decimals)) / Math.pow(10, decimals);\n }\n return Math.floor(res);\n } else if (keys.includes(\"$floor\")) {\n const res = recalculateObjectWithDocument(obj[\"$floor\"], document);\n return Math.floor(res);\n } else if (keys.includes(\"$gt\")) {\n const res = recalculateObjectWithDocument(obj[\"$gt\"], document);\n return res[0] > res[1];\n } else if (keys.includes(\"$gte\")) {\n const res = recalculateObjectWithDocument(obj[\"$gte\"], document);\n return res[0] >= res[1];\n } else if (keys.includes(\"$lt\")) {\n const res = recalculateObjectWithDocument(obj[\"$lt\"], document);\n return res[0] < res[1];\n } else if (keys.includes(\"$lte\")) {\n const res = recalculateObjectWithDocument(obj[\"$lte\"], document);\n return res[0] <= res[1];\n } else if (keys.includes(\"$eq\")) {\n const res = recalculateObjectWithDocument(obj[\"$eq\"], document);\n return res[0] === res[1];\n } else if (keys.includes(\"$neq\")) {\n const res = recalculateObjectWithDocument(obj[\"$neq\"], document);\n return res[0] !== res[1];\n } else {\n // console.log(\"String obj\", obj)\n // console.log(\"Data:\", document)\n let data = getValueByDotPath(document, Object.keys(obj)[0].substring(1));\n if (typeof obj === \"object\") {\n data = getObjectValue(data, obj[Object.keys(obj)[0]], document);\n }\n return data;\n }\n // const a = {\n // \"$and\": [\n // { \"name\": { \"$regex\": { \"$neq\": \"LED\" } } },\n // { \"name\": { \"$regex\": \"UV\" } },\n // { \"name\": { \"$regex\": \"Lamp\" } },\n // { \"categories\": \"ce82bfa4-b2c7-11ec-9c66-246e96436e9c\" }\n // ]\n // }\n } else {\n const result: Record<string, any> = {};\n // console.log(\"Obj\", obj)\n // console.log(\"Documents\", keys, JSON.stringify(document, null, 2))\n // console.log(\"klic\", obj, JSON.stringify(document, null, 2))\n // console.log(\"KKK\", getValueByDotPath(\"$\" + keys[0], document))\n keys.forEach((key) => (result[key] = recalculateObjectWithDocument(getValueByDotPath(obj[key]), document)));\n // console.log(\"Result je\", result)\n return result;\n }\n }\n // Je to jen hodnota, vracime ji\n else {\n if (typeof obj === \"string\" && obj.startsWith(\"$\")) return getValueByDotPath(document, obj.substring(1));\n else return obj;\n }\n}\n\nfunction getObjectValue(ddd: any, obj: any, documents: any): any {\n const data = Array.isArray(ddd)\n ? ddd.length > 0\n ? [...ddd]\n : undefined\n : typeof ddd === \"object\"\n ? Object.keys(ddd).length > 0\n ? { ...ddd }\n : undefined\n : ddd;\n if (!data) return undefined;\n // console.log(\"DATA v getObjectValue\", data)\n // console.log(\"getObjectValue\", obj)\n switch (Object.keys(obj)[0]) {\n case \"$pipe\":\n let result = data;\n // console.log(\"PIPE\")\n for (const action of obj.$pipe) {\n // console.log(\"Action\", action, result)\n if (result) result = getObjectValue(result, action, documents);\n }\n return result;\n case \"$filter\":\n // console.log(\"Data\", data[0], obj.$filter)\n const filterRes = data\n .map((d: any) => {\n if (typeof d === \"object\") {\n if (doesObjectMatchFilter(d, obj.$filter, documents)) return d;\n } else {\n if (doesValueMatchFilter(d, obj.$filter, documents)) return d;\n }\n })\n .filter((u: any) => u);\n // console.log(\"FILTER RESULT\", filterRes)\n return filterRes;\n case \"$sort\":\n console.log(\"Sorting\", obj.$sort);\n if (typeof obj.$sort === \"object\") {\n const rr = data.sortBy(obj.$sort);\n // console.log(\"Sorting result\", JSON.stringify(rr, null, 2))\n return rr;\n } else return obj.$sort === \"ASC\" ? data.sort((a: number, b: number) => a - b) : data.sort((a: number, b: number) => b - a);\n case \"$limit\":\n let limit = Array.isArray(obj.$limit) ? [...obj.$limit] : [obj.$limit];\n // console.log(\"Limiting\", limit)\n if (limit.length === 1) limit.unshift(0);\n else limit[1] = limit[1] + limit[0];\n const res = data.slice(...limit);\n // console.log(\"Limit res\", res)\n return res;\n case \"$project\":\n // console.log(\"Project\", obj.$project)\n if (!Array.isArray(obj.$project)) obj.$project = [obj.$project];\n return data.map((o: any) => Object.fromEntries(Object.entries(o).filter(([key]) => obj.$project.includes(key))));\n case \"$extract\":\n // console.log(\"Extract\", obj.$extract)\n // return data.map(o => o[obj.$extract])\n const sres = data.map((o: any) => {\n const res = getValueByDotPath(o, obj.$extract);\n // console.log(\"EXTRACT RES\", res)\n return res;\n });\n // console.log(\"SRES JE \", sres.flat())\n return sres.flat();\n // return sres\n case \"$extractValue\":\n const rv = data.map((o: any) => o[obj.$extract]);\n if (rv.length === 1) return rv[0];\n else return rv;\n default:\n // console.log(\"JE TU NEZNAMY\", Object.keys(obj)[0])\n }\n return data;\n}\n\nexport function getValueByRules(data: any, document: any, { mode, ruleId }: { mode?: any; ruleId?: any }): any {\n // Porovname hodnotu dokumentu s pravidlem\n if (Array.isArray(data)) {\n const results: any[] = [];\n data.forEach((item) => {\n const res = getValueByRules(item, document, { mode, ruleId });\n if (res !== undefined) results.push(res);\n });\n switch (mode) {\n case \"min\":\n // console.log(\"Vybiram z hodnot\", results)\n if (results.length === 0) return undefined;\n return Math.min(...results);\n case \"max\":\n return Math.max(...results);\n case \"array\":\n return results;\n case \"value\":\n default:\n if (results.length === 1) return results[0];\n return results;\n }\n }\n if (typeof data === \"object\") {\n if (data._value !== undefined) {\n if (data._rules) {\n // Pokud je pole ruznych pravidel s id, tak vybereme pravidlo podle ruleId\n if (Array.isArray(data._rules)) {\n if (doesObjectMatchFilter(document, data._rules.find((rule: any) => rule._id === ruleId)._rules)) {\n return data._value;\n }\n // Pravidlo je jen jedno\n } else if (doesObjectMatchFilter(document, data._rules)) {\n // console.log(\"Jedno pravidlo\", data._rules, \"Vysledek: \", data._value)\n return data._value;\n }\n return undefined;\n }\n return data._value;\n }\n return data;\n }\n // Pokud data neni ani pole, ani object, tak to je hodnota a vratime ji\n return data;\n}\n\nexport function doesValueMatchFilter(objVal: any, value: any, documents: any = {}): any {\n // if (!value) return true\n if (value === undefined) return true;\n\n if (typeof value === \"object\") {\n switch (Object.keys(value)[0]) {\n case \"$filter\":\n return doesObjectMatchFilter(\n objVal.filter((o: any) => doesObjectMatchFilter(o, value.$filter, documents)),\n value.$next\n );\n case \"$or\":\n return value.$or.some((filter: any) => doesValueMatchFilter(objVal, filter));\n case \"$and\":\n return value.$and.every((filter: any) => doesValueMatchFilter(objVal, filter));\n case \"$not\":\n return !doesValueMatchFilter(objVal, value.$not);\n case \"$sum\":\n // console.log(\"SUM objVal\", objVal)\n if (Array.isArray(objVal))\n return doesValueMatchFilter(\n objVal.reduce((acc, val) => acc + val, 0),\n value.$sum\n );\n return doesValueMatchFilter(objVal, value.$sum);\n case \"$length\":\n if (Array.isArray(objVal)) return doesValueMatchFilter(objVal.length, value.$length);\n return doesValueMatchFilter(1, value.$length);\n case \"$eq\":\n if (Array.isArray(objVal)) return objVal.some((o) => value.$eq === o);\n return value.$eq === objVal;\n case \"$neq\":\n if (Array.isArray(objVal)) return objVal.some((o) => value.$neq !== o);\n return value.$neq !== objVal;\n case \"$some\":\n // if (objVal.length === 20) console.log(\"SOME\", objVal)\n if (Array.isArray(objVal)) return objVal.some((o) => doesValueMatchFilter(o, value.$some));\n return doesValueMatchFilter(objVal, value.$some);\n case \"$nsome\":\n if (Array.isArray(objVal)) return objVal.some((o) => doesValueMatchFilter(o, value.$nsome));\n return doesValueMatchFilter(objVal, value.$nsome);\n case \"$every\":\n if (Array.isArray(objVal)) return objVal.every((o) => doesValueMatchFilter(o, value.$every));\n return doesValueMatchFilter(objVal, value.$every);\n case \"$nevery\":\n if (Array.isArray(objVal)) return objVal.every((o) => doesValueMatchFilter(o, value.$nevery));\n return doesValueMatchFilter(objVal, value.$nevery);\n case \"$in\":\n // console.log(\"IN\")\n // MICHAL: Overit!!!\n value.$in = recalculateObjectWithDocument(value.$in, documents);\n // value.$in = recalculateObjectWithDocument(value.$in, documents)\n // MICHAL: ˆˆˆˆˆˆˆ\n // console.log(\"V JE\", typeof value.$in)\n if (!Array.isArray(value.$in)) value.$in = [value.$in];\n if (Array.isArray(objVal)) {\n return objVal.some((o) => {\n const result = value.$in.some((v: any) => {\n // console.log(\"CALL \", o, v)\n const ret = doesValueMatchFilter(o, v);\n // console.log(\"RET JE \", ret)\n return ret;\n });\n // console.log(\"Call doesValueMatchFilter \", result)\n return result;\n });\n }\n return value.$in.some((v: any) => doesValueMatchFilter(objVal, v));\n // return value.$in.includes(objVal);\n // MICHAL: Pokud bude spravne fungovat $in tak podle toho predelat $nin\n case \"$nin\":\n if (!Array.isArray(value.$nin)) value.$nin = [value.$nin];\n if (Array.isArray(objVal)) return objVal.some((o) => !value.$nin.includes(o));\n return !value.$nin.includes(objVal);\n // Every in array\n case \"$ein\":\n if (!Array.isArray(value.$ein)) value.$ein = [value.$ein];\n if (Array.isArray(objVal)) return objVal.every((o) => value.$ein.includes(o));\n return value.$ein.includes(objVal);\n // Not every in array\n case \"$nein\":\n if (!Array.isArray(value.$nein)) value.$nein = [value.$nein];\n if (Array.isArray(objVal)) return objVal.every((o) => !value.$nein.includes(o));\n return !value.$nein.includes(objVal);\n // case \"$include\":\n // case \"$incl\":\n // return objVal?.includes(value.$include);\n case \"$gt\":\n return objVal > value.$gt;\n case \"$gte\":\n // console.log(\"Jsem GTE\", value.$gte, recalculateObjectWithDocument(value.$gte, documents))\n return objVal >= recalculateObjectWithDocument(value.$gte, documents);\n case \"$lt\":\n return objVal < value.$lt;\n case \"$lte\":\n return objVal <= value.$lte;\n case \"$regex\":\n // console.log(\"Testuji Regex\", value.$regex, objVal)\n const regex = new RegExp(escapeRegExp(value.$regex));\n if (regex) return regex.test(objVal);\n else return false;\n case \"$iregex\": // Neni case sensitive\n const iregex = new RegExp(escapeRegExp(value.$iregex), \"i\");\n if (iregex) return iregex.test(objVal);\n else return false;\n\n // Pomocne - lze resit regexem\n case \"$sw\":\n return value.$sw.startsWith(objVal);\n case \"$ew\":\n return value.$sw.endsWith(objVal);\n case \"$nsw\":\n return !value.$sw.startsWith(objVal);\n case \"$new\":\n return !value.$sw.endsWith(objVal);\n\n default:\n // console.log(\"Posilam default doesValueMatchFilter\")\n return doesObjectMatchFilter(objVal, value, documents);\n }\n } else {\n if (Array.isArray(objVal)) return objVal.some((o) => value === o);\n return objVal === value;\n }\n}\n\nexport function doesObjectMatchFilter(obj: any, filter: any, documents: any = {}): any {\n // console.log(\"doesObjectMatchFilter\")\n // if (filter.brandId === \"4f15daae-4605-4890-895c-c7e9602ea3db\") console.log(obj)\n if (!filter) return true; // Pokud neni nastaveny filter, vracime true\n\n if (Object.keys(filter)?.includes(\"$rule\")) {\n // console.log(\"Pravidloo: \", filter.$rule)\n const result = doesObjectMatchFilter(obj, filter.$rule, documents);\n if (result === true) {\n // console.log(\"Vracim result\", result)\n return result;\n } else {\n // console.log(\"Vracim chybovou message \", filter.$message)\n return filter.$message || false;\n }\n }\n\n let error;\n const result = Object.entries(filter).every(([key, value]: [key: string, value: any]) => {\n let objVal;\n // Pokud je key systemova promena, zjistime ji\n //TODO: Dodelat moment(date()) z Timers pro TimeShift\n if (key.startsWith(\"$\")) {\n switch (key) {\n case \"$date\":\n objVal = dayjs().format(\"YYYY-MM-DD\");\n break;\n case \"$time\":\n objVal = dayjs().format(\"HH:mm:ss\");\n break;\n case \"$datetime\":\n objVal = dayjs().format(\"YYYY-MM-DD HH:mm:ss\");\n break;\n case \"$day\":\n objVal = dayjs().day();\n break;\n case \"$or\":\n // return value.some((condition) => doesObjectMatchFilter(obj, condition));\n return value.some((condition: any) => {\n const res = doesObjectMatchFilter(obj, condition, documents);\n if (typeof res === \"boolean\") return res;\n // console.log(\"Mam Chybu\", res)\n error = res;\n return false;\n });\n case \"$and\":\n return value.every((condition: any) => {\n const res = doesObjectMatchFilter(obj, condition, documents);\n if (typeof res === \"boolean\") return res;\n // console.log(\"Mam Chybu\", res)\n error = res;\n return false;\n });\n case \"$first\":\n // console.log(\"Resim first pro\", obj, \"pravidlo\", JSON.stringify(value))\n if (Array.isArray(value)) {\n for (const v of value) {\n if (Object.keys(v)?.includes(\"$rule\")) {\n if (doesObjectMatchFilter(documents, v.$rule, documents)) {\n return doesValueMatchFilter(obj, v.$value);\n }\n } else {\n return doesValueMatchFilter(obj, v);\n }\n }\n return false;\n } else return doesObjectMatchFilter(obj, value, documents);\n case \"$last\":\n if (Array.isArray(value)) {\n for (const v of value.reverse()) {\n // console.log(\"V \", v)\n if (Object.keys(v)?.includes(\"$rule\")) {\n if (doesObjectMatchFilter(documents, v.$rule, documents)) {\n return doesValueMatchFilter(obj, v.$value);\n }\n } else {\n return doesValueMatchFilter(obj, v);\n }\n }\n return false;\n } else return doesObjectMatchFilter(obj, value, documents);\n\n case \"$gt\":\n case \"$gte\":\n case \"$lt\":\n case \"$lte\":\n case \"$eq\":\n case \"$neq\":\n // console.log(\"Dotaz:\", filter, \"Obj\", obj)\n const resp = recalculateObjectWithDocument(filter, obj);\n // console.log(\"Result dotazu\", resp)\n return resp;\n default:\n objVal = getValueByDotPath(obj, key.substring(1));\n }\n } else {\n objVal = getValueByDotPath(obj, key);\n // console.log(\n // // \"Obj\", JSON.stringify(obj, null, 2),\n // \"\\nKey\", JSON.stringify(key, null, 2),\n // \"\\nHodnota:\", JSON.stringify(objVal, null, 2))\n }\n\n // Pokud je key nepovinny (konci otaznikem) a v obj neexistuje, tak vratime true (ignoruje se)\n if (key.endsWith(\"?\") && objVal === undefined) return true;\n // Pokud je key povinny a neexistuje, vracime false\n if (objVal === undefined) return false;\n\n // console.log(\"Volam doesValueMatchFilter\", objVal, value)\n // Volam doesValueMatchFilter 39 {\"$gte\": 10}\n const rrr = doesValueMatchFilter(objVal, value, documents);\n // console.log(\"A je to \", rrr)\n return rrr;\n });\n\n return error || result;\n}\n\n/**\n *\n * Filteruje pole dokumentu podle filteru\n *\n * @param {*} documents Pole dokumentu\n * @param {*} filter object filteru\n * @returns vraci pole vyfilterovanych dokumentu\n */\nexport const filterDocuments = <T>(documents: T[] | T, filter: any): any => {\n if (!filter) return documents;\n if (!documents) return undefined;\n if (!Array.isArray(documents)) {\n if (doesObjectMatchFilter(documents, filter)) return documents;\n else return null;\n } else return documents.filter((item) => doesObjectMatchFilter(item, filter));\n};\n\nexport const filterDocumentsAsync = async <T>(documents: T[] | T, filter: any): Promise<any> => {\n return new Promise((resolve) => {\n const response = filterDocuments(documents, filter);\n resolve(response);\n });\n};\n\nexport const dataStoreFilterObject = (obj: any, filter: any): any => {\n if (!filter) return obj;\n if (!obj) return undefined;\n\n const result: Record<string, any> = {};\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n if (doesObjectMatchFilter(obj[key], filter)) {\n result[key] = obj[key];\n }\n }\n }\n return result;\n};\n\n/**\n *\n * @returns UUID v4\n *\n * Vygeneruje unikatni UUID v4\n */\nexport function uuid(): string {\n return [\n randomUuidSegment(\"xxxxxxxx\"),\n randomUuidSegment(\"xxxx\"),\n \"4\" + randomUuidSegment(\"xxx\"),\n randomUuidSegment(\"yxxx\"),\n randomUuidSegment(\"xxxxxxxxxxxx\"),\n ].join(\"-\");\n}\n\nexport function isUuid(val: string) {\n if (typeof val !== \"string\") return false;\n const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidPattern.test(val);\n}\n","// import { template } from \"lodash\";\n// import Mustache from 'mustache';\n\ntype TemplateData = Record<string, unknown>;\n\nconst _renderMyTemplate = (templateString: string, data: TemplateData): string => {\n return templateString.replace(/<%=(.*?)%>/g, (match: string, variable: string) => {\n const key = variable.trim();\n return data[key] !== undefined ? String(data[key]) : match;\n // return data[key] !== undefined ? data[key] : `<%=${variable}%>`;\n });\n};\n\nexport function renderTemplate(val: string, data: TemplateData): string {\n const renderedOutput = _renderMyTemplate(val, data);\n return renderedOutput;\n}\n\nexport function renderJSONTemplate<T>(val: T, data?: TemplateData): T {\n if (val == null) return val;\n if (!data) return val;\n // Regularni vyrazy zabezpecime\n const valString = JSON.stringify(val, (_key, value) => {\n if (value instanceof RegExp) {\n return { __regex__: value.source };\n }\n return value;\n });\n\n const renderedOutput = _renderMyTemplate(valString, data);\n\n // Regularni vyrazy vratime\n const parsedObj = JSON.parse(renderedOutput, (_key, value) => {\n if (typeof value === \"object\" && value !== null && Object.prototype.hasOwnProperty.call(value, \"__regex__\")) {\n const regexValue = (value as { __regex__: string }).__regex__;\n return new RegExp(regexValue);\n }\n return value;\n });\n\n return parsedObj;\n}\n\nexport const replaceRegexPlaceholders = (obj: unknown, placeholder = \"$regex\"): unknown => {\n if (typeof obj === \"object\") {\n if (Array.isArray(obj)) {\n return obj.map((o) => replaceRegexPlaceholders(o, placeholder));\n } else {\n if (obj === null) return obj;\n\n const sourceObj = obj as { [key: string]: unknown };\n const newObj: { [key: string]: unknown } = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[key] = replaceRegexPlaceholders(sourceObj[key], placeholder);\n }\n }\n if (Object.prototype.hasOwnProperty.call(newObj, placeholder)) {\n const regexStr = newObj[placeholder];\n try {\n const regex = new RegExp(String(regexStr));\n return regex;\n } catch (error) {\n console.error(`Invalid regular expression: ${regexStr}`);\n return newObj;\n }\n }\n return newObj;\n }\n } else {\n return obj;\n }\n};\n","import { useCallback, useContext, useEffect, useMemo, useState, useSyncExternalStore } from \"react\";\nimport { DataStoreStableContext } from \"./DataStoreProvider\";\nimport { renderJSONTemplate } from \"./templates\";\nimport { filterDocuments, recalculateObjectWithDocument } from \"./utils\";\nimport { systemLog } from \"./log\";\nimport { JSONType, Uuid } from \"./types\";\nimport { ProviderTypes } from \"./providerTypes\";\n\nexport interface UseDataProviderResult {\n /** Materializované dokumenty providera po vyhodnocení šablon a filtraci. */\n documents: Array<Record<string, any>>;\n /** Schéma providera, pokud je dostupné. */\n schema?: Record<string, any>;\n /** Aktualizuje data providera pomocí výchozí update varianty. */\n update: (val: JSONType) => void;\n /** Aktualizuje položku/položky providera s volitelnou variantou a route parametry. */\n updateItem: (\n args: { params?: JSONType; data?: JSONType; variant?: string; documentId?: string },\n callback?: (resp: JSONType) => void,\n ) => void;\n /** Smaže položku/položky providera. */\n deleteItem: (args: { params?: JSONType; data?: JSONType }, callback?: (resp: JSONType) => void) => void;\n /** Vytvoří novou položku providera. */\n createItem: (data: JSONType, callback?: () => void) => void;\n}\n\n/**\n * Zaregistruje/zpřístupní providera a vrátí normalizované dokumenty spolu s CRUD helpery.\n *\n * @param id Provider id nebo inline definice providera.\n * @param params Parametry šablony používané při renderu URI/definice.\n * @param dataFilter Volitelný client-side filtr dokumentů providera.\n * @param settings Volitelný závislý dokument použitý pro přepočet dat.\n */\nexport const useDataProvider = (\n /**\n * Provider id nebo objekt data {key: value}\n */\n id: ProviderTypes | { [key: string]: any },\n /**\n * Parametry pro prerenderovani providera (profiles/<%= profileId %>)\n */\n params?: { [key: string]: string } | null,\n /**\n * Filtrovani dat\n */\n dataFilter?: JSONType | null,\n /**\n * Nejake nastaveni\n */\n settings?: {\n documentId?: string;\n document?: JSONType;\n },\n): UseDataProviderResult => {\n const [providerId, setProviderId] = useState<string | null>(null);\n const [filter, setFilter] = useState<JSONType | null>(null);\n const {\n dispatch,\n presetProviders,\n updateProviderListeners,\n subscribeToProvider,\n getProviderLastUpdate,\n getExternalDocuments,\n getExternalProviders,\n } = useContext(DataStoreStableContext);\n\n const providerVersion = useSyncExternalStore(\n useCallback(\n (onStoreChange) => {\n if (!providerId) return () => {};\n return subscribeToProvider(providerId, onStoreChange);\n },\n [providerId, subscribeToProvider],\n ),\n useCallback(() => {\n if (!providerId) return null;\n return getProviderLastUpdate(providerId);\n }, [providerId, getProviderLastUpdate]),\n () => null,\n );\n\n systemLog(\"usedp\", `${id} - ${providerId}`);\n\n // useEffect(() => {\n // if (filter) console.log(\"Filter: \", JSON.stringify(filter, 0, 2));\n // }, [filter]);\n\n useEffect(() => {\n if (id === undefined || (typeof id === \"boolean\" && id === false)) return;\n var retId: string;\n const currentProviders = getExternalProviders();\n if (dataFilter) setFilter(dataFilter);\n // Provider je primo definovany objektem v id\n if (typeof id === \"object\") {\n const prov = renderJSONTemplate(id, params ?? undefined);\n // console.log(\"Registruji\", prov.id);\n setProviderId(prov.id);\n retId = prov.id;\n dispatch(\"registerProvider\", prov);\n // registerProvider(prov);\n } else {\n // Provider je dany jen id providera\n if (presetProviders[id]) {\n const prov = renderJSONTemplate(presetProviders[id], params ?? undefined);\n // customLog(\"usedp\",\"Register Provider: \", prov.id);\n // console.log(\"Registruji\", prov.id);\n setProviderId(prov.id);\n retId = prov.id;\n if (currentProviders[prov.id]) {\n systemLog(\"usedp\", \"Provider:\", prov.id, \"existuje\");\n if (!currentProviders[prov.id]?.isPermanent) updateProviderListeners(prov.id, 1);\n // registerProvider(prov);\n // dispatch(\"registerProvider\", prov);\n } else {\n systemLog(\"usedp\", \"Registruji novy provider:\", prov.id);\n dispatch(\"registerProvider\", prov);\n // registerProvider(prov);\n }\n } else {\n systemLog(\"usedp\", \"Neznamy provider \", id, params, dataFilter, settings);\n }\n }\n // console.log(\"PROVIDER RETID JE \", retId);\n return () => {\n // unregisterProvider(retId);\n // updateProviderListeners(retId, -1);\n const activeProviders = getExternalProviders();\n const presetProvider = presetProviders[retId as ProviderTypes];\n if (!presetProvider?.isPermanent && !activeProviders[retId]?.isPermanent) {\n systemLog(\"usedp\", \"Unregister Provider: \", retId, \"-\", activeProviders[retId]);\n // console.log(\"usedp\", \"Unregister Provider: \", retId, \"-\", providers[retId]);\n dispatch(\"unregisterProvider\", retId);\n // unregisterProvider(retId);\n }\n };\n }, []);\n\n const update = (val: JSONType) => {\n systemLog(\"usedp\", \"UPDATUJI: \", providerId, \", data: \", val);\n dispatch(\"updateDataStore\", { id: providerId, data: val });\n };\n\n /**\n *\n * @param {*} param0 {params, data, variant - varianta url adresy v dataProviders}\n * @param {*} callback\n */\n const updateItem = (\n { params, data, variant, documentId = undefined }: { params?: JSONType; data?: JSONType; variant?: string; documentId?: string },\n callback?: (resp: JSONType) => void,\n ) => {\n systemLog(\"usedp\", \"UPDATUJI:\", providerId, \", variant:\", variant, \", documentId: \", documentId, \", params:\", params, \", data:\", data);\n dispatch(\"updateDataStore\", { id: providerId, variant, params, data, documentId }, callback);\n };\n\n const deleteItem = ({ params, data }: { params?: JSONType; data?: JSONType }, callback?: (resp: JSONType) => void) => {\n systemLog(\"usedp\", \"DELETE FROM:\", providerId, \", params:\", params, \"data:\", data);\n dispatch(\"deleteProviderItem\", { providerId, data, params }, callback);\n };\n\n const createItem = (data: JSONType, callback?: () => void) => {\n // console.log(\"createItem Prov. id:\", id);\n dispatch(\"createProviderItem\", { id, data }, callback);\n };\n\n const provider = useMemo(() => {\n // console.time(`[USEDP] useMemo ${providerId}`);\n systemLog(\"usedp\", \"Vytvoreni dat: \", filter);\n const providers = getExternalProviders();\n const documents = getExternalDocuments();\n if (!providerId || !providers[providerId]) {\n return {\n data: [] as Array<Record<string, any>>,\n schema: undefined,\n };\n }\n\n let docs: Array<Record<string, any>> = [];\n providers[providerId]?.data.forEach((docId: string) => {\n let dData = documents[docId];\n\n if (providers[providerId].depend) {\n dData = recalculateObjectWithDocument(documents[docId], documents[providers[providerId].depend]);\n } else if (settings?.documentId) {\n dData = recalculateObjectWithDocument(documents[docId], documents[settings.documentId]);\n } else if (settings?.document) {\n dData = recalculateObjectWithDocument(documents[docId], settings.document);\n }\n\n docs.push({\n id: docId,\n ...dData,\n });\n });\n systemLog(\"usedp\", \"KonecVytvoreni dat: \", providerId);\n // customLog(\"usedp\", JSON.stringify(docs, 0, 2));\n if (filter) {\n systemLog(\"usedp\", \"Jdu filterovat: \", JSON.stringify(filter));\n docs = filterDocuments(docs, filter);\n systemLog(\"usedp\", \"Konec filteru: \");\n }\n\n // console.timeEnd(`[USEDP] useMemo ${providerId}`);\n\n return {\n ...providers[providerId],\n data: docs,\n };\n }, [providerId, providerVersion, settings?.document, settings?.documentId, getExternalProviders, getExternalDocuments]);\n\n systemLog(\"usedp\", `${providerId} END`);\n return {\n // provider,\n documents: provider.data,\n schema: provider.schema,\n // dispatch,\n update,\n updateItem,\n deleteItem,\n createItem,\n };\n};\n","import { useContext, useEffect, useMemo, useState } from \"react\";\nimport { systemLog } from \"./log\";\nimport { DataStoreActionsContext, DataStoreDocumentsContext } from \"./DataStoreProvider\";\nimport { Uuid } from \"./types\";\n\n/** Vstupní parametry hooku useDocument. */\ninterface UseDocumentParams {\n /**\n * UUID dokumentu\n */\n documentId: Uuid;\n model?: string;\n /**\n * nazev Providera, nebo objekt definice Providera\n */\n provider?: string | {};\n /**\n * Polozky ktere chceme ziskat. Ty co nejsou ulozene se pokusi stahnout z modelu nebo podle definice Providera a doplnit. Pokud nejsou nastavena zadne polozky, tak vrati to co ma v zarizeni.\n */\n fields?: string[];\n /**\n * true|false - pozadujeme kompletni dokument.\n */\n allFields?: boolean;\n}\n\ninterface UseDocumentResult {\n /** Materializovaný payload dokumentu z DataStore. */\n document: Record<string, any>;\n}\n\n/**\n * Vrátí jeden dokument a volitelně spustí lazy načtení chybějících polí.\n *\n * Example: useDocument({ documentId: \"...\", model: \"products\", fields: [\"name\", \"image\"] })\n */\nexport const useDocument = ({ documentId, model, provider, fields, allFields }: UseDocumentParams): UseDocumentResult => {\n const documents = useContext(DataStoreDocumentsContext);\n const { dispatch } = useContext(DataStoreActionsContext);\n\n systemLog(\"useDocument\", \"USE DOCUMENT\", documentId);\n\n const documentResult = useMemo(() => {\n systemLog(\"useDocument\", \"Hledam v Documents\", fields);\n let missingFields: string[] = [];\n let result: Record<string, any> = {};\n\n if (documents[documentId]) {\n if (Array.isArray(fields) && fields.length > 0) {\n for (const field of fields) {\n if (!Object.prototype.hasOwnProperty.call(documents[documentId], field)) {\n missingFields.push(field);\n } else {\n result[field] = documents[documentId][field];\n }\n }\n } else {\n result = documents[documentId];\n }\n if (missingFields.length > 0) {\n systemLog(\"useDocument\", \"Musim jeste stahnout\", missingFields);\n dispatch(\"updateDocument\", {\n documentId: documentId,\n model,\n fields: missingFields,\n });\n }\n } else {\n result = {};\n }\n systemLog(\"useDocument\", JSON.stringify(result));\n return { document: result };\n }, [documentId, JSON.stringify(fields), documents[documentId]]);\n\n return documentResult;\n};\n","import { useContext, useEffect, useMemo, useState } from \"react\";\nimport { DataStoreActionsContext, DataStoreProvidersContext } from \"./DataStoreProvider\";\nimport { renderJSONTemplate } from \"./templates\";\nimport { systemLog } from \"./log\";\nimport { JSONType, Uuid } from \"./types\";\nimport { ProviderTypes } from \"./providerTypes\";\n\nexport interface UseProviderActionsResult {\n /** Schéma providera, pokud je dostupné. */\n schema?: Record<string, any>;\n /** Aktualizuje data providera pomocí výchozí update varianty. */\n update: (val: JSONType) => void;\n /** Aktualizuje položku/položky providera s volitelnou route variantou a parametry. */\n updateItem: (args: { params?: JSONType; data?: any; variant?: string; documentId?: Uuid }, callback?: (value: JSONType) => void) => void;\n /** Smaže položku/položky providera. */\n deleteItem: (args: { params: JSONType; data?: JSONType }, callback?: () => void) => void;\n /** Vytvoří novou položku providera. */\n createItem: (data: JSONType, callback?: (value: JSONType) => void) => void;\n}\n\n/**\n * Vrací action helpery pro známé provider id.\n */\nexport const useProviderActions = (providerId: Uuid, data?: JSONType): UseProviderActionsResult => {\n const providers = useContext(DataStoreProvidersContext);\n const { dispatch, presetProviders, updateProviderListeners } = useContext(DataStoreActionsContext);\n const providerKey = providerId as ProviderTypes;\n\n systemLog(\"usedp\", `${providerId}`);\n\n useEffect(() => {\n // Provider jiz je registrovany\n if (providers[providerId]) {\n systemLog(\"usedp\", \"Provider:\", providerId, \"existuje\");\n if (!providers[providerId].isPermanent) updateProviderListeners(providerId, 1);\n }\n // Provider jeste neni registrovany\n else {\n if (presetProviders[providerKey]) {\n const templateData =\n typeof data === \"object\" && data !== null && !Array.isArray(data) ? (data as Record<string, unknown>) : undefined;\n const prov = renderJSONTemplate(presetProviders[providerKey], templateData);\n systemLog(\"usedp\", \"Registruji novy provider:\", providerId);\n dispatch(\"registerProvider\", prov);\n } else {\n systemLog(\"usedp\", \"Neznamy provider \", providerId);\n }\n\n return () => {\n if (!presetProviders[providerKey]?.isPermanent && !providers[providerId]?.isPermanent) {\n dispatch(\"unregisterProvider\", providerId);\n }\n };\n }\n }, []);\n\n const update = (val: JSONType) => {\n systemLog(\"usedp\", \"UPDATUJI: \", providerId, \", data: \", val);\n dispatch(\"updateDataStore\", { id: providerId, data: val });\n };\n\n /**\n * Aktualizuje položku/položky providera s volitelnou route variantou a template parametry.\n */\n const updateItem = (\n { params, data, variant, documentId = undefined }: { params?: JSONType; data?: any; variant?: string; documentId?: Uuid },\n callback?: (value: JSONType) => void,\n ) => {\n dispatch(\"updateDataStore\", { id: providerId, variant, params, data, documentId }, callback);\n };\n\n const deleteItem = (\n { params, data }: { params: JSONType; data?: JSONType }, // Destructuring parameters\n callback?: () => void, // Optional callback function\n ) => {\n dispatch(\"deleteProviderItem\", { providerId, data, params }, callback);\n };\n\n const createItem = (data: JSONType, callback?: (value: JSONType) => void) => {\n systemLog(\"usedp\", \"createItem Prov. id:\", providerId);\n dispatch(\"createProviderItem\", { id: providerId, data }, callback);\n };\n return {\n schema: providers[providerId]?.schema,\n update,\n updateItem,\n deleteItem,\n createItem,\n };\n};\n","/**\n * Black: \\x1b[30m\n * Red: \\x1b[31m\n * Green: \\x1b[32m\n *Yellow: \\x1b[33m\n * Blue: \\x1b[34m\n * Magenta: \\x1b[35m\n * Cyan: \\x1b[36m\n * White: \\x1b[37m\n */\n\n\nexport const COLOR_WHITE = `\\x1b[37m%s\\x1b[0m`\nexport const COLOR_MAGENTA = `\\x1b[35m%s\\x1b[0m`\nexport const COLOR_BLUE = `\\x1b[34m%s\\x1b[0m`\nexport const COLOR_CYAN = `\\x1b[36m%s\\x1b[0m`\nexport const COLOR_GREEN = `\\x1b[32m%s\\x1b[0m`\nexport const COLOR_RED = `\\x1b[31m%s\\x1b[0m`\nexport const COLOR_ERROR = `\\x1b[31m%s\\x1b[0m`\nexport const COLOR_YELLOW = `\\x1b[33m%s\\x1b[0m`\nexport const COLOR_ORANGE = `\\x1b[38;5;208m%s\\x1b[0m`;\n\nexport const COLOR_WARNING = `\\x1b[33m%s\\x1b[0m`\n\nexport const COLOR_PROVIDER = COLOR_MAGENTA\nexport const COLOR_CONTEXT = COLOR_MAGENTA\nexport const COLOR_RENDER = COLOR_BLUE\nexport const COLOR_FUNCTION = COLOR_CYAN\nexport const COLOR_SCREEN = COLOR_GREEN\n\nexport const COLOR_SOCKET = COLOR_CYAN\nexport const COLOR_SOCKETS = COLOR_YELLOW\nexport const COLOR_AXIOS = COLOR_YELLOW\n\nexport const COLOR_APP = COLOR_BLUE\nexport const COLOR_DS = COLOR_MAGENTA\n"],"mappings":"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","names":["res","result","dayjs","axios","import_axios","isEqual","axios","ioSockets","prev","result","sockets","newProvs","import_react","params","import_react","import_react","data"]}
|