@runtypelabs/ink-components 0.3.7 → 0.3.9

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.
Files changed (3) hide show
  1. package/dist/index.d.ts +68 -63
  2. package/dist/index.js +205 -206
  3. package/package.json +5 -5
package/dist/index.d.ts CHANGED
@@ -1,81 +1,86 @@
1
- import * as react from 'react';
2
- import { ComponentProps, ReactNode } from 'react';
3
- import InkSpinner from 'ink-spinner';
4
-
1
+ import InkSpinner from "ink-spinner";
2
+ import { ComponentProps, ReactNode } from "react";
3
+ //#region src/components/Spinner.d.ts
5
4
  type InkSpinnerType = ComponentProps<typeof InkSpinner>['type'];
6
5
  interface SpinnerProps {
7
- label?: string;
8
- color?: string;
9
- type?: InkSpinnerType;
6
+ label?: string;
7
+ color?: string;
8
+ type?: InkSpinnerType;
10
9
  }
11
- declare function Spinner({ label, color, type, }: SpinnerProps): react.JSX.Element;
12
-
10
+ export declare function Spinner({ label, color, type }: SpinnerProps): import("react").JSX.Element;
11
+ //#endregion
12
+ //#region src/components/StatusBar.d.ts
13
13
  interface StatusBarProps {
14
- left?: ReactNode;
15
- center?: string;
16
- right?: string;
14
+ left?: ReactNode;
15
+ center?: string;
16
+ right?: string;
17
17
  }
18
- declare function StatusBar({ left, center, right }: StatusBarProps): react.JSX.Element;
19
-
18
+ export declare function StatusBar({ left, center, right }: StatusBarProps): import("react").JSX.Element;
19
+ //#endregion
20
+ //#region src/components/StreamOutput.d.ts
20
21
  interface StreamOutputProps {
21
- content: string;
22
- isStreaming: boolean;
23
- enableMarkdown?: boolean;
24
- maxVisibleLines?: number;
25
- /** Lines to scroll up from the bottom (0 = follow latest) */
26
- scrollOffset?: number;
22
+ content: string;
23
+ isStreaming: boolean;
24
+ enableMarkdown?: boolean;
25
+ maxVisibleLines?: number;
26
+ /** Lines to scroll up from the bottom (0 = follow latest) */
27
+ scrollOffset?: number;
27
28
  }
28
29
  /**
29
30
  * Render raw markdown content to terminal-styled text with ANSI color codes.
30
31
  * Uses the module-level `marked` + `marked-terminal` configuration.
31
32
  */
32
- declare function renderMarkdownToTerminal(content: string): string;
33
- declare const StreamOutput: react.MemoExoticComponent<({ content, isStreaming, enableMarkdown, maxVisibleLines, scrollOffset, }: StreamOutputProps) => react.JSX.Element>;
34
-
33
+ export declare function renderMarkdownToTerminal(content: string): string;
34
+ export declare const StreamOutput: import("react").MemoExoticComponent<({ content, isStreaming, enableMarkdown, maxVisibleLines, scrollOffset }: StreamOutputProps) => import("react").JSX.Element>;
35
+ //#endregion
36
+ //#region src/components/ErrorDisplay.d.ts
35
37
  interface ErrorDisplayProps {
36
- error: Error | string;
37
- context?: string;
38
+ error: Error | string;
39
+ context?: string;
38
40
  }
