@wovin/core 0.0.9-RC3 → 0.0.10

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.
Files changed (78) hide show
  1. package/LICENSE +661 -0
  2. package/dist/applog/applog-helpers.d.ts +26 -7
  3. package/dist/applog/applog-helpers.d.ts.map +1 -1
  4. package/dist/applog/applog-utils.d.ts +11 -2
  5. package/dist/applog/applog-utils.d.ts.map +1 -1
  6. package/dist/applog/datom-types.d.ts +24 -13
  7. package/dist/applog/datom-types.d.ts.map +1 -1
  8. package/dist/applog.min.js +11 -3
  9. package/dist/chunk-4432UCLM.min.js +544 -0
  10. package/dist/chunk-4432UCLM.min.js.map +1 -0
  11. package/dist/{chunk-PTGUFZ3Q.min.js → chunk-5UN776TZ.min.js} +1 -5
  12. package/dist/{chunk-PTGUFZ3Q.min.js.map → chunk-5UN776TZ.min.js.map} +1 -1
  13. package/dist/{chunk-RMPMFLPZ.min.js → chunk-BLAIQY2K.min.js} +345 -296
  14. package/dist/chunk-BLAIQY2K.min.js.map +1 -0
  15. package/dist/chunk-DF3UOPRV.min.js +5085 -0
  16. package/dist/chunk-DF3UOPRV.min.js.map +1 -0
  17. package/dist/{chunk-QXKFFDHN.min.js → chunk-ITYJ7DMX.min.js} +5931 -5722
  18. package/dist/chunk-ITYJ7DMX.min.js.map +1 -0
  19. package/dist/chunk-QPGEBDMJ.min.js +9 -0
  20. package/dist/chunk-QPGEBDMJ.min.js.map +1 -0
  21. package/dist/index.min.js +99 -50
  22. package/dist/ipfs/car.d.ts +47 -7
  23. package/dist/ipfs/car.d.ts.map +1 -1
  24. package/dist/ipfs/ipfs-utils.d.ts +18 -7
  25. package/dist/ipfs/ipfs-utils.d.ts.map +1 -1
  26. package/dist/ipfs.min.js +26 -7
  27. package/dist/mobx/mobx-utils.d.ts +23 -17
  28. package/dist/mobx/mobx-utils.d.ts.map +1 -1
  29. package/dist/mobx.d.ts +2 -0
  30. package/dist/mobx.d.ts.map +1 -0
  31. package/dist/mobx.min.js +141 -0
  32. package/dist/pubsub/connector.d.ts +3 -1
  33. package/dist/pubsub/connector.d.ts.map +1 -1
  34. package/dist/pubsub/pub-pull.d.ts +14 -0
  35. package/dist/pubsub/pub-pull.d.ts.map +1 -0
  36. package/dist/pubsub/pub-push.d.ts +41 -0
  37. package/dist/pubsub/pub-push.d.ts.map +1 -0
  38. package/dist/pubsub/pubsub-types.d.ts +25 -0
  39. package/dist/pubsub/pubsub-types.d.ts.map +1 -1
  40. package/dist/pubsub.d.ts +2 -1
  41. package/dist/pubsub.d.ts.map +1 -1
  42. package/dist/pubsub.min.js +18 -7
  43. package/dist/query/basic.d.ts +40 -8
  44. package/dist/query/basic.d.ts.map +1 -1
  45. package/dist/query/divergences.d.ts.map +1 -1
  46. package/dist/query.min.js +36 -20
  47. package/dist/thread/basic.d.ts +24 -4
  48. package/dist/thread/basic.d.ts.map +1 -1
  49. package/dist/thread/filters.d.ts +1 -1
  50. package/dist/thread/filters.d.ts.map +1 -1
  51. package/dist/thread/mapped.d.ts +10 -3
  52. package/dist/thread/mapped.d.ts.map +1 -1
  53. package/dist/thread/utils.d.ts +16 -0
  54. package/dist/thread/utils.d.ts.map +1 -0
  55. package/dist/thread/writeable.d.ts +4 -3
  56. package/dist/thread/writeable.d.ts.map +1 -1
  57. package/dist/thread.d.ts +1 -0
  58. package/dist/thread.d.ts.map +1 -1
  59. package/dist/thread.min.js +13 -3
  60. package/dist/types/typescript-utils.d.ts +5 -4
  61. package/dist/types/typescript-utils.d.ts.map +1 -1
  62. package/dist/types.min.js +1 -5
  63. package/dist/utils.d.ts +3 -0
  64. package/dist/utils.d.ts.map +1 -1
  65. package/dist/utils.min.js +9 -0
  66. package/package.json +16 -11
  67. package/dist/chunk-GJGWIEIE.min.js +0 -66
  68. package/dist/chunk-GJGWIEIE.min.js.map +0 -1
  69. package/dist/chunk-PG6EJTCU.min.js +0 -4411
  70. package/dist/chunk-PG6EJTCU.min.js.map +0 -1
  71. package/dist/chunk-QXKFFDHN.min.js.map +0 -1
  72. package/dist/chunk-RMPMFLPZ.min.js.map +0 -1
  73. package/dist/chunk-RPPZKO5L.min.js +0 -1
  74. package/dist/chunk-WIE7ME3N.min.js +0 -120
  75. package/dist/chunk-WIE7ME3N.min.js.map +0 -1
  76. package/dist/pubsub/publication.d.ts +0 -15
  77. package/dist/pubsub/publication.d.ts.map +0 -1
  78. /package/dist/{chunk-RPPZKO5L.min.js.map → mobx.min.js.map} +0 -0
