@korajs/devtools 0.3.2 → 0.4.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.
@@ -1,8 +1,32 @@
1
+ // ../../node_modules/.pnpm/htm@3.1.1/node_modules/htm/dist/htm.mjs
2
+ var n = function(t4, s3, r3, e3) {
3
+ var u3;
4
+ s3[0] = 0;
5
+ for (var h3 = 1; h3 < s3.length; h3++) {
6
+ var p3 = s3[h3++], a3 = s3[h3] ? (s3[0] |= p3 ? 1 : 2, r3[s3[h3++]]) : s3[++h3];
7
+ 3 === p3 ? e3[0] = a3 : 4 === p3 ? e3[1] = Object.assign(e3[1] || {}, a3) : 5 === p3 ? (e3[1] = e3[1] || {})[s3[++h3]] = a3 : 6 === p3 ? e3[1][s3[++h3]] += a3 + "" : p3 ? (u3 = t4.apply(a3, n(t4, a3, r3, ["", null])), e3.push(u3), a3[0] ? s3[0] |= 2 : (s3[h3 - 2] = 0, s3[h3] = u3)) : e3.push(a3);
8
+ }
9
+ return e3;
10
+ };
11
+ var t = /* @__PURE__ */ new Map();
12
+ function htm_default(s3) {
13
+ var r3 = t.get(this);
14
+ return r3 || (r3 = /* @__PURE__ */ new Map(), t.set(this, r3)), (r3 = n(this, r3.get(s3) || (r3.set(s3, r3 = (function(n3) {
15
+ for (var t4, s4, r4 = 1, e3 = "", u3 = "", h3 = [0], p3 = function(n4) {
16
+ 1 === r4 && (n4 || (e3 = e3.replace(/^\s*\n\s*|\s*\n\s*$/g, ""))) ? h3.push(0, n4, e3) : 3 === r4 && (n4 || e3) ? (h3.push(3, n4, e3), r4 = 2) : 2 === r4 && "..." === e3 && n4 ? h3.push(4, n4, 0) : 2 === r4 && e3 && !n4 ? h3.push(5, 0, true, e3) : r4 >= 5 && ((e3 || !n4 && 5 === r4) && (h3.push(r4, 0, e3, s4), r4 = 6), n4 && (h3.push(r4, n4, 0, s4), r4 = 6)), e3 = "";
17
+ }, a3 = 0; a3 < n3.length; a3++) {
18
+ a3 && (1 === r4 && p3(), p3(a3));
19
+ for (var l3 = 0; l3 < n3[a3].length; l3++) t4 = n3[a3][l3], 1 === r4 ? "<" === t4 ? (p3(), h3 = [h3], r4 = 3) : e3 += t4 : 4 === r4 ? "--" === e3 && ">" === t4 ? (r4 = 1, e3 = "") : e3 = t4 + e3[0] : u3 ? t4 === u3 ? u3 = "" : e3 += t4 : '"' === t4 || "'" === t4 ? u3 = t4 : ">" === t4 ? (p3(), r4 = 1) : r4 && ("=" === t4 ? (r4 = 5, s4 = e3, e3 = "") : "/" === t4 && (r4 < 5 || ">" === n3[a3][l3 + 1]) ? (p3(), 3 === r4 && (h3 = h3[0]), r4 = h3, (h3 = h3[0]).push(2, 0, r4), r4 = 0) : " " === t4 || " " === t4 || "\n" === t4 || "\r" === t4 ? (p3(), r4 = 2) : e3 += t4), 3 === r4 && "!--" === e3 && (r4 = 4, h3 = h3[0]);
20
+ }
21
+ return p3(), h3;
22
+ })(s3)), r3), arguments, [])).length > 1 ? r3 : r3[0];
23
+ }
24
+
1
25
  // ../../node_modules/.pnpm/preact@10.29.1/node_modules/preact/dist/preact.mjs
2
- var n;
26
+ var n2;
3
27
  var l;
4
28
  var u;
5
- var t;
29
+ var t2;
6
30
  var i;
7
31
  var r;
8
32
  var o;