39
- declare function ErrorDisplay({ error, context }: ErrorDisplayProps): react.JSX.Element;
40
-
41
- declare const theme: {
42
- readonly backgroundDeep: "#000000";
43
- readonly background: "#1b212b";
44
- readonly surface: "#202733";
45
- readonly surfaceMuted: "#1d2430";
46
- readonly surfaceElevated: "#252d3b";
47
- readonly text: "#d8d3c9";
48
- readonly textMuted: "#918b84";
49
- readonly textSubtle: "#66625d";
50
- readonly accent: "#8fc4bf";
51
- readonly accentActive: "#a7d8d2";
52
- readonly success: "#8ecb73";
53
- readonly warning: "#d8ae63";
54
- readonly danger: "#c97b73";
55
- readonly border: "#394252";
56
- readonly borderActive: "#546077";
57
- readonly error: "#c97b73";
58
- readonly info: "#8fc4bf";
59
- readonly muted: "#918b84";
60
- readonly primary: "#8fc4bf";
61
- readonly secondary: "#a7d8d2";
62
- readonly spinner: "#8fc4bf";
63
- readonly progress: "#8fc4bf";
64
- readonly label: "#d8d3c9";
65
- readonly dimLabel: "#66625d";
66
- readonly highlight: "bold";
67
- readonly separator: " · ";
68
- readonly sectionGap: 1;
69
- readonly panelPaddingX: 1;
70
- readonly panelPaddingY: 0;
41
+ export declare function ErrorDisplay({ error, context }: ErrorDisplayProps): import("react").JSX.Element;
42
+ //#endregion
43
+ //#region src/theme.d.ts
44
+ export declare const theme: {
45
+ readonly backgroundDeep: "#000000";
46
+ readonly background: "#1b212b";
47
+ readonly surface: "#202733";
48
+ readonly surfaceMuted: "#1d2430";
49
+ readonly surfaceElevated: "#252d3b";
50
+ readonly text: "#d8d3c9";
51
+ readonly textMuted: "#918b84";
52
+ readonly textSubtle: "#66625d";
53
+ readonly accent: "#8fc4bf";
54
+ readonly accentActive: "#a7d8d2";
55
+ readonly success: "#8ecb73";
56
+ readonly warning: "#d8ae63";
57
+ readonly danger: "#c97b73";
58
+ readonly border: "#394252";
59
+ readonly borderActive: "#546077";
60
+ readonly error: "#c97b73";
61
+ readonly info: "#8fc4bf";
62
+ readonly muted: "#918b84";
63
+ readonly primary: "#8fc4bf";
64
+ readonly secondary: "#a7d8d2";
65
+ readonly spinner: "#8fc4bf";
66
+ readonly progress: "#8fc4bf";
67
+ readonly label: "#d8d3c9";
68
+ readonly dimLabel: "#66625d";
69
+ readonly highlight: "bold";
70
+ readonly separator: " · ";
71
+ readonly sectionGap: 1;
72
+ readonly panelPaddingX: 1;
73
+ readonly panelPaddingY: 0;
71
74
  };
72
75
  type Theme = typeof theme;
73
-
76
+ //#endregion
77
+ //#region src/types.d.ts
74
78
  type StreamPhase = 'idle' | 'thinking' | 'streaming' | 'tool' | 'complete' | 'error';
75
79
  interface ToolResult {
76
- name: string;
77
- status: 'running' | 'complete' | 'error';
78
- duration?: number;
80
+ name: string;
81
+ status: 'running' | 'complete' | 'error';
82
+ duration?: number;
79
83
  }
80
-
81
- export { ErrorDisplay, type ErrorDisplayProps, Spinner, type SpinnerProps, StatusBar, type StatusBarProps, StreamOutput, type StreamOutputProps, type StreamPhase, type Theme, type ToolResult, renderMarkdownToTerminal, theme };
84
+ //#endregion
85
+ export type { ErrorDisplayProps, SpinnerProps, StatusBarProps, StreamOutputProps, StreamPhase, Theme, ToolResult };
86
+ export {}
package/dist/index.js CHANGED
@@ -1,219 +1,218 @@
1
- // src/components/Spinner.tsx
2
1
  import { Box, Text } from "ink";
3
2
  import InkSpinner from "ink-spinner";
4
-
5
- // src/theme.ts
6
- var theme = {
7
- backgroundDeep: "#000000",
8
- background: "#1b212b",
9
- surface: "#202733",
10
- surfaceMuted: "#1d2430",
11
- surfaceElevated: "#252d3b",
12
- text: "#d8d3c9",
13
- textMuted: "#918b84",
14
- textSubtle: "#66625d",
15
- accent: "#8fc4bf",
16
- accentActive: "#a7d8d2",
17
- success: "#8ecb73",
18
- warning: "#d8ae63",
19
- danger: "#c97b73",
20
- border: "#394252",
21
- borderActive: "#546077",
22
- error: "#c97b73",
23
- info: "#8fc4bf",
24
- muted: "#918b84",
25
- primary: "#8fc4bf",
26
- secondary: "#a7d8d2",
27
- spinner: "#8fc4bf",
28
- progress: "#8fc4bf",
29
- label: "#d8d3c9",
30
- dimLabel: "#66625d",
31
- highlight: "bold",
32
- separator: " \xB7 ",
33
- sectionGap: 1,
34
- panelPaddingX: 1,
35
- panelPaddingY: 0
36
- };
37
-
38
- // src/components/Spinner.tsx
39
3
  import { jsx, jsxs } from "react/jsx-runtime";
40
- function Spinner({
41
- label = "Loading...",
42
- color = theme.spinner,
43
- type = "dots"
44
- }) {
45
- return /* @__PURE__ */ jsxs(Box, { children: [
46
- /* @__PURE__ */ jsx(Text, { color, children: /* @__PURE__ */ jsx(InkSpinner, { type }) }),
47
- /* @__PURE__ */ jsxs(Text, { color: theme.textMuted, children: [
48
- " ",
49
- label
50
- ] })
51
- ] });
52
- }
53
-
54
- // src/components/StatusBar.tsx
55
- import { Box as Box2, Text as Text2 } from "ink";
56
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
57
- function StatusBar({ left, center, right }) {
58
- return /* @__PURE__ */ jsxs2(
59
- Box2,
60
- {
61
- borderStyle: "single",
62
- borderColor: theme.border,
63
- backgroundColor: theme.background,
64
- paddingX: theme.panelPaddingX,
65
- paddingY: theme.panelPaddingY,
66
- children: [
67
- /* @__PURE__ */ jsx2(Box2, { flexGrow: 1, children: typeof left === "string" ? /* @__PURE__ */ jsx2(Text2, { color: theme.textMuted, children: left }) : left }),
68
- center && /* @__PURE__ */ jsx2(Box2, { flexGrow: 1, justifyContent: "center", children: /* @__PURE__ */ jsx2(Text2, { color: theme.accent, children: center }) }),
69
- right && /* @__PURE__ */ jsx2(Box2, { children: /* @__PURE__ */ jsx2(Text2, { color: theme.textSubtle, children: right }) })
70
- ]
71
- }
72
- );
73
- }
74
-
75
- // src/components/StreamOutput.tsx
76
- import { useMemo, memo } from "react";
77
- import { Box as Box3, Text as Text3 } from "ink";
4
+ import { memo, useMemo } from "react";
78
5
  import chalk from "chalk";
79
- import InkSpinner2 from "ink-spinner";
80
6
  import { marked } from "marked";
81
7
  import { markedTerminal } from "marked-terminal";
82
8
  import stripAnsi from "strip-ansi";
83
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
84
- var bodyText = chalk.hex(theme.text);
85
- var mutedText = chalk.hex(theme.textMuted);
86
- var subtleText = chalk.hex(theme.textSubtle);
87
- var accentText = chalk.hex(theme.accent);
88
- var accentActiveText = chalk.hex(theme.accentActive);
89
- var successText = chalk.hex(theme.success);
90
- var warningText = chalk.hex(theme.warning);
91
- var dangerText = chalk.hex(theme.danger);
92
- var markdownHighlightTheme = {
93
- default: bodyText,
94
- keyword: accentText,
95
- built_in: accentActiveText,
96
- type: accentActiveText,
97
- literal: accentText,
98
- number: successText,
99
- regexp: warningText,
100
- string: bodyText,
101
- subst: accentText,
102
- symbol: bodyText,
103
- class: accentActiveText,
104
- function: accentActiveText,
105
- title: accentActiveText,
106
- params: mutedText,
107
- comment: subtleText,
108
- doctag: subtleText,
109
- meta: subtleText,
110
- "meta-keyword": accentText,
111
- "meta-string": mutedText,
112
- section: accentText,
113
- tag: accentText,
114
- name: accentActiveText,
115
- "builtin-name": accentActiveText,
116
- attr: accentText,
117
- attribute: accentText,
118
- variable: accentActiveText,
119
- bullet: mutedText,
120
- code: successText,
121
- emphasis: accentText,
122
- strong: accentActiveText,
123
- formula: accentText,
124
- link: accentActiveText,
125
- quote: mutedText,
126
- addition: successText,
127
- deletion: dangerText
9
+ //#region src/theme.ts
10
+ const theme = {
11
+ backgroundDeep: "#000000",
12
+ background: "#1b212b",
13
+ surface: "#202733",
14
+ surfaceMuted: "#1d2430",
15
+ surfaceElevated: "#252d3b",
16
+ text: "#d8d3c9",
17
+ textMuted: "#918b84",
18
+ textSubtle: "#66625d",
19
+ accent: "#8fc4bf",
20
+ accentActive: "#a7d8d2",
21
+ success: "#8ecb73",
22
+ warning: "#d8ae63",
23
+ danger: "#c97b73",
24
+ border: "#394252",
25
+ borderActive: "#546077",
26
+ error: "#c97b73",
27
+ info: "#8fc4bf",
28
+ muted: "#918b84",
29
+ primary: "#8fc4bf",
30
+ secondary: "#a7d8d2",
31
+ spinner: "#8fc4bf",
32
+ progress: "#8fc4bf",
33
+ label: "#d8d3c9",
34
+ dimLabel: "#66625d",
35
+ highlight: "bold",
36
+ separator: " · ",
37
+ sectionGap: 1,
38
+ panelPaddingX: 1,
39
+ panelPaddingY: 0
128
40
  };
129
- marked.use(
130
- markedTerminal(
131
- {
132
- code: successText,
133
- blockquote: mutedText,
134
- html: subtleText,
135
- heading: accentText,
136
- firstHeading: accentActiveText.bold,
137
- hr: subtleText,
138
- listitem: bodyText,
139
- list: (body) => bodyText(body),
140
- table: mutedText,
141
- paragraph: bodyText,
142
- strong: accentActiveText.bold,
143
- em: accentText.italic,
144
- codespan: successText,
145
- del: subtleText.strikethrough,
146
- link: accentActiveText,
147
- href: mutedText.underline,
148
- text: bodyText,
149
- showSectionPrefix: false,
150
- reflowText: false
151
- },
152
- {
153
- ignoreIllegals: true,
154
- theme: markdownHighlightTheme
155
- }
156
- )
157
- );
41
+ //#endregion
42
+ //#region src/components/Spinner.tsx
43
+ function Spinner({ label = "Loading...", color = theme.spinner, type = "dots" }) {
44
+ return /* @__PURE__ */ jsxs(Box, { children: [/* @__PURE__ */ jsx(Text, {
45
+ color,
46
+ children: /* @__PURE__ */ jsx(InkSpinner, { type })
47
+ }), /* @__PURE__ */ jsxs(Text, {
48
+ color: theme.textMuted,
49
+ children: [" ", label]
50
+ })] });
51
+ }
52
+ //#endregion
53
+ //#region src/components/StatusBar.tsx
54
+ function StatusBar({ left, center, right }) {
55
+ return /* @__PURE__ */ jsxs(Box, {
56
+ borderStyle: "single",
57
+ borderColor: theme.border,
58
+ backgroundColor: theme.background,
59
+ paddingX: theme.panelPaddingX,
60
+ paddingY: theme.panelPaddingY,
61
+ children: [
62
+ /* @__PURE__ */ jsx(Box, {
63
+ flexGrow: 1,
64
+ children: typeof left === "string" ? /* @__PURE__ */ jsx(Text, {
65
+ color: theme.textMuted,
66
+ children: left
67
+ }) : left
68
+ }),
69
+ center && /* @__PURE__ */ jsx(Box, {
70
+ flexGrow: 1,
71
+ justifyContent: "center",
72
+ children: /* @__PURE__ */ jsx(Text, {
73
+ color: theme.accent,
74
+ children: center
75
+ })
76
+ }),
77
+ right && /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, {
78
+ color: theme.textSubtle,
79
+ children: right
80
+ }) })
81
+ ]
82
+ });
83
+ }
84
+ //#endregion
85
+ //#region src/components/StreamOutput.tsx
86
+ const bodyText = chalk.hex(theme.text);
87
+ const mutedText = chalk.hex(theme.textMuted);
88
+ const subtleText = chalk.hex(theme.textSubtle);
89
+ const accentText = chalk.hex(theme.accent);
90
+ const accentActiveText = chalk.hex(theme.accentActive);
91
+ const successText = chalk.hex(theme.success);
92
+ const markdownHighlightTheme = {
93
+ default: bodyText,
94
+ keyword: accentText,
95
+ built_in: accentActiveText,
96
+ type: accentActiveText,
97
+ literal: accentText,
98
+ number: successText,
99
+ regexp: chalk.hex(theme.warning),
100
+ string: bodyText,
101
+ subst: accentText,
102
+ symbol: bodyText,
103
+ class: accentActiveText,
104
+ function: accentActiveText,
105
+ title: accentActiveText,
106
+ params: mutedText,
107
+ comment: subtleText,
108
+ doctag: subtleText,
109
+ meta: subtleText,
110
+ "meta-keyword": accentText,
111
+ "meta-string": mutedText,
112
+ section: accentText,
113
+ tag: accentText,
114
+ name: accentActiveText,
115
+ "builtin-name": accentActiveText,
116
+ attr: accentText,
117
+ attribute: accentText,
118
+ variable: accentActiveText,
119
+ bullet: mutedText,
120
+ code: successText,
121
+ emphasis: accentText,
122
+ strong: accentActiveText,
123
+ formula: accentText,
124
+ link: accentActiveText,
125
+ quote: mutedText,
126
+ addition: successText,
127
+ deletion: chalk.hex(theme.danger)
128
+ };
129
+ marked.use(markedTerminal({
130
+ code: successText,
131
+ blockquote: mutedText,
132
+ html: subtleText,
133
+ heading: accentText,
134
+ firstHeading: accentActiveText.bold,
135
+ hr: subtleText,
136
+ listitem: bodyText,
137
+ list: (body) => bodyText(body),
138
+ table: mutedText,
139
+ paragraph: bodyText,
140
+ strong: accentActiveText.bold,
141
+ em: accentText.italic,
142
+ codespan: successText,
143
+ del: subtleText.strikethrough,
144
+ link: accentActiveText,
145
+ href: mutedText.underline,
146
+ text: bodyText,
147
+ showSectionPrefix: false,
148
+ reflowText: false
149
+ }, {
150
+ ignoreIllegals: true,
151
+ theme: markdownHighlightTheme
152
+ }));
153
+ /**
154
+ * Render raw markdown content to terminal-styled text with ANSI color codes.
155
+ * Uses the module-level `marked` + `marked-terminal` configuration.
156
+ */
158
157
  function renderMarkdownToTerminal(content) {
159
- const stripped = stripAnsi(content);
160
- if (!stripped) return "";
161
- return marked.parse(stripped).trimEnd();
158
+ const stripped = stripAnsi(content);
159
+ if (!stripped) return "";
160
+ return marked.parse(stripped).trimEnd();
162
161
  }
