UNPKG

@t1mmen/srtd

Version:

Supabase Repeatable Template Definitions (srtd): 🪄 Live-reloading SQL templates for Supabase DX. Make your database changes reviewable and migrations maintainable! 🚀

160 lines • 6.32 kB
import { Box, Text, useInput } from 'ink'; import React from 'react'; import { getConnectionStats } from '../utils/databaseConnection.js'; import { store } from '../utils/store.js'; function getResourceInfo() { // @ts-expect-error const handles = process._getActiveHandles?.() || []; // @ts-expect-error const requests = process._getActiveRequests?.() || []; const handlesByType = handles .map((h) => h?.constructor?.name) .filter(Boolean) .reduce((acc, name) => { acc[name] = (acc[name] || 0) + 1; return acc; }, {}); return { // File System watchers: handlesByType.FSWatcher || 0, events: handlesByType.FSEventWrap || 0, // Timing timers: handlesByType.Timeout || 0, intervals: handlesByType.Interval || 0, immediates: handlesByType.Immediate || 0, // IO & Network sockets: handlesByType.Socket || 0, servers: handlesByType.Server || 0, tcpWraps: handlesByType.TCP || 0, pipes: handlesByType.Pipe || 0, ttys: handlesByType.TTY || 0, // Process checks: handlesByType.Check || 0, signals: handlesByType.Signal || 0, // Other asyncHooks: handlesByType.AsyncHook || 0, requests: requests.length, // Count handles not explicitly tracked misc: Object.entries(handlesByType) .filter(([k]) => ![ 'FSWatcher', 'FSEventWrap', 'Timeout', 'Interval', 'Immediate', 'Socket', 'Server', 'TCP', 'Pipe', 'TTY', 'Check', 'Signal', 'AsyncHook', ].includes(k)) .reduce((sum, [_, count]) => sum + (count || 0), 0), total: handles.length + requests.length, }; } export default function Debug() { const [enabled, setEnabled] = React.useState(store.get('debugEnabled')); const [stats, setStats] = React.useState({ db: getConnectionStats(), resources: getResourceInfo(), }); useInput(input => { if (input === 'd') { const newState = !enabled; setEnabled(newState); store.set('debugEnabled', newState); } }); React.useEffect(() => { if (!enabled) return; const interval = setInterval(() => { setStats({ db: getConnectionStats(), resources: getResourceInfo(), }); }, 1000); return () => clearInterval(interval); }, [enabled]); if (!enabled) return null; return (React.createElement(Box, { flexDirection: "column", marginY: 1 }, React.createElement(Box, { flexDirection: "row", gap: 1 }, React.createElement(Text, { bold: true }, "Debug:"), React.createElement(Text, { dimColor: true }, "(press 'd' to toggle)")), React.createElement(Box, { paddingLeft: 2, flexDirection: "column" }, React.createElement(Text, { dimColor: true }, "\uD83D\uDCBE DB: ", stats.db ? `${stats.db.active} active, ${stats.db.idle} idle` : 'none'), React.createElement(Text, { dimColor: true }, "\uD83D\uDCCA Resources (", stats.resources.total, " total):"), React.createElement(Box, { paddingLeft: 3, flexDirection: "row", gap: 2 }, React.createElement(Text, { dimColor: true }, "\uD83D\uDC40 ", stats.resources.watchers, " watch"), React.createElement(Text, { dimColor: true }, "\uD83D\uDCE1 ", stats.resources.events, " event"), React.createElement(Text, { dimColor: true }, "\u23F3 ", stats.resources.timers, " timer"), React.createElement(Text, { dimColor: true }, "\uD83D\uDD04 ", stats.resources.intervals, " intv"), React.createElement(Text, { dimColor: true }, "\u26A1\uFE0F ", stats.resources.immediates, " imm")), React.createElement(Box, { paddingLeft: 3, flexDirection: "row", gap: 2 }, React.createElement(Text, { dimColor: true }, "\uD83D\uDD0C ", stats.resources.sockets, " sock"), React.createElement(Text, { dimColor: true }, "\uD83D\uDDA5\uFE0F ", stats.resources.servers, " srv"), React.createElement(Text, { dimColor: true }, "\uD83C\uDF10 ", stats.resources.tcpWraps, " tcp"), React.createElement(Text, { dimColor: true }, "\uD83D\uDCDD ", stats.resources.pipes, " pipe"), React.createElement(Text, { dimColor: true }, "\uD83D\uDCBB ", stats.resources.ttys, " tty")), React.createElement(Box, { paddingLeft: 3, flexDirection: "row", gap: 2 }, React.createElement(Text, { dimColor: true }, "\uD83D\uDD0D ", stats.resources.checks, " chk"), React.createElement(Text, { dimColor: true }, "\u26A1 ", stats.resources.signals, " sig"), React.createElement(Text, { dimColor: true }, "\uD83C\uDFA3 ", stats.resources.asyncHooks, " hook"), React.createElement(Text, { dimColor: true }, "\uD83D\uDCE5 ", stats.resources.requests, " req"), stats.resources.misc > 0 && React.createElement(Text, { dimColor: true }, "\u2753 ", stats.resources.misc, " misc"))))); } //# sourceMappingURL=Debug.js.map