@@ -29,7 +53,7 @@ function b(n3) {
29
53
  function k(l3, u3, t4) {
30
54
  var i3, r3, o3, e3 = {};
31
55
  for (o3 in u3) "key" == o3 ? i3 = u3[o3] : "ref" == o3 ? r3 = u3[o3] : e3[o3] = u3[o3];
32
- if (arguments.length > 2 && (e3.children = arguments.length > 3 ? n.call(arguments, 2) : t4), "function" == typeof l3 && null != l3.defaultProps) for (o3 in l3.defaultProps) void 0 === e3[o3] && (e3[o3] = l3.defaultProps[o3]);
56
+ if (arguments.length > 2 && (e3.children = arguments.length > 3 ? n2.call(arguments, 2) : t4), "function" == typeof l3 && null != l3.defaultProps) for (o3 in l3.defaultProps) void 0 === e3[o3] && (e3[o3] = l3.defaultProps[o3]);
33
57
  return x(l3, e3, i3, r3, null);
34
58
  }
35
59
  function x(n3, t4, i3, r3, o3) {
@@ -198,7 +222,7 @@ function G(u3, t4, i3, r3, o3, e3, f3, c3, s3) {
198
222
  }
199
223
  if (null == x2) m3 === k3 || c3 && u3.data == k3 || (u3.data = k3);
200
224
  else {
201
- if (e3 = e3 && n.call(u3.childNodes), !c3 && null != e3) for (m3 = {}, a3 = 0; a3 < u3.attributes.length; a3++) m3[(y2 = u3.attributes[a3]).name] = y2.value;
225
+ if (e3 = e3 && n2.call(u3.childNodes), !c3 && null != e3) for (m3 = {}, a3 = 0; a3 < u3.attributes.length; a3++) m3[(y2 = u3.attributes[a3]).name] = y2.value;
202
226
  for (a3 in m3) y2 = m3[a3], "dangerouslySetInnerHTML" == a3 ? p3 = y2 : "children" == a3 || a3 in k3 || "value" == a3 && "defaultValue" in k3 || "checked" == a3 && "defaultChecked" in k3 || N(u3, a3, null, y2, o3);
203
227
  for (a3 in k3) y2 = k3[a3], "children" == a3 ? v3 = y2 : "dangerouslySetInnerHTML" == a3 ? h3 = y2 : "value" == a3 ? w3 = y2 : "checked" == a3 ? _2 = y2 : c3 && "function" != typeof y2 || m3[a3] === y2 || N(u3, a3, y2, m3[a3], o3);
204
228
  if (h3) c3 || p3 && (h3.__html == p3.__html || h3.__html == u3.innerHTML) || (u3.innerHTML = h3.__html), t4.__k = [];
@@ -235,16 +259,16 @@ function Q(n3, l3, u3) {
235
259
  }
236
260
  function R(u3, t4, i3) {
237
261
  var r3, o3, e3, f3;
238
- t4 == document && (t4 = document.documentElement), l.__ && l.__(u3, t4), o3 = (r3 = "function" == typeof i3) ? null : i3 && i3.__k || t4.__k, e3 = [], f3 = [], q(t4, u3 = (!r3 && i3 || t4).__k = k(S, null, [u3]), o3 || d, d, t4.namespaceURI, !r3 && i3 ? [i3] : o3 ? null : t4.firstChild ? n.call(t4.childNodes) : null, e3, !r3 && i3 ? i3 : o3 ? o3.__e : t4.firstChild, r3, f3), D(e3, u3, f3);
262
+ t4 == document && (t4 = document.documentElement), l.__ && l.__(u3, t4), o3 = (r3 = "function" == typeof i3) ? null : i3 && i3.__k || t4.__k, e3 = [], f3 = [], q(t4, u3 = (!r3 && i3 || t4).__k = k(S, null, [u3]), o3 || d, d, t4.namespaceURI, !r3 && i3 ? [i3] : o3 ? null : t4.firstChild ? n2.call(t4.childNodes) : null, e3, !r3 && i3 ? i3 : o3 ? o3.__e : t4.firstChild, r3, f3), D(e3, u3, f3);
239
263
  }
240
- n = w.slice, l = { __e: function(n3, l3, u3, t4) {
264
+ n2 = w.slice, l = { __e: function(n3, l3, u3, t4) {
241
265
  for (var i3, r3, o3; l3 = l3.__; ) if ((i3 = l3.__c) && !i3.__) try {
242
266
  if ((r3 = i3.constructor) && null != r3.getDerivedStateFromError && (i3.setState(r3.getDerivedStateFromError(n3)), o3 = i3.__d), null != i3.componentDidCatch && (i3.componentDidCatch(n3, t4 || {}), o3 = i3.__d), o3) return i3.__E = i3;
243
267
  } catch (l4) {
244
268
  n3 = l4;
245
269
  }
246
270
  throw n3;
247
- } }, u = 0, t = function(n3) {
271
+ } }, u = 0, t2 = function(n3) {
248
272
  return null != n3 && void 0 === n3.constructor;
249
273
  }, C.prototype.setState = function(n3, l3) {
250
274
  var u3;
@@ -256,7 +280,7 @@ n = w.slice, l = { __e: function(n3, l3, u3, t4) {
256
280
  }, H.__r = 0, f = Math.random().toString(8), c = "__d" + f, s = "__a" + f, a = /(PointerCapture)$|Capture$/i, h = 0, p = V(false), v = V(true), y = 0;
257
281
 
258
282
  // ../../node_modules/.pnpm/preact@10.29.1/node_modules/preact/hooks/dist/hooks.mjs
259
- var t2;
283
+ var t3;
260
284
  var r2;
261
285
  var u2;
262
286
  var i2;
@@ -278,7 +302,7 @@ function d2(n3) {
278
302
  return o2 = 1, h2(D2, n3);
279
303
  }
280
304
  function h2(n3, u3, i3) {
281
- var o3 = p2(t2++, 2);
305
+ var o3 = p2(t3++, 2);
282
306
  if (o3.t = n3, !o3.__c && (o3.__ = [i3 ? i3(u3) : D2(void 0, u3), function(n4) {
283
307
  var t4 = o3.__N ? o3.__N[0] : o3.__[0], r3 = o3.t(t4, n4);
284
308
  t4 !== r3 && (o3.__N = [r3, o3.__[1]], o3.__c.setState({}));
@@ -312,7 +336,7 @@ function h2(n3, u3, i3) {
312
336
  return o3.__N || o3.__;
313
337
  }
314
338
  function T2(n3, r3) {
315
- var u3 = p2(t2++, 7);
339
+ var u3 = p2(t3++, 7);
316
340
  return C2(u3.__H, r3) && (u3.__ = n3(), u3.__H = r3, u3.__h = n3), u3.__;
317
341
  }
318
342
  function q2(n3, t4) {
@@ -335,11 +359,11 @@ c2.__b = function(n3) {
335
359
  }, c2.__ = function(n3, t4) {
336
360
  n3 && t4.__k && t4.__k.__m && (n3.__m = t4.__k.__m), s2 && s2(n3, t4);
337
361
  }, c2.__r = function(n3) {
338
- a2 && a2(n3), t2 = 0;
362
+ a2 && a2(n3), t3 = 0;
339
363
  var i3 = (r2 = n3.__c).__H;
340
364
  i3 && (u2 === r2 ? (i3.__h = [], r2.__h = [], i3.__.some(function(n4) {
341
365
  n4.__N && (n4.__ = n4.__N), n4.u = n4.__N = void 0;
342
- })) : (i3.__h.some(z2), i3.__h.some(B2), i3.__h = [], t2 = 0)), u2 = r2;
366
+ })) : (i3.__h.some(z2), i3.__h.some(B2), i3.__h = [], t3 = 0)), u2 = r2;
343
367
  }, c2.diffed = function(n3) {
344
368
  v2 && v2(n3);
345
369
  var t4 = n3.__c;
@@ -393,30 +417,6 @@ function D2(n3, t4) {
393
417
  return "function" == typeof t4 ? t4(n3) : t4;
394
418
  }
395
419
 
396
- // ../../node_modules/.pnpm/htm@3.1.1/node_modules/htm/dist/htm.mjs
397
- var n2 = function(t4, s3, r3, e3) {
398
- var u3;
399
- s3[0] = 0;
400
- for (var h3 = 1; h3 < s3.length; h3++) {
401
- var p3 = s3[h3++], a3 = s3[h3] ? (s3[0] |= p3 ? 1 : 2, r3[s3[h3++]]) : s3[++h3];
402
- 3 === p3 ? e3[0] = a3 : 4 === p3 ? e3[1] = Object.assign(e3[1] || {}, a3) : 5 === p3 ? (e3[1] = e3[1] || {})[s3[++h3]] = a3 : 6 === p3 ? e3[1][s3[++h3]] += a3 + "" : p3 ? (u3 = t4.apply(a3, n2(t4, a3, r3, ["", null])), e3.push(u3), a3[0] ? s3[0] |= 2 : (s3[h3 - 2] = 0, s3[h3] = u3)) : e3.push(a3);
403
- }
404
- return e3;
405
- };
406
- var t3 = /* @__PURE__ */ new Map();
407
- function htm_default(s3) {
408
- var r3 = t3.get(this);
409
- return r3 || (r3 = /* @__PURE__ */ new Map(), t3.set(this, r3)), (r3 = n2(this, r3.get(s3) || (r3.set(s3, r3 = (function(n3) {
410
- for (var t4, s4, r4 = 1, e3 = "", u3 = "", h3 = [0], p3 = function(n4) {
411
- 1 === r4 && (n4 || (e3 = e3.replace(/^\s*\n\s*|\s*\n\s*$/g, ""))) ? h3.push(0, n4, e3) : 3 === r4 && (n4 || e3) ? (h3.push(3, n4, e3), r4 = 2) : 2 === r4 && "..." === e3 && n4 ? h3.push(4, n4, 0) : 2 === r4 && e3 && !n4 ? h3.push(5, 0, true, e3) : r4 >= 5 && ((e3 || !n4 && 5 === r4) && (h3.push(r4, 0, e3, s4), r4 = 6), n4 && (h3.push(r4, n4, 0, s4), r4 = 6)), e3 = "";
412
- }, a3 = 0; a3 < n3.length; a3++) {
413
- a3 && (1 === r4 && p3(), p3(a3));
414
- for (var l3 = 0; l3 < n3[a3].length; l3++) t4 = n3[a3][l3], 1 === r4 ? "<" === t4 ? (p3(), h3 = [h3], r4 = 3) : e3 += t4 : 4 === r4 ? "--" === e3 && ">" === t4 ? (r4 = 1, e3 = "") : e3 = t4 + e3[0] : u3 ? t4 === u3 ? u3 = "" : e3 += t4 : '"' === t4 || "'" === t4 ? u3 = t4 : ">" === t4 ? (p3(), r4 = 1) : r4 && ("=" === t4 ? (r4 = 5, s4 = e3, e3 = "") : "/" === t4 && (r4 < 5 || ">" === n3[a3][l3 + 1]) ? (p3(), 3 === r4 && (h3 = h3[0]), r4 = h3, (h3 = h3[0]).push(2, 0, r4), r4 = 0) : " " === t4 || " " === t4 || "\n" === t4 || "\r" === t4 ? (p3(), r4 = 2) : e3 += t4), 3 === r4 && "!--" === e3 && (r4 = 4, h3 = h3[0]);
415
- }
416
- return p3(), h3;
417
- })(s3)), r3), arguments, [])).length > 1 ? r3 : r3[0];
418
- }
419
-
420
420
  // src/types.ts
421
421
  var EVENT_TYPE_CATEGORIES = {
422
422
  "operation:created": "operation",
@@ -434,12 +434,153 @@ var EVENT_TYPE_CATEGORIES = {
434
434
  "query:subscribed": "query",
435
435
  "query:invalidated": "query",
436
436
  "query:executed": "query",
437
- "connection:quality": "connection"
437
+ "connection:quality": "connection",
438
+ "sync:diagnostics": "sync",
439
+ "sync:bandwidth": "sync",
440
+ "sync:initial-sync-progress": "sync",
441
+ "awareness:updated": "sync",
442
+ "state-machine:transition": "operation",
443
+ "state-machine:rejected": "operation"
438
444
  };
439
445
  function eventTypeToCategory(type) {
440
446
  return EVENT_TYPE_CATEGORIES[type];
441
447
  }
442
448
 
449
+ // src/filter/event-filter.ts
450
+ function extractCollection(event) {
451
+ const e3 = event.event;
452
+ switch (e3.type) {
453
+ case "operation:created":
454
+ case "operation:applied":
455
+ return e3.operation.collection;
456
+ case "merge:started":
457
+ return e3.operationA.collection;
458
+ case "merge:completed":
459
+ case "merge:conflict":
460
+ return e3.trace.operationA.collection;
461
+ case "constraint:violated":
462
+ return e3.trace.operationA.collection;
463
+ case "query:subscribed":
464
+ return e3.collection;
465
+ case "query:invalidated":
466
+ return e3.trigger.collection;
467
+ case "sync:sent":
468
+ return e3.operations[0]?.collection ?? null;
469
+ case "sync:received":
470
+ return e3.operations[0]?.collection ?? null;
471
+ default:
472
+ return null;
473
+ }
474
+ }
475
+ function filterEvents(events2, criteria) {
476
+ const { categories, types, timeRange, collection } = criteria;
477
+ if (!categories && !types && !timeRange && !collection) {
478
+ return events2;
479
+ }
480
+ const categorySet = categories ? new Set(categories) : null;
481
+ const typeSet = types ? new Set(types) : null;
482
+ return events2.filter((event) => {
483
+ if (categorySet) {
484
+ const cat = eventTypeToCategory(event.event.type);
485
+ if (!categorySet.has(cat)) return false;
486
+ }
487
+ if (typeSet) {
488
+ if (!typeSet.has(event.event.type)) return false;
489
+ }
490
+ if (timeRange) {
491
+ if (event.receivedAt < timeRange.start || event.receivedAt > timeRange.end) {
492
+ return false;
493
+ }
494
+ }
495
+ if (collection) {
496
+ const eventCollection = extractCollection(event);
497
+ if (eventCollection !== collection) return false;
498
+ }
499
+ return true;
500
+ });
501
+ }
502
+
503
+ // src/stats/event-stats.ts
504
+ function computeStatistics(events2) {
505
+ const eventsByCategory = {
506
+ operation: 0,
507
+ merge: 0,
508
+ sync: 0,
509
+ query: 0,
510
+ connection: 0
511
+ };
512
+ const eventsByType = {};
513
+ let mergeConflicts = 0;
514
+ let constraintViolations = 0;
515
+ let mergeDurationSum = 0;
516
+ let mergeDurationCount = 0;
517
+ let queryDurationSum = 0;
518
+ let queryDurationCount = 0;
519
+ let syncOperationsSent = 0;
520
+ let syncOperationsReceived = 0;
521
+ for (const timestamped of events2) {
522
+ const e3 = timestamped.event;
523
+ const category = eventTypeToCategory(e3.type);
524
+ eventsByCategory[category]++;
525
+ eventsByType[e3.type] = (eventsByType[e3.type] ?? 0) + 1;
526
+ switch (e3.type) {
527
+ case "merge:completed":
528
+ mergeDurationSum += e3.trace.duration;
529
+ mergeDurationCount++;
530
+ break;
531
+ case "merge:conflict":
532
+ mergeConflicts++;
533
+ mergeDurationSum += e3.trace.duration;
534
+ mergeDurationCount++;
535
+ break;
536
+ case "constraint:violated":
537
+ constraintViolations++;
538
+ break;
539
+ case "query:executed":
540
+ queryDurationSum += e3.duration;
541
+ queryDurationCount++;
542
+ break;
543
+ case "sync:sent":
544
+ syncOperationsSent += e3.batchSize;
545
+ break;
546
+ case "sync:received":
547
+ syncOperationsReceived += e3.batchSize;
548
+ break;
549
+ }
550
+ }
551
+ return {
552
+ totalEvents: events2.length,
553
+ eventsByCategory,
554
+ eventsByType,
555
+ mergeConflicts,
556
+ constraintViolations,
557
+ avgMergeDuration: mergeDurationCount > 0 ? mergeDurationSum / mergeDurationCount : null,
558
+ avgQueryDuration: queryDurationCount > 0 ? queryDurationSum / queryDurationCount : null,
559
+ syncOperationsSent,
560
+ syncOperationsReceived
561
+ };
562
+ }
563
+
564
+ // src/ui/components.ts
565
+ function formatTime(timestamp) {
566
+ const d3 = new Date(timestamp);
567
+ const h3 = String(d3.getHours()).padStart(2, "0");
568
+ const m3 = String(d3.getMinutes()).padStart(2, "0");
569
+ const s3 = String(d3.getSeconds()).padStart(2, "0");
570
+ const ms = String(d3.getMilliseconds()).padStart(3, "0");
571
+ return `${h3}:${m3}:${s3}.${ms}`;
572
+ }
573
+ function truncate(str, max) {
574
+ if (str.length <= max) return str;
575
+ return `${str.slice(0, max - 1)}\u2026`;
576
+ }
577
+ function formatValue(value) {
578
+ if (value === null || value === void 0) return "null";
579
+ if (typeof value === "string") return `"${value}"`;
580
+ if (typeof value === "object") return JSON.stringify(value, null, 2);
581
+ return String(value);
582
+ }
583
+
443
584
  // src/ui/panel-state.ts
444
585
  function buildPanelModel(events2) {
445
586
  const timeline = events2.map((entry) => ({
@@ -561,9 +702,9 @@ function timelineLabel(event) {
561
702
  case "sync:connected":
562
703
  return `sync connected ${event.nodeId}`;
563
704
  case "sync:disconnected":
564
- return `sync disconnected`;
705
+ return "sync disconnected";
565
706
  case "sync:auth-failed":
566
- return `sync auth failed`;
707
+ return "sync auth failed";
567
708
  case "sync:sent":
568
709
  return `sync sent ${event.batchSize}`;
569
710
  case "sync:received":
@@ -578,6 +719,18 @@ function timelineLabel(event) {
578
719
  return `query executed ${event.queryId}`;
579
720
  case "connection:quality":
580
721
  return `connection ${event.quality}`;
722
+ case "sync:diagnostics":
723
+ return `sync diagnostics ${event.diagnostics.quality}`;
724
+ case "sync:bandwidth":
725
+ return `bandwidth ${event.direction} ${event.bytesPerSecond}B/s`;
726
+ case "sync:initial-sync-progress":
727
+ return `initial sync ${Math.round(event.progress * 100)}%`;
728
+ case "awareness:updated":
729
+ return `awareness ${event.states.size} peers`;
730
+ case "state-machine:transition":
731
+ return `transition ${event.collection} ${event.from} \u2192 ${event.to}`;
732
+ case "state-machine:rejected":
733
+ return `transition rejected ${event.collection} ${event.from} \u2192 ${event.to}`;
581
734
  }
582
735
  }
583
736
  function timelineColor(type) {
@@ -603,174 +756,31 @@ function extractOperation(event) {
603
756
  }
604
757
  }
605
758
 
606
- // src/stats/event-stats.ts
607
- function computeStatistics(events2) {
608
- const eventsByCategory = {
609
- operation: 0,
610
- merge: 0,
611
- sync: 0,
612
- query: 0,
613
- connection: 0
614
- };
615
- const eventsByType = {};
616
- let mergeConflicts = 0;
617
- let constraintViolations = 0;
618
- let mergeDurationSum = 0;
619
- let mergeDurationCount = 0;
620
- let queryDurationSum = 0;
621
- let queryDurationCount = 0;
622
- let syncOperationsSent = 0;
623
- let syncOperationsReceived = 0;
624
- for (const timestamped of events2) {
625
- const e3 = timestamped.event;
626
- const category = eventTypeToCategory(e3.type);
627
- eventsByCategory[category]++;
628
- eventsByType[e3.type] = (eventsByType[e3.type] ?? 0) + 1;
629
- switch (e3.type) {
630
- case "merge:completed":
631
- mergeDurationSum += e3.trace.duration;
632
- mergeDurationCount++;
633
- break;
634
- case "merge:conflict":
635
- mergeConflicts++;
636
- mergeDurationSum += e3.trace.duration;
637
- mergeDurationCount++;
638
- break;
639
- case "constraint:violated":
640
- constraintViolations++;
641
- break;
642
- case "query:executed":
643
- queryDurationSum += e3.duration;
644
- queryDurationCount++;
645
- break;
646
- case "sync:sent":
647
- syncOperationsSent += e3.batchSize;
648
- break;
649
- case "sync:received":
650
- syncOperationsReceived += e3.batchSize;
651
- break;
652
- }
653
- }
654
- return {
655
- totalEvents: events2.length,
656
- eventsByCategory,
657
- eventsByType,
658
- mergeConflicts,
659
- constraintViolations,
660
- avgMergeDuration: mergeDurationCount > 0 ? mergeDurationSum / mergeDurationCount : null,
661
- avgQueryDuration: queryDurationCount > 0 ? queryDurationSum / queryDurationCount : null,
662
- syncOperationsSent,
663
- syncOperationsReceived
664
- };
665
- }
666
-
667
- // src/filter/event-filter.ts
668
- function extractCollection(event) {
669
- const e3 = event.event;
670
- switch (e3.type) {
671
- case "operation:created":
672
- case "operation:applied":
673
- return e3.operation.collection;
674
- case "merge:started":
675
- return e3.operationA.collection;
676
- case "merge:completed":
677
- case "merge:conflict":
678
- return e3.trace.operationA.collection;
679
- case "constraint:violated":
680
- return e3.trace.operationA.collection;
681
- case "query:subscribed":
682
- return e3.collection;
683
- case "query:invalidated":
684
- return e3.trigger.collection;
685
- case "sync:sent":
686
- return e3.operations[0]?.collection ?? null;
687
- case "sync:received":
688
- return e3.operations[0]?.collection ?? null;
689
- default:
690
- return null;
691
- }
692
- }
693
- function filterEvents(events2, criteria) {
694
- const { categories, types, timeRange, collection } = criteria;
695
- if (!categories && !types && !timeRange && !collection) {
696
- return events2;
697
- }
698
- const categorySet = categories ? new Set(categories) : null;
699
- const typeSet = types ? new Set(types) : null;
700
- return events2.filter((event) => {
701
- if (categorySet) {
702
- const cat = eventTypeToCategory(event.event.type);
703
- if (!categorySet.has(cat)) return false;
704
- }
705
- if (typeSet) {
706
- if (!typeSet.has(event.event.type)) return false;
707
- }
708
- if (timeRange) {
709
- if (event.receivedAt < timeRange.start || event.receivedAt > timeRange.end) {
710
- return false;
711
- }
712
- }
713
- if (collection) {
714
- const eventCollection = extractCollection(event);
715
- if (eventCollection !== collection) return false;
716
- }
717
- return true;
718
- });
719
- }
720
-
721
- // src/ui/components.ts
722
- function formatTime(timestamp) {
723
- const d3 = new Date(timestamp);
724
- const h3 = String(d3.getHours()).padStart(2, "0");
725
- const m3 = String(d3.getMinutes()).padStart(2, "0");
726
- const s3 = String(d3.getSeconds()).padStart(2, "0");
727
- const ms = String(d3.getMilliseconds()).padStart(3, "0");
728
- return `${h3}:${m3}:${s3}.${ms}`;
729
- }
730
- function truncate(str, max) {
731
- if (str.length <= max) return str;
732
- return str.slice(0, max - 1) + "\u2026";
733
- }
734
- function formatValue(value) {
735
- if (value === null || value === void 0) return "null";
736
- if (typeof value === "string") return `"${value}"`;
737
- if (typeof value === "object") return JSON.stringify(value, null, 2);
738
- return String(value);
739
- }
740
-
741
759
  // src/ui/panel.ts
742
760
  var html = htm_default.bind(k);
743
761
  var ALL_CATEGORIES = ["operation", "merge", "sync", "query", "connection"];
744
762
  function DevToolsPanel({ events: events2 }) {
745
763
  const [activeTab, setActiveTab] = d2("timeline");
746
764
  const [search, setSearch] = d2("");
747
- const [categories, setCategories] = d2(
748
- () => new Set(ALL_CATEGORIES)
749
- );
765
+ const [categories, setCategories] = d2(() => new Set(ALL_CATEGORIES));
750
766
  const [expanded, setExpanded] = d2(() => /* @__PURE__ */ new Set());
751
767
  const [paused, setPaused] = d2(false);
752
- const toggleCategory = q2(
753
- (cat) => {
754
- setCategories((prev) => {
755
- const next = new Set(prev);
756
- if (next.has(cat)) next.delete(cat);
757
- else next.add(cat);
758
- return next;
759
- });
760
- },
761
- []
762
- );
763
- const toggleExpand = q2(
764
- (id) => {
765
- setExpanded((prev) => {
766
- const next = new Set(prev);
767
- if (next.has(id)) next.delete(id);
768
- else next.add(id);
769
- return next;
770
- });
771
- },
772
- []
773
- );
768
+ const toggleCategory = q2((cat) => {
769
+ setCategories((prev) => {
770
+ const next = new Set(prev);
771
+ if (next.has(cat)) next.delete(cat);
772
+ else next.add(cat);
773
+ return next;
774
+ });
775
+ }, []);
776
+ const toggleExpand = q2((id) => {
777
+ setExpanded((prev) => {
778
+ const next = new Set(prev);
779
+ if (next.has(id)) next.delete(id);
780
+ else next.add(id);
781
+ return next;
782
+ });
783
+ }, []);
774
784
  const filtered = T2(
775
785
  () => filterEvents(events2, { categories: [...categories] }),
776
786
  [events2, categories]