163
- var StreamOutput = memo(function StreamOutput2({
164
- content,
165
- isStreaming,
166
- enableMarkdown = true,
167
- maxVisibleLines,
168
- scrollOffset = 0
169
- }) {
170
- const rendered = useMemo(() => {
171
- const stripped = stripAnsi(content);
172
- if (!stripped) return "";
173
- if (enableMarkdown) {
174
- return marked.parse(stripped).trimEnd();
175
- }
176
- return stripped;
177
- }, [content, enableMarkdown]);
178
- const lines = useMemo(() => rendered.split("\n"), [rendered]);
179
- const visible = useMemo(() => {
180
- if (!maxVisibleLines) return rendered;
181
- const totalLines = lines.length;
182
- const clampedOffset = Math.min(scrollOffset, Math.max(0, totalLines - maxVisibleLines));
183
- const end = totalLines - clampedOffset;
184
- const start = Math.max(0, end - maxVisibleLines);
185
- return lines.slice(start, end).join("\n");
186
- }, [rendered, lines, maxVisibleLines, scrollOffset]);
187
- return /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", children: [
188
- visible && /* @__PURE__ */ jsx3(Text3, { color: theme.text, children: visible }),
189
- isStreaming && /* @__PURE__ */ jsx3(Box3, { children: /* @__PURE__ */ jsx3(Text3, { color: theme.textMuted, children: /* @__PURE__ */ jsx3(InkSpinner2, { type: "dots" }) }) })
190
- ] });
162
+ const StreamOutput = memo(function StreamOutput({ content, isStreaming, enableMarkdown = true, maxVisibleLines, scrollOffset = 0 }) {
163
+ const rendered = useMemo(() => {
164
+ const stripped = stripAnsi(content);
165
+ if (!stripped) return "";
166
+ if (enableMarkdown) return marked.parse(stripped).trimEnd();
167
+ return stripped;
168
+ }, [content, enableMarkdown]);
169
+ const lines = useMemo(() => rendered.split("\n"), [rendered]);
170
+ const visible = useMemo(() => {
171
+ if (!maxVisibleLines) return rendered;
172
+ const totalLines = lines.length;
173
+ const end = totalLines - Math.min(scrollOffset, Math.max(0, totalLines - maxVisibleLines));
174
+ const start = Math.max(0, end - maxVisibleLines);
175
+ return lines.slice(start, end).join("\n");
176
+ }, [
177
+ rendered,
178
+ lines,
179
+ maxVisibleLines,
180
+ scrollOffset
181
+ ]);
182
+ return /* @__PURE__ */ jsxs(Box, {
183
+ flexDirection: "column",
184
+ children: [visible && /* @__PURE__ */ jsx(Text, {
185
+ color: theme.text,
186
+ children: visible
187
+ }), isStreaming && /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, {
188
+ color: theme.textMuted,
189
+ children: /* @__PURE__ */ jsx(InkSpinner, { type: "dots" })
190
+ }) })]
191
+ });
191
192
  });