@@ -0,0 +1,544 @@
1
+ import {
2
+ E,
3
+ StaticThread,
4
+ ThreadInMemory,
5
+ applogThreadComparer,
6
+ computedFnDeepCompare,
7
+ computedStructuralComparer,
8
+ createDebugName,
9
+ isInitEvent,
10
+ joinThreads,
11
+ observableArrayMap,
12
+ observableSetMap,
13
+ queryNodesComparer,
14
+ resolveOrRemoveVariables,
15
+ rollingFilter,
16
+ rollingMapper,
17
+ sortApplogsByTs,
18
+ wrapper_default
19
+ } from "./chunk-ITYJ7DMX.min.js";
20
+ import {
21
+ action,
22
+ autorun,
23
+ comparer,
24
+ computed,
25
+ makeObservable,
26
+ observable,
27
+ onBecomeObserved,
28
+ toJS,
29
+ untracked
30
+ } from "./chunk-DF3UOPRV.min.js";
31
+
32
+ // src/query/types.ts
33
+ var QueryNode = class {
34
+ constructor(logsOfThisNode, variables, prevNode = null) {
35
+ this.logsOfThisNode = logsOfThisNode;
36
+ this.variables = variables;
37
+ this.prevNode = prevNode;
38
+ makeObservable(this, {
39
+ threadOfTrail: computed
40
+ // ? intuitively only put the ones here that felt expensive to compute (join)
41
+ });
42
+ }
43
+ get record() {
44
+ return this.variables;
45
+ }
46
+ get threadOfTrail() {
47
+ if (!this.prevNode)
48
+ return this.logsOfThisNode;
49
+ return joinThreads([
50
+ this.logsOfThisNode,
51
+ this.prevNode.threadOfTrail
52
+ ]);
53
+ }
54
+ get trailLogs() {
55
+ return this.threadOfTrail.applogs;
56
+ }
57
+ };
58
+ var QueryResult = class {
59
+ constructor(nodes) {
60
+ this.nodes = nodes;
61
+ makeObservable(this, {
62
+ threadOfAllTrails: computed,
63
+ // ? intuitively only put the ones here that felt expensive to compute (join)
64
+ size: computed,
65
+ // ... or cheap to cache
66
+ isEmpty: computed
67
+ });
68
+ }
69
+ get size() {
70
+ return this.records.length;
71
+ }
72
+ get isEmpty() {
73
+ return this.records.length === 0;
74
+ }
75
+ get untrackedSize() {
76
+ return untracked(() => this.records.length);
77
+ }
78
+ get records() {
79
+ return observableArrayMap(() => this.nodes.map(({ variables }) => variables), { name: "QueryResult.records" });
80
+ }
81
+ get leafNodeThread() {
82
+ return joinThreads(
83
+ observableArrayMap(() => this.nodes.map(({ logsOfThisNode: thread }) => thread), { name: "QueryResult.leafNodeThread" })
84
+ );
85
+ }
86
+ get leafNodeLogs() {
87
+ return observableArrayMap(() => this.nodes.map(({ logsOfThisNode: thread }) => thread.applogs), { name: "QueryResult.leafNodeLogs" });
88
+ }
89
+ // get trailThreads() {
90
+ // return observableArrayMap(() => this.nodes.map(({ trailThread }) => trailThread))
91
+ // }
92
+ get threadOfAllTrails() {
93
+ return joinThreads(observableArrayMap(() => this.nodes.map((node) => node.threadOfTrail), { name: "QueryResult.threadOfAllTrails" }));
94
+ }
95
+ get thread() {
96
+ return this.threadOfAllTrails;
97
+ }
98
+ get allApplogs() {
99
+ return this.threadOfAllTrails.applogs;
100
+ }
101
+ };
102
+
103
+ // src/query/basic.ts
104
+ var { WARN, LOG, DEBUG, VERBOSE, ERROR } = E.setup(E.INFO, { prefix: "[q]" });
105
+ var lastWriteWins = computedFnDeepCompare("lastWriteWins", function lastWriteWins2(thread, { inverseToOnlyReturnFirstLogs, tolerateAlreadyFiltered } = {}) {
106
+ VERBOSE(`lastWriteWins${inverseToOnlyReturnFirstLogs ? ".inversed" : ""} < ${thread.nameAndSizeUntracked} > initializing`);
107
+ if (thread.filters.includes("lastWriteWins")) {
108
+ if (tolerateAlreadyFiltered) {
109
+ DEBUG(`[lastWriteWins] already filtered, but tolerateAlreadyFiltered=true, so returning`);
110
+ return thread;
111
+ }
112
+ throw ERROR(`thread already filtered lastWriteWins:`, thread.filters, { name: thread.name });
113
+ }
114
+ let rollingMap;
115
+ const mappedThread = rollingMapper(thread, function lastWriteWinsMapper(event, sourceThread) {
116
+ const isInitial = isInitEvent(event);
117
+ let newLogs;
118
+ const toAdd = [];
119
+ const toRemove = isInitial ? null : [];
120
+ if (isInitial) {
121
+ rollingMap = /* @__PURE__ */ new Map();
122
+ newLogs = event.init;
123
+ } else {
124
+ newLogs = event.added;
125
+ }
126
+ let tsCheck;
127
+ for (let i = inverseToOnlyReturnFirstLogs ? 0 : newLogs.length - 1; inverseToOnlyReturnFirstLogs ? i < newLogs.length : i >= 0; inverseToOnlyReturnFirstLogs ? i++ : i--) {
128
+ const log = newLogs[i];
129
+ const key = log.en + "|" + log.at;
130
+ if (tsCheck && (inverseToOnlyReturnFirstLogs ? tsCheck > log.ts : tsCheck < log.ts)) {
131
+ throw ERROR(`lastWriteWins.mapper logs not sorted:`, tsCheck, inverseToOnlyReturnFirstLogs ? ">" : "<", log.ts, {
132
+ log,
133
+ i,
134
+ newLogs,
135
+ inverseToOnlyReturnFirstLogs
136
+ });
137
+ }
138
+ tsCheck = log.ts;
139
+ const existing = rollingMap.get(key);
140
+ if (!existing || (inverseToOnlyReturnFirstLogs ? existing.ts > log.ts : existing.ts < log.ts)) {
141
+ if (existing && !isInitial)
142
+ toRemove.push(existing);
143
+ toAdd.push(log);
144
+ rollingMap.set(key, log);
145
+ }
146
+ }
147
+ sortApplogsByTs(toAdd);
148
+ VERBOSE.isDisabled || VERBOSE(
149
+ `lastWriteWins${inverseToOnlyReturnFirstLogs ? ".inversed" : ""}<${thread.nameAndSizeUntracked}> mapped event`,
150
+ isInitial ? { ...Object.fromEntries(Object.entries(event).map(([k, v]) => [k, v?.length])), toAdd: toAdd.length, toRemove } : { ...event, toAdd, toRemove }
151
+ );
152
+ return isInitial ? { init: toAdd } : { added: toAdd, removed: toRemove };
153
+ }, { name: `lastWriteWins${inverseToOnlyReturnFirstLogs ? ".inversed" : ""}`, extraFilterName: "lastWriteWins" });
154
+ VERBOSE.isDisabled || autorun(() => {
155
+ VERBOSE(`lastWriteWins<${thread.nameAndSizeUntracked}> filtered down to`, mappedThread.applogs.length);
156
+ });
157
+ return mappedThread;
158
+ }, { equals: applogThreadComparer, argsDebugName: (thread) => createDebugName({ caller: "lastWriteWins", thread }) });
159
+ var withoutDeleted = computedFnDeepCompare("withoutDeleted", function withoutDeleted2(thread) {
160
+ if (VERBOSE.isEnabled)
161
+ VERBOSE(`withoutDeleted<${thread.nameAndSizeUntracked}>`);
162
+ if (thread.filters.includes("withoutDeleted")) {
163
+ throw ERROR(`thread already filtered withoutDeleted:`, thread.filters, { name: thread.name });
164
+ }
165
+ const deletionLogs = rollingFilter(
166
+ thread,
167
+ // TODO: handle un-delection
168
+ { at: ["isDeleted", "relation/isDeleted", "block/isDeleted"], vl: true },
169
+ { name: "isDeleted" }
170
+ );
171
+ VERBOSE.isEnabled && VERBOSE(
172
+ `withoutDeleted<${thread.nameAndSizeUntracked}> deletionLogs:`,
173
+ untracked(function expensiveAssUntrackedVerboseFx() {
174
+ return [...deletionLogs.applogs];
175
+ })
176
+ );
177
+ const obsArrMapName = createDebugName({ caller: "allDeletedEntities", thread });
178
+ const deleted = observableSetMap(function observableSetMapForDeleted() {
179
+ return deletionLogs.map((log) => log.en);
180
+ }, { name: obsArrMapName });
181
+ if (VERBOSE.isEnabled) {
182
+ autorun(() => {
183
+ VERBOSE(`withoutDeleted<${thread.nameAndSizeUntracked}> deleted:`, [...deleted]);
184
+ });
185
+ }
186
+ return rollingFilter(thread, { "!en": deleted }, { name: `withoutDeleted`, extraFilterName: "withoutDeleted" });
187
+ }, { equals: applogThreadComparer });
188
+ var query = computedFnDeepCompare("query", function query2(threadOrLogs, patternOrPatterns, startVariables = {}, opts = {}) {
189
+ const thread = threadFromMaybeArray(threadOrLogs);
190
+ DEBUG(`query<${thread.nameAndSizeUntracked}>:`, patternOrPatterns);
191
+ const patterns = Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns];
192
+ let nodes;
193
+ if (patterns.length === 1) {
194
+ nodes = null;
195
+ } else {
196
+ const pattersExceptLast = patterns.slice(0, -1);
197
+ nodes = query2(thread, pattersExceptLast, startVariables, opts);
198
+ }
199
+ const lastPattern = patterns[patterns.length - 1];
200
+ const stepResult = queryStep(thread, nodes, lastPattern, opts);
201
+ VERBOSE.isDisabled || autorun(() => VERBOSE(`query result:`, toJS(stepResult)));
202
+ return stepResult;
203
+ }, {
204
+ equals: queryNodesComparer,
205
+ argsDebugName: (thread, pattern, startVars) => createDebugName({ caller: "query", thread, args: startVars ? { pattern, startVars } : pattern })
206
+ });
207
+ var queryStep = computedFnDeepCompare("queryStep", function queryStep2(thread, nodeSet, pattern, opts = {}) {
208
+ DEBUG(`queryStep<${thread.nameAndSizeUntracked}> with`, nodeSet?.untrackedSize ?? "all", "nodes, pattern:", pattern);
209
+ if (!Object.entries(pattern).length)
210
+ throw new Error(`Pattern is empty`);
211
+ function doQuery(node) {
212
+ const [patternWithResolvedVars, variablesToFill] = resolveOrRemoveVariables(pattern, node?.variables ?? {});
213
+ VERBOSE(`[queryStep.doQuery] patternWithoutVars: `, patternWithResolvedVars);
214
+ const applogsMatchingStatic = rollingFilter(thread, patternWithResolvedVars);
215
+ const varMapper = createObjMapper(variablesToFill);
216
+ const resultNodes = observableArrayMap(function queryStepDoStep() {
217
+ const newVarsAndTheirLog = applogsMatchingStatic.map((log) => ({ log, vars: varMapper(log) }));
218
+ if (VERBOSE.isEnabled) {
219
+ VERBOSE(
220
+ `[queryStep.doQuery] step node:`,
221
+ node?.variables,
222
+ " =>",
223
+ newVarsAndTheirLog,
224
+ "from:",
225
+ untracked(() => applogsMatchingStatic.applogs)
226
+ );
227
+ }
228
+ return newVarsAndTheirLog.map(({ log, vars }) => {
229
+ const nodeVars = Object.assign({}, node?.variables, vars);
230
+ return new QueryNode(
231
+ // TODO: ? Make single result nodes reactive using MappedThread - only really relevant if a result had multiple logs (or different paths would lead to the same result?)
232
+ // ThreadInMemory.fromArray(
233
+ StaticThread.fromArray(
234
+ [log],
235
+ createDebugName({
236
+ caller: "QueryNode",
237
+ thread: applogsMatchingStatic,
238
+ pattern: `${wrapper_default(nodeVars)}@${wrapper_default(patternWithResolvedVars)}`
239
+ })
240
+ // true,
241
+ ),
242
+ nodeVars,
243
+ node
244
+ );
245
+ });
246
+ }, { name: createDebugName({ caller: "doQuery.mapNodes", thread: applogsMatchingStatic, pattern }) });
247
+ if (VERBOSE.isEnabled)
248
+ autorun(() => VERBOSE(`[queryStep.doQuery] resultNodes:`, [...resultNodes]));
249
+ if (opts.debug) {
250
+ LOG(
251
+ `[queryStep] step result:`,
252
+ untracked(
253
+ () => resultNodes.map(({ variables, logsOfThisNode: thread2 }) => ({
254
+ variables,
255
+ thread: thread2
256
+ // : /* util.inspect( */ thread.applogs, /* , { showHidden: false, depth: null }) */
257
+ }))
258
+ )
259
+ );
260
+ }
261
+ return resultNodes;
262
+ }
263
+ const observableResultNodes = observableArrayMap(
264
+ function queryStepGetResults() {
265
+ DEBUG(`[queryStep] Running with ${nodeSet?.nodes?.length} input nodes:`);
266
+ if (!nodeSet) {
267
+ return [...doQuery(null)];
268
+ } else {
269
+ return [...nodeSet.nodes.flatMap(doQuery)];
270
+ }
271
+ },
272
+ { name: createDebugName({ caller: "queryStep", thread, pattern }) }
273
+ );
274
+ if (VERBOSE.isEnabled)
275
+ autorun(() => VERBOSE(`[queryStep] observableResultNodes:`, [...observableResultNodes]));
276
+ return new QueryResult(observableResultNodes);
277
+ }, { equals: queryNodesComparer, argsDebugName: (thread, _nodes, pattern) => createDebugName({ caller: "queryStep", thread, pattern }) });
278
+ var queryNot = computedFnDeepCompare("queryNot", function queryNot2(thread, startNodes, patternOrPatterns, opts = {}) {
279
+ let nodes = startNodes.nodes;
280
+ DEBUG.force(`queryNot<${thread.nameAndSizeUntracked}> from: ${nodes.length} nodes`);
281
+ const patterns = Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns];
282
+ for (const pattern of patterns) {
283
+ if (!Object.entries(patternOrPatterns).length)
284
+ throw new Error(`Pattern is empty`);
285
+ nodes = nodes.filter(function innerNodeFilter({
286
+ /* applogs, */
287
+ variables
288
+ }) {
289
+ const [patternWithResolvedVars, _variablesToFill] = resolveOrRemoveVariables(pattern, variables ?? {});
290
+ VERBOSE(`[queryNot] patternWithoutVars: `, patternWithResolvedVars);
291
+ const newApplogs = rollingFilter(thread, patternWithResolvedVars);
292
+ VERBOSE(`[queryNot] step node:`, variables, " =>", newApplogs.size, "applogs");
293
+ VERBOSE.isDisabled || VERBOSE(`[queryNot] step node:`, variables, " => empty?", untracked(() => newApplogs.applogs));
294
+ if (opts.debug)
295
+ LOG(`[queryNot] node result:`, variables, "=>", newApplogs.applogs);
296
+ return newApplogs.isEmpty;
297
+ });
298
+ }
299
+ return new QueryResult(nodes);
300
+ }, { equals: queryNodesComparer, argsDebugName: (thread, nodes, pattern) => createDebugName({ caller: "queryNot", thread, pattern }) });
301
+ var filterAndMap = computedFnDeepCompare("filterAndMap", function filterAndMap2(thread, pattern, mapper) {
302
+ DEBUG(`filterAndMap<${thread.nameAndSizeUntracked}>`, pattern);
303
+ const filtered = rollingFilter(thread, pattern);
304
+ VERBOSE(`[filterAndMap] filtered:`, filtered.untrackedSize);
305
+ VERBOSE.isDisabled || autorun(() => VERBOSE(`[filterAndMap] filtered:`, filtered.applogs));
306
+ const name = createDebugName({ thread, pattern, caller: "filterAndMap" });
307
+ const mapped = observableArrayMap(() => mapThreadWith(filtered, mapper), { name });
308
+ VERBOSE.isDisabled || autorun(() => VERBOSE(`[filterAndMap] mapped:`, mapped));
309
+ return mapped;
310
+ }, { equals: comparer.structural, argsDebugName: (thread, pattern) => createDebugName({ caller: "filterAndMap", thread, pattern }) });
311
+ var queryAndMap = computedFnDeepCompare("queryAndMap", function queryAndMap2(threadOrLogs, patternOrPatterns, mapDef, variables = {}) {
312
+ const thread = threadFromMaybeArray(threadOrLogs);
313
+ DEBUG(`queryAndMap<${thread.nameAndSizeUntracked}>`, { patternOrPatterns, variables, map: mapDef });
314
+ const debugName = createDebugName({ thread, caller: "queryAndMap" });
315
+ const queryResult = query(thread, patternOrPatterns);
316
+ VERBOSE(`[queryAndMap] filtered count:`, queryResult.untrackedSize);
317
+ const mapped = observableArrayMap(
318
+ () => mapQueryResultWith(queryResult, mapDef),
319
+ { name: debugName }
320
+ );
321
+ VERBOSE.isDisabled || autorun(() => VERBOSE(`[queryAndMap] result:`, toJS(mapped)));
322
+ return mapped;
323
+ }, { equals: comparer.structural, argsDebugName: (thread, pattern) => createDebugName({ caller: "queryAndMap", thread, pattern }) });
324
+ var queryEntity = computedFnDeepCompare("queryEntity", function queryEntity2(thread, name, entityID, attributes) {
325
+ DEBUG(`queryEntity<${thread.nameAndSizeUntracked}>`, entityID, name);
326
+ const filtered = rollingFilter(thread, { en: entityID, at: prefixAttrs(name, attributes) });
327
+ VERBOSE(`queryEntity applogs:`, filtered.applogs);
328
+ return computed(
329
+ () => filtered.isEmpty ? null : Object.fromEntries(
330
+ filtered.map(({ at, vl }) => [at.slice(name.length + 1), vl])
331
+ )
332
+ );
333
+ }, {
334
+ equals: computedStructuralComparer,
335
+ argsDebugName: (thread, name, entityID) => createDebugName({ caller: "queryEntity", thread, args: { name, entityID } })
336
+ });
337
+ var agentsOfThread = computedFnDeepCompare("agentsOfThread", function agentsOfThread2(thread) {
338
+ DEBUG(`agentsOfThread<${thread.nameAndSizeUntracked}>`);
339
+ const mapped = observable.map();
340
+ const onEvent = action((event) => {
341
+ for (const log of isInitEvent(event) ? event.init : event.added) {
342
+ const prev = mapped.get(log.ag) ?? 0;
343
+ mapped.set(log.ag, prev + 1);
344
+ }
345
+ for (const log of !isInitEvent(event) && event.removed || []) {
346
+ const prev = mapped.get(log.ag);
347
+ if (!prev || prev < 1)
348
+ throw ERROR(`[agentsOfThread] number is now negative`, { log, event, mapped, prev });
349
+ mapped.set(log.ag, prev - 1);
350
+ }
351
+ LOG(`agentsOfThread<${thread.nameAndSizeUntracked}> processed event`, { event, mapped });
352
+ });
353
+ onEvent({ init: thread.applogs });
354
+ const unsubscribe = thread.subscribe(onEvent);
355
+ onBecomeObserved(mapped, unsubscribe);
356
+ return mapped;
357
+ });
358
+ var entityOverlap = computedFnDeepCompare("entityOverlap", function entityOverlapCount(threadA, threadB) {
359
+ LOG(`entityOverlap<${threadA.nameAndSizeUntracked}, ${threadB.nameAndSizeUntracked}>`);
360
+ return computed(() => {
361
+ const entitiesA = new Set(threadA.map((log) => log.en));
362
+ const entitiesB = new Set(threadB.map((log) => log.en));
363
+ return [...entitiesA].filter((en) => entitiesB.has(en));
364
+ });
365
+ });
366
+ var entityOverlapMap = function entityOverlapMap2(threadA, threadB, threadAName = "incoming", threadBName = "current") {
367
+ const useInferredVM = (en, thread) => en;
368
+ const overlapping = entityOverlap(threadA, threadB).get();
369
+ const mapped = /* @__PURE__ */ new Map();
370
+ overlapping.forEach((eachEntityID) => mapped.set(eachEntityID, {
371
+ [threadAName]: useInferredVM(eachEntityID, threadA),
372
+ [threadBName]: useInferredVM(eachEntityID, threadB)
373
+ }));
374
+ };
375
+ var entityOverlapCount2 = computedFnDeepCompare(
376
+ "entityOverlapCount",
377
+ function entityOverlapCount3(threadA, threadB) {
378
+ return computed(() => entityOverlap(threadA, threadB).get().length);
379
+ }
380
+ );
381
+ var querySingle = computedFnDeepCompare("querySingle", function querySingle2(threadOrLogs, patternOrPatterns, variables = {}) {
382
+ const result = query(threadOrLogs, patternOrPatterns, variables);
383
+ return computed(() => {
384
+ if (result.isEmpty)
385
+ return null;
386
+ if (result.size > 1)
387
+ throw ERROR(`[querySingle] got`, result.size, `results:`, result);
388
+ const logsOfThisNode = result.nodes[0].logsOfThisNode;
389
+ if (logsOfThisNode.size != 1)
390
+ throw ERROR(`[querySingle] single result, but got`, logsOfThisNode.size, `logs:`, logsOfThisNode.applogs);
391
+ return logsOfThisNode.applogs[0];
392
+ });
393
+ }, {
394
+ equals: comparer.structural,
395
+ argsDebugName: (thread, pattern) => createDebugName({ caller: "querySingle", thread, pattern })
396
+ });
397
+ var querySingleAndMap = computedFnDeepCompare(
398
+ "querySingleAndMap",
399
+ function querySingleAndMap2(threadOrLogs, patternOrPatterns, mapDef, variables = {}) {
400
+ const resultBox = querySingle(threadOrLogs, patternOrPatterns, variables);
401
+ return computed(() => {
402
+ const log = resultBox.get();
403
+ if (!log)
404
+ return void 0;
405
+ if (typeof mapDef === "string") {
406
+ return log[mapDef];
407
+ } else {
408
+ return createObjMapper(mapDef)(log);
409
+ }
410
+ });
411
+ },
412
+ {
413
+ equals: comparer.structural,
414
+ argsDebugName: (thread, pattern) => createDebugName({ caller: "querySingleAndMap", thread, pattern })
415
+ }
416
+ );
417
+ var mapThreadWith = function filterAndMapGetterFx(thread, mapDef) {
418
+ if (typeof mapDef === "function") {
419
+ return thread.map(mapDef);
420
+ } else if (typeof mapDef === "string") {
421
+ return thread.map((log) => log[mapDef]);
422
+ } else {
423
+ return thread.map(createObjMapper(mapDef));
424
+ }
425
+ };
426
+ var mapQueryResultWith = function filterAndMapGetterFx2(queryResult, mapDef) {
427
+ if (typeof mapDef === "function") {
428
+ return queryResult.records.map(mapDef);
429
+ } else if (typeof mapDef === "string") {
430
+ return queryResult.nodes.map((node) => {
431
+ if (!Object.hasOwn(node.record, mapDef)) {
432
+ if (node.logsOfThisNode.size !== 1) {
433
+ throw ERROR(`not sure what to map (it's not a var and a result node log count of ${node.logsOfThisNode.size})`);
434
+ }
435
+ return node.logsOfThisNode.firstLog[mapDef];
436
+ }
437
+ return node.record[mapDef];
438
+ });
439
+ } else {
440
+ return queryResult.nodes.map((node) => {
441
+ return createObjMapper(mapDef)(queryResult);
442
+ });
443
+ }
444
+ };
445
+ function createObjMapper(applogFieldMap) {
446
+ return (applog) => {
447
+ return Object.entries(applogFieldMap).reduce((acc, [key, value]) => {
448
+ acc[value] = applog[key];
449
+ return acc;
450
+ }, {});
451
+ };
452
+ }
453
+ function startsWith(str) {
454
+ return (value) => value.startsWith(str);
455
+ }
456
+ function prefixAttrs(prefix, attrs) {
457
+ return attrs.map((at) => prefixAt(prefix, at));
458
+ }
459
+ function prefixAt(prefix, attr) {
460
+ return `${prefix}/${attr}`;
461
+ }
462
+ function threadFromMaybeArray(threadOrLogs) {
463
+ if (!Array.isArray(threadOrLogs)) {
464
+ return threadOrLogs;
465
+ }
466
+ return ThreadInMemory.fromArray(threadOrLogs, `threadFromArray[${threadOrLogs.length}]`, true);
467
+ }
468
+
469
+ // src/query/divergences.ts
470
+ var { WARN: WARN2, LOG: LOG2, DEBUG: DEBUG2, VERBOSE: VERBOSE2, ERROR: ERROR2 } = E.setup(E.INFO);
471
+ var queryDivergencesByPrev = computedFnDeepCompare("queryDivergencesByPrev", function queryConflictingByPrev(sourceThread) {
472
+ DEBUG2(`queryDivergencesByPrev<${sourceThread.nameAndSizeUntracked}>`);
473
+ if (sourceThread.filters.includes("lastWriteWins"))
474
+ WARN2(`queryDivergencesByPrev on thread lastWriteWins`, sourceThread);
475
+ const divergences = observableArrayMap(() => {
476
+ const logsForNode = /* @__PURE__ */ new Map();
477
+ const leafs = /* @__PURE__ */ new Set();
478
+ VERBOSE2("all applogs:", sourceThread.applogs);
479
+ for (const log of sourceThread.applogs) {
480
+ let prevLogs;
481
+ if (log.pv) {
482
+ prevLogs = log.pv && logsForNode.get(log.pv.toString());
483
+ leafs.delete(log.pv.toString());
484
+ }
485
+ VERBOSE2("traversing log", { log, prevLogs, leafs: Array.from(leafs) });
486
+ logsForNode.set(log.cid, prevLogs ? [...prevLogs, log] : [log]);
487
+ leafs.add(log.cid);
488
+ }
489
+ return Array.from(leafs).map((leafID) => {
490
+ const thread = new ThreadInMemory(
491
+ createDebugName({
492
+ caller: "DivergenceLeaf",
493
+ thread: sourceThread,
494
+ pattern: `leaf: ${leafID}`
495
+ }),
496
+ logsForNode.get(leafID),
497
+ sourceThread.filters,
498
+ true
499
+ // TODO: sourceThread,
500
+ );
501
+ return { log: thread.latestLog, thread };
502
+ });
503
+ }, { name: createDebugName({ caller: "queryDivergencesByPrev", thread: sourceThread }) });
504
+ VERBOSE2.isDisabled || autorun(() => VERBOSE2(`[queryDivergencesByPrev] result:`, toJS(divergences)));
505
+ return divergences;
506
+ }, { equals: comparer.structural });
507
+
508
+ // src/query/matchers.ts
509
+ function includes(str) {
510
+ return (vl) => vl?.includes?.(str);
511
+ }
512
+ function includedIn(arr) {
513
+ return (vl) => arr?.includes?.(vl);
514
+ }
515
+
516
+ export {
517
+ QueryNode,
518
+ QueryResult,
519
+ lastWriteWins,
520
+ withoutDeleted,
521
+ query,
522
+ queryStep,
523
+ queryNot,
524
+ filterAndMap,
525
+ queryAndMap,
526
+ queryEntity,
527
+ agentsOfThread,
528
+ entityOverlap,
529
+ entityOverlapMap,
530
+ entityOverlapCount2 as entityOverlapCount,
531
+ querySingle,
532
+ querySingleAndMap,
533
+ mapThreadWith,
534
+ mapQueryResultWith,
535
+ createObjMapper,
536
+ startsWith,
537
+ prefixAttrs,
538
+ prefixAt,
539
+ threadFromMaybeArray,
540
+ queryDivergencesByPrev,
541
+ includes,
542
+ includedIn
543
+ };
544
+ //# sourceMappingURL=chunk-4432UCLM.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query/types.ts","../src/query/basic.ts","../src/query/divergences.ts","../src/query/matchers.ts"],"sourcesContent":["import { computed, makeObservable, untracked } from 'mobx'\nimport { ReadonlyObservableArray } from '..'\nimport { joinThreads } from '../applog/applog-helpers'\nimport { SearchContext } from '../applog/datom-types'\nimport { observableArrayMap } from '../mobx/mobx-utils'\nimport type { Thread } from '../thread/basic'\n\nexport class QueryNode {\n\tconstructor(\n\t\treadonly logsOfThisNode: Thread,\n\t\treadonly variables: SearchContext,\n\t\treadonly prevNode: QueryNode | null = null,\n\t) {\n\t\tmakeObservable(this, {\n\t\t\tthreadOfTrail: computed, // ? intuitively only put the ones here that felt expensive to compute (join)\n\t\t})\n\t}\n\tget record() {\n\t\treturn this.variables // alias for end-user consumption\n\t}\n\n\tget threadOfTrail() {\n\t\tif (!this.prevNode) return this.logsOfThisNode\n\t\treturn joinThreads([\n\t\t\tthis.logsOfThisNode,\n\t\t\tthis.prevNode.threadOfTrail,\n\t\t])\n\t}\n\tget trailLogs() {\n\t\treturn this.threadOfTrail.applogs\n\t}\n}\n/**\n * The result of a query (-step)\n */\nexport class QueryResult {\n\tconstructor(\n\t\tpublic nodes: ReadonlyObservableArray<QueryNode>,\n\t) {\n\t\tmakeObservable(this, {\n\t\t\tthreadOfAllTrails: computed, // ? intuitively only put the ones here that felt expensive to compute (join)\n\t\t\tsize: computed, // ... or cheap to cache\n\t\t\tisEmpty: computed,\n\t\t})\n\t}\n\n\tget size() {\n\t\treturn this.records.length\n\t}\n\tget isEmpty() {\n\t\treturn this.records.length === 0\n\t}\n\tget untrackedSize() {\n\t\treturn untracked(() => this.records.length)\n\t}\n\n\tget records() {\n\t\treturn observableArrayMap(() => this.nodes.map(({ variables }) => variables), { name: 'QueryResult.records' })\n\t}\n\tget leafNodeThread() {\n\t\treturn joinThreads(\n\t\t\tobservableArrayMap(() => this.nodes.map(({ logsOfThisNode: thread }) => thread), { name: 'QueryResult.leafNodeThread' }),\n\t\t)\n\t}\n\tget leafNodeLogs() {\n\t\treturn observableArrayMap(() => this.nodes.map(({ logsOfThisNode: thread }) => thread.applogs), { name: 'QueryResult.leafNodeLogs' })\n\t}\n\t// get trailThreads() {\n\t// \treturn observableArrayMap(() => this.nodes.map(({ trailThread }) => trailThread))\n\t// }\n\tget threadOfAllTrails() {\n\t\treturn joinThreads(observableArrayMap(() => this.nodes.map(node => node.threadOfTrail), { name: 'QueryResult.threadOfAllTrails' }))\n\t}\n\tget thread() {\n\t\treturn this.threadOfAllTrails // alias\n\t}\n\tget allApplogs() {\n\t\treturn this.threadOfAllTrails.applogs // mostly for easy logging\n\t}\n}\n","import { AgentHash, Applog, ApplogValue, DatalogQueryPattern, EntityID, SearchContext, ValueOrMatcher } from '../applog/datom-types'\n\nimport { Logger } from 'besonders-logger'\nimport { action, autorun, comparer, computed, makeObservable, observable, onBecomeObserved, toJS, untracked } from 'mobx'\n\nimport { isEmpty } from 'lodash-es'\nimport stringify from 'safe-stable-stringify'\nimport { resolveOrRemoveVariables, sortApplogsByTs } from '../applog/applog-utils'\nimport {\n\tapplogThreadComparer,\n\tcomputedFnDeepCompare,\n\tcomputedStructuralComparer,\n\tcreateDebugName,\n\tobservableArrayMap,\n\tobservableSetMap,\n\tqueryNodesComparer,\n} from '../mobx/mobx-utils'\nimport { isInitEvent, StaticThread, Thread, ThreadEvent } from '../thread/basic'\nimport { rollingFilter, rollingMapper, ThreadOnlyCurrent } from '../thread/filters'\nimport { MappedThread } from '../thread/mapped'\nimport { ThreadInMemory } from '../thread/writeable'\nimport { QueryNode, QueryResult } from './types'\n\nconst { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.INFO, { prefix: '[q]' }) // eslint-disable-line no-unused-vars\n\n// util.inspect.defaultOptions.depth = 5;\n\n// export interface QueryExecutorArguments {\n// db: Thread\n// // applogs: AppLog[]\n// nodes: SearchContextWithLog[]\n// }\n// export interface QueryExecutorResult {\n// // applogs: AppLog[]\n// nodes: SearchContextWithLog[]\n// }\n// export type QueryExecutor = (args: QueryExecutorArguments) => QueryExecutorResult\n\n/////////////\n// QUERIES //\n/////////////\n\n/**\n * Keep only the latest logs for each en&at (= last write wins)\n */\nexport const lastWriteWins = computedFnDeepCompare('lastWriteWins', function lastWriteWins(\n\tthread: Thread,\n\t{ inverseToOnlyReturnFirstLogs, tolerateAlreadyFiltered }: {\n\t\tinverseToOnlyReturnFirstLogs?: boolean\n\t\ttolerateAlreadyFiltered?: boolean\n\t} = {},\n): ThreadOnlyCurrent {\n\tVERBOSE(`lastWriteWins${inverseToOnlyReturnFirstLogs ? '.inversed' : ''} < ${thread.nameAndSizeUntracked} > initializing`)\n\t// if (thread.name.includes('lastWriteWins')) WARN(`thread already contains lastWriteWins:`, thread.name)\n\tif (thread.filters.includes('lastWriteWins')) {\n\t\tif (tolerateAlreadyFiltered) {\n\t\t\tDEBUG(`[lastWriteWins] already filtered, but tolerateAlreadyFiltered=true, so returning`)\n\t\t\treturn thread as ThreadOnlyCurrent\n\t\t}\n\t\tthrow ERROR(`thread already filtered lastWriteWins:`, thread.filters, { name: thread.name })\n\t}\n\n\tlet rollingMap: Map<string, Applog>\n\tconst mappedThread = rollingMapper(thread, function lastWriteWinsMapper(event, sourceThread) {\n\t\tconst isInitial = isInitEvent(event)\n\n\t\tlet newLogs: readonly Applog[]\n\t\tconst toAdd = [] as Applog[]\n\t\tconst toRemove = isInitial ? null : [] as Applog[]\n\t\tif (isInitial) {\n\t\t\trollingMap = new Map()\n\t\t\tnewLogs = event.init\n\t\t} else {\n\t\t\tnewLogs = event.added\n\t\t}\n\n\t\tlet tsCheck: string\n\t\tfor (\n\t\t\tlet i = inverseToOnlyReturnFirstLogs ? 0 : newLogs.length - 1;\n\t\t\tinverseToOnlyReturnFirstLogs ? i < newLogs.length : i >= 0;\n\t\t\tinverseToOnlyReturnFirstLogs ? i++ : i--\n\t\t) {\n\t\t\tconst log = newLogs[i]\n\t\t\tconst key = log.en + '|' + log.at // stringify([log.en, log.at]) - less efficient\n\n\t\t\t// TODO: use isoDateStrCompare ?\n\t\t\tif (tsCheck && (inverseToOnlyReturnFirstLogs ? tsCheck > log.ts : tsCheck < log.ts)) {\n\t\t\t\tthrow ERROR(`lastWriteWins.mapper logs not sorted:`, tsCheck, inverseToOnlyReturnFirstLogs ? '>' : '<', log.ts, {\n\t\t\t\t\tlog,\n\t\t\t\t\ti,\n\t\t\t\t\tnewLogs,\n\t\t\t\t\tinverseToOnlyReturnFirstLogs,\n\t\t\t\t})\n\t\t\t}\n\t\t\ttsCheck = log.ts\n\n\t\t\tconst existing = rollingMap.get(key)\n\t\t\tif (!existing || (inverseToOnlyReturnFirstLogs ? (existing.ts > log.ts) : (existing.ts < log.ts))) {\n\t\t\t\tif (existing && !isInitial) toRemove.push(existing)\n\t\t\t\ttoAdd.push(log)\n\t\t\t\trollingMap.set(key, log)\n\t\t\t}\n\t\t}\n\t\tsortApplogsByTs(toAdd) // HACK: find logical solution\n\t\tVERBOSE.isDisabled ||\n\t\t\tVERBOSE(\n\t\t\t\t`lastWriteWins${inverseToOnlyReturnFirstLogs ? '.inversed' : ''}<${thread.nameAndSizeUntracked}> mapped event`,\n\t\t\t\tisInitial ?\n\t\t\t\t\t{ ...Object.fromEntries(Object.entries(event).map(([k, v]) => [k, v?.length])), toAdd: toAdd.length, toRemove } :\n\t\t\t\t\t{ ...event, toAdd, toRemove },\n\t\t\t)\n\t\treturn isInitial ?\n\t\t\t{ init: toAdd }\n\t\t\t: { added: toAdd, removed: toRemove }\n\t}, { name: `lastWriteWins${inverseToOnlyReturnFirstLogs ? '.inversed' : ''}`, extraFilterName: 'lastWriteWins' })\n\tVERBOSE.isDisabled || autorun(() => {\n\t\tVERBOSE(`lastWriteWins<${thread.nameAndSizeUntracked}> filtered down to`, mappedThread.applogs.length) // using applogs.length, as size might not change, but we still want a log\n\t})\n\treturn mappedThread as ThreadOnlyCurrent\n\t// const filtered = observableArrayMap(() => {\n\t// VERBOSE(`lastWriteWins thread deps:`, getDependencyTree(thread.applogs), thread)\n\t// thread.applogs.forEach(applog => {\n\t// const key = stringify([applog.en, applog.at])\n\t// const existing = mapped.get(key)\n\t// if (!existing || existing.ts < applog.ts)\n\t// mapped.set(key, applog)\n\t// })\n\t// VERBOSE(`[lastWriteWins] mapped:`, mapped.size)\n\t// return Array.from(mapped.values())\n\t// }, { name: obsArrMapName })\n\t// VERBOSE(`lastWriteWins deps of filteredArr:`, getDependencyTree(filtered))\n\t// return new MappedThread(thread, filtered, `${thread.name} | lastWriteWins`)\n}, { equals: applogThreadComparer, argsDebugName: (thread) => createDebugName({ caller: 'lastWriteWins', thread }) })\n\n/**\n * Remove all applogs for entities that have an applog: { at: `isDeleted`, val: true }\n * ! WARNING: If not based on lastWriteWins, it will not respect un-deletions yet (isDeleted: false)\n */\nexport const withoutDeleted = computedFnDeepCompare('withoutDeleted', function withoutDeleted(\n\tthread: Thread,\n) {\n\tif (VERBOSE.isEnabled) VERBOSE(`withoutDeleted<${thread.nameAndSizeUntracked}>`)\n\t// if (thread.name.includes('withoutDeleted')) WARN(`thread already contains withoutDeleted:`, withoutDeleted)\n\tif (thread.filters.includes('withoutDeleted')) {\n\t\tthrow ERROR(`thread already filtered withoutDeleted:`, thread.filters, { name: thread.name })\n\t}\n\n\tconst deletionLogs = rollingFilter(\n\t\tthread, // TODO: handle un-delection\n\t\t{ at: ['isDeleted', 'relation/isDeleted', 'block/isDeleted'], vl: true },\n\t\t{ name: 'isDeleted' },\n\t)\n\tVERBOSE.isEnabled &&\n\t\tVERBOSE(\n\t\t\t`withoutDeleted<${thread.nameAndSizeUntracked}> deletionLogs:`,\n\t\t\tuntracked(function expensiveAssUntrackedVerboseFx() {\n\t\t\t\treturn [...deletionLogs.applogs]\n\t\t\t}),\n\t\t)\n\tconst obsArrMapName = createDebugName({ caller: 'allDeletedEntities', thread })\n\tconst deleted = observableSetMap(function observableSetMapForDeleted() {\n\t\treturn deletionLogs.map(log => log.en)\n\t}, { name: obsArrMapName })\n\t// if (VERBOSE.isEnabled) VERBOSE(`withoutDeleted<${db.nameAndSize}> deleted:`, untracked(() => [...deleted]))\n\tif (VERBOSE.isEnabled) {\n\t\tautorun(() => {\n\t\t\tVERBOSE(`withoutDeleted<${thread.nameAndSizeUntracked}> deleted:`, [...deleted])\n\t\t})\n\t}\n\n\treturn rollingFilter(thread, { '!en': deleted }, { name: `withoutDeleted`, extraFilterName: 'withoutDeleted' })\n}, { equals: applogThreadComparer })\n\n// export const filterStatic = computedFnDeepCompare('filterStatic', function filterStatic(\n// thread: Thread,\n// pattern: DatalogQueryPattern,\n// opts: { name?: string } = {},\n// ) {\n// VERBOSE(`filterStatic<${thread.nameAndSizeUntracked}>:`, pattern)\n// if (!Object.entries(pattern).length) throw new Error(`Pattern is empty`)\n// //TODO: deprecaate in favor of rollingFilter ?\n// return new Thread(thread, thread.applogs.filter(applog => {\n// for (const [field, patternValue] of Object.entries(pattern)) {\n// const applogValue = applog[field.startsWith('!') ? field.slice(1) : field]\n// if (!matchPartStatic(field, patternValue, applogValue))\n// return false\n// }\n// return true\n// }), `${thread.name} | ${opts.name || `filterStatic{${stringify(pattern)}}`}`)\n// }, { equals: applogThreadComparer })\n\nexport const query = computedFnDeepCompare('query', function query(\n\tthreadOrLogs: Thread | Applog[],\n\tpatternOrPatterns: DatalogQueryPattern | DatalogQueryPattern[],\n\tstartVariables: SearchContext = {},\n\topts: { debug?: boolean } = {},\n) {\n\tconst thread = threadFromMaybeArray(threadOrLogs)\n\tDEBUG(`query<${thread.nameAndSizeUntracked}>:`, patternOrPatterns)\n\tconst patterns = (Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns]) as DatalogQueryPattern[]\n\n\tlet nodes: QueryResult | null\n\tif (patterns.length === 1) {\n\t\t// We are the first step, so start from scratch\n\t\tnodes = null\n\t} else {\n\t\t// Run the previous step(s) first (= recursion)\n\t\tconst pattersExceptLast = patterns.slice(0, -1)\n\t\t// recursively call this function to have partial queries cacheable\n\t\tnodes = query(thread, pattersExceptLast, startVariables, opts)\n\t}\n\tconst lastPattern = patterns[patterns.length - 1]\n\tconst stepResult = queryStep(thread, nodes, lastPattern, opts)\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`query result:`, toJS(stepResult)))\n\treturn stepResult\n}, {\n\tequals: queryNodesComparer,\n\targsDebugName: (thread, pattern, startVars) =>\n\t\tcreateDebugName({ caller: 'query', thread, args: startVars ? { pattern, startVars } : pattern }),\n})\n\nexport const queryStep = computedFnDeepCompare('queryStep', function queryStep(\n\tthread: Thread,\n\tnodeSet: QueryResult | null,\n\tpattern: DatalogQueryPattern,\n\t// variables: SearchContext = {},\n\topts: { debug?: boolean } = {},\n) {\n\tDEBUG(`queryStep<${thread.nameAndSizeUntracked}> with`, nodeSet?.untrackedSize ?? 'all', 'nodes, pattern:', pattern)\n\tif (!Object.entries(pattern).length) throw new Error(`Pattern is empty`)\n\n\tfunction doQuery(node: QueryNode | null) {\n\t\tconst [patternWithResolvedVars, variablesToFill] = resolveOrRemoveVariables(pattern, node?.variables ?? {})\n\t\tVERBOSE(`[queryStep.doQuery] patternWithoutVars: `, patternWithResolvedVars)\n\t\tconst applogsMatchingStatic = rollingFilter(thread, patternWithResolvedVars)\n\t\tconst varMapper = createObjMapper(variablesToFill)\n\t\tconst resultNodes = observableArrayMap(function queryStepDoStep() {\n\t\t\tconst newVarsAndTheirLog = applogsMatchingStatic.map(log => ({ log, vars: varMapper(log) }))\n\t\t\tif (VERBOSE.isEnabled) {\n\t\t\t\tVERBOSE(\n\t\t\t\t\t`[queryStep.doQuery] step node:`,\n\t\t\t\t\tnode?.variables,\n\t\t\t\t\t' =>',\n\t\t\t\t\tnewVarsAndTheirLog,\n\t\t\t\t\t'from:',\n\t\t\t\t\tuntracked(() => applogsMatchingStatic.applogs),\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn newVarsAndTheirLog.map(({ log, vars }) => {\n\t\t\t\tconst nodeVars = Object.assign({}, node?.variables, vars)\n\t\t\t\treturn new QueryNode(\n\t\t\t\t\t// TODO: ? Make single result nodes reactive using MappedThread - only really relevant if a result had multiple logs (or different paths would lead to the same result?)\n\t\t\t\t\t// ThreadInMemory.fromArray(\n\t\t\t\t\tStaticThread.fromArray(\n\t\t\t\t\t\t[log],\n\t\t\t\t\t\tcreateDebugName({\n\t\t\t\t\t\t\tcaller: 'QueryNode',\n\t\t\t\t\t\t\tthread: applogsMatchingStatic,\n\t\t\t\t\t\t\tpattern: `${stringify(nodeVars)}@${stringify(patternWithResolvedVars)}`,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t// true,\n\t\t\t\t\t),\n\t\t\t\t\tnodeVars,\n\t\t\t\t\tnode,\n\t\t\t\t)\n\t\t\t})\n\t\t}, { name: createDebugName({ caller: 'doQuery.mapNodes', thread: applogsMatchingStatic, pattern }) })\n\t\tif (VERBOSE.isEnabled) autorun(() => VERBOSE(`[queryStep.doQuery] resultNodes:`, [...resultNodes]))\n\t\tif (opts.debug) {\n\t\t\tLOG(\n\t\t\t\t`[queryStep] step result:`,\n\t\t\t\tuntracked(() =>\n\t\t\t\t\tresultNodes.map(({ variables, logsOfThisNode: thread }) => ({\n\t\t\t\t\t\tvariables,\n\t\t\t\t\t\tthread, // : /* util.inspect( */ thread.applogs, /* , { showHidden: false, depth: null }) */\n\t\t\t\t\t}))\n\t\t\t\t),\n\t\t\t)\n\t\t}\n\t\treturn resultNodes\n\t}\n\tconst observableResultNodes = observableArrayMap(\n\t\tfunction queryStepGetResults() {\n\t\t\tDEBUG(`[queryStep] Running with ${nodeSet?.nodes?.length} input nodes:`)\n\t\t\tif (!nodeSet) {\n\t\t\t\t// first query step\n\t\t\t\treturn [...doQuery(null)] // HACK copy array bc otherwise the observableArrayMap doesn't seem to depend on the contents somehow\n\t\t\t} else {\n\t\t\t\t// subsequent query steps\n\t\t\t\treturn [...nodeSet.nodes.flatMap(doQuery)]\n\t\t\t}\n\t\t},\n\t\t{ name: createDebugName({ caller: 'queryStep', thread, pattern }) },\n\t)\n\n\tif (VERBOSE.isEnabled) autorun(() => VERBOSE(`[queryStep] observableResultNodes:`, [...observableResultNodes]))\n\treturn new QueryResult(observableResultNodes)\n}, { equals: queryNodesComparer, argsDebugName: (thread, _nodes, pattern) => createDebugName({ caller: 'queryStep', thread, pattern }) })\n\nexport const queryNot = computedFnDeepCompare('queryNot', function queryNot( // TODO: update old-style query\n\tthread: Thread,\n\tstartNodes: QueryResult,\n\tpatternOrPatterns: DatalogQueryPattern | DatalogQueryPattern[],\n\topts: { debug?: boolean } = {},\n) {\n\tlet nodes = startNodes.nodes\n\tDEBUG.force(`queryNot<${thread.nameAndSizeUntracked}> from: ${nodes.length} nodes`)\n\tconst patterns = (Array.isArray(patternOrPatterns) ? patternOrPatterns : [patternOrPatterns]) as DatalogQueryPattern[]\n\n\tfor (const pattern of patterns) {\n\t\tif (!Object.entries(patternOrPatterns).length) throw new Error(`Pattern is empty`)\n\t\tnodes = nodes.filter(function innerNodeFilter({ /* applogs, */ variables }) {\n\t\t\tconst [patternWithResolvedVars, _variablesToFill] = resolveOrRemoveVariables(pattern, variables ?? {})\n\t\t\tVERBOSE(`[queryNot] patternWithoutVars: `, patternWithResolvedVars)\n\t\t\tconst newApplogs = rollingFilter(thread, patternWithResolvedVars)\n\t\t\tVERBOSE(`[queryNot] step node:`, variables, ' =>', newApplogs.size, 'applogs')\n\t\t\tVERBOSE.isDisabled || VERBOSE(`[queryNot] step node:`, variables, ' => empty?', untracked(() => newApplogs.applogs))\n\n\t\t\tif (opts.debug) LOG(`[queryNot] node result:`, variables, '=>', newApplogs.applogs)\n\t\t\treturn newApplogs.isEmpty\n\t\t})\n\t}\n\treturn new QueryResult(nodes)\n}, { equals: queryNodesComparer, argsDebugName: (thread, nodes, pattern) => createDebugName({ caller: 'queryNot', thread, pattern }) })\n\n// export function or(queries: QueryExecutor[]) {\n// return tagged(\n// `or{${stringify(queries)} } `,\n// function orExecutor(args: QueryExecutorArguments) {\n// const { db, nodes: contexts } = args\n// VERBOSE('[or]', { queries, contexts })\n// let results = []\n// for (const query of queries) {\n// const res = query(args)\n// VERBOSE('[or] query', query, 'result =>', res)\n// results.push(...res.nodes)\n// }\n// return { contexts: results }\n// }\n// )\n// }\n\n// export type Tagged<T> = T & { tag: string }\n// export function tagged<T>(tag: string, thing: T): Tagged<T> {\n// const e = thing as (T & { tag: string })\n// e.tag = tag\n// return e\n// }\n\n//////////////////////\n// COMPOSED QUERIES //\n//////////////////////\n// createDebugName({ caller: 'useKidRelations' }, true)\nexport const filterAndMap = computedFnDeepCompare('filterAndMap', function filterAndMap<R>(\n\tthread: Thread,\n\tpattern: DatalogQueryPattern,\n\tmapper: (keyof Applog) | (Partial<{ [key in keyof Applog]: string }>) | ((applog: Applog) => R),\n) {\n\tDEBUG(`filterAndMap<${thread.nameAndSizeUntracked}>`, pattern)\n\n\tconst filtered = rollingFilter(thread, pattern)\n\tVERBOSE(`[filterAndMap] filtered:`, filtered.untrackedSize)\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[filterAndMap] filtered:`, filtered.applogs))\n\n\tconst name = createDebugName({ thread, pattern, caller: 'filterAndMap' })\n\tconst mapped = observableArrayMap<ApplogValue | any>(() => mapThreadWith(filtered, mapper), { name }) // TODO typing:? Record<string, ApplogValue> ?\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[filterAndMap] mapped:`, mapped))\n\treturn mapped\n}, { equals: comparer.structural, argsDebugName: (thread, pattern) => createDebugName({ caller: 'filterAndMap', thread, pattern }) })\n\nexport const queryAndMap = computedFnDeepCompare('queryAndMap', function queryAndMap<R>(\n\tthreadOrLogs: Thread | Applog[],\n\tpatternOrPatterns: Parameters<typeof query>[1],\n\tmapDef: string | (Partial<{ [key in keyof SearchContext]: string }>) | ((record: SearchContext) => R),\n\tvariables: SearchContext = {},\n) {\n\tconst thread = threadFromMaybeArray(threadOrLogs)\n\tDEBUG(`queryAndMap<${thread.nameAndSizeUntracked}>`, { patternOrPatterns, variables, map: mapDef })\n\tconst debugName = createDebugName({ thread, caller: 'queryAndMap' })\n\n\tconst queryResult = query(thread, patternOrPatterns)\n\tVERBOSE(`[queryAndMap] filtered count:`, queryResult.untrackedSize)\n\tconst mapped = observableArrayMap<ApplogValue | any>(\n\t\t() => mapQueryResultWith(queryResult, mapDef),\n\t\t{ name: debugName },\n\t)\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[queryAndMap] result:`, toJS(mapped)))\n\treturn mapped\n}, { equals: comparer.structural, argsDebugName: (thread, pattern) => createDebugName({ caller: 'queryAndMap', thread, pattern }) })\n\nexport const queryEntity = computedFnDeepCompare('queryEntity', function queryEntity(\n\tthread: Thread,\n\tname: string,\n\tentityID: EntityID,\n\tattributes: readonly string[],\n) {\n\tDEBUG(`queryEntity<${thread.nameAndSizeUntracked}>`, entityID, name)\n\n\tconst filtered = rollingFilter(thread, { en: entityID, at: prefixAttrs(name, attributes) })\n\tVERBOSE(`queryEntity applogs:`, filtered.applogs)\n\treturn computed(() =>\n\t\tfiltered.isEmpty ? null : Object.fromEntries(\n\t\t\tfiltered.map(({ at, vl }) => [at.slice(name.length + 1), vl]),\n\t\t)\n\t)\n}, {\n\tequals: computedStructuralComparer,\n\targsDebugName: (thread, name, entityID) => createDebugName({ caller: 'queryEntity', thread, args: { name, entityID } }),\n})\n\nexport const agentsOfThread = computedFnDeepCompare('agentsOfThread', function agentsOfThread(\n\tthread: Thread,\n) {\n\tDEBUG(`agentsOfThread<${thread.nameAndSizeUntracked}>`)\n\n\tconst mapped = observable.map<string, number>()\n\tconst onEvent = action((event: ThreadEvent) => {\n\t\tfor (const log of (isInitEvent(event) ? event.init : event.added)) {\n\t\t\tconst prev = mapped.get(log.ag) ?? 0\n\t\t\tmapped.set(log.ag, prev + 1)\n\t\t}\n\t\tfor (const log of (!isInitEvent(event) && event.removed || [])) {\n\t\t\tconst prev = mapped.get(log.ag)\n\t\t\tif (!prev || prev < 1) throw ERROR(`[agentsOfThread] number is now negative`, { log, event, mapped, prev })\n\t\t\tmapped.set(log.ag, prev - 1)\n\t\t}\n\t\tLOG(`agentsOfThread<${thread.nameAndSizeUntracked}> processed event`, { event, mapped })\n\t})\n\n\tonEvent({ init: thread.applogs })\n\tconst unsubscribe = thread.subscribe(onEvent)\n\tonBecomeObserved(mapped, unsubscribe)\n\n\treturn mapped\n})\n\nexport const entityOverlap = computedFnDeepCompare('entityOverlap', function entityOverlapCount(\n\tthreadA: Thread,\n\tthreadB: Thread,\n) {\n\tLOG(`entityOverlap<${threadA.nameAndSizeUntracked}, ${threadB.nameAndSizeUntracked}>`)\n\n\treturn computed(() => {\n\t\tconst entitiesA = new Set(threadA.map(log => log.en))\n\t\tconst entitiesB = new Set(threadB.map(log => log.en))\n\t\treturn [...entitiesA].filter(en => entitiesB.has(en))\n\t})\n})\n\nexport const entityOverlapMap = function entityOverlapMap(\n\tthreadA: Thread,\n\tthreadB: Thread,\n\tthreadAName = 'incoming',\n\tthreadBName = 'current',\n) {\n\tconst useInferredVM = (en, thread: Thread) => en\n\tconst overlapping = entityOverlap(threadA, threadB).get()\n\tconst mapped = new Map()\n\toverlapping.forEach(eachEntityID => (\n\t\tmapped.set(eachEntityID, {\n\t\t\t[threadAName]: useInferredVM(eachEntityID, threadA),\n\t\t\t[threadBName]: useInferredVM(eachEntityID, threadB),\n\t\t})\n\t))\n}\n\nexport const entityOverlapCount = computedFnDeepCompare(\n\t'entityOverlapCount',\n\tfunction entityOverlapCount(threadA: Thread, threadB: Thread) {\n\t\treturn computed(() => entityOverlap(threadA, threadB).get().length)\n\t},\n)\nexport const querySingle = computedFnDeepCompare('querySingle', function querySingle(\n\tthreadOrLogs: Thread | Applog[],\n\tpatternOrPatterns: Parameters<typeof query>[1],\n\tvariables: SearchContext = {},\n) {\n\tconst result = query(threadOrLogs, patternOrPatterns, variables)\n\treturn computed(() => {\n\t\tif (result.isEmpty) return null\n\t\tif (result.size > 1) throw ERROR(`[querySingle] got`, result.size, `results:`, result)\n\t\tconst logsOfThisNode = result.nodes[0].logsOfThisNode\n\t\tif (logsOfThisNode.size != 1) throw ERROR(`[querySingle] single result, but got`, logsOfThisNode.size, `logs:`, logsOfThisNode.applogs)\n\t\treturn logsOfThisNode.applogs[0]\n\t})\n}, {\n\tequals: comparer.structural,\n\targsDebugName: (thread, pattern) => createDebugName({ caller: 'querySingle', thread, pattern }),\n})\n\nexport const querySingleAndMap = computedFnDeepCompare(\n\t'querySingleAndMap',\n\tfunction querySingleAndMap<MAP extends (keyof Applog | (Partial<{ [key in keyof Applog]: string }>))>(\n\t\tthreadOrLogs: Thread | Applog[],\n\t\tpatternOrPatterns: Parameters<typeof query>[1],\n\t\tmapDef: MAP,\n\t\tvariables: SearchContext = {},\n\t) {\n\t\tconst resultBox = querySingle(threadOrLogs, patternOrPatterns, variables)\n\t\treturn computed<ApplogValue | { [key in keyof MAP]: ApplogValue } | null>(() => {\n\t\t\tconst log = resultBox.get()\n\t\t\tif (!log) return undefined\n\t\t\tif (typeof mapDef === 'string') {\n\t\t\t\treturn log[mapDef as string]\n\t\t\t} else {\n\t\t\t\treturn createObjMapper(mapDef)(log)\n\t\t\t}\n\t\t})\n\t},\n\t{\n\t\tequals: comparer.structural,\n\t\targsDebugName: (thread, pattern) => createDebugName({ caller: 'querySingleAndMap', thread, pattern }),\n\t},\n)\n/////////////\n// HELPERS //\n/////////////\n\nexport const mapThreadWith = function filterAndMapGetterFx<R>(\n\tthread: Thread,\n\tmapDef: (keyof Applog) | (Partial<{ [key in keyof Applog]: string }>) | ((applog: Applog) => R),\n) {\n\tif (typeof mapDef === 'function') {\n\t\treturn thread.map(mapDef)\n\t} else if (typeof mapDef === 'string') {\n\t\treturn thread.map(log => log[mapDef])\n\t} else {\n\t\treturn thread.map(createObjMapper(mapDef))\n\t}\n}\nexport const mapQueryResultWith = function filterAndMapGetterFx<R>(\n\tqueryResult: QueryResult,\n\tmapDef: string | (Partial<{ [key in keyof SearchContext]: string }>) | ((record: SearchContext) => R),\n) {\n\tif (typeof mapDef === 'function') {\n\t\treturn queryResult.records.map(mapDef)\n\t} else if (typeof mapDef === 'string') {\n\t\treturn queryResult.nodes.map((node) => {\n\t\t\tif (!Object.hasOwn(node.record, mapDef)) {\n\t\t\t\tif (node.logsOfThisNode.size !== 1) {\n\t\t\t\t\tthrow ERROR(`not sure what to map (it's not a var and a result node log count of ${node.logsOfThisNode.size})`)\n\t\t\t\t}\n\t\t\t\treturn node.logsOfThisNode.firstLog[mapDef]\n\t\t\t}\n\t\t\treturn node.record[mapDef]\n\t\t})\n\t} else {\n\t\treturn queryResult.nodes.map((node) => {\n\t\t\treturn createObjMapper(mapDef)(queryResult)\n\t\t})\n\t}\n}\n/**\n * Map Applog to custom named record, e.g.:\n * { en: 'movieID', vl: 'movieName' }\n * will map the applog to { movieID: .., movieName: .. }\n */\nexport function createObjMapper<FROM extends string, TO extends string>(applogFieldMap: Partial<{ [key in FROM]: TO }>) {\n\treturn (applog: { [key in FROM]: any }) => {\n\t\treturn Object.entries(applogFieldMap).reduce((acc, [key, value]) => {\n\t\t\tacc[value as TO] = applog[key]\n\t\t\treturn acc\n\t\t}, {} as Partial<{ [key in TO]: ApplogValue }>)\n\t}\n}\n\nexport function startsWith(str: string) {\n\treturn (value) => value.startsWith(str)\n}\n\nexport function prefixAttrs(prefix: string, attrs: readonly string[]) {\n\treturn attrs.map(at => prefixAt(prefix, at))\n}\nexport function prefixAt(prefix: string, attr: string) {\n\treturn `${prefix}/${attr}`\n}\nexport function threadFromMaybeArray(threadOrLogs: Thread | Applog[]) {\n\tif (!Array.isArray(threadOrLogs)) {\n\t\treturn threadOrLogs\n\t}\n\treturn ThreadInMemory.fromArray(threadOrLogs, `threadFromArray[${threadOrLogs.length}]`, true)\n}\n","import { Logger } from 'besonders-logger'\nimport { autorun, comparer, toJS } from 'mobx'\nimport stringify from 'safe-stable-stringify'\nimport { Applog, CidString } from '../applog/datom-types'\nimport { computedFnDeepCompare, createDebugName, observableArrayMap } from '../mobx/mobx-utils'\nimport { Thread } from '../thread/basic'\nimport { ThreadInMemory } from '../thread/writeable'\n\nconst { WARN, LOG, DEBUG, VERBOSE, ERROR } = Logger.setup(Logger.INFO) // eslint-disable-line no-unused-vars\n\nexport interface DivergenceLeaf {\n\tlog: Applog\n\tthread: Thread\n}\n\nexport const queryDivergencesByPrev = computedFnDeepCompare('queryDivergencesByPrev', function queryConflictingByPrev(\n\tsourceThread: Thread,\n) {\n\tDEBUG(`queryDivergencesByPrev<${sourceThread.nameAndSizeUntracked}>`)\n\tif (sourceThread.filters.includes('lastWriteWins')) WARN(`queryDivergencesByPrev on thread lastWriteWins`, sourceThread)\n\n\tconst divergences = observableArrayMap(() => {\n\t\tconst logsForNode = new Map<CidString, Applog[]>()\n\t\tconst leafs = new Set<CidString>()\n\t\tVERBOSE('all applogs:', sourceThread.applogs)\n\t\tfor (const log of sourceThread.applogs) {\n\t\t\tlet prevLogs\n\t\t\tif (log.pv) {\n\t\t\t\tprevLogs = log.pv && logsForNode.get(log.pv.toString())\n\t\t\t\tleafs.delete(log.pv.toString())\n\t\t\t}\n\t\t\tVERBOSE('traversing log', { log, prevLogs, leafs: Array.from(leafs) })\n\t\t\tlogsForNode.set(log.cid, prevLogs ? [...prevLogs, log] : [log])\n\t\t\tleafs.add(log.cid)\n\t\t}\n\t\treturn Array.from(leafs).map(leafID => {\n\t\t\t// TODO use MappedThread?\n\t\t\tconst thread = new ThreadInMemory(\n\t\t\t\tcreateDebugName({\n\t\t\t\t\tcaller: 'DivergenceLeaf',\n\t\t\t\t\tthread: sourceThread,\n\t\t\t\t\tpattern: `leaf: ${leafID}`,\n\t\t\t\t}),\n\t\t\t\tlogsForNode.get(leafID),\n\t\t\t\tsourceThread.filters,\n\t\t\t\ttrue,\n\t\t\t\t// TODO: sourceThread,\n\t\t\t)\n\t\t\treturn ({ log: thread.latestLog, thread })\n\t\t})\n\t}, { name: createDebugName({ caller: 'queryDivergencesByPrev', thread: sourceThread }) })\n\tVERBOSE.isDisabled || autorun(() => VERBOSE(`[queryDivergencesByPrev] result:`, toJS(divergences)))\n\treturn divergences\n}, { equals: comparer.structural })\n\n// export const queryDivergencesOfEnAtByPrev = computedFnDeepCompare('queryDivergencesOfEnAtByPrev', function queryDivergencesOfEnAtByPrev(\n// \tsourceThread: Thread,\n// ) {\n// \tDEBUG(`queryDivergencesOfEnAtByPrev<${sourceThread.nameAndSizeUntracked}>`)\n// \tif (sourceThread.filters.includes('lastWriteWins')) WARN(`queryDivergencesOfEnAtByPrevFon thread lastWriteWins`, sourceThread)\n\n// \tconst divergences = observableArrayMap(() => {\n// \t\tconst logsForNode = new Map<CidString, Applog[]>()\n// \t\tconst leafs = new Map<string, Set<CidString>>() // [en,at]\n// \t\tVERBOSE('all applogs:', sourceThread.applogs)\n// \t\tfor (const log of sourceThread.applogs) {\n// \t\t\tconst key = stringify([log.en, log.at])\n// \t\t\tif (!leafs.has(key)) leafs.set(key, new Set())\n// \t\t\tlet prevLogs\n// \t\t\tif (log.pv) {\n// \t\t\t\tprevLogs = log.pv && logsForNode.get(log.pv.toString())\n// \t\t\t\tleafs.get(key).delete(log.pv.toString())\n// \t\t\t}\n// \t\t\tVERBOSE('traversing log', { key, log, prevLogs, leafs: Array.from(leafs) })\n// \t\t\tlogsForNode.set(log.cid, prevLogs ? [...prevLogs, log] : [log])\n// \t\t\tleafs.get(key).add(log.cid)\n// \t\t}\n// \t\treturn Array.from(leafs.entries()).map(([_enAt, leafs]) => {\n// \t\t\t// TODO use MappedThread?\n// \t\t\tconst thread = new ThreadInMemory(\n// \t\t\t\tcreateDebugName({\n// \t\t\t\t\tcaller: 'DivergenceLeaf',\n// \t\t\t\t\tthread: sourceThread,\n// \t\t\t\t\tpattern: `leaf: ${leafID}`,\n// \t\t\t\t}),\n// \t\t\t\tlogsForNode.get(leafID),\n// \t\t\t\tsourceThread.filters,\n// \t\t\t\ttrue,\n// \t\t\t\t// TODO: sourceThread,\n// \t\t\t)\n// \t\t\treturn ({ log: thread.latestLog, thread })\n// \t\t})\n// \t}, { name: createDebugName({ caller: 'queryDivergencesOfEnAtByPrev', thread: sourceThread }) })\n// \tVERBOSE.isDisabled || autorun(() => VERBOSE(`[queryDivergencesOfEnAtByPrev] result:`, toJS(divergences)))\n// \treturn divergences\n// }, { equals: comparer.structural })\n","import { DatomPart } from '../applog/datom-types'\n\nexport function includes(str: string) {\n\treturn (vl: DatomPart) => vl?.includes?.(str)\n}\nexport function includedIn(arr: string[]) {\n\treturn (vl: DatomPart) => arr?.includes?.(vl)\n}\n"],"mappings":"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","names":["lastWriteWins","withoutDeleted","query","queryStep","thread","queryNot","filterAndMap","queryAndMap","queryEntity","agentsOfThread","entityOverlapMap","entityOverlapCount","querySingle","querySingleAndMap","filterAndMapGetterFx","WARN","LOG","DEBUG","VERBOSE","ERROR"]}
@@ -1521,8 +1521,6 @@ var Bool = BooleanTB.bind(import_typebox.Type);
1521
1521
  var STR = Str();
1522
1522
  var NUM = Num();
1523
1523
  var BOOL = Bool();
1524
- var DefaultTrue = true;
1525
- var DefaultFalse = false;
1526
1524
  function checkParityTB() {
1527
1525
  const s1 = Str();
1528
1526
  const s2 = Str();
@@ -1547,9 +1545,7 @@ export {
1547
1545
  STR,
1548
1546
  NUM,
1549
1547
  BOOL,
1550
- DefaultTrue,
1551
- DefaultFalse,
1552
1548
  checkParityTB,
1553
1549
  arrayIfSingle
1554
1550
  };
1555
- //# sourceMappingURL=chunk-PTGUFZ3Q.min.js.map
1551
+ //# sourceMappingURL=chunk-5UN776TZ.min.js.map