@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
JavaScript
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