192
-
193
- // src/components/ErrorDisplay.tsx
194
- import { Box as Box4, Text as Text4 } from "ink";
195
- import { jsxs as jsxs4 } from "react/jsx-runtime";
193
+ //#endregion
194
+ //#region src/components/ErrorDisplay.tsx
196
195
  function ErrorDisplay({ error, context }) {
197
- const message = error instanceof Error ? error.message : error;
198
- const cause = error instanceof Error && error.cause ? String(error.cause) : void 0;
199
- return /* @__PURE__ */ jsxs4(Box4, { flexDirection: "column", marginTop: theme.sectionGap, children: [
200
- /* @__PURE__ */ jsxs4(Text4, { color: theme.danger, bold: true, children: [
201
- "Error",
202
- context ? ` ${context}` : "",
203
- ": ",
204
- message
205
- ] }),
206
- cause && /* @__PURE__ */ jsxs4(Text4, { color: theme.textMuted, children: [
207
- "Cause: ",
208
- cause
209
- ] })
210
- ] });
196
+ const message = error instanceof Error ? error.message : error;
197
+ const cause = error instanceof Error && error.cause ? String(error.cause) : void 0;
198
+ return /* @__PURE__ */ jsxs(Box, {
199
+ flexDirection: "column",
200
+ marginTop: theme.sectionGap,
201
+ children: [/* @__PURE__ */ jsxs(Text, {
202
+ color: theme.danger,
203
+ bold: true,
204
+ children: [
205
+ "Error",
206
+ context ? ` ${context}` : "",
207
+ ": ",
208
+ message
209
+ ]
210
+ }), cause && /* @__PURE__ */ jsxs(Text, {
211
+ color: theme.textMuted,
212
+ children: ["Cause: ", cause]
213
+ })]
214
+ });
211
215
  }
