1/** @jsxImportSource @alchemy.run/sigil */
2import { AnsiText } from "@alchemy.run/sigil";
3import { inspect } from "node:util";
4import type { ReactNode } from "react";
5import { Box, useCliEnvironment } from "../ui/index.ts";
6
7export interface StackOutputsProps {
8 readonly value: unknown;
9 readonly offset?: number;
10 readonly limit?: number;
11}
12
13export function StackOutputs({
14 value,
15 offset = 0,
16 limit = Number.POSITIVE_INFINITY,
17}: StackOutputsProps) {
18 const { colors } = useCliEnvironment();
19 const output = inspect(value, { colors });
20 const lines = output.split("\n").slice(offset, offset + limit);
21
22 return (
23 <Box flexDirection="column">
24 {lines.map((line, index) => (
25 <AnsiText key={offset + index} wrap="none">
26 {line || " "}
27 </AnsiText>
28 ))}
29 </Box>
30 );
31}
32
33export const stackOutputLineCount = (value: unknown): number =>
34 inspect(value, { colors: false }).split("\n").length;
35
36export const stackOutputsView = (value: unknown): ReactNode => (
37 <StackOutputs value={value} />
38);