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