@korajs/devtools 0.3.2 → 0.5.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",
@@ -428,18 +428,164 @@ var EVENT_TYPE_CATEGORIES = {
428
428
  "sync:connected": "sync",
429
429
  "sync:disconnected": "sync",
430
430
  "sync:auth-failed": "sync",
431
+ "sync:schema-mismatch": "sync",
432
+ "sync:apply-failed": "sync",
431
433
  "sync:sent": "sync",
432
434
  "sync:received": "sync",
433
435
  "sync:acknowledged": "sync",
434
436
  "query:subscribed": "query",
435
437
  "query:invalidated": "query",
436
438
  "query:executed": "query",
437
- "connection:quality": "connection"
439
+ "connection:quality": "connection",
440
+ "sync:diagnostics": "sync",
441
+ "sync:bandwidth": "sync",
442
+ "sync:initial-sync-progress": "sync",
443
+ "awareness:updated": "sync",
444
+ "state-machine:transition": "operation",
445
+ "state-machine:rejected": "operation",
446
+ "store:persistence-error": "connection",
447
+ "store:quota-exceeded": "connection",
448
+ "replay:completed": "operation"
438
449
  };
439
450
  function eventTypeToCategory(type) {
440
451
  return EVENT_TYPE_CATEGORIES[type];
441
452
  }
442
453
 
454
+ // src/filter/event-filter.ts
455
+ function extractCollection(event) {
456
+ const e3 = event.event;
457
+ switch (e3.type) {
458
+ case "operation:created":
459
+ case "operation:applied":
460
+ return e3.operation.collection;
461
+ case "merge:started":
462
+ return e3.operationA.collection;
463
+ case "merge:completed":
464
+ case "merge:conflict":
465
+ return e3.trace.operationA.collection;
466
+ case "constraint:violated":
467
+ return e3.trace.operationA.collection;
468
+ case "query:subscribed":
469
+ return e3.collection;
470
+ case "query:invalidated":
471
+ return e3.trigger.collection;
472
+ case "sync:sent":
473
+ return e3.operations[0]?.collection ?? null;
474
+ case "sync:received":
475
+ return e3.operations[0]?.collection ?? null;
476
+ default:
477
+ return null;
478
+ }
479
+ }
480
+ function filterEvents(events2, criteria) {
481
+ const { categories, types, timeRange, collection } = criteria;
482
+ if (!categories && !types && !timeRange && !collection) {
483
+ return events2;
484
+ }
485
+ const categorySet = categories ? new Set(categories) : null;
486
+ const typeSet = types ? new Set(types) : null;
487
+ return events2.filter((event) => {
488
+ if (categorySet) {
489
+ const cat = eventTypeToCategory(event.event.type);
490
+ if (!categorySet.has(cat)) return false;
491
+ }
492
+ if (typeSet) {
493
+ if (!typeSet.has(event.event.type)) return false;
494
+ }
495
+ if (timeRange) {
496
+ if (event.receivedAt < timeRange.start || event.receivedAt > timeRange.end) {
497
+ return false;
498
+ }
499
+ }
500
+ if (collection) {
501
+ const eventCollection = extractCollection(event);
502
+ if (eventCollection !== collection) return false;
503
+ }
504
+ return true;
505
+ });
506
+ }
507
+
508
+ // src/stats/event-stats.ts
509
+ function computeStatistics(events2) {
510
+ const eventsByCategory = {
511
+ operation: 0,
512
+ merge: 0,
513
+ sync: 0,
514
+ query: 0,
515
+ connection: 0
516
+ };
517
+ const eventsByType = {};
518
+ let mergeConflicts = 0;
519
+ let constraintViolations = 0;
520
+ let mergeDurationSum = 0;
521
+ let mergeDurationCount = 0;
522
+ let queryDurationSum = 0;
523
+ let queryDurationCount = 0;
524
+ let syncOperationsSent = 0;
525
+ let syncOperationsReceived = 0;
526
+ for (const timestamped of events2) {
527
+ const e3 = timestamped.event;
528
+ const category = eventTypeToCategory(e3.type);
529
+ eventsByCategory[category]++;
530
+ eventsByType[e3.type] = (eventsByType[e3.type] ?? 0) + 1;
531
+ switch (e3.type) {
532
+ case "merge:completed":
533
+ mergeDurationSum += e3.trace.duration;
534
+ mergeDurationCount++;
535
+ break;
536
+ case "merge:conflict":
537
+ mergeConflicts++;
538
+ mergeDurationSum += e3.trace.duration;
539
+ mergeDurationCount++;
540
+ break;
541
+ case "constraint:violated":
542
+ constraintViolations++;
543
+ break;
544
+ case "query:executed":
545
+ queryDurationSum += e3.duration;
546
+ queryDurationCount++;
547
+ break;
548
+ case "sync:sent":
549
+ syncOperationsSent += e3.batchSize;
550
+ break;
551
+ case "sync:received":
552
+ syncOperationsReceived += e3.batchSize;
553
+ break;
554
+ }
555
+ }
556
+ return {
557
+ totalEvents: events2.length,
558
+ eventsByCategory,
559
+ eventsByType,
560
+ mergeConflicts,
561
+ constraintViolations,
562
+ avgMergeDuration: mergeDurationCount > 0 ? mergeDurationSum / mergeDurationCount : null,
563
+ avgQueryDuration: queryDurationCount > 0 ? queryDurationSum / queryDurationCount : null,
564
+ syncOperationsSent,
565
+ syncOperationsReceived
566
+ };
567
+ }
568
+
569
+ // src/ui/components.ts
570
+ function formatTime(timestamp) {
571
+ const d3 = new Date(timestamp);
572
+ const h3 = String(d3.getHours()).padStart(2, "0");
573
+ const m3 = String(d3.getMinutes()).padStart(2, "0");
574
+ const s3 = String(d3.getSeconds()).padStart(2, "0");
575
+ const ms = String(d3.getMilliseconds()).padStart(3, "0");
576
+ return `${h3}:${m3}:${s3}.${ms}`;
577
+ }
578
+ function truncate(str, max) {
579
+ if (str.length <= max) return str;
580
+ return `${str.slice(0, max - 1)}\u2026`;
581
+ }
582
+ function formatValue(value) {
583
+ if (value === null || value === void 0) return "null";
584
+ if (typeof value === "string") return `"${value}"`;
585
+ if (typeof value === "object") return JSON.stringify(value, null, 2);
586
+ return String(value);
587
+ }
588
+
443
589
  // src/ui/panel-state.ts
