@pinia/colada-devtools 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +5 -1
- package/dist/index.js +361 -337
- package/dist/index.js.map +1 -1
- package/dist-panel/{_queryId_-BGMH9Qyr.js → _queryId_-C_7uiscL.js} +59 -52
- package/dist-panel/{_queryId_-BGMH9Qyr.js.map → _queryId_-C_7uiscL.js.map} +1 -1
- package/dist-panel/index-CC3C7HKx.js +8136 -0
- package/dist-panel/index-CC3C7HKx.js.map +1 -0
- package/dist-panel/{index-BqoCeMqo.js → index-DqhXFdqH.js} +2 -2
- package/dist-panel/{index-BqoCeMqo.js.map → index-DqhXFdqH.js.map} +1 -1
- package/dist-panel/{index-D9g_5JvD.js → index-LhFYBC4E.js} +3 -3
- package/dist-panel/index-LhFYBC4E.js.map +1 -0
- package/dist-panel/index.js +1 -1
- package/dist-panel/{loader-HsZ_tw6Q.js → loader-BuVT322U.js} +2 -2
- package/dist-panel/loader-BuVT322U.js.map +1 -0
- package/dist-panel/{mouse-pointer-click-BVbSKgPQ.js → mouse-pointer-click-cg7KXnOS.js} +2 -2
- package/dist-panel/mouse-pointer-click-cg7KXnOS.js.map +1 -0
- package/dist-panel/{mutations-C5PrXZzg.js → mutations-BHQcJCEG.js} +2 -2
- package/dist-panel/{mutations-C5PrXZzg.js.map → mutations-BHQcJCEG.js.map} +1 -1
- package/dist-panel/{queries-D1tnLOMJ.js → queries-B13dqsR8.js} +3 -3
- package/dist-panel/queries-B13dqsR8.js.map +1 -0
- package/dist-panel/{settings-BDqpjtmF.js → settings-CKqwx8r9.js} +2 -2
- package/dist-panel/{settings-BDqpjtmF.js.map → settings-CKqwx8r9.js.map} +1 -1
- package/dist-shared/index.d.ts +0 -4
- package/dist-shared/index.js.map +1 -1
- package/package.json +7 -7
- package/dist-panel/index-D9g_5JvD.js.map +0 -1
- package/dist-panel/index-hPJdBAcc.js +0 -8043
- package/dist-panel/index-hPJdBAcc.js.map +0 -1
- package/dist-panel/loader-HsZ_tw6Q.js.map +0 -1
- package/dist-panel/mouse-pointer-click-BVbSKgPQ.js.map +0 -1
- package/dist-panel/queries-D1tnLOMJ.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { _ as
|
|
2
|
-
import { m, c as l, o as n, a as e, d as
|
|
3
|
-
import { _ as oe, a as se } from "./loader-
|
|
1
|
+
import { _ as N } from "./mouse-pointer-click-cg7KXnOS.js";
|
|
2
|
+
import { m, c as l, o as n, a as e, d as I, Q as A, l as U, p as F, R as Q, C as M, P as v, g as w, h as b, S as W, t as u, _ as Y, T as G, M as P, b as X, U as Z, V as J, y as z, z as K, F as q, k as r, w as d, i, W as B, X as ee, j as te } from "./index-CC3C7HKx.js";
|
|
3
|
+
import { _ as oe, a as se } from "./loader-BuVT322U.js";
|
|
4
4
|
const ne = {
|
|
5
5
|
viewBox: "0 0 24 24",
|
|
6
6
|
width: "1.2em",
|
|
@@ -76,11 +76,11 @@ function me(a, s) {
|
|
|
76
76
|
], -1)
|
|
77
77
|
]));
|
|
78
78
|
}
|
|
79
|
-
const he = m({ name: "lucide-refresh-cw", render: me }),
|
|
79
|
+
const he = m({ name: "lucide-refresh-cw", render: me }), _e = { class: "collapse collapse-arrow" }, fe = { class: "collapse-title px-2 py-0.5 bg-neutral-200 dark:bg-neutral-800 theme-neutral" }, ge = { class: "font-semibold text-sm flex gap-x-1 items-center" }, ke = /* @__PURE__ */ I({
|
|
80
80
|
__name: "UCollapse.ce",
|
|
81
81
|
props: /* @__PURE__ */ A({
|
|
82
82
|
title: { type: String },
|
|
83
|
-
icon: { type:
|
|
83
|
+
icon: { type: [Object, Function] }
|
|
84
84
|
}, {
|
|
85
85
|
open: { type: Boolean, default: !0 },
|
|
86
86
|
openModifiers: {}
|
|
@@ -88,7 +88,7 @@ const he = m({ name: "lucide-refresh-cw", render: me }), fe = { class: "collapse
|
|
|
88
88
|
emits: ["update:open"],
|
|
89
89
|
setup(a) {
|
|
90
90
|
const s = U(a, "open");
|
|
91
|
-
function
|
|
91
|
+
function f(o) {
|
|
92
92
|
if (o.target instanceof HTMLElement) {
|
|
93
93
|
const h = {
|
|
94
94
|
block: "nearest",
|
|
@@ -98,14 +98,14 @@ const he = m({ name: "lucide-refresh-cw", render: me }), fe = { class: "collapse
|
|
|
98
98
|
o.target.scrollIntoView(h);
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
-
return (o, h) => (n(), l("div",
|
|
101
|
+
return (o, h) => (n(), l("div", _e, [
|
|
102
102
|
F(e("input", {
|
|
103
103
|
"onUpdate:modelValue": h[0] || (h[0] = (C) => s.value = C),
|
|
104
104
|
type: "checkbox"
|
|
105
105
|
}, null, 512), [
|
|
106
106
|
[Q, s.value]
|
|
107
107
|
]),
|
|
108
|
-
e("div",
|
|
108
|
+
e("div", fe, [
|
|
109
109
|
M(o.$slots, "title", {
|
|
110
110
|
open: s.value,
|
|
111
111
|
title: o.title
|
|
@@ -123,7 +123,7 @@ const he = m({ name: "lucide-refresh-cw", render: me }), fe = { class: "collapse
|
|
|
123
123
|
]),
|
|
124
124
|
e("div", {
|
|
125
125
|
class: "collapse-content px-2 text-sm overflow-hidden",
|
|
126
|
-
onTransitionend:
|
|
126
|
+
onTransitionend: f
|
|
127
127
|
}, [
|
|
128
128
|
M(o.$slots, "default", { open: s.value }, void 0, !0)
|
|
129
129
|
], 32)
|
|
@@ -138,8 +138,8 @@ function we(a) {
|
|
|
138
138
|
return `${s.toFixed(3)} seconds`;
|
|
139
139
|
if (a < 6e4)
|
|
140
140
|
return `${Math.floor(s)} seconds`;
|
|
141
|
-
const
|
|
142
|
-
return a < 36e5 ? `${
|
|
141
|
+
const f = Math.floor(s / 60);
|
|
142
|
+
return a < 36e5 ? `${f} minute${f > 1 ? "s" : ""}` : `${Math.floor(f / 60)}h${f % 60}m${s % 60}s`;
|
|
143
143
|
}
|
|
144
144
|
const be = {
|
|
145
145
|
viewBox: "0 0 24 24",
|
|
@@ -200,13 +200,13 @@ function Se(a, s) {
|
|
|
200
200
|
], -1)
|
|
201
201
|
]));
|
|
202
202
|
}
|
|
203
|
-
const He = m({ name: "lucide-file-text", render: Se }),
|
|
203
|
+
const He = m({ name: "lucide-file-text", render: Se }), je = {
|
|
204
204
|
viewBox: "0 0 24 24",
|
|
205
205
|
width: "1.2em",
|
|
206
206
|
height: "1.2em"
|
|
207
207
|
};
|
|
208
|
-
function
|
|
209
|
-
return n(), l("svg",
|
|
208
|
+
function ze(a, s) {
|
|
209
|
+
return n(), l("svg", je, s[0] || (s[0] = [
|
|
210
210
|
e("g", {
|
|
211
211
|
fill: "none",
|
|
212
212
|
stroke: "currentColor",
|
|
@@ -223,7 +223,7 @@ function Ie(a, s) {
|
|
|
223
223
|
], -1)
|
|
224
224
|
]));
|
|
225
225
|
}
|
|
226
|
-
const
|
|
226
|
+
const Ie = m({ name: "lucide-circle-x", render: ze }), De = {
|
|
227
227
|
viewBox: "0 0 24 24",
|
|
228
228
|
width: "1.2em",
|
|
229
229
|
height: "1.2em"
|
|
@@ -240,13 +240,13 @@ function Ve(a, s) {
|
|
|
240
240
|
}, null, -1)
|
|
241
241
|
]));
|
|
242
242
|
}
|
|
243
|
-
const
|
|
243
|
+
const Oe = m({ name: "lucide-braces", render: Ve }), Re = {
|
|
244
244
|
viewBox: "0 0 24 24",
|
|
245
245
|
width: "1.2em",
|
|
246
246
|
height: "1.2em"
|
|
247
247
|
};
|
|
248
|
-
function
|
|
249
|
-
return n(), l("svg",
|
|
248
|
+
function Ee(a, s) {
|
|
249
|
+
return n(), l("svg", Re, s[0] || (s[0] = [
|
|
250
250
|
e("g", {
|
|
251
251
|
fill: "none",
|
|
252
252
|
stroke: "currentColor",
|
|
@@ -259,13 +259,13 @@ function Le(a, s) {
|
|
|
259
259
|
], -1)
|
|
260
260
|
]));
|
|
261
261
|
}
|
|
262
|
-
const
|
|
262
|
+
const Le = m({ name: "lucide-history", render: Ee }), Ne = {
|
|
263
263
|
viewBox: "0 0 24 24",
|
|
264
264
|
width: "1.2em",
|
|
265
265
|
height: "1.2em"
|
|
266
266
|
};
|
|
267
267
|
function Ae(a, s) {
|
|
268
|
-
return n(), l("svg",
|
|
268
|
+
return n(), l("svg", Ne, s[0] || (s[0] = [
|
|
269
269
|
e("g", {
|
|
270
270
|
fill: "none",
|
|
271
271
|
stroke: "currentColor",
|
|
@@ -314,16 +314,16 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
314
314
|
}, ut = {
|
|
315
315
|
key: 1,
|
|
316
316
|
class: "text-neutral-500/50"
|
|
317
|
-
}, ct = { class: "py-1" }, pt = { class: "grid grid-cols-[auto_1fr] gap-1" }, vt = { class: "font-bold" }, mt = { class: "font-bold" }, ht = { class: "font-bold" },
|
|
317
|
+
}, ct = { class: "py-1" }, pt = { class: "grid grid-cols-[auto_1fr] gap-1" }, vt = { class: "font-bold" }, mt = { class: "font-bold" }, ht = { class: "font-bold" }, _t = { class: "font-bold" }, ft = { class: "py-1" }, gt = { class: "rounded p-1 overflow-auto max-h-[1200px]" }, kt = { class: "py-1" }, yt = {
|
|
318
318
|
key: 0,
|
|
319
319
|
class: "rounded bg-neutral-500/20 p-1 overflow-auto max-h-[1200px]"
|
|
320
320
|
}, xt = { key: 1 }, wt = {
|
|
321
321
|
key: 1,
|
|
322
322
|
class: "py-6 mx-auto"
|
|
323
|
-
}, bt = { class: "flex flex-col text-center items-center gap-2 text-lg px-2" }, qt = /* @__PURE__ */
|
|
323
|
+
}, bt = { class: "flex flex-col text-center items-center gap-2 text-lg px-2" }, qt = /* @__PURE__ */ I({
|
|
324
324
|
__name: "[queryId]",
|
|
325
325
|
setup(a) {
|
|
326
|
-
const s = G(),
|
|
326
|
+
const s = G(), f = P(), o = X(() => f.value.find((c) => c.keyHash === s.params.queryId) ?? null), h = {
|
|
327
327
|
showSecond: !0,
|
|
328
328
|
rounding: "floor",
|
|
329
329
|
max: 1e3 * 60 * 5
|
|
@@ -334,9 +334,9 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
334
334
|
}, {
|
|
335
335
|
...h,
|
|
336
336
|
updateInterval: 3e3
|
|
337
|
-
}), k = J(), x =
|
|
337
|
+
}), k = J(), x = z(!1);
|
|
338
338
|
let T = x.value, S = null;
|
|
339
|
-
const $ =
|
|
339
|
+
const $ = z(!1);
|
|
340
340
|
return K(
|
|
341
341
|
() => {
|
|
342
342
|
var c;
|
|
@@ -346,7 +346,7 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
346
346
|
!c || S === c.status || (S = c.status, c.status === "error" ? ($.value = !0, T = x.value, x.value = !1) : c.status === "success" && (x.value = T, $.value = !1));
|
|
347
347
|
}
|
|
348
348
|
), (c, t) => {
|
|
349
|
-
const g = xe, D = he, y = ee, V = pe, H = oe,
|
|
349
|
+
const g = xe, D = he, y = ee, V = pe, H = oe, O = se, R = de, E = ae, L = N;
|
|
350
350
|
return n(), l("div", Fe, [
|
|
351
351
|
o.value ? (n(), l(q, { key: 0 }, [
|
|
352
352
|
r(g, {
|
|
@@ -354,7 +354,7 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
354
354
|
icon: i(Be)
|
|
355
355
|
}, {
|
|
356
356
|
default: d(() => {
|
|
357
|
-
var p,
|
|
357
|
+
var p, _, j;
|
|
358
358
|
return [
|
|
359
359
|
e("div", Qe, [
|
|
360
360
|
e("p", We, [
|
|
@@ -374,7 +374,7 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
374
374
|
max: void 0
|
|
375
375
|
})), 1)
|
|
376
376
|
])) : b("", !0),
|
|
377
|
-
(
|
|
377
|
+
(j = (_ = o.value.devtools.history.at(0)) == null ? void 0 : _.fetchTime) != null && j.end ? (n(), l("p", Je, [
|
|
378
378
|
t[12] || (t[12] = e("span", null, "Fetch duration:", -1)),
|
|
379
379
|
e("span", Ke, u(i(we)(
|
|
380
380
|
o.value.devtools.history.at(0).fetchTime.end - o.value.devtools.history.at(0).fetchTime.start
|
|
@@ -419,87 +419,94 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
419
419
|
size: "sm",
|
|
420
420
|
title: "Refetch this query",
|
|
421
421
|
disabled: ((p = o.value.options) == null ? void 0 : p.enabled) === !1,
|
|
422
|
-
onClick: t[0] || (t[0] = (
|
|
422
|
+
onClick: t[0] || (t[0] = (_) => i(k).emit("queries:refetch", o.value.key))
|
|
423
423
|
}, {
|
|
424
424
|
default: d(() => [
|
|
425
425
|
r(D, { class: "size-3.5" }),
|
|
426
426
|
t[15] || (t[15] = v(" Refetch "))
|
|
427
427
|
]),
|
|
428
|
-
_: 1
|
|
428
|
+
_: 1,
|
|
429
|
+
__: [15]
|
|
429
430
|
}, 8, ["disabled"]),
|
|
430
431
|
r(y, {
|
|
431
432
|
class: "theme-neutral",
|
|
432
433
|
size: "sm",
|
|
433
434
|
title: "Invalidate this query",
|
|
434
|
-
onClick: t[1] || (t[1] = (
|
|
435
|
+
onClick: t[1] || (t[1] = (_) => i(k).emit("queries:invalidate", o.value.key))
|
|
435
436
|
}, {
|
|
436
437
|
default: d(() => [
|
|
437
438
|
r(V),
|
|
438
439
|
t[16] || (t[16] = v(" Invalidate "))
|
|
439
440
|
]),
|
|
440
|
-
_: 1
|
|
441
|
+
_: 1,
|
|
442
|
+
__: [16]
|
|
441
443
|
}),
|
|
442
444
|
o.value.devtools.simulate !== "loading" ? (n(), w(y, {
|
|
443
445
|
key: 0,
|
|
444
446
|
class: "theme-purple",
|
|
445
447
|
size: "sm",
|
|
446
448
|
title: "Restore the previous state",
|
|
447
|
-
onClick: t[2] || (t[2] = (
|
|
449
|
+
onClick: t[2] || (t[2] = (_) => i(k).emit("queries:simulate:loading", o.value.key))
|
|
448
450
|
}, {
|
|
449
451
|
default: d(() => [
|
|
450
452
|
r(H),
|
|
451
453
|
t[17] || (t[17] = v(" Simulate loading "))
|
|
452
454
|
]),
|
|
453
|
-
_: 1
|
|
455
|
+
_: 1,
|
|
456
|
+
__: [17]
|
|
454
457
|
})) : (n(), w(y, {
|
|
455
458
|
key: 1,
|
|
456
459
|
class: "theme-purple",
|
|
457
460
|
size: "sm",
|
|
458
461
|
title: "Simulate a loading state",
|
|
459
|
-
onClick: t[3] || (t[3] = (
|
|
462
|
+
onClick: t[3] || (t[3] = (_) => i(k).emit("queries:simulate:loading:stop", o.value.key))
|
|
460
463
|
}, {
|
|
461
464
|
default: d(() => [
|
|
462
465
|
r(H, { class: "animate-spin" }),
|
|
463
466
|
t[18] || (t[18] = v(" Stop loading "))
|
|
464
467
|
]),
|
|
465
|
-
_: 1
|
|
468
|
+
_: 1,
|
|
469
|
+
__: [18]
|
|
466
470
|
})),
|
|
467
471
|
o.value.devtools.simulate !== "error" ? (n(), w(y, {
|
|
468
472
|
key: 2,
|
|
469
473
|
class: "theme-error",
|
|
470
474
|
size: "sm",
|
|
471
475
|
title: "Simulate an Error state",
|
|
472
|
-
onClick: t[4] || (t[4] = (
|
|
476
|
+
onClick: t[4] || (t[4] = (_) => i(k).emit("queries:simulate:error", o.value.key))
|
|
473
477
|
}, {
|
|
474
478
|
default: d(() => [
|
|
475
|
-
r(
|
|
479
|
+
r(O),
|
|
476
480
|
t[19] || (t[19] = v(" Simulate error "))
|
|
477
481
|
]),
|
|
478
|
-
_: 1
|
|
482
|
+
_: 1,
|
|
483
|
+
__: [19]
|
|
479
484
|
})) : (n(), w(y, {
|
|
480
485
|
key: 3,
|
|
481
486
|
class: "theme-error",
|
|
482
487
|
size: "sm",
|
|
483
488
|
title: "Restore the previous state",
|
|
484
|
-
onClick: t[5] || (t[5] = (
|
|
489
|
+
onClick: t[5] || (t[5] = (_) => i(k).emit("queries:simulate:error:stop", o.value.key))
|
|
485
490
|
}, {
|
|
486
491
|
default: d(() => [
|
|
487
|
-
r(
|
|
492
|
+
r(R),
|
|
488
493
|
t[20] || (t[20] = v(" Remove error "))
|
|
489
494
|
]),
|
|
490
|
-
_: 1
|
|
495
|
+
_: 1,
|
|
496
|
+
__: [20]
|
|
491
497
|
})),
|
|
492
498
|
r(y, {
|
|
493
499
|
class: "theme-warning",
|
|
494
500
|
size: "sm",
|
|
495
501
|
title: "Reset this query to its initial (pending) state",
|
|
496
|
-
onClick: t[6] || (t[6] = (
|
|
502
|
+
onClick: t[6] || (t[6] = (_) => i(k).emit("queries:reset", o.value.key))
|
|
497
503
|
}, {
|
|
498
504
|
default: d(() => [
|
|
499
|
-
r(
|
|
505
|
+
r(E),
|
|
500
506
|
t[21] || (t[21] = v(" Reset "))
|
|
501
507
|
]),
|
|
502
|
-
_: 1
|
|
508
|
+
_: 1,
|
|
509
|
+
__: [21]
|
|
503
510
|
})
|
|
504
511
|
])
|
|
505
512
|
];
|
|
@@ -523,7 +530,7 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
523
530
|
open: $.value,
|
|
524
531
|
"onUpdate:open": t[8] || (t[8] = (p) => $.value = p),
|
|
525
532
|
title: `Error${o.value.state.status === "error" ? " (!)" : ""}`,
|
|
526
|
-
icon: i(
|
|
533
|
+
icon: i(Ie)
|
|
527
534
|
}, {
|
|
528
535
|
default: d(() => [
|
|
529
536
|
e("div", rt, [
|
|
@@ -554,7 +561,7 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
554
561
|
]),
|
|
555
562
|
t[25] || (t[25] = e("span", null, "Cancelled:", -1)),
|
|
556
563
|
e("span", null, [
|
|
557
|
-
e("code",
|
|
564
|
+
e("code", _t, u(o.value.devtools.count.cancelled), 1)
|
|
558
565
|
])
|
|
559
566
|
])
|
|
560
567
|
])
|
|
@@ -563,11 +570,11 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
563
570
|
}, 8, ["icon"]),
|
|
564
571
|
r(g, {
|
|
565
572
|
title: `History (${o.value.devtools.history.length})`,
|
|
566
|
-
icon: i(
|
|
573
|
+
icon: i(Le),
|
|
567
574
|
open: !1
|
|
568
575
|
}, {
|
|
569
576
|
default: d(() => [
|
|
570
|
-
e("div",
|
|
577
|
+
e("div", ft, [
|
|
571
578
|
(n(!0), l(q, null, te(o.value.devtools.history, (p) => (n(), w(g, {
|
|
572
579
|
key: p.updatedAt,
|
|
573
580
|
title: `Entry nº${p.id} (${i(B)(new Date(p.updatedAt), h)})`,
|
|
@@ -585,7 +592,7 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
585
592
|
r(g, {
|
|
586
593
|
title: "Options",
|
|
587
594
|
open: !1,
|
|
588
|
-
icon: i(
|
|
595
|
+
icon: i(Oe)
|
|
589
596
|
}, {
|
|
590
597
|
default: d(() => [
|
|
591
598
|
e("div", kt, [
|
|
@@ -601,7 +608,7 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
601
608
|
], 64)) : (n(), l("div", wt, [
|
|
602
609
|
e("p", bt, [
|
|
603
610
|
t[27] || (t[27] = v(" Select a Query to inspect ")),
|
|
604
|
-
r(
|
|
611
|
+
r(L)
|
|
605
612
|
])
|
|
606
613
|
]))
|
|
607
614
|
]);
|
|
@@ -611,4 +618,4 @@ const Ue = m({ name: "lucide-sigma-square", render: Ae }), Fe = { class: "flex f
|
|
|
611
618
|
export {
|
|
612
619
|
qt as default
|
|
613
620
|
};
|
|
614
|
-
//# sourceMappingURL=_queryId_-
|
|
621
|
+
//# sourceMappingURL=_queryId_-C_7uiscL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_queryId_-BGMH9Qyr.js","sources":["../src/panel/components/UCollapse.ce.vue","../src/panel/utils/time.ts","../src/panel/pages/queries/[queryId].vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Component } from 'vue'\n\ndefineProps<{\n title?: string\n icon?: Component\n}>()\n\nconst open = defineModel<boolean>('open', {\n default: true,\n})\n\nfunction scrollIfNeeded(event: TransitionEvent) {\n if (event.target instanceof HTMLElement) {\n const scrollOptions: ScrollIntoViewOptions = {\n block: 'nearest',\n inline: 'nearest',\n behavior: 'smooth',\n }\n event.target.scrollIntoView(scrollOptions)\n }\n}\n</script>\n\n<template>\n <div class=\"collapse collapse-arrow\">\n <input v-model=\"open\" type=\"checkbox\">\n <div class=\"collapse-title px-2 py-0.5 bg-neutral-200 dark:bg-neutral-800 theme-neutral\">\n <slot name=\"title\" :open :title>\n <h3 class=\"font-semibold text-sm flex gap-x-1 items-center\">\n <slot name=\"icon\">\n <component :is=\"icon\" v-if=\"icon\" class=\"size-4\" />\n </slot>\n {{ title ?? 'Group' }}\n </h3>\n </slot>\n </div>\n <div class=\"collapse-content px-2 text-sm overflow-hidden\" @transitionend=\"scrollIfNeeded\">\n <slot :open />\n </div>\n </div>\n</template>\n\n<style scoped>\n.collapse:not(td, tr, colgroup) {\n visibility: visible;\n}\n\n.collapse {\n position: relative;\n display: grid;\n overflow: hidden;\n width: 100%;\n grid-template-rows: max-content 0fr;\n transition: grid-template-rows 0.2s;\n isolation: isolate;\n\n > input:is([type='checkbox'], [type='radio']) {\n grid-column-start: 1;\n grid-row-start: 1;\n appearance: none;\n opacity: 0;\n }\n\n &:is([open], :focus),\n &:has(> input:is([type='checkbox'], [type='radio']):checked) {\n grid-template-rows: max-content 1fr;\n }\n\n &:is([open], :focus) > .collapse-content,\n &:not(.collapse-close)\n > :where(input:is([type='checkbox'], [type='radio']):checked ~ .collapse-content) {\n visibility: visible;\n min-height: fit-content;\n }\n &:focus-visible,\n &:has(> input:is([type='checkbox'], [type='radio']):focus-visible) {\n outline-color: var(--ui-text);\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n }\n\n &:not(.collapse-close) {\n > input[type='checkbox'],\n > input[type='radio']:not(:checked),\n > .collapse-title {\n cursor: pointer;\n }\n }\n\n &:focus:not(.collapse-close, .collapse[open]) > .collapse-title {\n cursor: unset;\n }\n\n &:is([open]) {\n &.collapse-arrow {\n > .collapse-title:after {\n transform: translateY(-50%) rotate(225deg);\n }\n }\n }\n\n &.collapse-arrow:focus {\n > .collapse-title:after {\n transform: translateY(-50%) rotate(225deg);\n }\n }\n\n &.collapse-arrow {\n > input:is([type='checkbox'], [type='radio']):checked ~ .collapse-title:after {\n transform: translateY(-50%) rotate(225deg);\n }\n }\n\n > input:is([type='checkbox'], [type='radio']) {\n z-index: 1;\n width: 100%;\n }\n}\n\n.collapse-title,\n.collapse-content {\n grid-column-start: 1;\n grid-row-start: 1;\n}\n\n.collapse-content {\n visibility: hidden;\n grid-column-start: 1;\n grid-row-start: 2;\n min-height: 0;\n cursor: unset;\n transition: visibility 0.2s;\n}\n\n.collapse-arrow {\n > .collapse-title:after {\n position: absolute;\n display: block;\n height: 0.5rem;\n width: 0.5rem;\n transform: translateY(-100%) rotate(45deg);\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 0.2s;\n top: 50%;\n right: 0.8em;\n inset-inline-end: 0.75rem;\n content: '';\n transform-origin: 75% 75%;\n box-shadow: 2px 2px;\n pointer-events: none;\n }\n}\n\n.collapse-title {\n position: relative;\n width: 100%;\n transition: background-color 0.2s ease-out;\n}\n</style>\n","export function formatDuration(timeInMs: number): string {\n if (timeInMs < 1000) {\n return `${Math.round(timeInMs)} ms`\n }\n\n const seconds = timeInMs / 1000\n if (timeInMs < 10_000) {\n return `${seconds.toFixed(3)} seconds`\n }\n\n if (timeInMs < 60_000) {\n return `${Math.floor(seconds)} seconds`\n }\n\n const minutes = Math.floor(seconds / 60)\n\n if (timeInMs < 3_600_000) {\n return `${minutes} minute${minutes > 1 ? 's' : ''}`\n }\n\n const hours = Math.floor(minutes / 60)\n\n return `${hours}h${minutes % 60}m${seconds % 60}s`\n}\n","<script setup lang=\"ts\">\nimport type { UseQueryEntryPayload } from '@pinia/colada-devtools/shared'\nimport { computed, ref, watch } from 'vue'\nimport { useDuplexChannel, useQueryEntries } from '../../composables/duplex-channel'\nimport { formatDuration } from '../../utils/time'\nimport { useRoute } from 'vue-router'\nimport type { DataStateStatus } from '@pinia/colada'\n\nimport IWrench from '~icons/lucide/wrench'\nimport IInfoCircle from '~icons/lucide/info'\nimport IFileText from '~icons/lucide/file-text'\nimport ICircleX from '~icons/lucide/circle-x'\nimport IBraces from '~icons/lucide/braces'\nimport IHistory from '~icons/lucide/history'\nimport ISigmaSquare from '~icons/lucide/sigma-square'\nimport { useTimeAgo, formatTimeAgo } from '@vueuse/core'\nimport type { FormatTimeAgoOptions } from '@vueuse/core'\n\nconst route = useRoute('/queries/[queryId]')\nconst queries = useQueryEntries()\n\nconst selectedQuery = computed<UseQueryEntryPayload | null>(() => {\n return queries.value.find((entry) => entry.keyHash === route.params.queryId) ?? null\n})\n\nconst TIME_AGO_OPTIONS: FormatTimeAgoOptions = {\n showSecond: true,\n rounding: 'floor',\n max: 1000 * 60 * 5, // 5 minutes\n}\n\nconst lastUpdate = useTimeAgo(() => selectedQuery.value?.devtools.updatedAt ?? 0, {\n ...TIME_AGO_OPTIONS,\n updateInterval: 3_000,\n})\n\n// TODO: we should be able to highlight components using this query\n// const el = useTemplateRef('me')\n// TODO: add ref=\"me\" to the div\n// watch(\n// // also trigger if the selectedQuery changes\n// () => [el.value, selectedQuery.value?.id] as const,\n// ([el]) => {\n// if (!el || !selectedQuery.value) return\n//\n// const observingComponents = findVueComponents(\n// el,\n// selectedQuery.value.deps.filter((c) => c.type === 'component').map((c) => c.uid) ?? [],\n// )\n//\n// console.log('elements', observingComponents)\n// },\n// )\n\nconst channel = useDuplexChannel()\n\nconst isDataOpen = ref(false)\nlet wasDataOpen = isDataOpen.value\nlet lastStatus: DataStateStatus | null = null\nconst isErrorOpen = ref(false)\nwatch(\n () => selectedQuery.value?.state,\n (state) => {\n if (!state || lastStatus === state.status) return\n lastStatus = state.status\n if (state.status === 'error') {\n isErrorOpen.value = true\n // preserve it for later\n wasDataOpen = isDataOpen.value\n isDataOpen.value = false\n } else if (state.status === 'success') {\n isDataOpen.value = wasDataOpen\n isErrorOpen.value = false\n }\n },\n)\n</script>\n\n<template>\n <div class=\"flex flex-col divide-y dark:divide-(--ui-border) divide-(--ui-border-accented)\">\n <template v-if=\"selectedQuery\">\n <UCollapse title=\"Details\" :icon=\"IInfoCircle\">\n <div class=\"py-1 text-sm\">\n <p class=\"grid grid-cols-[auto_1fr] gap-1\">\n <span>key:</span>\n <span>\n <code class=\"rounded bg-neutral-500/20 p-0.5\">{{ selectedQuery.key }}</code>\n </span>\n </p>\n\n <p\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When was the query entry last updated\"\n >\n <span>Last update:</span>\n <span class=\"font-bold\">{{ lastUpdate }}</span>\n </p>\n\n <p\n v-if=\"selectedQuery.devtools.history.at(0)?.fetchTime\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When was the last time the query was fetched\"\n >\n <span>Last fetch:</span>\n <span class=\"font-bold\">{{\n formatTimeAgo(new Date(selectedQuery.devtools.history.at(0)!.fetchTime!.start), {\n ...TIME_AGO_OPTIONS,\n max: undefined,\n })\n }}</span>\n </p>\n\n <p\n v-if=\"selectedQuery.devtools.history.at(0)?.fetchTime?.end\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"How long did the last query take to fetch\"\n >\n <span>Fetch duration:</span>\n <span class=\"font-bold\">{{\n formatDuration(\n selectedQuery.devtools.history.at(0)!.fetchTime!.end!\n - selectedQuery.devtools.history.at(0)!.fetchTime!.start,\n )\n }}</span>\n </p>\n\n <p\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"How many components and effects are using this query\"\n >\n <span>Observers: <span class=\"font-bold\">{{ selectedQuery.deps.length }}</span></span>\n </p>\n\n <p\n v-if=\"!selectedQuery.active && selectedQuery.options\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When is this query entry garbace collected\"\n >\n <template\n v-if=\"\n typeof selectedQuery.options.gcTime === 'number'\n && Number.isFinite(selectedQuery.options.gcTime)\n \"\n >\n <span>Will be <i>gced</i></span>\n <span class=\"font-bold\">{{\n formatTimeAgo(\n new Date(selectedQuery.devtools.inactiveAt + selectedQuery.options.gcTime),\n {\n ...TIME_AGO_OPTIONS,\n max: undefined,\n },\n )\n }}</span>\n </template>\n </p>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Actions\" :icon=\"IWrench\">\n <div class=\"py-2 gap-2 flex flex-wrap items-center justify-items-start\">\n <UButton\n class=\"theme-info\"\n size=\"sm\"\n title=\"Refetch this query\"\n :disabled=\"selectedQuery.options?.enabled === false\"\n @click=\"channel.emit('queries:refetch', selectedQuery.key)\"\n >\n <i-lucide-refresh-cw class=\"size-3.5\" /> Refetch\n </UButton>\n\n <UButton\n class=\"theme-neutral\"\n size=\"sm\"\n title=\"Invalidate this query\"\n @click=\"channel.emit('queries:invalidate', selectedQuery.key)\"\n >\n <i-lucide-timer-reset /> Invalidate\n </UButton>\n\n <UButton\n v-if=\"selectedQuery.devtools.simulate !== 'loading'\"\n class=\"theme-purple\"\n size=\"sm\"\n title=\"Restore the previous state\"\n @click=\"channel.emit('queries:simulate:loading', selectedQuery.key)\"\n >\n <i-lucide-loader />\n Simulate loading\n </UButton>\n <UButton\n v-else\n class=\"theme-purple\"\n size=\"sm\"\n title=\"Simulate a loading state\"\n @click=\"channel.emit('queries:simulate:loading:stop', selectedQuery.key)\"\n >\n <i-lucide-loader class=\"animate-spin\" />\n Stop loading\n </UButton>\n\n <UButton\n v-if=\"selectedQuery.devtools.simulate !== 'error'\"\n class=\"theme-error\"\n size=\"sm\"\n title=\"Simulate an Error state\"\n @click=\"channel.emit('queries:simulate:error', selectedQuery.key)\"\n >\n <i-lucide-x-octagon /> Simulate error\n </UButton>\n <UButton\n v-else\n class=\"theme-error\"\n size=\"sm\"\n title=\"Restore the previous state\"\n @click=\"channel.emit('queries:simulate:error:stop', selectedQuery.key)\"\n >\n <i-lucide-rotate-ccw /> Remove error\n </UButton>\n\n <UButton\n class=\"theme-warning\"\n size=\"sm\"\n title=\"Reset this query to its initial (pending) state\"\n @click=\"channel.emit('queries:reset', selectedQuery.key)\"\n >\n <i-lucide-trash /> Reset\n </UButton>\n </div>\n </UCollapse>\n\n <UCollapse v-model:open=\"isDataOpen\" title=\"Data\" :icon=\"IFileText\">\n <div class=\"py-1\">\n <pre\n v-if=\"selectedQuery.state.data !== undefined\"\n class=\"rounded p-1 overflow-auto max-h-[1200px]\"\n >{{ selectedQuery.state.data }}</pre>\n <p v-else class=\"text-neutral-500/50\">\n No data\n </p>\n </div>\n </UCollapse>\n\n <UCollapse\n v-model:open=\"isErrorOpen\"\n :title=\"`Error${selectedQuery.state.status === 'error' ? ' (!)' : ''}`\"\n :icon=\"ICircleX\"\n >\n <div class=\"py-1\">\n <pre v-if=\"selectedQuery.state.error\" class=\"rounded p-1 overflow-auto max-h-[1200px]\">{{\n selectedQuery.state.error\n }}</pre>\n <p v-else class=\"text-neutral-500/50\">\n No error\n </p>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Call count\" :icon=\"ISigmaSquare\" :open=\"false\">\n <div class=\"py-1\">\n <p class=\"grid grid-cols-[auto_1fr] gap-1\">\n <span>Calls:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.total }}</code>\n </span>\n <span>Success:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.succeed }}</code>\n </span>\n <span>Errors:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.errored }}</code>\n </span>\n <span>Cancelled:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.cancelled }}</code>\n </span>\n </p>\n </div>\n </UCollapse>\n\n <UCollapse\n :title=\"`History (${selectedQuery.devtools.history.length})`\"\n :icon=\"IHistory\"\n :open=\"false\"\n >\n <div class=\"py-1\">\n <UCollapse\n v-for=\"entry of selectedQuery.devtools.history\"\n :key=\"entry.updatedAt\"\n :title=\"`Entry nº${entry.id} (${formatTimeAgo(new Date(entry.updatedAt), TIME_AGO_OPTIONS)})`\"\n :open=\"false\"\n >\n <pre class=\"rounded p-1 overflow-auto max-h-[1200px]\">{{ entry }}</pre>\n </UCollapse>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Options\" :open=\"false\" :icon=\"IBraces\">\n <div class=\"py-1\">\n <pre\n v-if=\"selectedQuery.options\"\n class=\"rounded bg-neutral-500/20 p-1 overflow-auto max-h-[1200px]\"\n >{{ selectedQuery.options }}</pre>\n <p v-else>\n This Query entry has no options. It might have been created from the server or manually\n set with\n <code>queryCache.setQueryData()</code> for prefetching.\n </p>\n </div>\n </UCollapse>\n </template>\n\n <template v-else>\n <div class=\"py-6 mx-auto\">\n <p class=\"flex flex-col text-center items-center gap-2 text-lg px-2\">\n Select a Query to inspect\n <i-lucide-mouse-pointer-click />\n </p>\n </div>\n </template>\n </div>\n</template>\n"],"names":["open","_useModel","__props","scrollIfNeeded","event","scrollOptions","formatDuration","timeInMs","seconds","minutes","route","useRoute","queries","useQueryEntries","selectedQuery","computed","entry","TIME_AGO_OPTIONS","lastUpdate","useTimeAgo","_a","channel","useDuplexChannel","isDataOpen","ref","wasDataOpen","lastStatus","isErrorOpen","watch","state"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQM,UAAAA,IAAOC,EAAqBC,GAAA,MAEjC;AAED,aAASC,EAAeC,GAAwB;AAC1C,UAAAA,EAAM,kBAAkB,aAAa;AACvC,cAAMC,IAAuC;AAAA,UAC3C,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ;AACM,QAAAD,EAAA,OAAO,eAAeC,CAAa;AAAA,MAAA;AAAA,IAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBK,SAASC,GAAeC,GAA0B;AACvD,MAAIA,IAAW;AACb,WAAO,GAAG,KAAK,MAAMA,CAAQ,CAAC;AAGhC,QAAMC,IAAUD,IAAW;AAC3B,MAAIA,IAAW;AACb,WAAO,GAAGC,EAAQ,QAAQ,CAAC,CAAC;AAG9B,MAAID,IAAW;AACb,WAAO,GAAG,KAAK,MAAMC,CAAO,CAAC;AAG/B,QAAMC,IAAU,KAAK,MAAMD,IAAU,EAAE;AAEvC,SAAID,IAAW,OACN,GAAGE,CAAO,UAAUA,IAAU,IAAI,MAAM,EAAE,KAK5C,GAFO,KAAK,MAAMA,IAAU,EAAE,CAEtB,IAAIA,IAAU,EAAE,IAAID,IAAU,EAAE;AACjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACLM,UAAAE,IAAQC,EAA6B,GACrCC,IAAUC,EAAgB,GAE1BC,IAAgBC,EAAsC,MACnDH,EAAQ,MAAM,KAAK,CAACI,MAAUA,EAAM,YAAYN,EAAM,OAAO,OAAO,KAAK,IACjF,GAEKO,IAAyC;AAAA,MAC7C,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,KAAK,MAAO,KAAK;AAAA;AAAA,IACnB,GAEMC,IAAaC,EAAW,MAAM;;AAAA,eAAAC,IAAAN,EAAc,UAAd,gBAAAM,EAAqB,SAAS,cAAa;AAAA,OAAG;AAAA,MAChF,GAAGH;AAAA,MACH,gBAAgB;AAAA,IAAA,CACjB,GAoBKI,IAAUC,EAAiB,GAE3BC,IAAaC,EAAI,EAAK;AAC5B,QAAIC,IAAcF,EAAW,OACzBG,IAAqC;AACnC,UAAAC,IAAcH,EAAI,EAAK;AAC7B,WAAAI;AAAA,MACE,MAAM;;AAAA,gBAAAR,IAAAN,EAAc,UAAd,gBAAAM,EAAqB;AAAA;AAAA,MAC3B,CAACS,MAAU;AACT,QAAI,CAACA,KAASH,MAAeG,EAAM,WACnCH,IAAaG,EAAM,QACfA,EAAM,WAAW,WACnBF,EAAY,QAAQ,IAEpBF,IAAcF,EAAW,OACzBA,EAAW,QAAQ,MACVM,EAAM,WAAW,cAC1BN,EAAW,QAAQE,GACnBE,EAAY,QAAQ;AAAA,MACtB;AAAA,IAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"_queryId_-C_7uiscL.js","sources":["../src/panel/components/UCollapse.ce.vue","../src/panel/utils/time.ts","../src/panel/pages/queries/[queryId].vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Component } from 'vue'\n\ndefineProps<{\n title?: string\n icon?: Component\n}>()\n\nconst open = defineModel<boolean>('open', {\n default: true,\n})\n\nfunction scrollIfNeeded(event: TransitionEvent) {\n if (event.target instanceof HTMLElement) {\n const scrollOptions: ScrollIntoViewOptions = {\n block: 'nearest',\n inline: 'nearest',\n behavior: 'smooth',\n }\n event.target.scrollIntoView(scrollOptions)\n }\n}\n</script>\n\n<template>\n <div class=\"collapse collapse-arrow\">\n <input v-model=\"open\" type=\"checkbox\">\n <div class=\"collapse-title px-2 py-0.5 bg-neutral-200 dark:bg-neutral-800 theme-neutral\">\n <slot name=\"title\" :open :title>\n <h3 class=\"font-semibold text-sm flex gap-x-1 items-center\">\n <slot name=\"icon\">\n <component :is=\"icon\" v-if=\"icon\" class=\"size-4\" />\n </slot>\n {{ title ?? 'Group' }}\n </h3>\n </slot>\n </div>\n <div class=\"collapse-content px-2 text-sm overflow-hidden\" @transitionend=\"scrollIfNeeded\">\n <slot :open />\n </div>\n </div>\n</template>\n\n<style scoped>\n.collapse:not(td, tr, colgroup) {\n visibility: visible;\n}\n\n.collapse {\n position: relative;\n display: grid;\n overflow: hidden;\n width: 100%;\n grid-template-rows: max-content 0fr;\n transition: grid-template-rows 0.2s;\n isolation: isolate;\n\n > input:is([type='checkbox'], [type='radio']) {\n grid-column-start: 1;\n grid-row-start: 1;\n appearance: none;\n opacity: 0;\n }\n\n &:is([open], :focus),\n &:has(> input:is([type='checkbox'], [type='radio']):checked) {\n grid-template-rows: max-content 1fr;\n }\n\n &:is([open], :focus) > .collapse-content,\n &:not(.collapse-close)\n > :where(input:is([type='checkbox'], [type='radio']):checked ~ .collapse-content) {\n visibility: visible;\n min-height: fit-content;\n }\n &:focus-visible,\n &:has(> input:is([type='checkbox'], [type='radio']):focus-visible) {\n outline-color: var(--ui-text);\n outline-style: solid;\n outline-width: 2px;\n outline-offset: 2px;\n }\n\n &:not(.collapse-close) {\n > input[type='checkbox'],\n > input[type='radio']:not(:checked),\n > .collapse-title {\n cursor: pointer;\n }\n }\n\n &:focus:not(.collapse-close, .collapse[open]) > .collapse-title {\n cursor: unset;\n }\n\n &:is([open]) {\n &.collapse-arrow {\n > .collapse-title:after {\n transform: translateY(-50%) rotate(225deg);\n }\n }\n }\n\n &.collapse-arrow:focus {\n > .collapse-title:after {\n transform: translateY(-50%) rotate(225deg);\n }\n }\n\n &.collapse-arrow {\n > input:is([type='checkbox'], [type='radio']):checked ~ .collapse-title:after {\n transform: translateY(-50%) rotate(225deg);\n }\n }\n\n > input:is([type='checkbox'], [type='radio']) {\n z-index: 1;\n width: 100%;\n }\n}\n\n.collapse-title,\n.collapse-content {\n grid-column-start: 1;\n grid-row-start: 1;\n}\n\n.collapse-content {\n visibility: hidden;\n grid-column-start: 1;\n grid-row-start: 2;\n min-height: 0;\n cursor: unset;\n transition: visibility 0.2s;\n}\n\n.collapse-arrow {\n > .collapse-title:after {\n position: absolute;\n display: block;\n height: 0.5rem;\n width: 0.5rem;\n transform: translateY(-100%) rotate(45deg);\n transition-property: all;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 0.2s;\n top: 50%;\n right: 0.8em;\n inset-inline-end: 0.75rem;\n content: '';\n transform-origin: 75% 75%;\n box-shadow: 2px 2px;\n pointer-events: none;\n }\n}\n\n.collapse-title {\n position: relative;\n width: 100%;\n transition: background-color 0.2s ease-out;\n}\n</style>\n","export function formatDuration(timeInMs: number): string {\n if (timeInMs < 1000) {\n return `${Math.round(timeInMs)} ms`\n }\n\n const seconds = timeInMs / 1000\n if (timeInMs < 10_000) {\n return `${seconds.toFixed(3)} seconds`\n }\n\n if (timeInMs < 60_000) {\n return `${Math.floor(seconds)} seconds`\n }\n\n const minutes = Math.floor(seconds / 60)\n\n if (timeInMs < 3_600_000) {\n return `${minutes} minute${minutes > 1 ? 's' : ''}`\n }\n\n const hours = Math.floor(minutes / 60)\n\n return `${hours}h${minutes % 60}m${seconds % 60}s`\n}\n","<script setup lang=\"ts\">\nimport type { UseQueryEntryPayload } from '@pinia/colada-devtools/shared'\nimport { computed, ref, watch } from 'vue'\nimport { useDuplexChannel, useQueryEntries } from '../../composables/duplex-channel'\nimport { formatDuration } from '../../utils/time'\nimport { useRoute } from 'vue-router'\nimport type { DataStateStatus } from '@pinia/colada'\n\nimport IWrench from '~icons/lucide/wrench'\nimport IInfoCircle from '~icons/lucide/info'\nimport IFileText from '~icons/lucide/file-text'\nimport ICircleX from '~icons/lucide/circle-x'\nimport IBraces from '~icons/lucide/braces'\nimport IHistory from '~icons/lucide/history'\nimport ISigmaSquare from '~icons/lucide/sigma-square'\nimport { useTimeAgo, formatTimeAgo } from '@vueuse/core'\nimport type { FormatTimeAgoOptions } from '@vueuse/core'\n\nconst route = useRoute('/queries/[queryId]')\nconst queries = useQueryEntries()\n\nconst selectedQuery = computed<UseQueryEntryPayload | null>(() => {\n return queries.value.find((entry) => entry.keyHash === route.params.queryId) ?? null\n})\n\nconst TIME_AGO_OPTIONS: FormatTimeAgoOptions = {\n showSecond: true,\n rounding: 'floor',\n max: 1000 * 60 * 5, // 5 minutes\n}\n\nconst lastUpdate = useTimeAgo(() => selectedQuery.value?.devtools.updatedAt ?? 0, {\n ...TIME_AGO_OPTIONS,\n updateInterval: 3_000,\n})\n\n// TODO: we should be able to highlight components using this query\n// const el = useTemplateRef('me')\n// TODO: add ref=\"me\" to the div\n// watch(\n// // also trigger if the selectedQuery changes\n// () => [el.value, selectedQuery.value?.id] as const,\n// ([el]) => {\n// if (!el || !selectedQuery.value) return\n//\n// const observingComponents = findVueComponents(\n// el,\n// selectedQuery.value.deps.filter((c) => c.type === 'component').map((c) => c.uid) ?? [],\n// )\n//\n// console.log('elements', observingComponents)\n// },\n// )\n\nconst channel = useDuplexChannel()\n\nconst isDataOpen = ref(false)\nlet wasDataOpen = isDataOpen.value\nlet lastStatus: DataStateStatus | null = null\nconst isErrorOpen = ref(false)\nwatch(\n () => selectedQuery.value?.state,\n (state) => {\n if (!state || lastStatus === state.status) return\n lastStatus = state.status\n if (state.status === 'error') {\n isErrorOpen.value = true\n // preserve it for later\n wasDataOpen = isDataOpen.value\n isDataOpen.value = false\n } else if (state.status === 'success') {\n isDataOpen.value = wasDataOpen\n isErrorOpen.value = false\n }\n },\n)\n</script>\n\n<template>\n <div class=\"flex flex-col divide-y dark:divide-(--ui-border) divide-(--ui-border-accented)\">\n <template v-if=\"selectedQuery\">\n <UCollapse title=\"Details\" :icon=\"IInfoCircle\">\n <div class=\"py-1 text-sm\">\n <p class=\"grid grid-cols-[auto_1fr] gap-1\">\n <span>key:</span>\n <span>\n <code class=\"rounded bg-neutral-500/20 p-0.5\">{{ selectedQuery.key }}</code>\n </span>\n </p>\n\n <p\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When was the query entry last updated\"\n >\n <span>Last update:</span>\n <span class=\"font-bold\">{{ lastUpdate }}</span>\n </p>\n\n <p\n v-if=\"selectedQuery.devtools.history.at(0)?.fetchTime\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When was the last time the query was fetched\"\n >\n <span>Last fetch:</span>\n <span class=\"font-bold\">{{\n formatTimeAgo(new Date(selectedQuery.devtools.history.at(0)!.fetchTime!.start), {\n ...TIME_AGO_OPTIONS,\n max: undefined,\n })\n }}</span>\n </p>\n\n <p\n v-if=\"selectedQuery.devtools.history.at(0)?.fetchTime?.end\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"How long did the last query take to fetch\"\n >\n <span>Fetch duration:</span>\n <span class=\"font-bold\">{{\n formatDuration(\n selectedQuery.devtools.history.at(0)!.fetchTime!.end!\n - selectedQuery.devtools.history.at(0)!.fetchTime!.start,\n )\n }}</span>\n </p>\n\n <p\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"How many components and effects are using this query\"\n >\n <span>Observers: <span class=\"font-bold\">{{ selectedQuery.deps.length }}</span></span>\n </p>\n\n <p\n v-if=\"!selectedQuery.active && selectedQuery.options\"\n class=\"grid grid-cols-[auto_1fr] gap-x-2\"\n title=\"When is this query entry garbace collected\"\n >\n <template\n v-if=\"\n typeof selectedQuery.options.gcTime === 'number'\n && Number.isFinite(selectedQuery.options.gcTime)\n \"\n >\n <span>Will be <i>gced</i></span>\n <span class=\"font-bold\">{{\n formatTimeAgo(\n new Date(selectedQuery.devtools.inactiveAt + selectedQuery.options.gcTime),\n {\n ...TIME_AGO_OPTIONS,\n max: undefined,\n },\n )\n }}</span>\n </template>\n </p>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Actions\" :icon=\"IWrench\">\n <div class=\"py-2 gap-2 flex flex-wrap items-center justify-items-start\">\n <UButton\n class=\"theme-info\"\n size=\"sm\"\n title=\"Refetch this query\"\n :disabled=\"selectedQuery.options?.enabled === false\"\n @click=\"channel.emit('queries:refetch', selectedQuery.key)\"\n >\n <i-lucide-refresh-cw class=\"size-3.5\" /> Refetch\n </UButton>\n\n <UButton\n class=\"theme-neutral\"\n size=\"sm\"\n title=\"Invalidate this query\"\n @click=\"channel.emit('queries:invalidate', selectedQuery.key)\"\n >\n <i-lucide-timer-reset /> Invalidate\n </UButton>\n\n <UButton\n v-if=\"selectedQuery.devtools.simulate !== 'loading'\"\n class=\"theme-purple\"\n size=\"sm\"\n title=\"Restore the previous state\"\n @click=\"channel.emit('queries:simulate:loading', selectedQuery.key)\"\n >\n <i-lucide-loader />\n Simulate loading\n </UButton>\n <UButton\n v-else\n class=\"theme-purple\"\n size=\"sm\"\n title=\"Simulate a loading state\"\n @click=\"channel.emit('queries:simulate:loading:stop', selectedQuery.key)\"\n >\n <i-lucide-loader class=\"animate-spin\" />\n Stop loading\n </UButton>\n\n <UButton\n v-if=\"selectedQuery.devtools.simulate !== 'error'\"\n class=\"theme-error\"\n size=\"sm\"\n title=\"Simulate an Error state\"\n @click=\"channel.emit('queries:simulate:error', selectedQuery.key)\"\n >\n <i-lucide-x-octagon /> Simulate error\n </UButton>\n <UButton\n v-else\n class=\"theme-error\"\n size=\"sm\"\n title=\"Restore the previous state\"\n @click=\"channel.emit('queries:simulate:error:stop', selectedQuery.key)\"\n >\n <i-lucide-rotate-ccw /> Remove error\n </UButton>\n\n <UButton\n class=\"theme-warning\"\n size=\"sm\"\n title=\"Reset this query to its initial (pending) state\"\n @click=\"channel.emit('queries:reset', selectedQuery.key)\"\n >\n <i-lucide-trash /> Reset\n </UButton>\n </div>\n </UCollapse>\n\n <UCollapse v-model:open=\"isDataOpen\" title=\"Data\" :icon=\"IFileText\">\n <div class=\"py-1\">\n <pre\n v-if=\"selectedQuery.state.data !== undefined\"\n class=\"rounded p-1 overflow-auto max-h-[1200px]\"\n >{{ selectedQuery.state.data }}</pre>\n <p v-else class=\"text-neutral-500/50\">\n No data\n </p>\n </div>\n </UCollapse>\n\n <UCollapse\n v-model:open=\"isErrorOpen\"\n :title=\"`Error${selectedQuery.state.status === 'error' ? ' (!)' : ''}`\"\n :icon=\"ICircleX\"\n >\n <div class=\"py-1\">\n <pre v-if=\"selectedQuery.state.error\" class=\"rounded p-1 overflow-auto max-h-[1200px]\">{{\n selectedQuery.state.error\n }}</pre>\n <p v-else class=\"text-neutral-500/50\">\n No error\n </p>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Call count\" :icon=\"ISigmaSquare\" :open=\"false\">\n <div class=\"py-1\">\n <p class=\"grid grid-cols-[auto_1fr] gap-1\">\n <span>Calls:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.total }}</code>\n </span>\n <span>Success:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.succeed }}</code>\n </span>\n <span>Errors:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.errored }}</code>\n </span>\n <span>Cancelled:</span>\n <span>\n <code class=\"font-bold\">{{ selectedQuery.devtools.count.cancelled }}</code>\n </span>\n </p>\n </div>\n </UCollapse>\n\n <UCollapse\n :title=\"`History (${selectedQuery.devtools.history.length})`\"\n :icon=\"IHistory\"\n :open=\"false\"\n >\n <div class=\"py-1\">\n <UCollapse\n v-for=\"entry of selectedQuery.devtools.history\"\n :key=\"entry.updatedAt\"\n :title=\"`Entry nº${entry.id} (${formatTimeAgo(new Date(entry.updatedAt), TIME_AGO_OPTIONS)})`\"\n :open=\"false\"\n >\n <pre class=\"rounded p-1 overflow-auto max-h-[1200px]\">{{ entry }}</pre>\n </UCollapse>\n </div>\n </UCollapse>\n\n <UCollapse title=\"Options\" :open=\"false\" :icon=\"IBraces\">\n <div class=\"py-1\">\n <pre\n v-if=\"selectedQuery.options\"\n class=\"rounded bg-neutral-500/20 p-1 overflow-auto max-h-[1200px]\"\n >{{ selectedQuery.options }}</pre>\n <p v-else>\n This Query entry has no options. It might have been created from the server or manually\n set with\n <code>queryCache.setQueryData()</code> for prefetching.\n </p>\n </div>\n </UCollapse>\n </template>\n\n <template v-else>\n <div class=\"py-6 mx-auto\">\n <p class=\"flex flex-col text-center items-center gap-2 text-lg px-2\">\n Select a Query to inspect\n <i-lucide-mouse-pointer-click />\n </p>\n </div>\n </template>\n </div>\n</template>\n"],"names":["open","_useModel","__props","scrollIfNeeded","event","scrollOptions","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","$event","_hoisted_2","_renderSlot","_ctx","title","_hoisted_3","icon","_createBlock","_resolveDynamicComponent","_createTextVNode","formatDuration","timeInMs","seconds","minutes","route","useRoute","queries","useQueryEntries","selectedQuery","computed","entry","TIME_AGO_OPTIONS","lastUpdate","useTimeAgo","_a","channel","useDuplexChannel","isDataOpen","ref","wasDataOpen","lastStatus","isErrorOpen","watch","state","_Fragment","_createVNode","_component_UCollapse","_unref","IInfoCircle","_cache","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","formatTimeAgo","_c","_b","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","IWrench","_hoisted_15","_component_UButton","_component_i_lucide_refresh_cw","_component_i_lucide_timer_reset","_component_i_lucide_loader","_component_i_lucide_x_octagon","_component_i_lucide_rotate_ccw","_component_i_lucide_trash","IFileText","_hoisted_16","_hoisted_17","_hoisted_18","ICircleX","_hoisted_19","_hoisted_20","_hoisted_21","ISigmaSquare","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","IHistory","_hoisted_28","_hoisted_29","IBraces","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_component_i_lucide_mouse_pointer_click"],"mappings":"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"}
|