@pinia/colada-devtools 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +141 -134
- package/dist/index.js.map +1 -1
- package/dist-panel/{_queryId_-SBAeSmfh.js → _queryId_-BRk1BujP.js} +85 -78
- package/dist-panel/_queryId_-BRk1BujP.js.map +1 -0
- package/dist-panel/{index-CAv-3vCR.js → index-B_58xqr0.js} +2 -2
- package/dist-panel/{index-CAv-3vCR.js.map → index-B_58xqr0.js.map} +1 -1
- package/dist-panel/{index-DZwqU9e-.js → index-CIFb4FXj.js} +3 -3
- package/dist-panel/index-CIFb4FXj.js.map +1 -0
- package/dist-panel/index-dcKxSjOS.js +8113 -0
- package/dist-panel/index-dcKxSjOS.js.map +1 -0
- package/dist-panel/index.js +1 -1
- package/dist-panel/{loader-DHLcbUhz.js → loader-CDd8nw_A.js} +2 -2
- package/dist-panel/loader-CDd8nw_A.js.map +1 -0
- package/dist-panel/{mouse-pointer-click-BHnWXkC_.js → mouse-pointer-click-BisIGlPs.js} +2 -2
- package/dist-panel/mouse-pointer-click-BisIGlPs.js.map +1 -0
- package/dist-panel/mutations-DmPjJLlL.js +13 -0
- package/dist-panel/mutations-DmPjJLlL.js.map +1 -0
- package/dist-panel/{queries-CE8W5p_h.js → queries-B9YVJVQ4.js} +88 -89
- package/dist-panel/queries-B9YVJVQ4.js.map +1 -0
- package/dist-panel/{settings-DIqJoCBU.js → settings-s4xqlsIF.js} +2 -2
- package/dist-panel/{settings-DIqJoCBU.js.map → settings-s4xqlsIF.js.map} +1 -1
- package/dist-shared/index.d.ts +1 -1
- package/dist-shared/index.js.map +1 -1
- package/package.json +7 -7
- package/dist-panel/_queryId_-SBAeSmfh.js.map +0 -1
- package/dist-panel/index-BdIpA-g4.js +0 -8026
- package/dist-panel/index-BdIpA-g4.js.map +0 -1
- package/dist-panel/index-DZwqU9e-.js.map +0 -1
- package/dist-panel/loader-DHLcbUhz.js.map +0 -1
- package/dist-panel/mouse-pointer-click-BHnWXkC_.js.map +0 -1
- package/dist-panel/mutations-BfqfXeMY.js +0 -13
- package/dist-panel/mutations-BfqfXeMY.js.map +0 -1
- package/dist-panel/queries-CE8W5p_h.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries-B9YVJVQ4.js","sources":["../src/panel/components/UCircleProgress.ce.vue","../src/panel/utils/query-state.ts","../src/panel/composables/performance-now.ts","../src/panel/components/ListQueryEntry.vue","../src/panel/components/UInput.ce.vue","../../node_modules/.pnpm/@posva+splitpanes@4.0.6_vue@3.5.15_typescript@5.8.3_/node_modules/@posva/splitpanes/dist/splitpanes.js","../src/panel/composables/use-container-media-query.ts","../src/panel/pages/queries.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nconst {\n value,\n min = 0,\n max = 100,\n strokeWidth = 2,\n} = defineProps<{\n value: number\n min?: number\n max?: number\n strokeWidth?: number\n}>()\n\nconst valuePercentage = computed(() => Math.round(((value - min) / (max - min)) * 100))\n</script>\n\n<template>\n <div class=\"progress-bar\" aria-hidden>\n <svg>\n <circle class=\"bg\" />\n <circle class=\"fg\" />\n </svg>\n </div>\n</template>\n\n<style scoped>\n.progress-bar > svg {\n --progress-value: v-bind(valuePercentage);\n --size: 1em;\n --half-size: calc(var(--size) / 2);\n --stroke-width: calc(v-bind(strokeWidth) * var(--size) / 10);\n --radius: calc((var(--size) - var(--stroke-width)) / 2);\n --circumference: calc(var(--radius) * pi * 2);\n --dash: calc((var(--progress-value) * var(--circumference)) / 100);\n animation: progress-animation 100s linear 0s 1 forwards;\n\n width: var(--size);\n height: var(--size);\n}\n\n.progress-bar circle {\n cx: var(--half-size);\n cy: var(--half-size);\n r: var(--radius);\n stroke-width: var(--stroke-width);\n fill: none;\n stroke-linecap: butt;\n}\n\n.progress-bar circle.bg {\n stroke: color-mix(in hsl, currentColor 25%, var(--ui-bg));\n}\n\n.progress-bar circle.fg {\n transform: rotate(-90deg);\n transform-origin: var(--half-size) var(--half-size);\n stroke-dasharray: var(--dash) calc(var(--circumference) - var(--dash));\n transition: stroke-dasharray 0.3s linear 0s;\n stroke: currentColor;\n}\n</style>\n","import type { UseQueryEntryPayload } from '@pinia/colada-devtools/shared'\n\nexport type UseQueryEntryPayloadStatus =\n | 'loading'\n | 'fresh'\n | 'error'\n | 'stale'\n | 'pending'\n | 'unknown'\n\nexport function getQueryStatus(entry: UseQueryEntryPayload): UseQueryEntryPayloadStatus {\n if (entry.asyncStatus === 'loading') {\n return 'loading'\n }\n if (entry.state.status === 'error') {\n return 'error'\n }\n if (entry.state.status === 'pending') {\n return 'pending'\n }\n if (entry.stale) {\n return 'stale'\n }\n if (entry.state.status === 'success') {\n return 'fresh'\n }\n\n return 'unknown'\n}\n\nexport const STATUS_COLOR_CLASSES: Record<\n UseQueryEntryPayloadStatus | 'inactive',\n {\n base: string\n clear: string\n text: string\n }\n> = {\n loading: {\n base: 'bg-purple-400',\n clear: 'bg-purple-200',\n text: 'text-purple-100',\n },\n fresh: {\n base: 'bg-success-500',\n clear: 'bg-success-200',\n text: 'text-success-100',\n },\n error: {\n base: 'bg-error-500',\n clear: 'bg-error-200',\n text: 'text-error-100',\n },\n stale: {\n base: 'bg-info-500',\n clear: 'bg-info-200',\n text: 'text-info-100',\n },\n pending: {\n base: 'bg-warning-500',\n clear: 'bg-warning-200',\n text: 'text-warning-100',\n },\n inactive: {\n base: 'bg-neutral-400',\n clear: 'bg-neutral-200',\n text: 'text-neutral-100',\n },\n unknown: {\n base: 'bg-gray-400',\n clear: 'bg-gray-200',\n text: 'text-gray-100',\n },\n}\n","import { onScopeDispose, shallowRef } from 'vue'\n\n// share this variable among all instances\nconst now = shallowRef(performance.timeOrigin + performance.now())\nlet intervalId: ReturnType<typeof setInterval> | undefined\nlet useCount = 0\n\n/**\n * Reactive and shared `performance.now()` that updates on the specified interval.\n */\nexport function usePerformanceNow() {\n if (!intervalId) {\n intervalId = setInterval(() => {\n now.value = performance.timeOrigin + performance.now()\n }, 50)\n }\n\n useCount++\n onScopeDispose(() => {\n if (--useCount <= 0) {\n clearInterval(intervalId)\n intervalId = undefined\n }\n })\n\n return now\n}\n","<script setup lang=\"ts\">\nimport { miniJsonParse } from '@pinia/colada-devtools/shared'\nimport type { UseQueryEntryPayload } from '@pinia/colada-devtools/shared'\nimport { computed } from 'vue'\nimport { getQueryStatus, STATUS_COLOR_CLASSES } from '../utils/query-state'\nimport { useRouter } from 'vue-router'\nimport { usePerformanceNow } from '../composables/performance-now'\n\nconst { entry } = defineProps<{\n entry: UseQueryEntryPayload\n}>()\nconst router = useRouter()\n\nconst now = usePerformanceNow()\n// const now = useNow({ interval: Math.max(100, (entry.options?.gcTime || 0) / 30) })\n\nfunction unselect(event: MouseEvent) {\n event.preventDefault()\n event.stopPropagation()\n router.push('/queries')\n}\n\n// TODO: colorize the output based on the type of value\nconst formattedKey = computed(() => {\n return entry.key.map((rawValue) => {\n let value: unknown = rawValue\n try {\n value = typeof rawValue === 'string' ? JSON.parse(rawValue) : rawValue\n } catch {\n // If parsing fails, keep the original value\n }\n return value && typeof value === 'object' ? miniJsonParse(value) : String(value)\n })\n})\n\nconst status = computed(() => getQueryStatus(entry))\n</script>\n\n<template>\n <RouterLink\n v-slot=\"{ isActive, navigate, href }\"\n :to=\"{ name: '/queries/[queryId]', params: { queryId: entry.keyHash } }\"\n custom\n >\n <div\n class=\"grid grid-cols-[minmax(0,auto)_1fr] grid-flow-col items-center gap-x-2 p-1 relative text-sm @container\"\n :class=\"[\n isActive ? 'bg-neutral-200 dark:bg-neutral-700' : 'hover:bg-(--ui-bg-elevated)',\n entry.active ? '' : 'text-(--ui-text)/50',\n ]\"\n >\n <div class=\"h-full w-6 relative\">\n <div\n class=\"absolute -inset-1 right-0 flex items-center justify-center\"\n :class=\"STATUS_COLOR_CLASSES[status].base\"\n :title=\"status\"\n >\n <i-lucide-loader v-if=\"status === 'loading'\" title=\"Loading\" aria-label=\"Loading icon\" />\n <i-lucide-check-check\n v-else-if=\"status === 'fresh'\"\n title=\"Fresh successful data\"\n aria-label=\"Fresh successful data icon\"\n />\n <i-lucide-x-octagon\n v-else-if=\"status === 'error'\"\n title=\"Error\"\n aria-label=\"Error icon\"\n />\n <i-lucide-check v-else-if=\"status === 'stale'\" title=\"Stale\" aria-label=\"Stale icon\" />\n <i-lucide-pause\n v-else-if=\"status === 'pending'\"\n title=\"Pending\"\n aria-label=\"Pending icon\"\n />\n </div>\n </div>\n\n <a\n :href\n class=\"hover:cursor-pointer block overflow-hidden\"\n :title=\"entry.active ? 'Active query' : 'Inactive query'\"\n @click=\"isActive ? unselect($event) : navigate($event)\"\n >\n <ol class=\"flex font-mono flex-grow gap-0.5 overflow-auto items-center\">\n <template v-for=\"(key, i) in formattedKey\" :key=\"key\">\n <li class=\"text-wrap break-words rounded bg-(--ui-text)/5 px-0.5\">{{ key }}</li>\n <li v-if=\"i < formattedKey.length - 1\" aria-hidden=\"true\">/</li>\n </template>\n </ol>\n </a>\n\n <div v-if=\"entry.options?.enabled === false\" title=\"This query is disabled\">\n <span class=\"rounded bg-theme/70 theme-neutral p-0.5 text-xs flex gap-x-0.5 items-center\">\n <i-lucide-circle-slash aria-hidden />\n <span class=\"@max-md:hidden\">disabled</span>\n </span>\n </div>\n <div\n v-else-if=\"\n !entry.active\n && entry.gcTimeout\n && entry.devtools.inactiveAt\n && typeof entry.options?.gcTime === 'number'\n && Number.isFinite(entry.options.gcTime)\n && entry.options.gcTime <= 30_000\n \"\n title=\"This query will be garbage collected\"\n >\n <UCircleProgress\n class=\"size-[1em] dark:text-neutral-500 text-neutral-400\"\n :max=\"entry.options.gcTime\"\n :value=\"entry.devtools.inactiveAt + entry.options.gcTime - now\"\n />\n </div>\n </div>\n </RouterLink>\n</template>\n","<script setup lang=\"ts\">\nconst modelValue = defineModel<string | number>()\n</script>\n\n<template>\n <input\n v-model=\"modelValue\"\n class=\"py-1.5 pl-8 pr-2 rounded border border-(--ui-border) focus:ring-1 focus:ring-theme focus:outline-none transition-colors theme-primary\"\n placeholder=\"Search Queries\"\n >\n</template>\n","import { defineComponent as G, useSlots as fe, ref as k, computed as h, watch as A, onMounted as X, onBeforeUnmount as Y, provide as g, createElementBlock as W, openBlock as I, normalizeClass as pe, renderSlot as J, nextTick as T, inject as E, getCurrentInstance as me, normalizeStyle as de, unref as j } from \"vue\";\nconst he = /* @__PURE__ */ G({\n __name: \"splitpanes\",\n props: {\n horizontal: { type: Boolean, default: !1 },\n pushOtherPanes: { type: Boolean, default: !0 },\n maximizePanes: { type: Boolean, default: !0 },\n // Maximize pane on splitter double click/tap.\n rtl: { type: Boolean, default: !1 },\n // Right to left direction.\n firstSplitter: { type: Boolean, default: !1 }\n },\n emits: [\n \"ready\",\n \"resize\",\n \"resized\",\n \"pane-click\",\n \"pane-maximize\",\n \"pane-add\",\n \"pane-remove\",\n \"splitter-click\",\n \"splitter-dblclick\"\n ],\n setup(L, { emit: x }) {\n const y = x, c = L;\n fe();\n const l = k([]), w = h(\n () => l.value.reduce((e, n) => (e[~~n.id] = n) && e, {})\n ), z = h(() => l.value.length), f = k(null), S = k(!1), v = k({\n mouseDown: !1,\n dragging: !1,\n activeSplitter: null,\n cursorOffset: 0\n // Cursor offset within the splitter.\n }), d = k({\n // Used to detect double click on touch devices.\n splitter: null,\n timeoutId: null\n }), _ = h(() => ({\n [`splitpanes splitpanes--${c.horizontal ? \"horizontal\" : \"vertical\"}`]: !0,\n \"splitpanes--dragging\": v.value.dragging\n }));\n let P = () => {\n };\n function R(e) {\n e.addEventListener(\"mousemove\", M, { passive: !1 }), e.addEventListener(\"mouseup\", u), \"ontouchstart\" in window && (e.addEventListener(\"touchmove\", M, { passive: !1 }), e.addEventListener(\"touchend\", u)), P = () => {\n e.removeEventListener(\"mousemove\", M), e.removeEventListener(\"mouseup\", u), \"ontouchstart\" in window && (e.removeEventListener(\"touchmove\", M), e.removeEventListener(\"touchend\", u)), P = () => {\n };\n };\n }\n const N = (e, n) => {\n const t = e.target.closest(\".splitpanes__splitter\");\n if (t) {\n const { left: i, top: a } = t.getBoundingClientRect(), { clientX: o, clientY: s } = \"touches\" in e ? e.touches[0] : e;\n v.value.cursorOffset = c.horizontal ? s - a : o - i;\n }\n R(e.target.ownerDocument || document), v.value.mouseDown = !0, v.value.activeSplitter = n;\n }, M = (e) => {\n v.value.mouseDown && (e.preventDefault(), v.value.dragging = !0, requestAnimationFrame(() => {\n Z(Q(e)), m(\"resize\", { event: e }, !0);\n }));\n }, u = (e) => {\n v.value.dragging && m(\"resized\", { event: e }, !0), v.value.mouseDown = !1, v.value.activeSplitter = null, setTimeout(() => {\n v.value.dragging = !1, P();\n }, 100);\n }, C = (e, n) => {\n \"ontouchstart\" in window && (e.preventDefault(), d.value.splitter === n ? (clearTimeout(d.value.timeoutId), d.value.timeoutId = null, B(e, n), d.value.splitter = null) : (d.value.splitter = n, d.value.timeoutId = setTimeout(() => d.value.splitter = null, 500))), v.value.dragging || m(\"splitter-click\", { event: e, index: n }, !0);\n }, B = (e, n) => {\n if (m(\"splitter-dblclick\", { event: e, index: n }, !0), c.maximizePanes) {\n let t = 0;\n l.value = l.value.map((i, a) => (i.size = a === n ? i.max : i.min, a !== n && (t += i.min), i)), l.value[n].size -= t, m(\"pane-maximize\", {\n event: e,\n index: n,\n pane: l.value[n]\n }), m(\"resized\", { event: e, index: n }, !0);\n }\n }, K = (e, n) => {\n m(\"pane-click\", {\n event: e,\n index: w.value[n].index,\n pane: w.value[n]\n });\n }, Q = (e) => {\n var a;\n const n = (a = f.value) == null ? void 0 : a.getBoundingClientRect(), { clientX: t, clientY: i } = \"ontouchstart\" in window && e.touches ? e.touches[0] : e;\n return {\n x: t - (c.horizontal ? 0 : v.value.cursorOffset) - n.left,\n y: i - (c.horizontal ? v.value.cursorOffset : 0) - n.top\n };\n }, V = (e) => {\n e = e[c.horizontal ? \"y\" : \"x\"];\n const n = f.value[c.horizontal ? \"clientHeight\" : \"clientWidth\"];\n return c.rtl && !c.horizontal && (e = n - e), e * 100 / n;\n }, Z = (e) => {\n const n = v.value.activeSplitter;\n let t = {\n prevPanesSize: U(n),\n nextPanesSize: b(n),\n prevReachedMinPanes: 0,\n nextReachedMinPanes: 0\n };\n const i = 0 + (c.pushOtherPanes ? 0 : t.prevPanesSize), a = 100 - (c.pushOtherPanes ? 0 : t.nextPanesSize), o = Math.max(Math.min(V(e), a), i);\n let s = [n, n + 1], r = l.value[s[0]], p = l.value[s[1]];\n if (!r || !p) return;\n const F = r.max < 100 && o >= r.max + t.prevPanesSize, ve = p.max < 100 && o <= 100 - (p.max + b(n + 1));\n if (F || ve) {\n F ? (r.size = r.max, p.size = Math.max(100 - r.max - t.prevPanesSize - t.nextPanesSize, 0)) : (r.size = Math.max(\n 100 - p.max - t.prevPanesSize - b(n + 1),\n 0\n ), p.size = p.max);\n return;\n }\n if (c.pushOtherPanes) {\n const H = ee(t, o);\n if (!H) return;\n ({ sums: t, panesToResize: s } = H), r = l.value[s[0]], p = l.value[s[1]];\n }\n r && (r.size = Math.min(\n Math.max(o - t.prevPanesSize - t.prevReachedMinPanes, r.min),\n r.max\n )), p && (p.size = Math.min(\n Math.max(100 - o - t.nextPanesSize - t.nextReachedMinPanes, p.min),\n p.max\n ));\n }, ee = (e, n) => {\n const t = v.value.activeSplitter, i = [t, t + 1];\n let a = l.value[i[0]], o = l.value[i[1]];\n return a && n < e.prevPanesSize + a.min && (i[0] = ne(t).index, e.prevReachedMinPanes = 0, i[0] < t && l.value.forEach((s, r) => {\n r > i[0] && r <= t && (s.size = s.min, e.prevReachedMinPanes += s.min);\n }), e.prevPanesSize = U(i[0]), i[0] === void 0) ? (e.prevReachedMinPanes = 0, l.value[0].size = l.value[0].min, l.value.forEach((s, r) => {\n r > 0 && r <= t && (s.size = s.min, e.prevReachedMinPanes += s.min);\n }), o.size = 100 - e.prevReachedMinPanes - l.value[0].min - e.prevPanesSize - e.nextPanesSize, null) : n > 100 - e.nextPanesSize - l.value[i[1]].min && (i[1] = ie(t).index, e.nextReachedMinPanes = 0, i[1] > t + 1 && l.value.forEach((s, r) => {\n r > t && r < i[1] && (s.size = s.min, e.nextReachedMinPanes += s.min);\n }), e.nextPanesSize = b(i[1] - 1), i[1] === void 0) ? (e.nextReachedMinPanes = 0, l.value.forEach((s, r) => {\n r < z.value - 1 && r >= t + 1 && (s.size = s.min, e.nextReachedMinPanes += s.min);\n }), l.value[i[0]].size = 100 - e.prevPanesSize - b(i[0] - 1), null) : { sums: e, panesToResize: i };\n }, U = (e) => l.value.reduce((n, t, i) => n + (i < e ? t.size : 0), 0), b = (e) => l.value.reduce((n, t, i) => n + (i > e + 1 ? t.size : 0), 0), ne = (e) => [...l.value].reverse().find((t) => t.index < e && t.size > t.min) || {}, ie = (e) => l.value.find((t) => t.index > e + 1 && t.size > t.min) || {}, te = () => {\n var n;\n const e = Array.from(((n = f.value) == null ? void 0 : n.children) || []);\n for (const t of e) {\n const i = t.classList.contains(\"splitpanes__pane\"), a = t.classList.contains(\"splitpanes__splitter\");\n !i && !a && (t.remove(), console.warn(\n \"Splitpanes: Only <pane> elements are allowed at the root of <splitpanes>. One of your DOM nodes was removed.\"\n ));\n }\n }, $ = (e, n, t = !1) => {\n const i = e - 1, a = document.createElement(\"div\");\n a.classList.add(\"splitpanes__splitter\"), t || (a.onmousedown = (o) => N(o, i), typeof window < \"u\" && \"ontouchstart\" in window && (a.ontouchstart = (o) => N(o, i)), a.onclick = (o) => C(o, i + 1)), a.ondblclick = (o) => B(o, i + 1), n.parentNode.insertBefore(a, n);\n }, ae = (e) => {\n e.onmousedown = void 0, e.onclick = void 0, e.ondblclick = void 0, e.remove();\n }, O = () => {\n var t;\n const e = Array.from(((t = f.value) == null ? void 0 : t.children) || []);\n for (const i of e)\n i.className.includes(\"splitpanes__splitter\") && ae(i);\n let n = 0;\n for (const i of e)\n i.className.includes(\"splitpanes__pane\") && (!n && c.firstSplitter ? $(n, i, !0) : n && $(n, i), n++);\n }, se = ({ uid: e, ...n }) => {\n const t = w.value[e];\n for (const [i, a] of Object.entries(n)) t[i] = a;\n }, le = (e) => {\n var t;\n let n = -1;\n Array.from(((t = f.value) == null ? void 0 : t.children) || []).some((i) => (i.className.includes(\"splitpanes__pane\") && n++, i.isSameNode(e.el))), l.value.splice(n, 0, { ...e, index: n }), l.value.forEach((i, a) => i.index = a), S.value && T(() => {\n O(), q({ addedPane: l.value[n] }), m(\"pane-add\", { pane: l.value[n] });\n });\n }, oe = (e) => {\n const n = l.value.findIndex((i) => i.id === e);\n l.value[n].el = null;\n const t = l.value.splice(n, 1)[0];\n l.value.forEach((i, a) => i.index = a), T(() => {\n O(), m(\"pane-remove\", { pane: t }), q({ removedPane: { ...t } });\n });\n }, q = (e = {}) => {\n !e.addedPane && !e.removedPane ? ue() : l.value.some((n) => n.givenSize !== null || n.min || n.max < 100) ? ce(e) : re(), S.value && m(\"resized\");\n }, re = () => {\n const e = 100 / z.value;\n let n = 0;\n const t = [], i = [];\n for (const a of l.value)\n a.size = Math.max(Math.min(e, a.max), a.min), n -= a.size, a.size >= a.max && t.push(a.id), a.size <= a.min && i.push(a.id);\n n > 0.1 && D(n, t, i);\n }, ue = () => {\n let e = 100;\n const n = [], t = [];\n let i = 0;\n for (const o of l.value)\n e -= o.size, o.givenSize !== null && i++, o.size >= o.max && n.push(o.id), o.size <= o.min && t.push(o.id);\n let a = 100;\n if (e > 0.1) {\n for (const o of l.value)\n o.givenSize === null && (o.size = Math.max(\n Math.min(e / (z.value - i), o.max),\n o.min\n )), a -= o.size;\n a > 0.1 && D(a, n, t);\n }\n }, ce = ({ addedPane: e, removedPane: n } = {}) => {\n let t = 100 / z.value, i = 0;\n const a = [], o = [];\n ((e == null ? void 0 : e.givenSize) ?? null) !== null && (t = (100 - e.givenSize) / (z.value - 1));\n for (const s of l.value)\n i -= s.size, s.size >= s.max && a.push(s.id), s.size <= s.min && o.push(s.id);\n if (!(Math.abs(i) < 0.1)) {\n for (const s of l.value)\n (e == null ? void 0 : e.givenSize) !== null && (e == null ? void 0 : e.id) === s.id || (s.size = Math.max(Math.min(t, s.max), s.min)), i -= s.size, s.size >= s.max && a.push(s.id), s.size <= s.min && o.push(s.id);\n i > 0.1 && D(i, a, o);\n }\n }, D = (e, n, t) => {\n let i;\n e > 0 ? i = e / (z.value - n.length) : i = e / (z.value - t.length), l.value.forEach((a, o) => {\n if (e > 0 && !n.includes(a.id)) {\n const s = Math.max(Math.min(a.size + i, a.max), a.min), r = s - a.size;\n e -= r, a.size = s;\n } else if (!t.includes(a.id)) {\n const s = Math.max(Math.min(a.size + i, a.max), a.min), r = s - a.size;\n e -= r, a.size = s;\n }\n }), Math.abs(e) > 0.1 && T(() => {\n S.value && console.warn(\"Splitpanes: Could not resize panes correctly due to their constraints.\");\n });\n }, m = (e, n = void 0, t = !1) => {\n const i = (n == null ? void 0 : n.index) ?? v.value.activeSplitter ?? null;\n y(e, {\n ...n,\n ...i !== null && { index: i },\n ...t && i !== null && {\n prevPane: l.value[i - (c.firstSplitter ? 1 : 0)],\n nextPane: l.value[i + (c.firstSplitter ? 0 : 1)]\n },\n panes: l.value.map((a) => ({\n min: a.min,\n max: a.max,\n size: a.size\n }))\n });\n };\n return A(\n () => c.firstSplitter,\n () => O()\n ), X(() => {\n te(), O(), q(), m(\"ready\"), S.value = !0;\n }), Y(() => S.value = !1), g(\"panes\", l), g(\"indexedPanes\", w), g(\n \"horizontal\",\n h(() => c.horizontal)\n ), g(\"requestUpdate\", se), g(\"onPaneAdd\", le), g(\"onPaneRemove\", oe), g(\"onPaneClick\", K), (e, n) => (I(), W(\"div\", {\n class: pe(_.value),\n ref_key: \"containerEl\",\n ref: f\n }, [\n J(e.$slots, \"default\")\n ], 2));\n }\n}), xe = /* @__PURE__ */ G({\n __name: \"pane\",\n props: {\n size: { type: [Number, String] },\n minSize: { type: [Number, String], default: 0 },\n maxSize: { type: [Number, String], default: 100 }\n },\n setup(L) {\n var M;\n const x = L, y = E(\"requestUpdate\"), c = E(\"onPaneAdd\"), l = E(\"horizontal\"), w = E(\"onPaneRemove\"), z = E(\"onPaneClick\"), f = (M = me()) == null ? void 0 : M.uid, S = E(\"indexedPanes\"), v = h(() => S.value[f]), d = k(null), _ = h(() => {\n const u = isNaN(x.size) || x.size === void 0 ? 0 : parseFloat(x.size);\n return Math.max(Math.min(u, R.value), P.value);\n }), P = h(() => {\n const u = parseFloat(x.minSize);\n return isNaN(u) ? 0 : u;\n }), R = h(() => {\n const u = parseFloat(x.maxSize);\n return isNaN(u) ? 100 : u;\n }), N = h(() => {\n var u;\n return `${l.value ? \"height\" : \"width\"}: ${(u = v.value) == null ? void 0 : u.size}%`;\n });\n return A(\n () => _.value,\n (u) => y({ uid: f, size: u })\n ), A(\n () => P.value,\n (u) => y({ uid: f, min: u })\n ), A(\n () => R.value,\n (u) => y({ uid: f, max: u })\n ), X(() => {\n c({\n id: f,\n el: d.value,\n min: P.value,\n max: R.value,\n // The given size (useful to know the user intention).\n givenSize: x.size === void 0 ? null : _.value,\n size: _.value\n // The computed current size at any time.\n });\n }), Y(() => w(f)), (u, C) => (I(), W(\"div\", {\n ref_key: \"paneEl\",\n ref: d,\n class: \"splitpanes__pane\",\n onClick: C[0] || (C[0] = (B) => j(z)(B, j(f))),\n style: de(N.value)\n }, [\n J(u.$slots, \"default\")\n ], 4));\n }\n});\nexport {\n xe as Pane,\n he as Splitpanes\n};\n","import type { MaybeRefOrGetter } from 'vue'\nimport { computed, onScopeDispose, shallowRef, toValue, watchEffect } from 'vue'\nimport { useEventListener, useSupported } from '@vueuse/core'\n\n// copied from match-container and adapted to shadow DOM\n// import 'match-container'\n\nconst polyfill_key = 'bae45330cd3d4e0e96b60d26b57009b5'\nlet count = 0\n// To guard against the case that this polyfill might be included more than once\n// we must ensure that the ID generating function is a singleton\n// to guarantee that no duplicated IDs are generated - however slim the chance might be.\n// The IDs are unique in the current javascript runtime context.\n// The IDs are constructed from the following parts:\n// - a timestamp\n// - the current value of a counter, incremented after each created ID\n// - a static prefix\n// Even if two IDs are generated within the same milisecond the increased counter ensures\n// that they cannot clash.\n\nconst createID = () => `${polyfill_key}-${Date.now()}-${count++}`\n\nclass ContainerQueryListEvent extends Event {\n constructor(\n type: string,\n public container: string,\n public matches: boolean,\n ) {\n super(type)\n }\n}\n\nclass ContainerQueryList extends EventTarget {\n #observedElement: HTMLElement\n #abortController = new AbortController()\n container: string\n matches: boolean\n\n constructor(element: HTMLElement, containerQueryString: string) {\n super()\n this.container = containerQueryString\n const unique_name = `container-query-observer-${createID()}`\n const markerAttribute = `data-${unique_name}`\n element.setAttribute(markerAttribute, '')\n const sentinelProperty = `--${unique_name}`\n const propertyCss = `\n @property ${sentinelProperty} {\n syntax: '<custom-ident>';\n inherits: false;\n initial-value: --false;\n }\n`.trim()\n const containerCss = `\n @container ${containerQueryString} {\n [${markerAttribute}] {\n ${sentinelProperty}: --true;\n }\n }\n`.trim()\n\n const rootNode = element.getRootNode()\n if (!(rootNode instanceof ShadowRoot) && !(rootNode instanceof Document)) {\n console.error(`root node of element isn\\'t a ShadowRoot or Document`, rootNode)\n throw new TypeError('Root node must be a ShadowRoot or Document')\n }\n\n const propertyCssSheet = new CSSStyleSheet()\n propertyCssSheet.replaceSync(propertyCss)\n const doc = document\n doc.adoptedStyleSheets.push(propertyCssSheet)\n\n // FIXME: adoptedStyleSheets cannot be shared\n // the behavior breaks when using the PiP\n if (rootNode.ownerDocument === document) {\n const containerQuerySheet = new CSSStyleSheet()\n containerQuerySheet.replaceSync(containerCss)\n rootNode.adoptedStyleSheets.push(containerQuerySheet)\n }\n\n const style = getComputedStyle(element)\n this.matches = style.getPropertyValue(sentinelProperty) === '--true'\n\n this.#observedElement = element\n this.#startObserving(sentinelProperty, containerQueryString, element)\n }\n\n #startObserving(\n sentinelProperty: string,\n containerQueryString: string,\n observedElement: HTMLElement,\n ) {\n const _previousValues: Record<string, string | undefined> = {}\n\n observedElement.style.setProperty('transition', `${sentinelProperty} 0.001ms step-start`)\n observedElement.style.setProperty('transition-behavior', 'allow-discrete')\n observedElement.addEventListener(\n 'transitionrun',\n (transitionEvent) => {\n if (observedElement === transitionEvent.target) {\n const computedStyle = getComputedStyle(observedElement)\n const changes: Record<string, string | undefined> = {}\n const currentValue = computedStyle.getPropertyValue(sentinelProperty)\n const previousValue = _previousValues[sentinelProperty]\n const hasChanged = currentValue !== previousValue\n\n if (hasChanged) {\n changes[sentinelProperty] = currentValue\n _previousValues[sentinelProperty] = currentValue\n if (sentinelProperty in changes) {\n const matches = changes[sentinelProperty] === '--true'\n this.matches = matches\n // raise 'change' event\n const event = new ContainerQueryListEvent('change', containerQueryString, matches)\n this.dispatchEvent(event)\n }\n }\n }\n },\n { signal: this.#abortController.signal },\n )\n\n // init _previousValues\n const computedStyle = getComputedStyle(observedElement)\n const currentValue = computedStyle.getPropertyValue(sentinelProperty)\n _previousValues[sentinelProperty] = currentValue\n }\n\n dispose() {\n this.#observedElement.style.removeProperty('transition')\n this.#observedElement.style.removeProperty('transition-behavior')\n // stop the event listener\n this.#abortController.abort()\n }\n}\n\nif (typeof window !== 'undefined') {\n if (!HTMLElement.prototype.matchContainer) {\n HTMLElement.prototype.matchContainer = function matchContainer(\n this: HTMLElement,\n containerQueryString: string,\n ) {\n return new ContainerQueryList(this, containerQueryString)\n }\n }\n}\n\n// For some reason, the types are not being picked up from the package\ndeclare global {\n interface HTMLElement {\n matchContainer: (containerQueryString: string) => ContainerQueryList\n }\n}\n\n/**\n * Reactive Container Media Query.\n *\n * @param query - The container query string to match against.\n * @param target - The target element to match the query against.\n */\nexport function useContainerMediaQuery(\n query: MaybeRefOrGetter<string>,\n target: MaybeRefOrGetter<HTMLElement | null | undefined>,\n) {\n const isSupported = useSupported(\n () => typeof document !== 'undefined' && typeof document.body.matchContainer === 'function',\n )\n const mediaQuery = shallowRef<ContainerQueryList>()\n const matches = shallowRef(false)\n\n watchEffect(() => {\n if (!isSupported.value) return\n\n mediaQuery.value?.dispose()\n\n mediaQuery.value = toValue(target)?.matchContainer(toValue(query))\n matches.value = !!mediaQuery.value?.matches\n })\n\n onScopeDispose(() => {\n mediaQuery.value?.dispose()\n })\n\n useEventListener(\n mediaQuery,\n 'change',\n (event: ContainerQueryListEvent) => {\n matches.value = event.matches\n },\n { passive: true },\n )\n\n return computed(() => matches.value)\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, useTemplateRef } from 'vue'\nimport type { ComponentPublicInstance } from 'vue'\nimport { Pane, Splitpanes } from '@posva/splitpanes'\nimport { useQueryEntries } from '../composables/duplex-channel'\nimport { getQueryStatus, STATUS_COLOR_CLASSES } from '../utils/query-state'\nimport type { UseQueryEntryPayloadStatus } from '../utils/query-state'\nimport type { UseQueryEntryPayload } from '@pinia/colada-devtools/shared'\nimport { useContainerMediaQuery } from '../composables/use-container-media-query'\nimport { useLocalStorage } from '@vueuse/core'\n\nconst searchQuery = ref('')\n\nconst queries = useQueryEntries()\n\nconst filteredItems = computed(() => {\n let items = queries.value\n\n if (searchQuery.value) {\n const query = searchQuery.value.toLowerCase()\n items = items.filter((item) => {\n const searchable = item.key\n return searchable.some((v) => String(v).toLowerCase().includes(query))\n })\n }\n\n // sort by last updatedAt\n return items.sort((a, b) => {\n return b.devtools.updatedAt - a.devtools.updatedAt\n })\n})\n\nconst queriesGrouped = computed<\n Record<\n Exclude<UseQueryEntryPayloadStatus, 'unknown' | 'stale'> | 'inactive',\n UseQueryEntryPayload[]\n >\n>(() => {\n return {\n loading: [],\n fresh: [],\n error: [],\n pending: [],\n inactive: filteredItems.value.filter((item) => !item.active),\n ...Object.groupBy(filteredItems.value, (item) => getQueryStatus(item)),\n }\n})\n\nconst container = useTemplateRef('split-panes-container')\nconst isNarrow = useContainerMediaQuery('(width < 768px)', () => container.value?.$el)\n\nconst queryListPanelSize = useLocalStorage<number[]>('pc-devtools-query-list-panel-size', [30, 70])\n\nfunction updatePanesSize({ panes }: { panes: { size: number }[] }) {\n queryListPanelSize.value = panes.map((pane) => pane.size)\n}\n</script>\n\n<template>\n <section class=\"grid grid-rows-[auto_1fr] overflow-hidden @container\">\n <!-- Search & Actions Bar -->\n <div class=\"flex items-center p-2 border-b border-(--ui-border) gap-2\">\n <div class=\"relative flex-grow\">\n <i-lucide-search\n class=\"absolute left-2 top-1/2 -translate-y-1/2 text-ui-text-muted size-4\"\n />\n <UInput v-model=\"searchQuery\" type=\"search\" class=\"w-full\" placeholder=\"Search Queries\" />\n </div>\n\n <!-- TODO: sort source, asc/desc -->\n\n <div class=\"flex gap-x-1\">\n <div\n v-for=\"(queryGroup, status) in queriesGrouped\"\n :key=\"status\"\n class=\"theme-neutral bg-(--ui-bg-muted) rounded p-1 text-xs font-semibold flex items-center gap-x-1\"\n :class=\"(queryGroup?.length ?? 0) === 0 ? 'text-(--ui-text-muted)' : ''\"\n :title=\"`${queryGroup?.length ?? 0} ${status} queries (after filtering)`\"\n >\n <div class=\"rounded-full size-2\" :class=\"STATUS_COLOR_CLASSES[status].base\" />\n <span class=\"@max-[750px]:hidden\">{{ status }}</span>\n <div\n class=\"px-1.5 py-0.5 rounded min-w-[1.65em] flex justify-center\"\n :class=\"\n (queryGroup?.length ?? 0) === 0\n ? 'bg-(--ui-bg-accented)'\n : [STATUS_COLOR_CLASSES[status].base, STATUS_COLOR_CLASSES[status].text]\n \"\n >\n <span>{{ queryGroup?.length ?? 0 }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <Splitpanes\n ref=\"split-panes-container\"\n class=\"overflow-hidden\"\n :horizontal=\"isNarrow\"\n @resized=\"updatePanesSize\"\n >\n <!-- List Panel -->\n <Pane min-size=\"15\" :size=\"queryListPanelSize[0]\" class=\"flex flex-col\">\n <ol role=\"list\" class=\"divide-y divide-(--ui-border)\">\n <li v-for=\"entry of filteredItems\" :key=\"entry.keyHash\">\n <ListQueryEntry :entry />\n </li>\n </ol>\n </Pane>\n\n <!-- Details Panel -->\n <Pane min-size=\"30\" :size=\"queryListPanelSize[1]\" class=\"flex flex-col\">\n <RouterView />\n </Pane>\n </Splitpanes>\n </section>\n</template>\n"],"names":["valuePercentage","computed","__props","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","getQueryStatus","entry","STATUS_COLOR_CLASSES","now","shallowRef","intervalId","useCount","usePerformanceNow","onScopeDispose","router","useRouter","unselect","event","formattedKey","rawValue","value","miniJsonParse","status","_createBlock","_component_RouterLink","_withCtx","isActive","navigate","href","_unref","_component_i_lucide_loader","_component_i_lucide_check_check","_component_i_lucide_x_octagon","_component_i_lucide_check","_component_i_lucide_pause","$event","_hoisted_4","_Fragment","_renderList","key","i","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_createVNode","_component_i_lucide_circle_slash","_hoisted_9","_component_UCircleProgress","modelValue","_useModel","he","G","L","x","y","c","fe","l","k","w","h","n","z","f","S","d","_","P","R","M","u","N","t","a","o","s","Z","Q","m","C","B","K","V","U","b","r","p","F","ve","H","ee","ne","ie","te","e","$","ae","O","se","le","T","q","oe","ue","ce","re","D","A","X","Y","g","I","W","pe","J","xe","E","me","v","j","de","polyfill_key","count","createID","ContainerQueryListEvent","type","container","matches","ContainerQueryList","element","containerQueryString","__privateAdd","_ContainerQueryList_instances","_observedElement","_abortController","__publicField","unique_name","markerAttribute","sentinelProperty","propertyCss","containerCss","rootNode","propertyCssSheet","containerQuerySheet","style","__privateSet","__privateMethod","startObserving_fn","__privateGet","observedElement","_previousValues","transitionEvent","computedStyle","changes","currentValue","previousValue","useContainerMediaQuery","query","target","isSupported","useSupported","mediaQuery","watchEffect","_a","_b","toValue","_c","useEventListener","searchQuery","ref","queries","useQueryEntries","filteredItems","items","item","queriesGrouped","useTemplateRef","isNarrow","queryListPanelSize","useLocalStorage","updatePanesSize","panes","pane","_hoisted_2","_hoisted_3","_component_i_lucide_search","_component_UInput","queryGroup","_normalizeClass","Splitpanes","Pane","_component_ListQueryEntry","_component_RouterView"],"mappings":"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","x_google_ignoreList":[5]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as e, c as t, o as c } from "./index-
|
|
1
|
+
import { _ as e, c as t, o as c } from "./index-dcKxSjOS.js";
|
|
2
2
|
const n = {};
|
|
3
3
|
function s(o, r) {
|
|
4
4
|
return c(), t("h1", null, "Settings");
|
|
@@ -7,4 +7,4 @@ const a = /* @__PURE__ */ e(n, [["render", s]]);
|
|
|
7
7
|
export {
|
|
8
8
|
a as default
|
|
9
9
|
};
|
|
10
|
-
//# sourceMappingURL=settings-
|
|
10
|
+
//# sourceMappingURL=settings-s4xqlsIF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-
|
|
1
|
+
{"version":3,"file":"settings-s4xqlsIF.js","sources":["../src/panel/pages/settings.vue"],"sourcesContent":["<script setup lang=\"ts\"></script>\n\n<template>\n <h1>Settings</h1>\n</template>\n"],"names":["_openBlock","_createElementBlock"],"mappings":";;;AAGE,SAAAA,EAAA,GAAAC,EAAiB,YAAb,UAAQ;;;"}
|
package/dist-shared/index.d.ts
CHANGED
|
@@ -88,7 +88,7 @@ export declare interface UseQueryEntryHistoryEntry extends Pick<UseQueryEntry, '
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
export declare interface UseQueryEntryPayload {
|
|
91
|
-
|
|
91
|
+
keyHash: string;
|
|
92
92
|
key: UseQueryEntry['key'];
|
|
93
93
|
state: UseQueryEntry['state']['value'];
|
|
94
94
|
asyncStatus: UseQueryEntry['asyncStatus']['value'];
|
package/dist-shared/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/shared/query-serialized.ts","../src/shared/rpc/index.ts","../src/shared/plugins/devtools-info.ts"],"sourcesContent":["import type { RefetchOnControl, UseQueryEntry, UseQueryOptionsWithDefaults } from '@pinia/colada'\nimport type { DEVTOOLS_INFO_KEY } from './plugins/devtools-info'\n\nexport interface UseQueryEntryPayload {\n id: string\n\n key: UseQueryEntry['key']\n state: UseQueryEntry['state']['value']\n asyncStatus: UseQueryEntry['asyncStatus']['value']\n\n active: UseQueryEntry['active']\n stale: UseQueryEntry['stale']\n when: UseQueryEntry['when']\n options: UseQueryEntryPayloadOptions | null\n deps: UseQueryEntryPayloadDep[]\n gcTimeout: number | null\n\n devtools: UseQueryEntry[typeof DEVTOOLS_INFO_KEY]\n}\n\nexport interface UseQueryEntryPayloadDepComponent {\n type: 'component'\n uid: number\n name: string | undefined\n}\n\nexport interface UseQueryEntryPayloadDepEffect {\n type: 'effect'\n active: boolean\n detached: boolean\n}\n\nexport type UseQueryEntryPayloadDep =\n | UseQueryEntryPayloadDepComponent\n | UseQueryEntryPayloadDepEffect\n\nexport interface UseQueryEntryPayloadOptions\n extends Pick<UseQueryOptionsWithDefaults, 'gcTime' | 'staleTime'> {\n // manually overriden to extract only plain values\n enabled: boolean\n refetchOnMount: RefetchOnControl\n refetchOnReconnect: RefetchOnControl\n refetchOnWindowFocus: RefetchOnControl\n}\n\nexport function miniJsonParse(value: unknown): string {\n const isValidIdentifier = (key: string): boolean => /^[A-Z_$][\\w$]*$/i.test(key)\n\n const serialize = (val: unknown): string => {\n if (val === null) return 'null'\n if (typeof val === 'number') return val.toString()\n if (typeof val === 'string') return JSON.stringify(val)\n if (typeof val === 'boolean') return val ? 'true' : 'false'\n\n if (Array.isArray(val)) {\n return `[${val.map(serialize).join(',')}]`\n }\n\n if (typeof val === 'object') {\n const obj = val as Record<string, unknown>\n const entries = Object.keys(obj).map((key) => {\n const k = isValidIdentifier(key) ? key : JSON.stringify(key)\n const v = serialize(obj[key])\n return `${k}:${v}`\n })\n return `{${entries.join(',')}}`\n }\n\n return 'undefined' // or throw if you prefer to exclude unsupported values\n }\n\n return serialize(value)\n}\n","import type { DataState, EntryKey, UseQueryEntryFilter } from '@pinia/colada'\nimport type { UseQueryEntryPayload } from '../query-serialized'\nimport { toRaw } from 'vue'\n\nexport class DuplexChannel<\n const Emits extends Record<EmitsKeys, any[]>,\n const Listens extends Record<ListensKeys, [...any[]]>,\n // TODO: this seems to be enough. Test it\n // const Emits extends Record<keyof Emits, [...any[]]>,\n // const Listens extends Record<keyof Listens, [...any[]]>,\n // NOTE: we need these two to avoid requiring the interface to have an index signature for string\n EmitsKeys extends keyof Emits = keyof Emits,\n ListensKeys extends keyof Listens = keyof Listens,\n> {\n protected listenersByEvent = new Map<keyof Listens, Set<(...args: any[]) => void>>()\n protected eventsController: null | AbortController = null\n\n constructor(protected port: MessagePort) {\n this.setPort(port)\n }\n\n setPort(port: MessagePort) {\n // remove the previous event listeners\n this.eventsController?.abort()\n const { signal } = (this.eventsController = new AbortController())\n this.port = port\n port.addEventListener('message', this.onMessage.bind(this), { signal })\n port.addEventListener('messageerror', this.onMessageError.bind(this), { signal })\n // needed when we call `addEventListener` instead of using `onmessage`\n port.start()\n }\n\n private onMessage(event: MessageEvent) {\n if (!event.data || typeof event.data !== 'object' || typeof event.data.id !== 'string') {\n console.error(`${this.constructor.name}: invalid message`, event.data)\n return\n }\n const listeners = this.listenersByEvent.get(event.data.id)\n if (!listeners) return\n\n for (const listener of listeners.values()) {\n listener(...(event.data.data as Listens[keyof Listens]))\n }\n }\n\n private onMessageError(event: MessageEvent) {\n console.error(`${this.constructor.name}: message error`, event)\n }\n\n stop() {\n this.listenersByEvent.clear()\n this.eventsController?.abort()\n }\n\n emit<K extends keyof Emits>(event: K, ...args: NoInfer<Emits[K]>): void {\n const clonedData = args.map((arg) => toRawDeep(arg))\n this.port.postMessage({ id: event, data: clonedData })\n }\n\n on<K extends keyof Listens>(event: K, callback: (...args: Listens[K]) => void): () => void {\n let listeners = this.listenersByEvent.get(event)\n if (!listeners) {\n this.listenersByEvent.set(event, (listeners = new Set()))\n }\n listeners.add(callback)\n\n return () => {\n this.listenersByEvent.get(event)?.delete(callback)\n }\n }\n\n off<K extends keyof Listens>(event: K): void {\n this.listenersByEvent.delete(event)\n }\n}\n\nexport interface AppEmits {\n 'queries:all': [entries: UseQueryEntryPayload[]]\n 'queries:update': [entry: UseQueryEntryPayload]\n 'queries:delete': [entry: UseQueryEntryPayload]\n 'mutations:all': [entries: unknown[]]\n\n // for testing\n 'ping': []\n 'pong': []\n}\n\nexport interface DevtoolsEmits {\n 'queries:clear': [] | [filters: UseQueryEntryFilter]\n 'queries:refetch': [entryKey: EntryKey]\n 'queries:invalidate': [entryKey: EntryKey]\n 'queries:reset': [entryKey: EntryKey]\n\n 'queries:simulate:error': [entryKey: EntryKey]\n 'queries:simulate:error:stop': [entryKey: EntryKey]\n 'queries:simulate:loading': [entryKey: EntryKey]\n 'queries:simulate:loading:stop': [entryKey: EntryKey]\n\n 'queries:set:state': [entryKey: EntryKey, state: DataState<unknown, unknown, unknown>]\n\n // for testing\n 'ping': []\n 'pong': []\n}\n\nexport function _testTypes() {\n // the app\n const client = new DuplexChannel<AppEmits, DevtoolsEmits>({} as any)\n // the devtools\n const server = new DuplexChannel<DevtoolsEmits, AppEmits>({} as any)\n\n client.emit('queries:all', [])\n // client.emit('queries:all', [{ id: '', active: false, asyncStatus: 'idle', }])\n client.on('queries:clear', () => {})\n client.on('queries:clear', (filters = {}) => {\n console.log(filters.key)\n // ...\n })\n\n server.emit('queries:clear')\n server.emit('queries:clear', { key: [''] })\n}\n\nfunction toRawDeep<T>(val: T): T\nfunction toRawDeep(val: unknown): unknown {\n if (Array.isArray(val)) {\n return val.map((item) => toRawDeep(item))\n }\n // TODO: custom classes?\n if (val && typeof val === 'object' && !isError(val)) {\n return Object.fromEntries(Object.entries(val).map(([key, value]) => [key, toRawDeep(value)]))\n }\n return toRaw(val)\n}\n\nfunction isError(err: unknown): err is Error {\n return 'isError' in Error && typeof Error.isError === 'function'\n ? Error.isError(err)\n : err instanceof Error\n}\n","/**\n * Pinia Colada plugin that counts how many times a query has been fetched, has resolved, rejected, etc.\n *\n */\nimport type { DataState, UseQueryEntry } from '@pinia/colada'\n\nexport const DEVTOOLS_INFO_KEY = Symbol('fetch-count-pinia-colada-plugin')\n\nexport interface UseQueryEntryHistoryEntry extends Pick<UseQueryEntry, 'key'> {\n id: number\n\n state: DataState<unknown, unknown, unknown>\n\n /**\n * When was the last time the entry was updated.\n */\n updatedAt: number\n\n /**\n * When was the entry created.\n */\n createdAt: number\n\n /**\n * The time it took to fetch the entry.\n */\n fetchTime: {\n start: number\n end: number | null\n } | null\n}\n\nexport interface UseQueryDevtoolsInfo {\n count: {\n succeed: number\n errored: number\n cancelled: number\n total: number\n }\n\n updatedAt: number\n\n /**\n * When was this entry last inactive. 0 if it has never been inactive.\n */\n inactiveAt: number\n\n simulate: 'error' | 'loading' | null\n\n /**\n * Only the last 10 entries are kept.\n */\n history: UseQueryEntryHistoryEntry[]\n}\n\ndeclare module '@pinia/colada' {\n // eslint-disable-next-line unused-imports/no-unused-vars\n interface UseQueryEntry<TData, TError, TDataInitial> {\n /**\n * Returns whether the query is currently delaying its `asyncStatus` from becoming `'loading'`. Requires the {@link PiniaColadaDelay} plugin.\n */\n [DEVTOOLS_INFO_KEY]: UseQueryDevtoolsInfo\n }\n}\n"],"names":["miniJsonParse","value","isValidIdentifier","key","serialize","val","obj","k","v","DuplexChannel","port","__publicField","_a","signal","event","listeners","listener","args","clonedData","arg","toRawDeep","callback","_testTypes","client","server","filters","item","isError","toRaw","err","DEVTOOLS_INFO_KEY"],"mappings":";;;;AA6CO,SAASA,EAAcC,GAAwB;AACpD,QAAMC,IAAoB,CAACC,MAAyB,mBAAmB,KAAKA,CAAG,GAEzEC,IAAY,CAACC,MAAyB;AACtC,QAAAA,MAAQ,KAAa,QAAA;AACzB,QAAI,OAAOA,KAAQ,SAAU,QAAOA,EAAI,SAAS;AACjD,QAAI,OAAOA,KAAQ,SAAiB,QAAA,KAAK,UAAUA,CAAG;AACtD,QAAI,OAAOA,KAAQ,UAAW,QAAOA,IAAM,SAAS;AAEhD,QAAA,MAAM,QAAQA,CAAG;AACnB,aAAO,IAAIA,EAAI,IAAID,CAAS,EAAE,KAAK,GAAG,CAAC;AAGrC,QAAA,OAAOC,KAAQ,UAAU;AAC3B,YAAMC,IAAMD;AAMZ,aAAO,IALS,OAAO,KAAKC,CAAG,EAAE,IAAI,CAACH,MAAQ;AAC5C,cAAMI,IAAIL,EAAkBC,CAAG,IAAIA,IAAM,KAAK,UAAUA,CAAG,GACrDK,IAAIJ,EAAUE,EAAIH,CAAG,CAAC;AACrB,eAAA,GAAGI,CAAC,IAAIC,CAAC;AAAA,MAAA,CACjB,EACkB,KAAK,GAAG,CAAC;AAAA,IAAA;AAGvB,WAAA;AAAA,EACT;AAEA,SAAOJ,EAAUH,CAAK;AACxB;ACpEO,MAAMQ,EASX;AAAA,EAIA,YAAsBC,GAAmB;AAH/B,IAAAC,EAAA,8CAAuB,IAAkD;AACzE,IAAAA,EAAA,0BAA2C;AAE/B,SAAA,OAAAD,GACpB,KAAK,QAAQA,CAAI;AAAA,EAAA;AAAA,EAGnB,QAAQA,GAAmB;;AAEzB,KAAAE,IAAA,KAAK,qBAAL,QAAAA,EAAuB;AACvB,UAAM,EAAE,QAAAC,EAAO,IAAK,KAAK,mBAAmB,IAAI,gBAAgB;AAChE,SAAK,OAAOH,GACPA,EAAA,iBAAiB,WAAW,KAAK,UAAU,KAAK,IAAI,GAAG,EAAE,QAAAG,GAAQ,GACjEH,EAAA,iBAAiB,gBAAgB,KAAK,eAAe,KAAK,IAAI,GAAG,EAAE,QAAAG,GAAQ,GAEhFH,EAAK,MAAM;AAAA,EAAA;AAAA,EAGL,UAAUI,GAAqB;AACjC,QAAA,CAACA,EAAM,QAAQ,OAAOA,EAAM,QAAS,YAAY,OAAOA,EAAM,KAAK,MAAO,UAAU;AACtF,cAAQ,MAAM,GAAG,KAAK,YAAY,IAAI,qBAAqBA,EAAM,IAAI;AACrE;AAAA,IAAA;AAEF,UAAMC,IAAY,KAAK,iBAAiB,IAAID,EAAM,KAAK,EAAE;AACzD,QAAKC;AAEM,iBAAAC,KAAYD,EAAU;AACtB,QAAAC,EAAA,GAAIF,EAAM,KAAK,IAA+B;AAAA,EACzD;AAAA,EAGM,eAAeA,GAAqB;AAC1C,YAAQ,MAAM,GAAG,KAAK,YAAY,IAAI,mBAAmBA,CAAK;AAAA,EAAA;AAAA,EAGhE,OAAO;;AACL,SAAK,iBAAiB,MAAM,IAC5BF,IAAA,KAAK,qBAAL,QAAAA,EAAuB;AAAA,EAAM;AAAA,EAG/B,KAA4BE,MAAaG,GAA+B;AACtE,UAAMC,IAAaD,EAAK,IAAI,CAACE,MAAQC,EAAUD,CAAG,CAAC;AACnD,SAAK,KAAK,YAAY,EAAE,IAAIL,GAAO,MAAMI,GAAY;AAAA,EAAA;AAAA,EAGvD,GAA4BJ,GAAUO,GAAqD;AACzF,QAAIN,IAAY,KAAK,iBAAiB,IAAID,CAAK;AAC/C,WAAKC,KACH,KAAK,iBAAiB,IAAID,GAAQC,IAAY,oBAAI,KAAM,GAE1DA,EAAU,IAAIM,CAAQ,GAEf,MAAM;;AACX,OAAAT,IAAA,KAAK,iBAAiB,IAAIE,CAAK,MAA/B,QAAAF,EAAkC,OAAOS;AAAA,IAC3C;AAAA,EAAA;AAAA,EAGF,IAA6BP,GAAgB;AACtC,SAAA,iBAAiB,OAAOA,CAAK;AAAA,EAAA;AAEtC;AA+BO,SAASQ,IAAa;AAE3B,QAAMC,IAAS,IAAId,EAAuC,EAAS,GAE7De,IAAS,IAAIf,EAAuC,EAAS;AAE5D,EAAAc,EAAA,KAAK,eAAe,EAAE,GAEtBA,EAAA,GAAG,iBAAiB,MAAM;AAAA,EAAA,CAAE,GACnCA,EAAO,GAAG,iBAAiB,CAACE,IAAU,CAAA,MAAO;AACnC,YAAA,IAAIA,EAAQ,GAAG;AAAA,EAAA,CAExB,GAEDD,EAAO,KAAK,eAAe,GAC3BA,EAAO,KAAK,iBAAiB,EAAE,KAAK,CAAC,EAAE,GAAG;AAC5C;AAGA,SAASJ,EAAUf,GAAuB;AACpC,SAAA,MAAM,QAAQA,CAAG,IACZA,EAAI,IAAI,CAACqB,MAASN,EAAUM,CAAI,CAAC,IAGtCrB,KAAO,OAAOA,KAAQ,YAAY,CAACsB,EAAQtB,CAAG,IACzC,OAAO,YAAY,OAAO,QAAQA,CAAG,EAAE,IAAI,CAAC,CAACF,GAAKF,CAAK,MAAM,CAACE,GAAKiB,EAAUnB,CAAK,CAAC,CAAC,CAAC,IAEvF2B,EAAMvB,CAAG;AAClB;AAEA,SAASsB,EAAQE,GAA4B;AACpC,SAAA,aAAa,SAAS,OAAO,MAAM,WAAY,aAClD,MAAM,QAAQA,CAAG,IACjBA,aAAe;AACrB;ACrIa,MAAAC,IAAoB,OAAO,iCAAiC;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/shared/query-serialized.ts","../src/shared/rpc/index.ts","../src/shared/plugins/devtools-info.ts"],"sourcesContent":["import type { RefetchOnControl, UseQueryEntry, UseQueryOptionsWithDefaults } from '@pinia/colada'\nimport type { DEVTOOLS_INFO_KEY } from './plugins/devtools-info'\n\nexport interface UseQueryEntryPayload {\n keyHash: string\n\n key: UseQueryEntry['key']\n state: UseQueryEntry['state']['value']\n asyncStatus: UseQueryEntry['asyncStatus']['value']\n\n active: UseQueryEntry['active']\n stale: UseQueryEntry['stale']\n when: UseQueryEntry['when']\n options: UseQueryEntryPayloadOptions | null\n deps: UseQueryEntryPayloadDep[]\n gcTimeout: number | null\n\n devtools: UseQueryEntry[typeof DEVTOOLS_INFO_KEY]\n}\n\nexport interface UseQueryEntryPayloadDepComponent {\n type: 'component'\n uid: number\n name: string | undefined\n}\n\nexport interface UseQueryEntryPayloadDepEffect {\n type: 'effect'\n active: boolean\n detached: boolean\n}\n\nexport type UseQueryEntryPayloadDep =\n | UseQueryEntryPayloadDepComponent\n | UseQueryEntryPayloadDepEffect\n\nexport interface UseQueryEntryPayloadOptions\n extends Pick<UseQueryOptionsWithDefaults, 'gcTime' | 'staleTime'> {\n // manually overriden to extract only plain values\n enabled: boolean\n refetchOnMount: RefetchOnControl\n refetchOnReconnect: RefetchOnControl\n refetchOnWindowFocus: RefetchOnControl\n}\n\nexport function miniJsonParse(value: unknown): string {\n const isValidIdentifier = (key: string): boolean => /^[A-Z_$][\\w$]*$/i.test(key)\n\n const serialize = (val: unknown): string => {\n if (val === null) return 'null'\n if (typeof val === 'number') return val.toString()\n if (typeof val === 'string') return JSON.stringify(val)\n if (typeof val === 'boolean') return val ? 'true' : 'false'\n\n if (Array.isArray(val)) {\n return `[${val.map(serialize).join(',')}]`\n }\n\n if (typeof val === 'object') {\n const obj = val as Record<string, unknown>\n const entries = Object.keys(obj).map((key) => {\n const k = isValidIdentifier(key) ? key : JSON.stringify(key)\n const v = serialize(obj[key])\n return `${k}:${v}`\n })\n return `{${entries.join(',')}}`\n }\n\n return 'undefined' // or throw if you prefer to exclude unsupported values\n }\n\n return serialize(value)\n}\n","import type { DataState, EntryKey, UseQueryEntryFilter } from '@pinia/colada'\nimport type { UseQueryEntryPayload } from '../query-serialized'\nimport { toRaw } from 'vue'\n\nexport class DuplexChannel<\n const Emits extends Record<EmitsKeys, any[]>,\n const Listens extends Record<ListensKeys, [...any[]]>,\n // TODO: this seems to be enough. Test it\n // const Emits extends Record<keyof Emits, [...any[]]>,\n // const Listens extends Record<keyof Listens, [...any[]]>,\n // NOTE: we need these two to avoid requiring the interface to have an index signature for string\n EmitsKeys extends keyof Emits = keyof Emits,\n ListensKeys extends keyof Listens = keyof Listens,\n> {\n protected listenersByEvent = new Map<keyof Listens, Set<(...args: any[]) => void>>()\n protected eventsController: null | AbortController = null\n\n constructor(protected port: MessagePort) {\n this.setPort(port)\n }\n\n setPort(port: MessagePort) {\n // remove the previous event listeners\n this.eventsController?.abort()\n const { signal } = (this.eventsController = new AbortController())\n this.port = port\n port.addEventListener('message', this.onMessage.bind(this), { signal })\n port.addEventListener('messageerror', this.onMessageError.bind(this), { signal })\n // needed when we call `addEventListener` instead of using `onmessage`\n port.start()\n }\n\n private onMessage(event: MessageEvent) {\n if (!event.data || typeof event.data !== 'object' || typeof event.data.id !== 'string') {\n console.error(`${this.constructor.name}: invalid message`, event.data)\n return\n }\n const listeners = this.listenersByEvent.get(event.data.id)\n if (!listeners) return\n\n for (const listener of listeners.values()) {\n listener(...(event.data.data as Listens[keyof Listens]))\n }\n }\n\n private onMessageError(event: MessageEvent) {\n console.error(`${this.constructor.name}: message error`, event)\n }\n\n stop() {\n this.listenersByEvent.clear()\n this.eventsController?.abort()\n }\n\n emit<K extends keyof Emits>(event: K, ...args: NoInfer<Emits[K]>): void {\n const clonedData = args.map((arg) => toRawDeep(arg))\n this.port.postMessage({ id: event, data: clonedData })\n }\n\n on<K extends keyof Listens>(event: K, callback: (...args: Listens[K]) => void): () => void {\n let listeners = this.listenersByEvent.get(event)\n if (!listeners) {\n this.listenersByEvent.set(event, (listeners = new Set()))\n }\n listeners.add(callback)\n\n return () => {\n this.listenersByEvent.get(event)?.delete(callback)\n }\n }\n\n off<K extends keyof Listens>(event: K): void {\n this.listenersByEvent.delete(event)\n }\n}\n\nexport interface AppEmits {\n 'queries:all': [entries: UseQueryEntryPayload[]]\n 'queries:update': [entry: UseQueryEntryPayload]\n 'queries:delete': [entry: UseQueryEntryPayload]\n 'mutations:all': [entries: unknown[]]\n\n // for testing\n 'ping': []\n 'pong': []\n}\n\nexport interface DevtoolsEmits {\n 'queries:clear': [] | [filters: UseQueryEntryFilter]\n 'queries:refetch': [entryKey: EntryKey]\n 'queries:invalidate': [entryKey: EntryKey]\n 'queries:reset': [entryKey: EntryKey]\n\n 'queries:simulate:error': [entryKey: EntryKey]\n 'queries:simulate:error:stop': [entryKey: EntryKey]\n 'queries:simulate:loading': [entryKey: EntryKey]\n 'queries:simulate:loading:stop': [entryKey: EntryKey]\n\n 'queries:set:state': [entryKey: EntryKey, state: DataState<unknown, unknown, unknown>]\n\n // for testing\n 'ping': []\n 'pong': []\n}\n\nexport function _testTypes() {\n // the app\n const client = new DuplexChannel<AppEmits, DevtoolsEmits>({} as any)\n // the devtools\n const server = new DuplexChannel<DevtoolsEmits, AppEmits>({} as any)\n\n client.emit('queries:all', [])\n // client.emit('queries:all', [{ id: '', active: false, asyncStatus: 'idle', }])\n client.on('queries:clear', () => {})\n client.on('queries:clear', (filters = {}) => {\n console.log(filters.key)\n // ...\n })\n\n server.emit('queries:clear')\n server.emit('queries:clear', { key: [''] })\n}\n\nfunction toRawDeep<T>(val: T): T\nfunction toRawDeep(val: unknown): unknown {\n if (Array.isArray(val)) {\n return val.map((item) => toRawDeep(item))\n }\n // TODO: custom classes?\n if (val && typeof val === 'object' && !isError(val)) {\n return Object.fromEntries(Object.entries(val).map(([key, value]) => [key, toRawDeep(value)]))\n }\n return toRaw(val)\n}\n\nfunction isError(err: unknown): err is Error {\n return 'isError' in Error && typeof Error.isError === 'function'\n ? Error.isError(err)\n : err instanceof Error\n}\n","/**\n * Pinia Colada plugin that counts how many times a query has been fetched, has resolved, rejected, etc.\n *\n */\nimport type { DataState, UseQueryEntry } from '@pinia/colada'\n\nexport const DEVTOOLS_INFO_KEY = Symbol('fetch-count-pinia-colada-plugin')\n\nexport interface UseQueryEntryHistoryEntry extends Pick<UseQueryEntry, 'key'> {\n id: number\n\n state: DataState<unknown, unknown, unknown>\n\n /**\n * When was the last time the entry was updated.\n */\n updatedAt: number\n\n /**\n * When was the entry created.\n */\n createdAt: number\n\n /**\n * The time it took to fetch the entry.\n */\n fetchTime: {\n start: number\n end: number | null\n } | null\n}\n\nexport interface UseQueryDevtoolsInfo {\n count: {\n succeed: number\n errored: number\n cancelled: number\n total: number\n }\n\n updatedAt: number\n\n /**\n * When was this entry last inactive. 0 if it has never been inactive.\n */\n inactiveAt: number\n\n simulate: 'error' | 'loading' | null\n\n /**\n * Only the last 10 entries are kept.\n */\n history: UseQueryEntryHistoryEntry[]\n}\n\ndeclare module '@pinia/colada' {\n // eslint-disable-next-line unused-imports/no-unused-vars\n interface UseQueryEntry<TData, TError, TDataInitial> {\n /**\n * Returns whether the query is currently delaying its `asyncStatus` from becoming `'loading'`. Requires the {@link PiniaColadaDelay} plugin.\n */\n [DEVTOOLS_INFO_KEY]: UseQueryDevtoolsInfo\n }\n}\n"],"names":["miniJsonParse","value","isValidIdentifier","key","serialize","val","obj","k","v","DuplexChannel","port","__publicField","_a","signal","event","listeners","listener","args","clonedData","arg","toRawDeep","callback","_testTypes","client","server","filters","item","isError","toRaw","err","DEVTOOLS_INFO_KEY"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinia/colada-devtools",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.6",
|
|
5
5
|
"description": "Devtools for Pinia Colada",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -48,18 +48,18 @@
|
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@iconify-json/lucide": "^1.2.42",
|
|
50
50
|
"@posva/splitpanes": "^4.0.6",
|
|
51
|
-
"@tailwindcss/vite": "^4.1.
|
|
52
|
-
"@vueuse/core": "^13.
|
|
51
|
+
"@tailwindcss/vite": "^4.1.7",
|
|
52
|
+
"@vueuse/core": "^13.3.0",
|
|
53
53
|
"mande": "^2.0.9",
|
|
54
54
|
"match-container": "^0.1.0",
|
|
55
55
|
"pinia": "^3.0.2",
|
|
56
|
-
"tailwindcss": "^4.1.
|
|
56
|
+
"tailwindcss": "^4.1.7",
|
|
57
57
|
"unplugin-icons": "^22.1.0",
|
|
58
|
-
"unplugin-vue-components": "^28.
|
|
58
|
+
"unplugin-vue-components": "^28.7.0",
|
|
59
59
|
"unplugin-vue-router": "^0.12.0",
|
|
60
|
-
"vite-plugin-dts": "^4.5.
|
|
60
|
+
"vite-plugin-dts": "^4.5.4",
|
|
61
61
|
"vue-router": "^4.5.1",
|
|
62
|
-
"@pinia/colada": "0.
|
|
62
|
+
"@pinia/colada": "0.17.0"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|
|
65
65
|
"dev:app": "vite",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_queryId_-SBAeSmfh.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.id === 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 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,OAAON,EAAM,OAAO,OAAO,KAAK,IAC5E,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|