444
590
  function buildPanelModel(events2) {
445
591
  const timeline = events2.map((entry) => ({
@@ -561,9 +707,13 @@ function timelineLabel(event) {
561
707
  case "sync:connected":
562
708
  return `sync connected ${event.nodeId}`;
563
709
  case "sync:disconnected":
564
- return `sync disconnected`;
710
+ return "sync disconnected";
565
711
  case "sync:auth-failed":
566
- return `sync auth failed`;
712
+ return "sync auth failed";
713
+ case "sync:schema-mismatch":
714
+ return `schema mismatch client ${event.clientSchemaVersion} server ${event.serverSchemaVersion}`;
715
+ case "sync:apply-failed":
716
+ return `sync apply failed ${event.operationId}`;
567
717
  case "sync:sent":
568
718
  return `sync sent ${event.batchSize}`;
569
719
  case "sync:received":
@@ -578,6 +728,24 @@ function timelineLabel(event) {
578
728
  return `query executed ${event.queryId}`;
579
729
  case "connection:quality":
580
730
  return `connection ${event.quality}`;
731
+ case "sync:diagnostics":
732
+ return `sync diagnostics ${event.diagnostics.quality}`;
733
+ case "sync:bandwidth":
734
+ return `bandwidth ${event.direction} ${event.bytesPerSecond}B/s`;
735
+ case "sync:initial-sync-progress":
736
+ return `initial sync ${Math.round(event.progress * 100)}%`;
737
+ case "awareness:updated":
738
+ return `awareness ${event.states.size} peers`;
739
+ case "state-machine:transition":
740
+ return `transition ${event.collection} ${event.from} \u2192 ${event.to}`;
741
+ case "state-machine:rejected":
742
+ return `transition rejected ${event.collection} ${event.from} \u2192 ${event.to}`;
743
+ case "store:persistence-error":
744
+ return `store persistence error ${event.message}`;
745
+ case "store:quota-exceeded":
746
+ return "store quota exceeded";
747
+ case "replay:completed":
748
+ return `replay ${event.operationsApplied} ops`;
581
749
  }
582
750
  }
583
751
  function timelineColor(type) {
@@ -603,174 +771,31 @@ function extractOperation(event) {
603
771
  }
604
772
  }
605
773
 
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
774
  // src/ui/panel.ts
742
775
  var html = htm_default.bind(k);
743
776
  var ALL_CATEGORIES = ["operation", "merge", "sync", "query", "connection"];
744
777
  function DevToolsPanel({ events: events2 }) {
745
778
  const [activeTab, setActiveTab] = d2("timeline");
746
779
  const [search, setSearch] = d2("");
747
- const [categories, setCategories] = d2(
748
- () => new Set(ALL_CATEGORIES)
749
- );
780
+ const [categories, setCategories] = d2(() => new Set(ALL_CATEGORIES));
750
781
  const [expanded, setExpanded] = d2(() => /* @__PURE__ */ new Set());
751
782
  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
- );
783
+ const toggleCategory = q2((cat) => {
784
+ setCategories((prev) => {
785
+ const next = new Set(prev);
786
+ if (next.has(cat)) next.delete(cat);
787
+ else next.add(cat);
788
+ return next;
789
+ });
790
+ }, []);
791
+ const toggleExpand = q2((id) => {
792
+ setExpanded((prev) => {
793
+ const next = new Set(prev);
794
+ if (next.has(id)) next.delete(id);
795
+ else next.add(id);
796
+ return next;
797
+ });
798
+ }, []);
774
799
  const filtered = T2(
775
800
  () => filterEvents(events2, { categories: [...categories] }),
776
801
  [events2, categories]