@mgarlik/datastore 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,2370 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ COLOR_APP: () => COLOR_APP,
34
+ COLOR_AXIOS: () => COLOR_AXIOS,
35
+ COLOR_BLUE: () => COLOR_BLUE,
36
+ COLOR_CONTEXT: () => COLOR_CONTEXT,
37
+ COLOR_CYAN: () => COLOR_CYAN,
38
+ COLOR_DS: () => COLOR_DS,
39
+ COLOR_ERROR: () => COLOR_ERROR,
40
+ COLOR_FUNCTION: () => COLOR_FUNCTION,
41
+ COLOR_GREEN: () => COLOR_GREEN,
42
+ COLOR_MAGENTA: () => COLOR_MAGENTA,
43
+ COLOR_ORANGE: () => COLOR_ORANGE,
44
+ COLOR_PROVIDER: () => COLOR_PROVIDER,
45
+ COLOR_RED: () => COLOR_RED,
46
+ COLOR_RENDER: () => COLOR_RENDER,
47
+ COLOR_SCREEN: () => COLOR_SCREEN,
48
+ COLOR_SOCKET: () => COLOR_SOCKET,
49
+ COLOR_SOCKETS: () => COLOR_SOCKETS,
50
+ COLOR_WARNING: () => COLOR_WARNING,
51
+ COLOR_WHITE: () => COLOR_WHITE,
52
+ COLOR_YELLOW: () => COLOR_YELLOW,
53
+ DataStoreActionsContext: () => DataStoreActionsContext,
54
+ DataStoreContext: () => DataStoreContext,
55
+ DataStoreDocumentsContext: () => DataStoreDocumentsContext,
56
+ DataStoreProvider: () => DataStoreProvider_default,
57
+ DataStoreProvidersContext: () => DataStoreProvidersContext,
58
+ DataStoreStableContext: () => DataStoreStableContext,
59
+ SQLite: () => SQLite2,
60
+ dataStoreFilterObject: () => dataStoreFilterObject,
61
+ doesObjectMatchFilter: () => doesObjectMatchFilter,
62
+ doesValueMatchFilter: () => doesValueMatchFilter,
63
+ filterDocuments: () => filterDocuments,
64
+ filterDocumentsAsync: () => filterDocumentsAsync,
65
+ getValueByRules: () => getValueByRules,
66
+ isUuid: () => isUuid,
67
+ recalculateObjectWithDocument: () => recalculateObjectWithDocument,
68
+ useDataProvider: () => useDataProvider,
69
+ useDataStore: () => useDataStore,
70
+ useDataStoreActions: () => useDataStoreActions,
71
+ useDocument: () => useDocument,
72
+ useDocuments: () => useDocuments,
73
+ useFilteredDocuments: () => useFilteredDocuments,
74
+ useProvider: () => useProvider,
75
+ useProviderActions: () => useProviderActions,
76
+ useProviderDocuments: () => useProviderDocuments,
77
+ uuid: () => uuid
78
+ });
79
+ module.exports = __toCommonJS(index_exports);
80
+
81
+ // src/DataStoreProvider.tsx
82
+ var import_react = require("react");
83
+
84
+ // src/log.ts
85
+ function systemLog(..._args) {
86
+ }
87
+ function systemLogError(...args) {
88
+ if (typeof console !== "undefined" && typeof console.error === "function") {
89
+ console.error(...args);
90
+ }
91
+ }
92
+
93
+ // src/handleSocketMessage.ts
94
+ var handleSocketMessage = (model, msg, dataProvider) => {
95
+ const { dispatch, updateDocument } = dataProvider;
96
+ const data = JSON.parse(msg);
97
+ switch (data.action) {
98
+ case "create":
99
+ systemLog("sockets", "[create] ", data.model, ", document: ", data.documentId);
100
+ dispatch?.("createDocument", { model: data.model, documentId: data.documentId, data: data.data });
101
+ break;
102
+ case "update":
103
+ systemLog("sockets", `[update] ${JSON.stringify(data)}`);
104
+ if (Array.isArray(data.data)) dispatch?.("updateDocuments", { model: data.model, documents: data.data });
105
+ else updateDocument?.({ model: data.model, documentId: data.documentId, data: data.data });
106
+ break;
107
+ case "delete":
108
+ systemLog("sockets", "[delete] model:", data.model, ", document: ", data.documentId);
109
+ dispatch?.("deleteDocument", { documentId: data.documentId, data: data.data });
110
+ break;
111
+ case "deleteItem":
112
+ systemLog("sockets", "DELETE ITEM ", model, ", model: ", data.model, ", data: ", data.data);
113
+ dispatch?.("removeItem", { model, documentId: data.data.id });
114
+ break;
115
+ default:
116
+ console.error(`Unknown command ${data.action}`);
117
+ }
118
+ };
119
+
120
+ // src/handleData.ts
121
+ var import_axios = __toESM(require("axios"), 1);
122
+
123
+ // src/utils.ts
124
+ var Crypto = __toESM(require("expo-crypto"), 1);
125
+
126
+ // src/dotPath.ts
127
+ function propToArray(prop) {
128
+ return prop.split(".").reduce((ret, el, index, list) => {
129
+ const last = index > 0 && list[index - 1];
130
+ if (last && /(?:^|[^\\])\\$/.test(last)) {
131
+ const prev = ret.pop() || "";
132
+ ret.push(prev.slice(0, -1) + "." + el);
133
+ } else {
134
+ ret.push(el);
135
+ }
136
+ return ret;
137
+ }, []);
138
+ }
139
+ function getValueByDotPath(obj, prop, value) {
140
+ prop = typeof prop === "number" ? propToArray(prop.toString()) : typeof prop === "string" ? propToArray(prop) : prop;
141
+ let currentObj = obj;
142
+ for (let i = 0; i < (prop?.length || 0); i += 1) {
143
+ if (currentObj === null || typeof currentObj !== "object") {
144
+ return value;
145
+ }
146
+ let head = prop[i];
147
+ if (Array.isArray(currentObj)) {
148
+ const results = [];
149
+ for (let j = 0; j < currentObj.length; j += 1) {
150
+ const result = getValueByDotPath(currentObj[j], prop.slice(i), value);
151
+ if (result !== value) {
152
+ results.push(result);
153
+ }
154
+ }
155
+ return results.flat();
156
+ }
157
+ if (head === "$end" && Array.isArray(currentObj)) {
158
+ head = currentObj.length - 1;
159
+ }
160
+ currentObj = currentObj[head];
161
+ }
162
+ if (typeof currentObj === "undefined") {
163
+ return value;
164
+ }
165
+ return currentObj;
166
+ }
167
+
168
+ // src/utils.ts
169
+ var import_dayjs = __toESM(require("dayjs"), 1);
170
+ function escapeRegExp(string) {
171
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
172
+ }
173
+ function recalculateObjectWithDocument(obj, document) {
174
+ if (obj === void 0) return;
175
+ if (Array.isArray(obj)) {
176
+ const results = [];
177
+ obj.forEach((item) => {
178
+ const result = recalculateObjectWithDocument(item, document);
179
+ if (result !== void 0) {
180
+ results.push(result);
181
+ }
182
+ });
183
+ return results;
184
+ } else if (typeof obj === "object") {
185
+ const keys = Object.keys(obj);
186
+ if (keys.some((item) => item.startsWith("$"))) {
187
+ if (keys.includes("$rule")) {
188
+ const res = doesObjectMatchFilter(document, obj["$rule"]);
189
+ if (res && obj["$value"] !== void 0) {
190
+ return recalculateObjectWithDocument(obj["$value"], document);
191
+ } else if (obj["$value"] === void 0) {
192
+ return res;
193
+ }
194
+ } else if (keys.includes("$or")) {
195
+ return obj["$or"].some((condition) => {
196
+ const res = doesObjectMatchFilter(document, condition);
197
+ if (typeof res === "boolean") return res;
198
+ const error = res;
199
+ return false;
200
+ });
201
+ } else if (keys.includes("$and")) {
202
+ return obj["$and"].every((condition) => {
203
+ const res = doesObjectMatchFilter(document, condition);
204
+ if (typeof res === "boolean") return res;
205
+ const error = res;
206
+ return false;
207
+ });
208
+ } else if (keys.includes("$min")) {
209
+ const res = recalculateObjectWithDocument(obj["$min"], document);
210
+ if (res.length === 0) return void 0;
211
+ return Math.min(...res);
212
+ } else if (keys.includes("$max")) {
213
+ const res = recalculateObjectWithDocument(obj["$max"], document);
214
+ if (res.length === 0) return void 0;
215
+ return Math.max(...res);
216
+ } else if (keys.includes("$sum")) {
217
+ const res = recalculateObjectWithDocument(obj["$sum"], document);
218
+ if (res) return res.reduce((acc, val) => acc + val, 0);
219
+ else return void 0;
220
+ } else if (keys.includes("$avg")) {
221
+ const res = recalculateObjectWithDocument(obj["$avg"], document);
222
+ const sum = res.reduce((acc, val) => acc + val, 0);
223
+ return sum / res.length;
224
+ } else if (keys.includes("$median")) {
225
+ const res = recalculateObjectWithDocument(obj["$median"], document);
226
+ const sortedArray = res.slice().sort((a, b) => a - b);
227
+ let median;
228
+ const middleIndex = Math.floor(sortedArray.length / 2);
229
+ if (sortedArray.length % 2 === 0) {
230
+ median = (sortedArray[middleIndex - 1] + sortedArray[middleIndex]) / 2;
231
+ } else {
232
+ median = sortedArray[middleIndex];
233
+ }
234
+ return median;
235
+ } else if (keys.includes("$val") || keys.includes("$value")) {
236
+ const res = recalculateObjectWithDocument(obj["$val"] || obj["$value"], document);
237
+ if (res.length === 1) return res[0];
238
+ return res;
239
+ } else if (keys.includes("$first")) {
240
+ const res = recalculateObjectWithDocument(obj["$first"], document);
241
+ return res?.[0];
242
+ } else if (keys.includes("$last")) {
243
+ const res = recalculateObjectWithDocument(obj["$last"], document);
244
+ return res?.[res.length - 1];
245
+ } else if (keys.includes("$concat")) {
246
+ const res = recalculateObjectWithDocument(obj["$concat"], document);
247
+ return res.join("");
248
+ } else if (keys.includes("$plus")) {
249
+ const res = recalculateObjectWithDocument(obj["$plus"], document);
250
+ return res.reduce((accumulator, currentValue) => accumulator + Number(currentValue), 0);
251
+ } else if (keys.includes("$minus")) {
252
+ const res = recalculateObjectWithDocument(obj["$minus"], document);
253
+ if (res?.length > 0) {
254
+ const first = res.shift();
255
+ return res.reduce((accumulator, currentValue) => accumulator - Number(currentValue), first);
256
+ }
257
+ return res;
258
+ } else if (keys.includes("$times")) {
259
+ const res = recalculateObjectWithDocument(obj["$times"], document);
260
+ return res.reduce((accumulator, currentValue) => accumulator * Number(currentValue), 1);
261
+ } else if (keys.includes("$div") || keys.includes("$divide")) {
262
+ const res = recalculateObjectWithDocument(obj["$div"] || obj["$divide"], document);
263
+ const first = res.shift();
264
+ return res.reduce((accumulator, currentValue) => accumulator / Number(currentValue), first);
265
+ } else if (keys.includes("$mod")) {
266
+ const res = recalculateObjectWithDocument(obj["$mod"], document);
267
+ return res[0] % res[1];
268
+ } else if (keys.includes("$round")) {
269
+ const res = recalculateObjectWithDocument(obj["$round"], document);
270
+ if (Array.isArray(res)) {
271
+ const decimals = res[1] || 0;
272
+ return Math.round(res[0] * Math.pow(10, decimals)) / Math.pow(10, decimals);
273
+ }
274
+ return Math.round(res);
275
+ } else if (keys.includes("$ceil")) {
276
+ const res = recalculateObjectWithDocument(obj["$ceil"], document);
277
+ if (Array.isArray(res)) {
278
+ const decimals = res[1] || 0;
279
+ return Math.ceil(res[0] * Math.pow(10, decimals)) / Math.pow(10, decimals);
280
+ }
281
+ return Math.floor(res);
282
+ } else if (keys.includes("$floor")) {
283
+ const res = recalculateObjectWithDocument(obj["$floor"], document);
284
+ return Math.floor(res);
285
+ } else if (keys.includes("$gt")) {
286
+ const res = recalculateObjectWithDocument(obj["$gt"], document);
287
+ return res[0] > res[1];
288
+ } else if (keys.includes("$gte")) {
289
+ const res = recalculateObjectWithDocument(obj["$gte"], document);
290
+ return res[0] >= res[1];
291
+ } else if (keys.includes("$lt")) {
292
+ const res = recalculateObjectWithDocument(obj["$lt"], document);
293
+ return res[0] < res[1];
294
+ } else if (keys.includes("$lte")) {
295
+ const res = recalculateObjectWithDocument(obj["$lte"], document);
296
+ return res[0] <= res[1];
297
+ } else if (keys.includes("$eq")) {
298
+ const res = recalculateObjectWithDocument(obj["$eq"], document);
299
+ return res[0] === res[1];
300
+ } else if (keys.includes("$neq")) {
301
+ const res = recalculateObjectWithDocument(obj["$neq"], document);
302
+ return res[0] !== res[1];
303
+ } else {
304
+ let data = getValueByDotPath(document, Object.keys(obj)[0].substring(1));
305
+ if (typeof obj === "object") {
306
+ data = getObjectValue(data, obj[Object.keys(obj)[0]], document);
307
+ }
308
+ return data;
309
+ }
310
+ } else {
311
+ const result = {};
312
+ keys.forEach((key) => result[key] = recalculateObjectWithDocument(getValueByDotPath(obj[key]), document));
313
+ return result;
314
+ }
315
+ } else {
316
+ if (typeof obj === "string" && obj.startsWith("$")) return getValueByDotPath(document, obj.substring(1));
317
+ else return obj;
318
+ }
319
+ }
320
+ function getObjectValue(ddd, obj, documents) {
321
+ const data = Array.isArray(ddd) ? ddd.length > 0 ? [...ddd] : void 0 : typeof ddd === "object" ? Object.keys(ddd).length > 0 ? { ...ddd } : void 0 : ddd;
322
+ if (!data) return void 0;
323
+ switch (Object.keys(obj)[0]) {
324
+ case "$pipe":
325
+ let result = data;
326
+ for (const action of obj.$pipe) {
327
+ if (result) result = getObjectValue(result, action, documents);
328
+ }
329
+ return result;
330
+ case "$filter":
331
+ const filterRes = data.map((d) => {
332
+ if (typeof d === "object") {
333
+ if (doesObjectMatchFilter(d, obj.$filter, documents)) return d;
334
+ } else {
335
+ if (doesValueMatchFilter(d, obj.$filter, documents)) return d;
336
+ }
337
+ }).filter((u) => u);
338
+ return filterRes;
339
+ case "$sort":
340
+ console.log("Sorting", obj.$sort);
341
+ if (typeof obj.$sort === "object") {
342
+ const rr = data.sortBy(obj.$sort);
343
+ return rr;
344
+ } else return obj.$sort === "ASC" ? data.sort((a, b) => a - b) : data.sort((a, b) => b - a);
345
+ case "$limit":
346
+ let limit = Array.isArray(obj.$limit) ? [...obj.$limit] : [obj.$limit];
347
+ if (limit.length === 1) limit.unshift(0);
348
+ else limit[1] = limit[1] + limit[0];
349
+ const res = data.slice(...limit);
350
+ return res;
351
+ case "$project":
352
+ if (!Array.isArray(obj.$project)) obj.$project = [obj.$project];
353
+ return data.map((o) => Object.fromEntries(Object.entries(o).filter(([key]) => obj.$project.includes(key))));
354
+ case "$extract":
355
+ const sres = data.map((o) => {
356
+ const res2 = getValueByDotPath(o, obj.$extract);
357
+ return res2;
358
+ });
359
+ return sres.flat();
360
+ // return sres
361
+ case "$extractValue":
362
+ const rv = data.map((o) => o[obj.$extract]);
363
+ if (rv.length === 1) return rv[0];
364
+ else return rv;
365
+ default:
366
+ }
367
+ return data;
368
+ }
369
+ function getValueByRules(data, document, { mode, ruleId }) {
370
+ if (Array.isArray(data)) {
371
+ const results = [];
372
+ data.forEach((item) => {
373
+ const res = getValueByRules(item, document, { mode, ruleId });
374
+ if (res !== void 0) results.push(res);
375
+ });
376
+ switch (mode) {
377
+ case "min":
378
+ if (results.length === 0) return void 0;
379
+ return Math.min(...results);
380
+ case "max":
381
+ return Math.max(...results);
382
+ case "array":
383
+ return results;
384
+ case "value":
385
+ default:
386
+ if (results.length === 1) return results[0];
387
+ return results;
388
+ }
389
+ }
390
+ if (typeof data === "object") {
391
+ if (data._value !== void 0) {
392
+ if (data._rules) {
393
+ if (Array.isArray(data._rules)) {
394
+ if (doesObjectMatchFilter(document, data._rules.find((rule) => rule._id === ruleId)._rules)) {
395
+ return data._value;
396
+ }
397
+ } else if (doesObjectMatchFilter(document, data._rules)) {
398
+ return data._value;
399
+ }
400
+ return void 0;
401
+ }
402
+ return data._value;
403
+ }
404
+ return data;
405
+ }
406
+ return data;
407
+ }
408
+ function doesValueMatchFilter(objVal, value, documents = {}) {
409
+ if (value === void 0) return true;
410
+ if (typeof value === "object") {
411
+ switch (Object.keys(value)[0]) {
412
+ case "$filter":
413
+ return doesObjectMatchFilter(
414
+ objVal.filter((o) => doesObjectMatchFilter(o, value.$filter, documents)),
415
+ value.$next
416
+ );
417
+ case "$or":
418
+ return value.$or.some((filter) => doesValueMatchFilter(objVal, filter));
419
+ case "$and":
420
+ return value.$and.every((filter) => doesValueMatchFilter(objVal, filter));
421
+ case "$not":
422
+ return !doesValueMatchFilter(objVal, value.$not);
423
+ case "$sum":
424
+ if (Array.isArray(objVal))
425
+ return doesValueMatchFilter(
426
+ objVal.reduce((acc, val) => acc + val, 0),
427
+ value.$sum
428
+ );
429
+ return doesValueMatchFilter(objVal, value.$sum);
430
+ case "$length":
431
+ if (Array.isArray(objVal)) return doesValueMatchFilter(objVal.length, value.$length);
432
+ return doesValueMatchFilter(1, value.$length);
433
+ case "$eq":
434
+ if (Array.isArray(objVal)) return objVal.some((o) => value.$eq === o);
435
+ return value.$eq === objVal;
436
+ case "$neq":
437
+ if (Array.isArray(objVal)) return objVal.some((o) => value.$neq !== o);
438
+ return value.$neq !== objVal;
439
+ case "$some":
440
+ if (Array.isArray(objVal)) return objVal.some((o) => doesValueMatchFilter(o, value.$some));
441
+ return doesValueMatchFilter(objVal, value.$some);
442
+ case "$nsome":
443
+ if (Array.isArray(objVal)) return objVal.some((o) => doesValueMatchFilter(o, value.$nsome));
444
+ return doesValueMatchFilter(objVal, value.$nsome);
445
+ case "$every":
446
+ if (Array.isArray(objVal)) return objVal.every((o) => doesValueMatchFilter(o, value.$every));
447
+ return doesValueMatchFilter(objVal, value.$every);
448
+ case "$nevery":
449
+ if (Array.isArray(objVal)) return objVal.every((o) => doesValueMatchFilter(o, value.$nevery));
450
+ return doesValueMatchFilter(objVal, value.$nevery);
451
+ case "$in":
452
+ value.$in = recalculateObjectWithDocument(value.$in, documents);
453
+ if (!Array.isArray(value.$in)) value.$in = [value.$in];
454
+ if (Array.isArray(objVal)) {
455
+ return objVal.some((o) => {
456
+ const result = value.$in.some((v) => {
457
+ const ret = doesValueMatchFilter(o, v);
458
+ return ret;
459
+ });
460
+ return result;
461
+ });
462
+ }
463
+ return value.$in.some((v) => doesValueMatchFilter(objVal, v));
464
+ // return value.$in.includes(objVal);
465
+ // MICHAL: Pokud bude spravne fungovat $in tak podle toho predelat $nin
466
+ case "$nin":
467
+ if (!Array.isArray(value.$nin)) value.$nin = [value.$nin];
468
+ if (Array.isArray(objVal)) return objVal.some((o) => !value.$nin.includes(o));
469
+ return !value.$nin.includes(objVal);
470
+ // Every in array
471
+ case "$ein":
472
+ if (!Array.isArray(value.$ein)) value.$ein = [value.$ein];
473
+ if (Array.isArray(objVal)) return objVal.every((o) => value.$ein.includes(o));
474
+ return value.$ein.includes(objVal);
475
+ // Not every in array
476
+ case "$nein":
477
+ if (!Array.isArray(value.$nein)) value.$nein = [value.$nein];
478
+ if (Array.isArray(objVal)) return objVal.every((o) => !value.$nein.includes(o));
479
+ return !value.$nein.includes(objVal);
480
+ // case "$include":
481
+ // case "$incl":
482
+ // return objVal?.includes(value.$include);
483
+ case "$gt":
484
+ return objVal > value.$gt;
485
+ case "$gte":
486
+ return objVal >= recalculateObjectWithDocument(value.$gte, documents);
487
+ case "$lt":
488
+ return objVal < value.$lt;
489
+ case "$lte":
490
+ return objVal <= value.$lte;
491
+ case "$regex":
492
+ const regex = new RegExp(escapeRegExp(value.$regex));
493
+ if (regex) return regex.test(objVal);
494
+ else return false;
495
+ case "$iregex":
496
+ const iregex = new RegExp(escapeRegExp(value.$iregex), "i");
497
+ if (iregex) return iregex.test(objVal);
498
+ else return false;
499
+ // Pomocne - lze resit regexem
500
+ case "$sw":
501
+ return value.$sw.startsWith(objVal);
502
+ case "$ew":
503
+ return value.$sw.endsWith(objVal);
504
+ case "$nsw":
505
+ return !value.$sw.startsWith(objVal);
506
+ case "$new":
507
+ return !value.$sw.endsWith(objVal);
508
+ default:
509
+ return doesObjectMatchFilter(objVal, value, documents);
510
+ }
511
+ } else {
512
+ if (Array.isArray(objVal)) return objVal.some((o) => value === o);
513
+ return objVal === value;
514
+ }
515
+ }
516
+ function doesObjectMatchFilter(obj, filter, documents = {}) {
517
+ if (!filter) return true;
518
+ if (Object.keys(filter)?.includes("$rule")) {
519
+ const result2 = doesObjectMatchFilter(obj, filter.$rule, documents);
520
+ if (result2 === true) {
521
+ return result2;
522
+ } else {
523
+ return filter.$message || false;
524
+ }
525
+ }
526
+ let error;
527
+ const result = Object.entries(filter).every(([key, value]) => {
528
+ let objVal;
529
+ if (key.startsWith("$")) {
530
+ switch (key) {
531
+ case "$date":
532
+ objVal = (0, import_dayjs.default)().format("YYYY-MM-DD");
533
+ break;
534
+ case "$time":
535
+ objVal = (0, import_dayjs.default)().format("HH:mm:ss");
536
+ break;
537
+ case "$datetime":
538
+ objVal = (0, import_dayjs.default)().format("YYYY-MM-DD HH:mm:ss");
539
+ break;
540
+ case "$day":
541
+ objVal = (0, import_dayjs.default)().day();
542
+ break;
543
+ case "$or":
544
+ return value.some((condition) => {
545
+ const res = doesObjectMatchFilter(obj, condition, documents);
546
+ if (typeof res === "boolean") return res;
547
+ error = res;
548
+ return false;
549
+ });
550
+ case "$and":
551
+ return value.every((condition) => {
552
+ const res = doesObjectMatchFilter(obj, condition, documents);
553
+ if (typeof res === "boolean") return res;
554
+ error = res;
555
+ return false;
556
+ });
557
+ case "$first":
558
+ if (Array.isArray(value)) {
559
+ for (const v of value) {
560
+ if (Object.keys(v)?.includes("$rule")) {
561
+ if (doesObjectMatchFilter(documents, v.$rule, documents)) {
562
+ return doesValueMatchFilter(obj, v.$value);
563
+ }
564
+ } else {
565
+ return doesValueMatchFilter(obj, v);
566
+ }
567
+ }
568
+ return false;
569
+ } else return doesObjectMatchFilter(obj, value, documents);
570
+ case "$last":
571
+ if (Array.isArray(value)) {
572
+ for (const v of value.reverse()) {
573
+ if (Object.keys(v)?.includes("$rule")) {
574
+ if (doesObjectMatchFilter(documents, v.$rule, documents)) {
575
+ return doesValueMatchFilter(obj, v.$value);
576
+ }
577
+ } else {
578
+ return doesValueMatchFilter(obj, v);
579
+ }
580
+ }
581
+ return false;
582
+ } else return doesObjectMatchFilter(obj, value, documents);
583
+ case "$gt":
584
+ case "$gte":
585
+ case "$lt":
586
+ case "$lte":
587
+ case "$eq":
588
+ case "$neq":
589
+ const resp = recalculateObjectWithDocument(filter, obj);
590
+ return resp;
591
+ default:
592
+ objVal = getValueByDotPath(obj, key.substring(1));
593
+ }
594
+ } else {
595
+ objVal = getValueByDotPath(obj, key);
596
+ }
597
+ if (key.endsWith("?") && objVal === void 0) return true;
598
+ if (objVal === void 0) return false;
599
+ const rrr = doesValueMatchFilter(objVal, value, documents);
600
+ return rrr;
601
+ });
602
+ return error || result;
603
+ }
604
+ var filterDocuments = (documents, filter) => {
605
+ if (!filter) return documents;
606
+ if (!documents) return void 0;
607
+ if (!Array.isArray(documents)) {
608
+ if (doesObjectMatchFilter(documents, filter)) return documents;
609
+ else return null;
610
+ } else return documents.filter((item) => doesObjectMatchFilter(item, filter));
611
+ };
612
+ var filterDocumentsAsync = async (documents, filter) => {
613
+ return new Promise((resolve) => {
614
+ const response = filterDocuments(documents, filter);
615
+ resolve(response);
616
+ });
617
+ };
618
+ var dataStoreFilterObject = (obj, filter) => {
619
+ if (!filter) return obj;
620
+ if (!obj) return void 0;
621
+ const result = {};
622
+ for (const key in obj) {
623
+ if (obj.hasOwnProperty(key)) {
624
+ if (doesObjectMatchFilter(obj[key], filter)) {
625
+ result[key] = obj[key];
626
+ }
627
+ }
628
+ }
629
+ return result;
630
+ };
631
+ function uuid() {
632
+ return Crypto.randomUUID();
633
+ }
634
+ function isUuid(val) {
635
+ if (typeof val !== "string") return false;
636
+ 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;
637
+ return uuidPattern.test(val);
638
+ }
639
+
640
+ // src/handleData.ts
641
+ var saveData = async ({
642
+ providerId,
643
+ newData,
644
+ dateUpdate,
645
+ SQLite: SQLite3
646
+ }) => {
647
+ console.time(`[SQL] saveData ${providerId}`);
648
+ const batchSize = 8e3;
649
+ const placeholders = "(?,?,?,?)";
650
+ var i = 0;
651
+ for (i = 0; i < newData.length / batchSize; i++) {
652
+ const values = [];
653
+ for (let j = 0; j < batchSize; j++) {
654
+ if (i * batchSize + j < newData.length) {
655
+ const { id, ...item } = newData[i * batchSize + j];
656
+ values.push(id, JSON.stringify(item), providerId, dateUpdate);
657
+ }
658
+ }
659
+ const placeholdersArray = Array.from({ length: Math.ceil(values.length / 4) }, () => placeholders).join(",");
660
+ if (placeholdersArray.length < 10) console.log("DATA TO UPDATE", JSON.stringify(values, null, 2));
661
+ const row = await SQLite3.query(`INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES ${placeholdersArray}`, values);
662
+ systemLog("axios", "saveData result: ", JSON.stringify(row));
663
+ }
664
+ console.timeEnd(`[SQL] saveData ${providerId}`);
665
+ };
666
+ var buildUri = ({
667
+ method,
668
+ dataSource,
669
+ variant
670
+ }) => {
671
+ if (dataSource.crud) {
672
+ if (method === "update" && dataSource.crud.updates) {
673
+ if (variant && dataSource.crud.updates[variant]) return dataSource.crud.updates[variant];
674
+ if (dataSource.crud[method]) return dataSource.crud[method];
675
+ const firstUpdateUri = Object.values(dataSource.crud.updates)[0];
676
+ if (firstUpdateUri) return firstUpdateUri;
677
+ }
678
+ const crudUri = dataSource.crud[method];
679
+ if (crudUri) return crudUri;
680
+ }
681
+ return dataSource.uri || `${dataSource.model || ""}/`;
682
+ };
683
+ var getData = async ({ id, dataSource, isPersisting, schema, SQLite: SQLite3, changeTime }) => {
684
+ if (dataSource) systemLog("axios", "GET Data Source: ", buildUri({ dataSource, method: "read" }));
685
+ else systemLog("axios", "No DataSource for ", id);
686
+ let persistedData = [];
687
+ var params = { ...dataSource?.params };
688
+ if (dataSource?.filter) params.filter = dataSource.filter;
689
+ if (dataSource?.select) params.select = dataSource.select;
690
+ try {
691
+ var newData;
692
+ if (dataSource?.data) {
693
+ newData = dataSource.data;
694
+ } else if (dataSource?.file) {
695
+ const response = await fetch(`${process.env.PUBLIC_URL}/${dataSource.file}`);
696
+ newData = await response.json();
697
+ } else {
698
+ if (changeTime) {
699
+ params.changeTime = changeTime;
700
+ } else if (isPersisting && SQLite3) {
701
+ console.time("Persisted Data");
702
+ const qDatum = await SQLite3.read(`SELECT * FROM documents WHERE model = '${id}' ORDER BY lastUpdate DESC`);
703
+ systemLog("axios", "SQLite.read Posledni datum update: ", qDatum[0]?.lastUpdate);
704
+ if (qDatum[0]?.lastUpdate) params.changeTime = qDatum[0].lastUpdate;
705
+ persistedData = qDatum.map((item) => ({ id: item.id, ...JSON.parse(item.data) }));
706
+ console.timeEnd("Persisted Data");
707
+ }
708
+ if (dataSource) {
709
+ systemLog("axios", "Params: ", JSON.stringify(params));
710
+ const axiosResponse = await import_axios.default.get(buildUri({ dataSource, method: "read" }), { params });
711
+ if (schema && !dataSource.readAllFields) {
712
+ if (Array.isArray(axiosResponse.data.data)) {
713
+ newData = [];
714
+ axiosResponse.data.data.forEach((element) => {
715
+ if (element._deleted) {
716
+ newData.push(element);
717
+ return;
718
+ }
719
+ var newRow = {};
720
+ Object.keys(schema).forEach((key) => {
721
+ if (typeof element === "object") {
722
+ newRow[key] = schema[key].source ? element[schema[key].source] : element[key];
723
+ } else {
724
+ newRow[key] = element;
725
+ }
726
+ });
727
+ if (!newRow.id && ["payments", "deliveries"].includes(id)) {
728
+ if (element.id) {
729
+ newRow.id = id + "-" + element.id;
730
+ } else {
731
+ newRow.id = uuid();
732
+ }
733
+ }
734
+ newData.push(newRow);
735
+ });
736
+ } else {
737
+ newData = {};
738
+ Object.keys(schema).forEach((key) => {
739
+ newData[key] = schema[key].source ? axiosResponse.data.data[schema[key].source] : axiosResponse.data.data[key];
740
+ });
741
+ }
742
+ } else {
743
+ newData = axiosResponse.data.data;
744
+ }
745
+ systemLog(
746
+ "axios",
747
+ `(SERVER TIME: ${axiosResponse.data.queryTime}) Data:`,
748
+ newData.length || "single",
749
+ "items, Size:",
750
+ JSON.stringify(newData).length,
751
+ "Bytes"
752
+ );
753
+ if (isPersisting && SQLite3) {
754
+ await saveData({ providerId: id, newData, SQLite: SQLite3, dateUpdate: axiosResponse.data.queryAt || (/* @__PURE__ */ new Date()).toISOString() });
755
+ }
756
+ }
757
+ }
758
+ if (Array.isArray(newData)) {
759
+ console.time("Maping");
760
+ const map = /* @__PURE__ */ new Map();
761
+ persistedData.forEach((item) => map.set(item.id, item));
762
+ newData.forEach((item) => map.set(item.id, item));
763
+ let updatedArray = [];
764
+ updatedArray.push(...map.values());
765
+ systemLog(
766
+ "axios",
767
+ `getData - Polozky ${id} persisted: ${persistedData.length}, newData: ${newData.length}, vysledek: ${updatedArray.length}`
768
+ );
769
+ console.timeEnd("Maping");
770
+ return updatedArray;
771
+ } else {
772
+ return newData || [];
773
+ }
774
+ } catch (e) {
775
+ console.error(`[AXIOS] CHYBA PRI NACITANI DAT Z: ${JSON.stringify(dataSource, null, 2)}
776
+ ${e}`);
777
+ return [];
778
+ }
779
+ };
780
+ var postData = async ({ dataSource, variant, schema, val }) => {
781
+ try {
782
+ systemLog("axios", "POST", buildUri({ dataSource, variant, method: "create" }), ", Data: ", JSON.stringify(val, null, 2));
783
+ const response = await import_axios.default.post(`${buildUri({ dataSource, variant, method: "create" })}`, val);
784
+ systemLog("axios", "POST Query Time: ", response.data.queryTime);
785
+ systemLog("axios", "POST Response Data: ", response.data.data.length, " B");
786
+ return response.data.data;
787
+ } catch (e) {
788
+ console.error(`POST DATA: ${e}`);
789
+ return e;
790
+ }
791
+ };
792
+ var patchData = async ({ dataSource, variant, data }) => {
793
+ try {
794
+ systemLog("axios", "PATCH: ", buildUri({ dataSource, variant, method: "update" }), ", Data: ", JSON.stringify(data, null, 2));
795
+ const response = await import_axios.default.patch(buildUri({ dataSource, variant, method: "update" }), data);
796
+ response.data?.queryTime && systemLog("axios", "PATCH Server Query Time: ", response.data.queryTime);
797
+ systemLog("axios", "PATCH Response Data: ", response.data.data.length, " Bytes");
798
+ return response.data.data;
799
+ } catch (e) {
800
+ console.error(`[AXIOS] PATCH DATA: ${e}`);
801
+ }
802
+ };
803
+ var deleteData = async ({ dataSource, data }) => {
804
+ try {
805
+ systemLog("axios", "deleteData DS:", dataSource);
806
+ const response = await import_axios.default.delete(`${buildUri({ dataSource, method: "delete" })}`, data);
807
+ response.data?.queryTime && systemLog("axios", "deleteData - Query Time: ", response.data.queryTime);
808
+ systemLog("axios", "deleteData Data response: ", response.data.data);
809
+ return response.data.data;
810
+ } catch (e) {
811
+ console.error(`DELETE DATA: ${e}`);
812
+ return e;
813
+ }
814
+ };
815
+
816
+ // src/DataStoreProvider.tsx
817
+ var import_socket = require("socket.io-client");
818
+ var import_axios2 = __toESM(require("axios"), 1);
819
+ var import_expo_localization = require("expo-localization");
820
+
821
+ // src/templates.ts
822
+ var _renderMyTemplate = (templateString, data) => {
823
+ return templateString.replace(/<%=(.*?)%>/g, (match, variable) => {
824
+ const key = variable.trim();
825
+ return data[key] !== void 0 ? String(data[key]) : match;
826
+ });
827
+ };
828
+ function renderJSONTemplate(val, data) {
829
+ if (val == null) return val;
830
+ if (!data) return val;
831
+ const valString = JSON.stringify(val, (_key, value) => {
832
+ if (value instanceof RegExp) {
833
+ return { __regex__: value.source };
834
+ }
835
+ return value;
836
+ });
837
+ const renderedOutput = _renderMyTemplate(valString, data);
838
+ const parsedObj = JSON.parse(renderedOutput, (_key, value) => {
839
+ if (typeof value === "object" && value !== null && Object.prototype.hasOwnProperty.call(value, "__regex__")) {
840
+ const regexValue = value.__regex__;
841
+ return new RegExp(regexValue);
842
+ }
843
+ return value;
844
+ });
845
+ return parsedObj;
846
+ }
847
+
848
+ // src/DataStoreProvider.tsx
849
+ var import_isEqual = __toESM(require("lodash/isEqual.js"), 1);
850
+
851
+ // src/database.ts
852
+ var SQL = __toESM(require("expo-sqlite"), 1);
853
+ var SQLite = class {
854
+ constructor(name) {
855
+ this.db = null;
856
+ this.dbName = name || "modelaz.db";
857
+ this.initDB();
858
+ }
859
+ async initDB() {
860
+ if (!this.db) {
861
+ try {
862
+ systemLog("sql", "[initDB]");
863
+ this.db = await SQL.openDatabaseAsync(this.dbName);
864
+ await this.createTables({
865
+ documents: "id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT"
866
+ // logs: "time TEXT PRIMARY KEY, module TEXT, message TEXT",
867
+ });
868
+ } catch (e) {
869
+ console.log("INITDB ERROR", e);
870
+ throw e;
871
+ }
872
+ }
873
+ }
874
+ async getDb() {
875
+ if (!this.db) {
876
+ await this.initDB();
877
+ }
878
+ if (!this.db) {
879
+ throw new Error("Database is not initialized");
880
+ }
881
+ return this.db;
882
+ }
883
+ async createTable(table, tableSchema) {
884
+ try {
885
+ systemLog("sql", "[createTable]", table);
886
+ const db = await this.getDb();
887
+ const result = await db.runAsync(`CREATE TABLE IF NOT EXISTS '${table}' (${tableSchema})`);
888
+ systemLog("sql", "[createTable] result: ", JSON.stringify(result));
889
+ return result;
890
+ } catch (e) {
891
+ systemLogError("sql", "[createTable]", e);
892
+ throw e;
893
+ }
894
+ }
895
+ async createTables(tables) {
896
+ try {
897
+ systemLog("sql", "[createTables]", tables);
898
+ const query = Object.entries(tables).reduce((acc, [table, schema]) => {
899
+ return acc + `CREATE TABLE IF NOT EXISTS '${table}' (${schema});`;
900
+ }, "");
901
+ const db = await this.getDb();
902
+ const result = await db.runAsync(query);
903
+ systemLog("sql", "[createTables] result: ", JSON.stringify(result));
904
+ return result;
905
+ } catch (e) {
906
+ systemLogError("sql", "[createTable]", e);
907
+ throw e;
908
+ }
909
+ }
910
+ /**
911
+ * Smazani starych logu
912
+ */
913
+ async deleteLogs() {
914
+ systemLog("sql", "[query] delete old Logs", this.db);
915
+ try {
916
+ const db = await this.getDb();
917
+ await db.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);
918
+ } catch (error) {
919
+ throw error;
920
+ }
921
+ }
922
+ async read(query, args) {
923
+ try {
924
+ systemLog("sql", "[read]", query);
925
+ const db = await this.getDb();
926
+ const result = args === void 0 ? await db.getAllAsync(query) : await db.getAllAsync(query, args);
927
+ systemLog("sql", "[read] result ", result.length);
928
+ return result;
929
+ } catch (e) {
930
+ systemLogError("sql", "[read]", e);
931
+ throw e;
932
+ }
933
+ }
934
+ async query(query, args) {
935
+ try {
936
+ systemLog("sql", "[query]->", query);
937
+ const db = await this.getDb();
938
+ const result = args === void 0 ? await db.getAllAsync(query) : await db.getAllAsync(query, args);
939
+ systemLog("sql", result);
940
+ return result;
941
+ } catch (error) {
942
+ console.error("INSERT ERROR", error);
943
+ systemLogError("sql", error);
944
+ throw error;
945
+ }
946
+ }
947
+ async dropTable(table) {
948
+ try {
949
+ systemLog("sql", "dropTable", table);
950
+ console.time("[SQL] dropTable");
951
+ const db = await this.getDb();
952
+ const result = await db.runAsync(`DROP TABLE ${table}`);
953
+ console.timeEnd("[SQL] dropTable");
954
+ return result;
955
+ } catch (error) {
956
+ throw error;
957
+ }
958
+ }
959
+ async emptyTable(table) {
960
+ try {
961
+ systemLog("sql", `[emptyTable]`, table);
962
+ const db = await this.getDb();
963
+ const result = await db.runAsync(`DELETE FROM '${table}'`);
964
+ systemLog("sql", "[emptyTable] result", result);
965
+ return result;
966
+ } catch (error) {
967
+ throw error;
968
+ }
969
+ }
970
+ async getTables() {
971
+ systemLog("sql", "Jdu zkusit nacist tabulky z ", JSON.stringify(this.dbName));
972
+ try {
973
+ const db = await this.getDb();
974
+ const result = await db.getAllAsync('SELECT name FROM sqlite_master WHERE type="table"');
975
+ systemLog("sql", "DB Result:", result);
976
+ return result;
977
+ } catch (error) {
978
+ throw error;
979
+ }
980
+ }
981
+ async resetDatabase() {
982
+ try {
983
+ systemLog("sql", "Reset database", this.dbName);
984
+ console.time("DELETING");
985
+ systemLog("sql", "Closing");
986
+ const db = await this.getDb();
987
+ await db.closeAsync();
988
+ systemLog("sql", "Deleting");
989
+ await SQL.deleteDatabaseAsync(this.dbName);
990
+ console.timeEnd("DELETING");
991
+ console.time("INIT");
992
+ this.db = null;
993
+ systemLog("sql", "Zacinam inicializovat databazi databaze");
994
+ await this.initDB();
995
+ systemLog("sql", "Inicializovana databaze");
996
+ console.timeEnd("INIT");
997
+ } catch (e) {
998
+ systemLogError("sql", "[resetDatabase]", e);
999
+ }
1000
+ }
1001
+ };
1002
+
1003
+ // src/DataStoreProvider.tsx
1004
+ var import_jsx_runtime = require("react/jsx-runtime");
1005
+ var SQLite2 = new SQLite("modelaz.db");
1006
+ var DataStoreContext = (0, import_react.createContext)({});
1007
+ var DataStoreDocumentsContext = (0, import_react.createContext)({});
1008
+ var DataStoreProvidersContext = (0, import_react.createContext)({});
1009
+ var DataStoreActionsContext = (0, import_react.createContext)({});
1010
+ var DataStoreStableContext = (0, import_react.createContext)({});
1011
+ var useDataStoreActions = () => (0, import_react.useContext)(DataStoreActionsContext);
1012
+ var useFilteredDocuments = (filter) => {
1013
+ const [activeFilter, setFilter] = (0, import_react.useState)(filter);
1014
+ const [data, setData] = (0, import_react.useState)();
1015
+ const documents = (0, import_react.useContext)(DataStoreDocumentsContext);
1016
+ (0, import_react.useEffect)(() => {
1017
+ setFilter(filter);
1018
+ }, [JSON.stringify(filter)]);
1019
+ (0, import_react.useEffect)(() => {
1020
+ console.time("Filter");
1021
+ if (activeFilter && documents && Object.keys(documents).length > 0 && Object.keys(activeFilter).length > 0) {
1022
+ const result = dataStoreFilterObject(documents, activeFilter);
1023
+ const dataArray = Object.keys(result).map((id) => ({
1024
+ id,
1025
+ ...result[id]
1026
+ }));
1027
+ if (!(0, import_isEqual.default)(data, dataArray)) setData(dataArray);
1028
+ }
1029
+ console.timeEnd("Filter");
1030
+ }, [activeFilter, documents]);
1031
+ return { documents: data || documents, setFilter };
1032
+ };
1033
+ var useDocuments = () => {
1034
+ const documents = (0, import_react.useContext)(DataStoreDocumentsContext);
1035
+ return { documents };
1036
+ };
1037
+ var useProviderDocuments = (provider, settings) => {
1038
+ const documents = (0, import_react.useContext)(DataStoreDocumentsContext);
1039
+ const providers = (0, import_react.useContext)(DataStoreProvidersContext);
1040
+ const docs = (0, import_react.useMemo)(() => {
1041
+ console.log("useProviderDocuments", provider);
1042
+ const d = {};
1043
+ providers[provider]?.data.forEach((id) => {
1044
+ if (settings?.filter && !doesObjectMatchFilter(documents[id], settings.filter)) return;
1045
+ let result = documents[id];
1046
+ if (providers[provider].depend) {
1047
+ result = recalculateObjectWithDocument(documents[id], documents[providers[provider].depend]);
1048
+ } else if (settings?.documentId) {
1049
+ result = recalculateObjectWithDocument(documents[id], documents[settings.documentId]);
1050
+ } else if (settings?.document) {
1051
+ result = recalculateObjectWithDocument(documents[id], settings.document);
1052
+ }
1053
+ d[id] = result;
1054
+ });
1055
+ return d;
1056
+ }, [providers[provider]?.lastUpdate, documents[providers[provider]?.depend], settings?.filter, settings?.documentId, settings?.document]);
1057
+ return { documents: docs };
1058
+ };
1059
+ var useProvider = (val) => {
1060
+ const providers = (0, import_react.useContext)(DataStoreProvidersContext);
1061
+ return providers[val];
1062
+ };
1063
+ var useDataStore = () => {
1064
+ const meta = (0, import_react.useContext)(DataStoreContext);
1065
+ const documents = (0, import_react.useContext)(DataStoreDocumentsContext);
1066
+ const providers = (0, import_react.useContext)(DataStoreProvidersContext);
1067
+ const actions = (0, import_react.useContext)(DataStoreActionsContext);
1068
+ return { ...meta, documents, providers, ...actions };
1069
+ };
1070
+ var modelTemplateIdMap = {
1071
+ brands: "brandId",
1072
+ payments: "paymentId",
1073
+ profiles: "profileId",
1074
+ user: "userId"
1075
+ };
1076
+ var buildDocumentTemplateParams = (model, documentId) => {
1077
+ const templateIdKey = modelTemplateIdMap[model] || `${model.replace(/s$/, "")}Id`;
1078
+ return {
1079
+ id: documentId,
1080
+ documentId,
1081
+ productId: documentId,
1082
+ [templateIdKey]: documentId
1083
+ };
1084
+ };
1085
+ var DataStoreProvider = ({ socketServer, restServer, usePersistentStorage = true, ...props }) => {
1086
+ const [isLive, setIsLive] = (0, import_react.useState)(false);
1087
+ const [isSynchronizing, setIsSynchronizing] = (0, import_react.useState)(true);
1088
+ const [sockets, setSockets] = (0, import_react.useState)({});
1089
+ const [providers, setProviders] = (0, import_react.useState)({});
1090
+ const [documents, setDocuments] = (0, import_react.useState)({});
1091
+ const externalProvidersRef = (0, import_react.useRef)({});
1092
+ const externalDocumentsRef = (0, import_react.useRef)({});
1093
+ const providerSubscribersRef = (0, import_react.useRef)(/* @__PURE__ */ new Map());
1094
+ const previousProviderUpdateIdsRef = (0, import_react.useRef)({});
1095
+ const [dispatcher, setDispatcher] = (0, import_react.useState)({ isBussy: false, actions: [] });
1096
+ const [counterProviders, setCounterProviders] = (0, import_react.useState)({});
1097
+ const [counterDocuments, setCounterDocuments] = (0, import_react.useState)({});
1098
+ const didInitialLiveSyncRef = (0, import_react.useRef)(false);
1099
+ (0, import_react.useEffect)(() => {
1100
+ if (!restServer) return;
1101
+ const localization = (0, import_expo_localization.getLocales)();
1102
+ import_axios2.default.defaults.baseURL = restServer;
1103
+ import_axios2.default.defaults.headers.common["Accept-Language"] = localization[0]?.languageCode;
1104
+ systemLog("dsp", "[INIT] Axios baseURL:", restServer);
1105
+ async function checkServer() {
1106
+ try {
1107
+ const response = await import_axios2.default.head("/", {
1108
+ timeout: 7e3,
1109
+ validateStatus: () => true
1110
+ });
1111
+ systemLog("dsp", "[INIT] Axios Success, status:", response.status);
1112
+ } catch (e) {
1113
+ if (import_axios2.default.isAxiosError(e)) {
1114
+ systemLog("dsp", "[INIT] Axios Error:", e.code ?? "UNKNOWN", e.message);
1115
+ } else {
1116
+ systemLog("dsp", "[INIT] Axios Error:", String(e));
1117
+ }
1118
+ } finally {
1119
+ systemLog("dsp", "[INIT] Axios check done");
1120
+ }
1121
+ }
1122
+ checkServer();
1123
+ }, [restServer]);
1124
+ const socketRoomHandlersRef = (0, import_react.useRef)({});
1125
+ const socketActionHandlersRef = (0, import_react.useRef)({});
1126
+ systemLog("dsp", "START");
1127
+ const socket = (0, import_react.useMemo)(() => (0, import_socket.io)(socketServer?.url, socketServer?.params), [socketServer?.url, socketServer.params]);
1128
+ const handleSocketConnect = (0, import_react.useCallback)(() => setIsLive(true), []);
1129
+ const handleSocketDisconnect = (0, import_react.useCallback)(() => setIsLive(false), []);
1130
+ const getSocketAuthToken = (0, import_react.useCallback)(() => {
1131
+ const authorizationHeader = import_axios2.default.defaults.headers.common["Authorization"];
1132
+ if (typeof authorizationHeader === "string" && authorizationHeader.length > 0) {
1133
+ return authorizationHeader.startsWith("Bearer ") ? authorizationHeader : `Bearer ${authorizationHeader}`;
1134
+ }
1135
+ return "Bearer ";
1136
+ }, []);
1137
+ const subscribeToProvider = (0, import_react.useCallback)((providerId, callback) => {
1138
+ const subscribersByProvider = providerSubscribersRef.current;
1139
+ const providerSubscribers = subscribersByProvider.get(providerId) || /* @__PURE__ */ new Set();
1140
+ providerSubscribers.add(callback);
1141
+ subscribersByProvider.set(providerId, providerSubscribers);
1142
+ return () => {
1143
+ const activeSubscribers = subscribersByProvider.get(providerId);
1144
+ if (!activeSubscribers) return;
1145
+ activeSubscribers.delete(callback);
1146
+ if (activeSubscribers.size === 0) subscribersByProvider.delete(providerId);
1147
+ };
1148
+ }, []);
1149
+ const getProviderLastUpdate = (0, import_react.useCallback)((providerId) => {
1150
+ return externalProvidersRef.current?.[providerId]?.lastUpdate?.id ?? null;
1151
+ }, []);
1152
+ const getExternalDocuments = (0, import_react.useCallback)(() => externalDocumentsRef.current, []);
1153
+ const getExternalProviders = (0, import_react.useCallback)(() => externalProvidersRef.current, []);
1154
+ (0, import_react.useEffect)(() => {
1155
+ externalProvidersRef.current = providers;
1156
+ const currentUpdateIds = {};
1157
+ Object.keys(providers).forEach((providerId) => {
1158
+ currentUpdateIds[providerId] = providers[providerId]?.lastUpdate?.id ?? null;
1159
+ if (previousProviderUpdateIdsRef.current[providerId] !== currentUpdateIds[providerId]) {
1160
+ const subscribers = providerSubscribersRef.current.get(providerId);
1161
+ subscribers?.forEach((callback) => callback());
1162
+ }
1163
+ });
1164
+ Object.keys(previousProviderUpdateIdsRef.current).forEach((providerId) => {
1165
+ if (!(providerId in currentUpdateIds)) {
1166
+ const subscribers = providerSubscribersRef.current.get(providerId);
1167
+ subscribers?.forEach((callback) => callback());
1168
+ }
1169
+ });
1170
+ previousProviderUpdateIdsRef.current = currentUpdateIds;
1171
+ }, [providers]);
1172
+ (0, import_react.useEffect)(() => {
1173
+ externalDocumentsRef.current = documents;
1174
+ }, [documents]);
1175
+ const persistDocument = (0, import_react.useCallback)(
1176
+ async ({
1177
+ documentId,
1178
+ model,
1179
+ data,
1180
+ lastUpdate = (/* @__PURE__ */ new Date()).toISOString()
1181
+ }) => {
1182
+ if (!usePersistentStorage) return;
1183
+ await SQLite2.query("INSERT OR REPLACE INTO documents (id, data, model, lastUpdate) VALUES (?, ?, ?, ?)", [
1184
+ documentId,
1185
+ JSON.stringify(data),
1186
+ model,
1187
+ lastUpdate
1188
+ ]);
1189
+ },
1190
+ [usePersistentStorage]
1191
+ );
1192
+ const removePersistedDocument = (0, import_react.useCallback)(
1193
+ async (documentId) => {
1194
+ if (!usePersistentStorage) return;
1195
+ await SQLite2.query("DELETE FROM documents WHERE id = ?", [documentId]);
1196
+ },
1197
+ [usePersistentStorage]
1198
+ );
1199
+ const synchronizeDataStore = (0, import_react.useCallback)(async () => {
1200
+ setIsSynchronizing(true);
1201
+ const stats = { processed: 0, updated: 0, failed: 0 };
1202
+ try {
1203
+ for (const key of Object.keys(providers)) {
1204
+ stats.processed++;
1205
+ try {
1206
+ const { data, lastUpdate, ...rest } = providers[key];
1207
+ const response = await getData({
1208
+ id: key,
1209
+ ...rest,
1210
+ changeTime: lastUpdate.time
1211
+ });
1212
+ if (response.length > 0) {
1213
+ const updateData = {};
1214
+ response.forEach((item) => {
1215
+ const { id, ...d } = item;
1216
+ updateData[id] = d;
1217
+ });
1218
+ await updateDocuments({ model: key, documents: updateData, mode: "replace" });
1219
+ stats.updated++;
1220
+ }
1221
+ } catch (e) {
1222
+ stats.failed++;
1223
+ console.error("[DSP] synchronizeDataStore provider error:", key, e);
1224
+ }
1225
+ }
1226
+ } finally {
1227
+ setIsSynchronizing(false);
1228
+ systemLog("dsp", "[synchronizeDataStore] Hotovo:", stats);
1229
+ }
1230
+ }, [providers]);
1231
+ (0, import_react.useEffect)(() => {
1232
+ if (isLive) {
1233
+ systemLog("dsp", "useEffect[isLive] Sockets: ", JSON.stringify(sockets, null, 2));
1234
+ const ss = Object.keys(sockets);
1235
+ systemLog("dsp", "useEffect[isLive] registruji", ss);
1236
+ if (ss?.length > 0) socket.emit("joinRooms", JSON.stringify(ss));
1237
+ if (!didInitialLiveSyncRef.current) {
1238
+ didInitialLiveSyncRef.current = true;
1239
+ systemLog("dsp", "useEffect[isLive] Zacinam synchronizovat");
1240
+ synchronizeDataStore();
1241
+ }
1242
+ } else {
1243
+ didInitialLiveSyncRef.current = false;
1244
+ }
1245
+ }, [isLive, socket, sockets, synchronizeDataStore]);
1246
+ const presetProviders = props.providers;
1247
+ (0, import_react.useEffect)(() => {
1248
+ socket.on("connect", handleSocketConnect);
1249
+ socket.on("disconnect", handleSocketDisconnect);
1250
+ return () => {
1251
+ socket.off("connect", handleSocketConnect);
1252
+ socket.off("disconnect", handleSocketDisconnect);
1253
+ };
1254
+ }, [socket, handleSocketConnect, handleSocketDisconnect]);
1255
+ const startSockets = (0, import_react.useCallback)(() => {
1256
+ socket.auth = {
1257
+ ...socket.auth || {},
1258
+ ...socketServer?.params?.auth || {},
1259
+ token: getSocketAuthToken()
1260
+ };
1261
+ systemLog("dsp", "PRIPOJUJI LIVE SOCKETS");
1262
+ socket.connect();
1263
+ }, [socket, socketServer?.params?.auth, getSocketAuthToken]);
1264
+ const stopSockets = (0, import_react.useCallback)(() => {
1265
+ systemLog("dsp", "[DSP] ODPOJUJI LIVE SOCKETS");
1266
+ socket.disconnect();
1267
+ }, [socket]);
1268
+ const resetDataStore = (0, import_react.useCallback)(async () => {
1269
+ console.time("[DSP] resetDataStore");
1270
+ if (usePersistentStorage) {
1271
+ await SQLite2.emptyTable("documents");
1272
+ }
1273
+ setSockets({});
1274
+ setProviders({});
1275
+ setDocuments({});
1276
+ setCounterProviders({});
1277
+ setCounterDocuments({});
1278
+ console.timeEnd("[DSP] resetDataStore");
1279
+ }, [usePersistentStorage]);
1280
+ const resetProvider = (0, import_react.useCallback)(
1281
+ async (provider) => {
1282
+ if (!usePersistentStorage) return;
1283
+ await SQLite2.query(`DELETE FROM documents WHERE model='${provider}'`);
1284
+ },
1285
+ [usePersistentStorage]
1286
+ );
1287
+ const initProvider = (0, import_react.useCallback)(
1288
+ async (id, data) => {
1289
+ const providerPreset = presetProviders[id];
1290
+ const prov = renderJSONTemplate({ ...providerPreset || {}, id }, data);
1291
+ systemLog("dsp", "[INIT PROVIDER] ", id, "(", data || "", ")");
1292
+ if (typeof prov !== "boolean") {
1293
+ return await registerProvider(prov);
1294
+ }
1295
+ return false;
1296
+ },
1297
+ [presetProviders]
1298
+ );
1299
+ const dispatch = (0, import_react.useCallback)((action, data, callback) => {
1300
+ systemLog("dsp", "[DSP] DISPATCH Ukladam akci", action, ",", data);
1301
+ setDispatcher((prev) => ({
1302
+ isBussy: prev.isBussy,
1303
+ actions: [...prev.actions, { action, data, callback }]
1304
+ }));
1305
+ }, []);
1306
+ (0, import_react.useEffect)(() => {
1307
+ async function processDispatcher() {
1308
+ if (dispatcher.actions.length > 0) {
1309
+ let result;
1310
+ systemLog("dsp", "[DSP] DISPATCHER Zpracovavam", dispatcher.actions[0].action);
1311
+ const timeCode = uuid();
1312
+ console.time(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
1313
+ setDispatcher((prev) => ({ ...prev, isBussy: true }));
1314
+ const item = dispatcher.actions[0];
1315
+ switch (item.action) {
1316
+ case "registerProvider":
1317
+ await registerProvider(item.data);
1318
+ break;
1319
+ case "unregisterProvider":
1320
+ await unregisterProvider(item.data);
1321
+ break;
1322
+ case "updateDataStore":
1323
+ result = await updateDataStore(item.data);
1324
+ break;
1325
+ case "createDocument":
1326
+ await createDocument(item.data);
1327
+ break;
1328
+ case "updateDocument":
1329
+ await updateDocument(item.data);
1330
+ break;
1331
+ case "updateDocuments":
1332
+ await updateDocuments(item.data);
1333
+ break;
1334
+ case "removeItem":
1335
+ break;
1336
+ case "deleteDocument":
1337
+ await deleteDocument(item.data);
1338
+ break;
1339
+ case "createProviderItem":
1340
+ result = await createProviderItem(item.data);
1341
+ break;
1342
+ case "deleteProviderItem":
1343
+ result = await deleteProviderItem(item.data);
1344
+ break;
1345
+ default:
1346
+ console.error("Unknown Action ", item.action, "Data: ", item.data);
1347
+ }
1348
+ item.callback && item.callback(result);
1349
+ setDispatcher((prev) => ({
1350
+ isBussy: false,
1351
+ actions: prev.actions.slice(1)
1352
+ }));
1353
+ console.timeEnd(`Dispatcher ${dispatcher.actions[0].action} ${timeCode}`);
1354
+ }
1355
+ }
1356
+ if (!dispatcher.isBussy) processDispatcher();
1357
+ }, [dispatcher]);
1358
+ const updateDocuments = (0, import_react.useCallback)(
1359
+ async ({
1360
+ model,
1361
+ documents: uDocuments,
1362
+ mode = "update"
1363
+ }) => {
1364
+ systemLog("dsp", "[DSP] updateDocuments updatuji model:", model, "Documents:", Object.keys(uDocuments).length);
1365
+ const modelProvider = providers[model];
1366
+ if (!modelProvider) {
1367
+ systemLog("dsp", "[DSP] updateDocuments - provider neexistuje:", model);
1368
+ return;
1369
+ }
1370
+ let data = [...modelProvider.data || []];
1371
+ const documentsToPersist = [];
1372
+ const documentIdsToDelete = [];
1373
+ setDocuments((prev) => {
1374
+ console.time("updateDocuments");
1375
+ let newDocs = { ...prev };
1376
+ if (Array.isArray(uDocuments)) {
1377
+ uDocuments.forEach((document) => {
1378
+ const { id, ...doc } = document;
1379
+ switch (mode) {
1380
+ case "replace":
1381
+ systemLog("dsp", "updateDocuments - replace", id);
1382
+ newDocs[id] = doc;
1383
+ if (doc._deleted) {
1384
+ data = data.filter((d) => d !== id);
1385
+ documentIdsToDelete.push(id);
1386
+ delete newDocs[id];
1387
+ } else {
1388
+ if (!data.includes(id)) data.push(id);
1389
+ documentsToPersist.push({ id, data: newDocs[id] });
1390
+ }
1391
+ break;
1392
+ case "update":
1393
+ default:
1394
+ if (!newDocs[id]) {
1395
+ systemLog("dsp", "updateDocuments - vytvarim", id);
1396
+ data.push(id);
1397
+ newDocs[id] = doc;
1398
+ documentsToPersist.push({ id, data: newDocs[id] });
1399
+ } else if (doc._deleted) {
1400
+ systemLog("dsp", "updateDocuments - mazu", id);
1401
+ data = data.filter((d) => d !== id);
1402
+ documentIdsToDelete.push(id);
1403
+ delete newDocs[id];
1404
+ } else {
1405
+ systemLog("dsp", "updateDocuments - updatuji", id);
1406
+ newDocs[id] = { ...newDocs[id], ...doc };
1407
+ documentsToPersist.push({ id, data: newDocs[id] });
1408
+ }
1409
+ break;
1410
+ }
1411
+ });
1412
+ } else {
1413
+ for (const key in uDocuments) {
1414
+ switch (mode) {
1415
+ case "replace":
1416
+ if (!newDocs[key]) {
1417
+ data.push(key);
1418
+ }
1419
+ if (uDocuments[key]._deleted) {
1420
+ data = data.filter((d) => d !== key);
1421
+ documentIdsToDelete.push(key);
1422
+ }
1423
+ newDocs[key] = uDocuments[key];
1424
+ if (uDocuments[key]._deleted) {
1425
+ delete newDocs[key];
1426
+ } else {
1427
+ documentsToPersist.push({ id: key, data: newDocs[key] });
1428
+ }
1429
+ break;
1430
+ case "update":
1431
+ default:
1432
+ if (!newDocs[key]) {
1433
+ data.push(key);
1434
+ newDocs[key] = uDocuments[key];
1435
+ documentsToPersist.push({ id: key, data: newDocs[key] });
1436
+ break;
1437
+ }
1438
+ if (uDocuments[key]._deleted) {
1439
+ data = data.filter((d) => d !== key);
1440
+ documentIdsToDelete.push(key);
1441
+ delete newDocs[key];
1442
+ } else {
1443
+ newDocs[key] = { ...newDocs[key], ...uDocuments[key] };
1444
+ documentsToPersist.push({ id: key, data: newDocs[key] });
1445
+ }
1446
+ break;
1447
+ }
1448
+ }
1449
+ }
1450
+ console.timeEnd("updateDocuments");
1451
+ return newDocs;
1452
+ });
1453
+ const unique = uuid();
1454
+ setProviders((prev) => {
1455
+ const newP = { ...prev };
1456
+ newP[model] = {
1457
+ ...newP[model],
1458
+ data,
1459
+ lastUpdate: { id: unique, time: /* @__PURE__ */ new Date() }
1460
+ };
1461
+ return newP;
1462
+ });
1463
+ if (modelProvider?.isPersisting && usePersistentStorage) {
1464
+ await Promise.all(documentsToPersist.map((item) => persistDocument({ documentId: item.id, model, data: item.data })));
1465
+ await Promise.all(documentIdsToDelete.map((documentId) => removePersistedDocument(documentId)));
1466
+ }
1467
+ },
1468
+ [providers, setDocuments, setProviders, persistDocument, removePersistedDocument]
1469
+ );
1470
+ const updateDocument = (0, import_react.useCallback)(
1471
+ async ({ documentId, model, fields, data: pData }) => {
1472
+ systemLog("dsp", "[updateDocument]:", documentId, ", model:", model);
1473
+ let data = pData;
1474
+ if (typeof pData === "function") data = pData(documents[documentId]);
1475
+ if (fields) {
1476
+ systemLog("dsp", "[updateDocument] Stahovani ", model, ", document: ", documentId, ", fields: ", fields);
1477
+ systemLog("dsp", "[updateDocument] Providers: ", Object.keys(providers));
1478
+ const provider = presetProviders[model];
1479
+ systemLog("dsp", "[updateDocument]", provider);
1480
+ let dP = renderJSONTemplate(presetProviders[model], buildDocumentTemplateParams(model, documentId));
1481
+ if (dP) {
1482
+ const dataFromSource = await getData({
1483
+ id: dP.id,
1484
+ dataSource: { ...dP.dataSource, params: { select: fields.join(" ") } },
1485
+ isPersisting: !!dP.isPersisting && usePersistentStorage,
1486
+ schema: dP.schema,
1487
+ SQLite: SQLite2
1488
+ });
1489
+ systemLog("dsp", "[updateDocument] DATA: ", dataFromSource);
1490
+ data = dataFromSource;
1491
+ }
1492
+ }
1493
+ if (data) {
1494
+ var listeningProviders = 0;
1495
+ var isProvidersUpdated = false;
1496
+ const rand = uuid();
1497
+ setProviders((prev) => {
1498
+ systemLog("dsp", "[updateDocument] setProviders", rand);
1499
+ console.time("[DSP UPDATE PROVIDERS INSIDE]");
1500
+ var newProviders = { ...prev };
1501
+ Object.keys(newProviders).forEach((key) => {
1502
+ const provider = newProviders[key];
1503
+ const providerNext = {
1504
+ ...provider,
1505
+ data: Array.isArray(provider?.data) ? [...provider.data] : []
1506
+ };
1507
+ var socketListeners = providerNext.dataSource?.socketListeners || [];
1508
+ if (socketListeners.length === 0) {
1509
+ if (providerNext.data.includes(documentId)) {
1510
+ if (!providerNext.dataSource?.filter || filterDocuments(data, providerNext.dataSource?.filter)) {
1511
+ systemLog("dsp", "[updateDocument] - zustava v Provider bez Listeners:", key);
1512
+ listeningProviders++;
1513
+ providerNext.lastUpdate = {
1514
+ id: uuid(),
1515
+ time: /* @__PURE__ */ new Date(),
1516
+ documentId
1517
+ };
1518
+ } else {
1519
+ providerNext.data = providerNext.data.filter((item) => item !== documentId);
1520
+ isProvidersUpdated = true;
1521
+ providerNext.lastUpdate = {
1522
+ id: uuid(),
1523
+ time: /* @__PURE__ */ new Date(),
1524
+ documentId
1525
+ };
1526
+ }
1527
+ }
1528
+ } else if (socketListeners.includes(model) || // socketListeners.includes(documentId) ||
1529
+ key === model) {
1530
+ if (!providerNext.dataSource.filter || filterDocuments(data, providerNext.dataSource.filter)) {
1531
+ listeningProviders++;
1532
+ providerNext.lastUpdate = {
1533
+ id: uuid(),
1534
+ time: /* @__PURE__ */ new Date(),
1535
+ documentId
1536
+ };
1537
+ if (!providerNext.data.includes(documentId)) {
1538
+ providerNext.data.push(documentId);
1539
+ isProvidersUpdated = true;
1540
+ }
1541
+ } else {
1542
+ if (providerNext.data.includes(documentId)) {
1543
+ systemLog("dsp", "[updateDocument] - mazu:", key);
1544
+ providerNext.data = providerNext.data.filter((item) => item !== documentId);
1545
+ isProvidersUpdated = true;
1546
+ providerNext.lastUpdate = {
1547
+ id: uuid(),
1548
+ time: /* @__PURE__ */ new Date(),
1549
+ documentId
1550
+ };
1551
+ }
1552
+ }
1553
+ }
1554
+ newProviders[key] = providerNext;
1555
+ });
1556
+ console.timeEnd("[DSP UPDATE PROVIDERS INSIDE]");
1557
+ console.time("[DSP UPDATE DOCUMENTS OUTSIDE]");
1558
+ setDocuments((prev2) => {
1559
+ console.time("[DSP UPDATE DOCUMENTS INSIDE]");
1560
+ if (prev2[documentId]) {
1561
+ if (listeningProviders === 0) {
1562
+ const newD = { ...prev2 };
1563
+ delete newD[documentId];
1564
+ console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
1565
+ return newD;
1566
+ } else {
1567
+ console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
1568
+ return {
1569
+ ...prev2,
1570
+ [documentId]: { ...prev2[documentId], ...data }
1571
+ };
1572
+ }
1573
+ } else if (listeningProviders > 0) {
1574
+ console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
1575
+ return { ...prev2, [documentId]: data };
1576
+ }
1577
+ console.timeEnd("[DSP UPDATE DOCUMENTS INSIDE]");
1578
+ return prev2;
1579
+ });
1580
+ console.timeEnd("[DSP UPDATE DOCUMENTS OUTSIDE]");
1581
+ systemLog("dsp", "OUTSIDE", documentId);
1582
+ return newProviders;
1583
+ });
1584
+ systemLog("dsp", "updateDocument - meni se pocet naslouchajicich Provideru ?", isProvidersUpdated ? "true" : "false");
1585
+ if (isProvidersUpdated) {
1586
+ systemLog("dsp", "updateDocument - menim counterDocuments pro", listeningProviders, "Providers");
1587
+ setCounterDocuments((prev) => {
1588
+ if (listeningProviders === 0) {
1589
+ const newD = { ...prev };
1590
+ delete newD[documentId];
1591
+ return newD;
1592
+ } else {
1593
+ return { ...prev, [documentId]: listeningProviders };
1594
+ }
1595
+ });
1596
+ } else {
1597
+ systemLog("dsp", "updateDocument - nemenim counterDocuments. Dokument zustava v", listeningProviders, "Providers");
1598
+ }
1599
+ if (providers[model]?.isPersisting && usePersistentStorage) {
1600
+ if (listeningProviders > 0) {
1601
+ await persistDocument({
1602
+ documentId,
1603
+ model,
1604
+ data: { ...documents[documentId], ...data }
1605
+ });
1606
+ } else {
1607
+ await removePersistedDocument(documentId);
1608
+ }
1609
+ }
1610
+ }
1611
+ },
1612
+ [documents, providers, setDocuments, setProviders, setCounterDocuments, persistDocument, removePersistedDocument]
1613
+ );
1614
+ const updateDataStore = (0, import_react.useCallback)(
1615
+ async ({
1616
+ id,
1617
+ documentId,
1618
+ params,
1619
+ variant,
1620
+ data
1621
+ }) => {
1622
+ if (!providers[id]) {
1623
+ systemLog("dsp", "[updateDataStore] Provider neexistuje:", id);
1624
+ return;
1625
+ }
1626
+ if (!providers[id].dataSource?.uri && !providers[id].dataSource?.crud) {
1627
+ if (!documents[documentId] && providers[id]?.autoCreate) {
1628
+ await createProviderItem({ id, data: { id: documentId, ...data } });
1629
+ } else updateDocument({ documentId, model: id, data });
1630
+ return true;
1631
+ }
1632
+ systemLog(
1633
+ "dsp",
1634
+ "[updateDataStore] Posilam patchData: ",
1635
+ id,
1636
+ ",\n params: ",
1637
+ JSON.stringify(params, null, 2),
1638
+ "\n data: ",
1639
+ JSON.stringify(data, null, 2)
1640
+ );
1641
+ const result = await patchData({
1642
+ dataSource: renderJSONTemplate(providers[id].dataSource, params),
1643
+ variant,
1644
+ data
1645
+ });
1646
+ if (typeof result === "object") {
1647
+ const { id: rDocumentId, ...document } = result;
1648
+ if (!isLive) {
1649
+ systemLog("dsp", "[updateDataStore] UPDATE DATA STORE RESULT: ", result);
1650
+ updateDocument({ documentId: rDocumentId, model: id, data: document });
1651
+ } else {
1652
+ systemLog("dsp", "[updateDataStore] Updatuje Socket");
1653
+ }
1654
+ }
1655
+ return result;
1656
+ },
1657
+ [providers, documents, isLive, updateDocument]
1658
+ );
1659
+ (0, import_react.useEffect)(() => {
1660
+ socketActionHandlersRef.current = { dispatch, updateDocument };
1661
+ }, [dispatch, updateDocument]);
1662
+ const createDocument = (0, import_react.useCallback)(
1663
+ async ({ model, documentId, data }) => {
1664
+ const newDocument = data;
1665
+ systemLog("dsp", `Registruji model ${model}, documentId ${documentId}, data: ${JSON.stringify(data)}`);
1666
+ var providerListenersCount = 0;
1667
+ Object.keys(providers).forEach((key) => {
1668
+ const provider = providers[key];
1669
+ var socketListeners = provider.dataSource?.socketListeners;
1670
+ if ((socketListeners?.includes(model) || key === model) && (!provider.dataSource?.filter || filterDocuments(data, provider.dataSource?.filter))) {
1671
+ systemLog("dsp", "[createDocument] Provider data: ", provider.data.length, " Bytes, documentId: ", documentId);
1672
+ if (!provider.data.includes(documentId)) {
1673
+ providerListenersCount++;
1674
+ setProviders((prev) => ({
1675
+ ...prev,
1676
+ [key]: {
1677
+ ...prev[key],
1678
+ data: [...prev[key].data, documentId],
1679
+ lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
1680
+ }
1681
+ }));
1682
+ }
1683
+ }
1684
+ });
1685
+ if (providerListenersCount > 0) {
1686
+ if (providers[model]?.isPersisting && usePersistentStorage) {
1687
+ await persistDocument({ documentId, model, data: newDocument });
1688
+ }
1689
+ setCounterDocuments((prev) => {
1690
+ const newC = { ...prev };
1691
+ if (newC[documentId]) {
1692
+ setDocuments((prev2) => ({
1693
+ ...prev2,
1694
+ [documentId]: { ...prev2[documentId], ...newDocument }
1695
+ }));
1696
+ newC[documentId] = prev[documentId] + providerListenersCount;
1697
+ } else {
1698
+ setDocuments((prev2) => ({ ...prev2, [documentId]: newDocument }));
1699
+ newC[documentId] = providerListenersCount;
1700
+ }
1701
+ return newC;
1702
+ });
1703
+ return { id: documentId, document: newDocument };
1704
+ } else return false;
1705
+ },
1706
+ [providers, setProviders, setCounterDocuments, setDocuments, persistDocument]
1707
+ );
1708
+ const deleteDocument = (0, import_react.useCallback)(
1709
+ async ({ documentId }) => {
1710
+ systemLog("dsp", `[deleteDocument] Mazu document ${documentId}}`);
1711
+ await removePersistedDocument(documentId);
1712
+ setDocuments((prev) => {
1713
+ const newDocs = { ...prev };
1714
+ systemLog("dsp", "[deleteDocument] MAZU ", documentId, " z ", newDocs);
1715
+ delete newDocs[documentId];
1716
+ systemLog("dsp", "[deleteDocument] NEW DOCS: ", newDocs);
1717
+ return newDocs;
1718
+ });
1719
+ setCounterDocuments((prev) => {
1720
+ const newC = { ...prev };
1721
+ delete newC[documentId];
1722
+ return newC;
1723
+ });
1724
+ setProviders((prev) => {
1725
+ var deletedCount = 0;
1726
+ const updatedDataObj = { ...prev };
1727
+ for (const key in updatedDataObj) {
1728
+ const initialLength = updatedDataObj[key].data.length;
1729
+ updatedDataObj[key].data = updatedDataObj[key].data.filter((element) => element !== documentId);
1730
+ updatedDataObj[key].lastUpdate = { id: uuid(), time: /* @__PURE__ */ new Date() };
1731
+ deletedCount += initialLength - updatedDataObj[key].data.length;
1732
+ if (initialLength - updatedDataObj[key].data.length > 0) systemLog("dsp", "[deleteDocument] Smazan zaznam...", deletedCount);
1733
+ }
1734
+ return updatedDataObj;
1735
+ });
1736
+ },
1737
+ [setDocuments, setCounterDocuments, setProviders, removePersistedDocument]
1738
+ );
1739
+ const createProviderItem = (0, import_react.useCallback)(
1740
+ async ({ id, data }) => {
1741
+ if (!providers[id]) {
1742
+ systemLog("dsp", "[createProviderItem] Provider neexistuje:", id);
1743
+ return;
1744
+ }
1745
+ if (!providers[id].dataSource) {
1746
+ const { id: dId, ...rData } = data;
1747
+ const documentId = dId || uuid();
1748
+ const result2 = createDocument({ model: id, documentId, data: rData });
1749
+ return result2;
1750
+ }
1751
+ const result = await postData({
1752
+ dataSource: providers[id].dataSource,
1753
+ schema: providers[id].schema,
1754
+ val: data
1755
+ });
1756
+ return result;
1757
+ },
1758
+ [providers, createDocument]
1759
+ );
1760
+ const deleteProviderItem = (0, import_react.useCallback)(
1761
+ async ({ providerId, data, params }) => {
1762
+ if (!providers[providerId]) {
1763
+ systemLog("dsp", "[deleteProviderItem] Provider neexistuje:", providerId);
1764
+ return;
1765
+ }
1766
+ const response = await deleteData({
1767
+ dataSource: renderJSONTemplate(providers[providerId].dataSource, params),
1768
+ // dataSource: providers[providerId].dataSource,
1769
+ data
1770
+ });
1771
+ return response;
1772
+ },
1773
+ [providers]
1774
+ );
1775
+ const registerProviderSockets = (0, import_react.useCallback)(
1776
+ (sockets2) => {
1777
+ if (sockets2) {
1778
+ systemLog("dsp", "[registerProviderSockets]", sockets2);
1779
+ var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1780
+ setSockets((prev) => {
1781
+ const newS = { ...prev };
1782
+ d.forEach((item) => {
1783
+ if (newS[item]) {
1784
+ newS[item].listeners = newS[item].listeners + 1;
1785
+ } else {
1786
+ const roomHandler = (msg) => {
1787
+ const { dispatch: currentDispatch, updateDocument: currentUpdateDocument } = socketActionHandlersRef.current;
1788
+ handleSocketMessage(item, msg, {
1789
+ dispatch: currentDispatch,
1790
+ updateDocument: currentUpdateDocument
1791
+ });
1792
+ };
1793
+ socketRoomHandlersRef.current[item] = roomHandler;
1794
+ newS[item] = { listeners: 1, data: [] };
1795
+ socket.emit("joinRoom", item);
1796
+ socket.on(item, roomHandler);
1797
+ }
1798
+ });
1799
+ return newS;
1800
+ });
1801
+ }
1802
+ },
1803
+ [setSockets, socket]
1804
+ );
1805
+ const unregisterProviderSockets = (0, import_react.useCallback)(
1806
+ (sockets2) => {
1807
+ systemLog("dsp", "[unregisterProviderSockets] Mazu sockety ", JSON.stringify(sockets2, null, 2));
1808
+ var removeSocketListeners = [];
1809
+ var d = Array.isArray(sockets2) ? sockets2 : [sockets2];
1810
+ setSockets((prev) => {
1811
+ const newS = { ...prev };
1812
+ d.forEach((item) => {
1813
+ if (newS[item]?.listeners <= 1) {
1814
+ removeSocketListeners.push(item);
1815
+ const roomHandler = socketRoomHandlersRef.current[item];
1816
+ if (roomHandler) {
1817
+ socket.off(item, roomHandler);
1818
+ delete socketRoomHandlersRef.current[item];
1819
+ }
1820
+ delete newS[item];
1821
+ } else if (newS[item]) newS[item].listeners = newS[item].listeners - 1;
1822
+ });
1823
+ if (removeSocketListeners.length > 0) {
1824
+ socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
1825
+ }
1826
+ return newS;
1827
+ });
1828
+ },
1829
+ [setSockets, socket]
1830
+ );
1831
+ const updateProviderListeners = (0, import_react.useCallback)(
1832
+ async (id, val) => {
1833
+ systemLog("dsp", `[updateProviderListeners] provider:`, id, "menim o", val);
1834
+ setCounterProviders((prev) => {
1835
+ if (!prev[id]) return prev;
1836
+ if (prev[id] + val > 0) {
1837
+ return {
1838
+ ...prev,
1839
+ [id]: prev[id] + val
1840
+ };
1841
+ } else {
1842
+ setProviders((prevP) => {
1843
+ systemLog("dsp", "[DSP] UPDATE PROVIDER - mazu sockets ", id);
1844
+ setSockets((prevS) => {
1845
+ var removeSocketListeners = [];
1846
+ const newS = { ...prevS };
1847
+ const providerSocketListeners = prevP[id].dataSource?.socketListeners || [];
1848
+ providerSocketListeners.forEach((socketName) => {
1849
+ if (!newS[socketName]) return;
1850
+ if (newS[socketName].listeners + val <= 0) {
1851
+ const roomHandler = socketRoomHandlersRef.current[socketName];
1852
+ if (roomHandler) {
1853
+ socket.off(socketName, roomHandler);
1854
+ delete socketRoomHandlersRef.current[socketName];
1855
+ }
1856
+ delete newS[socketName];
1857
+ removeSocketListeners.push(socketName);
1858
+ } else {
1859
+ newS[socketName].listeners = newS[socketName].listeners + val;
1860
+ }
1861
+ });
1862
+ if (removeSocketListeners.length > 0) {
1863
+ socket.emit("leaveRooms", JSON.stringify(removeSocketListeners));
1864
+ }
1865
+ return newS;
1866
+ });
1867
+ setCounterDocuments((prevC) => {
1868
+ const newC = { ...prevC };
1869
+ prevP[id].data.forEach((document) => {
1870
+ if (newC[document] + val <= 0) {
1871
+ setDocuments((prev2) => {
1872
+ const newD = { ...prev2 };
1873
+ delete newD[document];
1874
+ return newD;
1875
+ });
1876
+ delete newC[document];
1877
+ } else {
1878
+ newC[document] = newC[document] + val;
1879
+ }
1880
+ });
1881
+ return newC;
1882
+ });
1883
+ const newP = { ...prevP };
1884
+ delete newP[id];
1885
+ return newP;
1886
+ });
1887
+ const newProvs = { ...prev };
1888
+ delete newProvs[id];
1889
+ return newProvs;
1890
+ }
1891
+ });
1892
+ },
1893
+ [setCounterProviders, setProviders, setCounterDocuments, setDocuments, socket]
1894
+ );
1895
+ const registerProvider = (0, import_react.useCallback)(
1896
+ async (newItem) => {
1897
+ systemLog("dsp", "[registerProvider]", newItem.id);
1898
+ let result;
1899
+ const { id, ...provider } = newItem;
1900
+ if (providers[id]) {
1901
+ setCounterProviders((prev) => {
1902
+ systemLog("dsp", "[registerProvider] Pouze navysuji ", id, " ", prev[id], " -> ", prev[id] + 1);
1903
+ return {
1904
+ ...prev,
1905
+ [id]: prev[id] + 1
1906
+ };
1907
+ });
1908
+ result = providers[id];
1909
+ } else {
1910
+ const dataFromSource = await getData({
1911
+ schema: newItem.schema,
1912
+ dataSource: newItem.dataSource || {},
1913
+ id: newItem.id,
1914
+ isPersisting: !!newItem.isPersisting && usePersistentStorage,
1915
+ SQLite: SQLite2
1916
+ });
1917
+ console.time(`[DSP] VYTVARENI PROVIDERA ${id}`);
1918
+ var dataList = [];
1919
+ var items = {};
1920
+ const dataS = Array.isArray(dataFromSource) ? dataFromSource : [dataFromSource];
1921
+ dataS.forEach((item) => {
1922
+ if (!item) return;
1923
+ const { id: itId, ...data } = item;
1924
+ const id2 = itId || uuid();
1925
+ dataList.push(id2);
1926
+ if (documents[id2]) {
1927
+ items[id2] = {
1928
+ ...documents[id2],
1929
+ ...data
1930
+ };
1931
+ } else {
1932
+ items[id2] = data;
1933
+ }
1934
+ });
1935
+ setCounterDocuments((prev) => {
1936
+ {
1937
+ const newC = { ...prev };
1938
+ dataList.forEach((i) => {
1939
+ if (newC[i]) {
1940
+ newC[i] = newC[i] + 1;
1941
+ } else {
1942
+ newC[i] = 1;
1943
+ }
1944
+ });
1945
+ return newC;
1946
+ }
1947
+ });
1948
+ if (Object.keys(items).length > 0)
1949
+ setDocuments((prev) => ({ ...prev, ...items }));
1950
+ result = {
1951
+ ...provider,
1952
+ data: dataList,
1953
+ lastUpdate: { id: uuid(), time: /* @__PURE__ */ new Date() }
1954
+ };
1955
+ setProviders((prev) => ({
1956
+ ...prev,
1957
+ [id]: result
1958
+ }));
1959
+ setCounterProviders((prev) => ({
1960
+ ...prev,
1961
+ [id]: 1
1962
+ }));
1963
+ dataList;
1964
+ if (provider.dataSource?.socketListeners) registerProviderSockets(provider.dataSource.socketListeners);
1965
+ console.timeEnd(`[DSP] VYTVARENI PROVIDERA ${id}`);
1966
+ }
1967
+ return result;
1968
+ },
1969
+ [providers, SQLite2, documents, setDocuments, setProviders, setCounterProviders, registerProviderSockets]
1970
+ );
1971
+ const unregisterProvider = (0, import_react.useCallback)(
1972
+ async (itemId) => {
1973
+ setCounterProviders((prev) => {
1974
+ if (prev[itemId]) {
1975
+ if (prev[itemId] > 1) {
1976
+ systemLog("dsp", "[unregisterProvider] snizuji ", itemId, "z ", prev[itemId], " na ", prev[itemId] - 1);
1977
+ return {
1978
+ ...prev,
1979
+ [itemId]: prev[itemId] - 1
1980
+ };
1981
+ } else {
1982
+ systemLog("dsp", "[unregisterProvider] mazu ", Object.keys(providers));
1983
+ unregisterProviderSockets(providers[itemId]?.dataSource.socketListeners);
1984
+ systemLog("dsp", "[unregisterProvider] Mazu dokumenty providera ", itemId);
1985
+ setCounterDocuments((cd) => {
1986
+ const newC = { ...cd };
1987
+ const deleteDocumentIds = [];
1988
+ providers[itemId].data.forEach((docId) => {
1989
+ if (newC[docId] <= 1) {
1990
+ deleteDocumentIds.push(docId);
1991
+ delete newC[docId];
1992
+ } else newC[docId] = newC[docId] - 1;
1993
+ });
1994
+ if (deleteDocumentIds.length > 0) {
1995
+ setDocuments((pd) => {
1996
+ const newD = { ...pd };
1997
+ deleteDocumentIds.forEach((docId) => {
1998
+ delete newD[docId];
1999
+ });
2000
+ return newD;
2001
+ });
2002
+ }
2003
+ return newC;
2004
+ });
2005
+ setProviders((pp) => {
2006
+ const newProvs2 = { ...pp };
2007
+ delete newProvs2[itemId];
2008
+ return newProvs2;
2009
+ });
2010
+ const newProvs = { ...prev };
2011
+ delete newProvs[itemId];
2012
+ return newProvs;
2013
+ }
2014
+ } else return prev;
2015
+ });
2016
+ },
2017
+ [setCounterProviders, providers, setCounterDocuments, setDocuments, setProviders, unregisterProviderSockets]
2018
+ );
2019
+ const actionsValue = (0, import_react.useMemo)(
2020
+ () => ({
2021
+ dispatch,
2022
+ initProvider,
2023
+ resetProvider,
2024
+ registerProvider,
2025
+ unregisterProvider,
2026
+ updateProviderListeners,
2027
+ resetDataStore,
2028
+ startSockets,
2029
+ stopSockets,
2030
+ registerProviderSockets,
2031
+ unregisterProviderSockets,
2032
+ updateDocuments,
2033
+ presetProviders
2034
+ }),
2035
+ [
2036
+ dispatch,
2037
+ initProvider,
2038
+ resetProvider,
2039
+ registerProvider,
2040
+ unregisterProvider,
2041
+ updateProviderListeners,
2042
+ resetDataStore,
2043
+ startSockets,
2044
+ stopSockets,
2045
+ registerProviderSockets,
2046
+ unregisterProviderSockets,
2047
+ updateDocuments,
2048
+ presetProviders
2049
+ ]
2050
+ );
2051
+ const metaValue = (0, import_react.useMemo)(
2052
+ () => ({ isLive, isSynchronizing, sockets, counterProviders, counterDocuments }),
2053
+ [isLive, isSynchronizing, sockets, counterProviders, counterDocuments]
2054
+ );
2055
+ const stableValue = (0, import_react.useMemo)(
2056
+ () => ({
2057
+ dispatch,
2058
+ presetProviders,
2059
+ updateProviderListeners,
2060
+ subscribeToProvider,
2061
+ getProviderLastUpdate,
2062
+ getExternalDocuments,
2063
+ getExternalProviders
2064
+ }),
2065
+ [
2066
+ dispatch,
2067
+ presetProviders,
2068
+ updateProviderListeners,
2069
+ subscribeToProvider,
2070
+ getProviderLastUpdate,
2071
+ getExternalDocuments,
2072
+ getExternalProviders
2073
+ ]
2074
+ );
2075
+ systemLog("dsp", "END");
2076
+ return (
2077
+ // <DatabaseProvider>
2078
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreStableContext.Provider, { value: stableValue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreActionsContext.Provider, { value: actionsValue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreProvidersContext.Provider, { value: providers, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreDocumentsContext.Provider, { value: documents, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DataStoreContext.Provider, { value: metaValue, children: props.children }) }) }) }) })
2079
+ );
2080
+ };
2081
+ var DataStoreProvider_default = DataStoreProvider;
2082
+
2083
+ // src/useDataProvider.tsx
2084
+ var import_react2 = require("react");
2085
+ var useDataProvider = (id, params, dataFilter, settings) => {
2086
+ const [providerId, setProviderId] = (0, import_react2.useState)(null);
2087
+ const [filter, setFilter] = (0, import_react2.useState)(null);
2088
+ const {
2089
+ dispatch,
2090
+ presetProviders,
2091
+ updateProviderListeners,
2092
+ subscribeToProvider,
2093
+ getProviderLastUpdate,
2094
+ getExternalDocuments,
2095
+ getExternalProviders
2096
+ } = (0, import_react2.useContext)(DataStoreStableContext);
2097
+ const providerVersion = (0, import_react2.useSyncExternalStore)(
2098
+ (0, import_react2.useCallback)(
2099
+ (onStoreChange) => {
2100
+ if (!providerId) return () => {
2101
+ };
2102
+ return subscribeToProvider(providerId, onStoreChange);
2103
+ },
2104
+ [providerId, subscribeToProvider]
2105
+ ),
2106
+ (0, import_react2.useCallback)(() => {
2107
+ if (!providerId) return null;
2108
+ return getProviderLastUpdate(providerId);
2109
+ }, [providerId, getProviderLastUpdate]),
2110
+ () => null
2111
+ );
2112
+ systemLog("usedp", `${id} - ${providerId}`);
2113
+ (0, import_react2.useEffect)(() => {
2114
+ if (id === void 0 || typeof id === "boolean" && id === false) return;
2115
+ var retId;
2116
+ const currentProviders = getExternalProviders();
2117
+ if (dataFilter) setFilter(dataFilter);
2118
+ if (typeof id === "object") {
2119
+ const prov = renderJSONTemplate(id, params ?? void 0);
2120
+ setProviderId(prov.id);
2121
+ retId = prov.id;
2122
+ dispatch("registerProvider", prov);
2123
+ } else {
2124
+ if (presetProviders[id]) {
2125
+ const prov = renderJSONTemplate(presetProviders[id], params ?? void 0);
2126
+ setProviderId(prov.id);
2127
+ retId = prov.id;
2128
+ if (currentProviders[prov.id]) {
2129
+ systemLog("usedp", "Provider:", prov.id, "existuje");
2130
+ if (!currentProviders[prov.id]?.isPermanent) updateProviderListeners(prov.id, 1);
2131
+ } else {
2132
+ systemLog("usedp", "Registruji novy provider:", prov.id);
2133
+ dispatch("registerProvider", prov);
2134
+ }
2135
+ } else {
2136
+ systemLog("usedp", "Neznamy provider ", id, params, dataFilter, settings);
2137
+ }
2138
+ }
2139
+ return () => {
2140
+ const activeProviders = getExternalProviders();
2141
+ const presetProvider = presetProviders[retId];
2142
+ if (!presetProvider?.isPermanent && !activeProviders[retId]?.isPermanent) {
2143
+ systemLog("usedp", "Unregister Provider: ", retId, "-", activeProviders[retId]);
2144
+ dispatch("unregisterProvider", retId);
2145
+ }
2146
+ };
2147
+ }, []);
2148
+ const update = (val) => {
2149
+ systemLog("usedp", "UPDATUJI: ", providerId, ", data: ", val);
2150
+ dispatch("updateDataStore", { id: providerId, data: val });
2151
+ };
2152
+ const updateItem = ({ params: params2, data, variant, documentId = void 0 }, callback) => {
2153
+ systemLog("usedp", "UPDATUJI:", providerId, ", variant:", variant, ", documentId: ", documentId, ", params:", params2, ", data:", data);
2154
+ dispatch("updateDataStore", { id: providerId, variant, params: params2, data, documentId }, callback);
2155
+ };
2156
+ const deleteItem = ({ params: params2, data }, callback) => {
2157
+ systemLog("usedp", "DELETE FROM:", providerId, ", params:", params2, "data:", data);
2158
+ dispatch("deleteProviderItem", { providerId, data, params: params2 }, callback);
2159
+ };
2160
+ const createItem = (data, callback) => {
2161
+ dispatch("createProviderItem", { id, data }, callback);
2162
+ };
2163
+ const provider = (0, import_react2.useMemo)(() => {
2164
+ systemLog("usedp", "Vytvoreni dat: ", filter);
2165
+ const providers = getExternalProviders();
2166
+ const documents = getExternalDocuments();
2167
+ if (!providerId || !providers[providerId]) {
2168
+ return {
2169
+ data: [],
2170
+ schema: void 0
2171
+ };
2172
+ }
2173
+ let docs = [];
2174
+ providers[providerId]?.data.forEach((docId) => {
2175
+ let dData = documents[docId];
2176
+ if (providers[providerId].depend) {
2177
+ dData = recalculateObjectWithDocument(documents[docId], documents[providers[providerId].depend]);
2178
+ } else if (settings?.documentId) {
2179
+ dData = recalculateObjectWithDocument(documents[docId], documents[settings.documentId]);
2180
+ } else if (settings?.document) {
2181
+ dData = recalculateObjectWithDocument(documents[docId], settings.document);
2182
+ }
2183
+ docs.push({
2184
+ id: docId,
2185
+ ...dData
2186
+ });
2187
+ });
2188
+ systemLog("usedp", "KonecVytvoreni dat: ", providerId);
2189
+ if (filter) {
2190
+ systemLog("usedp", "Jdu filterovat: ", JSON.stringify(filter));
2191
+ docs = filterDocuments(docs, filter);
2192
+ systemLog("usedp", "Konec filteru: ");
2193
+ }
2194
+ return {
2195
+ ...providers[providerId],
2196
+ data: docs
2197
+ };
2198
+ }, [providerId, providerVersion, settings?.document, settings?.documentId, getExternalProviders, getExternalDocuments]);
2199
+ systemLog("usedp", `${providerId} END`);
2200
+ return {
2201
+ // provider,
2202
+ documents: provider.data,
2203
+ schema: provider.schema,
2204
+ // dispatch,
2205
+ update,
2206
+ updateItem,
2207
+ deleteItem,
2208
+ createItem
2209
+ };
2210
+ };
2211
+
2212
+ // src/useDocument.ts
2213
+ var import_react3 = require("react");
2214
+ var useDocument = ({ documentId, model, provider, fields, allFields }) => {
2215
+ const documents = (0, import_react3.useContext)(DataStoreDocumentsContext);
2216
+ const { dispatch } = (0, import_react3.useContext)(DataStoreActionsContext);
2217
+ systemLog("useDocument", "USE DOCUMENT", documentId);
2218
+ const documentResult = (0, import_react3.useMemo)(() => {
2219
+ systemLog("useDocument", "Hledam v Documents", fields);
2220
+ let missingFields = [];
2221
+ let result = {};
2222
+ if (documents[documentId]) {
2223
+ if (Array.isArray(fields) && fields.length > 0) {
2224
+ for (const field of fields) {
2225
+ if (!Object.prototype.hasOwnProperty.call(documents[documentId], field)) {
2226
+ missingFields.push(field);
2227
+ } else {
2228
+ result[field] = documents[documentId][field];
2229
+ }
2230
+ }
2231
+ } else {
2232
+ result = documents[documentId];
2233
+ }
2234
+ if (missingFields.length > 0) {
2235
+ systemLog("useDocument", "Musim jeste stahnout", missingFields);
2236
+ dispatch("updateDocument", {
2237
+ documentId,
2238
+ model,
2239
+ fields: missingFields
2240
+ });
2241
+ }
2242
+ } else {
2243
+ result = {};
2244
+ }
2245
+ systemLog("useDocument", JSON.stringify(result));
2246
+ return { document: result };
2247
+ }, [documentId, JSON.stringify(fields), documents[documentId]]);
2248
+ return documentResult;
2249
+ };
2250
+
2251
+ // src/useProviderActions.tsx
2252
+ var import_react4 = require("react");
2253
+ var useProviderActions = (providerId, data) => {
2254
+ const providers = (0, import_react4.useContext)(DataStoreProvidersContext);
2255
+ const { dispatch, presetProviders, updateProviderListeners } = (0, import_react4.useContext)(DataStoreActionsContext);
2256
+ const providerKey = providerId;
2257
+ systemLog("usedp", `${providerId}`);
2258
+ (0, import_react4.useEffect)(() => {
2259
+ if (providers[providerId]) {
2260
+ systemLog("usedp", "Provider:", providerId, "existuje");
2261
+ if (!providers[providerId].isPermanent) updateProviderListeners(providerId, 1);
2262
+ } else {
2263
+ if (presetProviders[providerKey]) {
2264
+ const templateData = typeof data === "object" && data !== null && !Array.isArray(data) ? data : void 0;
2265
+ const prov = renderJSONTemplate(presetProviders[providerKey], templateData);
2266
+ systemLog("usedp", "Registruji novy provider:", providerId);
2267
+ dispatch("registerProvider", prov);
2268
+ } else {
2269
+ systemLog("usedp", "Neznamy provider ", providerId);
2270
+ }
2271
+ return () => {
2272
+ if (!presetProviders[providerKey]?.isPermanent && !providers[providerId]?.isPermanent) {
2273
+ dispatch("unregisterProvider", providerId);
2274
+ }
2275
+ };
2276
+ }
2277
+ }, []);
2278
+ const update = (val) => {
2279
+ systemLog("usedp", "UPDATUJI: ", providerId, ", data: ", val);
2280
+ dispatch("updateDataStore", { id: providerId, data: val });
2281
+ };
2282
+ const updateItem = ({ params, data: data2, variant, documentId = void 0 }, callback) => {
2283
+ dispatch("updateDataStore", { id: providerId, variant, params, data: data2, documentId }, callback);
2284
+ };
2285
+ const deleteItem = ({ params, data: data2 }, callback) => {
2286
+ dispatch("deleteProviderItem", { providerId, data: data2, params }, callback);
2287
+ };
2288
+ const createItem = (data2, callback) => {
2289
+ systemLog("usedp", "createItem Prov. id:", providerId);
2290
+ dispatch("createProviderItem", { id: providerId, data: data2 }, callback);
2291
+ };
2292
+ return {
2293
+ schema: providers[providerId]?.schema,
2294
+ update,
2295
+ updateItem,
2296
+ deleteItem,
2297
+ createItem
2298
+ };
2299
+ };
2300
+
2301
+ // src/logColors.ts
2302
+ var COLOR_WHITE = `\x1B[37m%s\x1B[0m`;
2303
+ var COLOR_MAGENTA = `\x1B[35m%s\x1B[0m`;
2304
+ var COLOR_BLUE = `\x1B[34m%s\x1B[0m`;
2305
+ var COLOR_CYAN = `\x1B[36m%s\x1B[0m`;
2306
+ var COLOR_GREEN = `\x1B[32m%s\x1B[0m`;
2307
+ var COLOR_RED = `\x1B[31m%s\x1B[0m`;
2308
+ var COLOR_ERROR = `\x1B[31m%s\x1B[0m`;
2309
+ var COLOR_YELLOW = `\x1B[33m%s\x1B[0m`;
2310
+ var COLOR_ORANGE = `\x1B[38;5;208m%s\x1B[0m`;
2311
+ var COLOR_WARNING = `\x1B[33m%s\x1B[0m`;
2312
+ var COLOR_PROVIDER = COLOR_MAGENTA;
2313
+ var COLOR_CONTEXT = COLOR_MAGENTA;
2314
+ var COLOR_RENDER = COLOR_BLUE;
2315
+ var COLOR_FUNCTION = COLOR_CYAN;
2316
+ var COLOR_SCREEN = COLOR_GREEN;
2317
+ var COLOR_SOCKET = COLOR_CYAN;
2318
+ var COLOR_SOCKETS = COLOR_YELLOW;
2319
+ var COLOR_AXIOS = COLOR_YELLOW;
2320
+ var COLOR_APP = COLOR_BLUE;
2321
+ var COLOR_DS = COLOR_MAGENTA;
2322
+ // Annotate the CommonJS export names for ESM import in node:
2323
+ 0 && (module.exports = {
2324
+ COLOR_APP,
2325
+ COLOR_AXIOS,
2326
+ COLOR_BLUE,
2327
+ COLOR_CONTEXT,
2328
+ COLOR_CYAN,
2329
+ COLOR_DS,
2330
+ COLOR_ERROR,
2331
+ COLOR_FUNCTION,
2332
+ COLOR_GREEN,
2333
+ COLOR_MAGENTA,
2334
+ COLOR_ORANGE,
2335
+ COLOR_PROVIDER,
2336
+ COLOR_RED,
2337
+ COLOR_RENDER,
2338
+ COLOR_SCREEN,
2339
+ COLOR_SOCKET,
2340
+ COLOR_SOCKETS,
2341
+ COLOR_WARNING,
2342
+ COLOR_WHITE,
2343
+ COLOR_YELLOW,
2344
+ DataStoreActionsContext,
2345
+ DataStoreContext,
2346
+ DataStoreDocumentsContext,
2347
+ DataStoreProvider,
2348
+ DataStoreProvidersContext,
2349
+ DataStoreStableContext,
2350
+ SQLite,
2351
+ dataStoreFilterObject,
2352
+ doesObjectMatchFilter,
2353
+ doesValueMatchFilter,
2354
+ filterDocuments,
2355
+ filterDocumentsAsync,
2356
+ getValueByRules,
2357
+ isUuid,
2358
+ recalculateObjectWithDocument,
2359
+ useDataProvider,
2360
+ useDataStore,
2361
+ useDataStoreActions,
2362
+ useDocument,
2363
+ useDocuments,
2364
+ useFilteredDocuments,
2365
+ useProvider,
2366
+ useProviderActions,
2367
+ useProviderDocuments,
2368
+ uuid
2369
+ });
2370
+ //# sourceMappingURL=index.cjs.map