"use client"; import type { JSX } from "react"; import type { IConsoleMessage } from "../structures/IConsoleMessage"; interface ConsoleViewerProps { messages: IConsoleMessage[]; empty?: string; } export function ConsoleViewer({ messages, empty = "No output yet. Click Execute to run the compiled JavaScript.", }: ConsoleViewerProps) { if (messages.length === 0) return (
{empty}
); return (
{messages.map((msg, i) => (
{msg.type} {(Array.isArray(msg.value) ? msg.value : [msg.value]).map( (arg, idx) => ( {idx > 0 ? " " : ""} {formatValue(arg)} ), )}
))}
); } function typeColor(type: IConsoleMessage["type"]): string { switch (type) { case "error": return "text-red-600"; case "warn": return "text-amber-600"; case "info": return "text-sky-700"; case "debug": return "text-fuchsia-700"; case "dir": case "table": return "text-cyan-700"; default: return "text-emerald-700"; } } function formatValue(value: unknown, depth = 0): JSX.Element { if (typeof value === "string") return {JSON.stringify(value)}; if (typeof value === "number") return {String(value)}; if (typeof value === "boolean") return {String(value)}; if (value === null) return null; if (value === undefined) return undefined; if (typeof value === "function") return [Function]; if (Array.isArray(value)) return ( [ {value.map((item, idx) => ( {idx > 0 ? ", " : ""} {formatValue(item, depth + 1)} ))} ] ); if (value instanceof Error) return ( {value.name}: {value.message} ); try { const entries = Object.entries(value as Record); if (entries.length === 0) return {"{}"}; if (depth > 4) return [...]; return ( {"{"} {entries.map(([k, v], idx) => ( {idx > 0 ? ", " : " "} {k}:{" "} {formatValue(v, depth + 1)} ))} {" }"} ); } catch { return {String(value)}; } }