212
- export {
213
- ErrorDisplay,
214
- Spinner,
215
- StatusBar,
216
- StreamOutput,
217
- renderMarkdownToTerminal,
218
- theme
219
- };
216
+ //#endregion
217
+ export { ErrorDisplay, Spinner, StatusBar, StreamOutput, renderMarkdownToTerminal, theme };
218
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runtypelabs/ink-components",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "description": "Shared Ink (React for CLI) components for the Runtype CLI — spinners, status bars, streaming output, and error displays.",
5
5
  "license": "MIT",
6
6
  "author": "Runtype",
@@ -29,9 +29,9 @@
29
29
  "devDependencies": {
30
30
  "@types/react": "^19.2.18",
31
31
  "ink-testing-library": "4.0.0",
32
- "tsup": "^8.0.2",
32
+ "tsdown": "^0.23.0",
33
33
  "typescript": "^6.0.3",
34
- "vitest": "^4.1.0"
34
+ "vitest": "^5.0.2"
35
35
  },
36
36
  "keywords": [
37
37
  "runtype",
@@ -59,10 +59,10 @@
59
59
  },
60
60
  "sideEffects": false,
61
61
  "scripts": {
62
- "build": "tsup",
62
+ "build": "tsdown",
63
63
  "test": "vitest run",
64
64
  "type-check": "tsgo --noEmit",
65
- "dev": "tsup --watch",
65
+ "dev": "tsdown --watch",
66
66
  "typecheck": "tsgo --noEmit",
67
67
  "lint": "eslint ."
68
68
  }