From db6017a8b7d47ab6915198fd406fc1d648a6251e Mon Sep 17 00:00:00 2001 From: SukeshP1995 <30713956+SukeshP1995@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:02:45 +0200 Subject: [PATCH] chore: replace strip-ansi with util.stripVTControlCharacters (#1380) --- bun.lock | 1 - package.json | 1 - scripts/externals.ts | 1 - src/QueryEngine.ts | 2 +- src/commands/provider/provider.test.tsx | 2 +- src/components/ConsoleOAuthFlow.test.tsx | 2 +- src/components/ExportDialog.test.tsx | 2 +- src/components/MarkdownTable.tsx | 2 +- src/components/PromptInput/PromptInput.tsx | 2 +- src/components/ProviderManager.test.tsx | 2 +- src/components/StartupScreen.test.ts | 2 +- src/components/Stats.tsx | 2 +- src/components/TextInput.test.tsx | 2 +- src/components/ThemePicker.test.tsx | 2 +- src/components/design-system/ThemeProvider.test.tsx | 2 +- .../MonitorPermissionRequest/MonitorPermissionRequest.test.tsx | 2 +- src/components/shell/ShellProgressMessage.tsx | 2 +- src/hooks/useTextInput.ts | 2 +- src/ink/hooks/use-terminal-title.ts | 2 +- src/ink/stringWidth.ts | 2 +- src/utils/exportRenderer.tsx | 2 +- src/utils/markdown.ts | 2 +- src/utils/messages/mappers.ts | 2 +- src/utils/staticRender.tsx | 2 +- 24 files changed, 21 insertions(+), 24 deletions(-) diff --git a/bun.lock b/bun.lock index e04c64cb6..66e192894 100644 --- a/bun.lock +++ b/bun.lock @@ -59,7 +59,6 @@ "shell-quote": "1.8.3", "signal-exit": "4.1.0", "stack-utils": "2.0.6", - "strip-ansi": "7.2.0", "supports-hyperlinks": "3.2.0", "tree-kill": "1.2.2", "turndown": "7.2.2", diff --git a/package.json b/package.json index 7a2418cb9..798b2e90b 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,6 @@ "shell-quote": "1.8.3", "signal-exit": "4.1.0", "stack-utils": "2.0.6", - "strip-ansi": "7.2.0", "supports-hyperlinks": "3.2.0", "tree-kill": "1.2.2", "turndown": "7.2.2", diff --git a/scripts/externals.ts b/scripts/externals.ts index 1ac73b11a..7333a8292 100644 --- a/scripts/externals.ts +++ b/scripts/externals.ts @@ -72,7 +72,6 @@ export const INTENTIONALLY_BUNDLED: string[] = [ 'figures', 'get-east-asian-width', 'indent-string', - 'strip-ansi', 'supports-hyperlinks', 'wrap-ansi', // Data formats diff --git a/src/QueryEngine.ts b/src/QueryEngine.ts index 407de56fc..84e6a2dfc 100644 --- a/src/QueryEngine.ts +++ b/src/QueryEngine.ts @@ -17,7 +17,7 @@ import type { import { accumulateUsage, updateUsage } from 'src/services/api/claude.js' import type { NonNullableUsage } from 'src/services/api/logging.js' import { EMPTY_USAGE } from 'src/services/api/logging.js' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import type { Command } from './commands.js' import { getSlashCommandToolSkills } from './commands.js' import { diff --git a/src/commands/provider/provider.test.tsx b/src/commands/provider/provider.test.tsx index bd561f54c..05bf2563d 100644 --- a/src/commands/provider/provider.test.tsx +++ b/src/commands/provider/provider.test.tsx @@ -2,7 +2,7 @@ import { PassThrough } from 'node:stream' import { afterEach, beforeEach, expect, mock, test } from 'bun:test' import React from 'react' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { createRoot, render, useApp } from '../../ink.js' import { AppStateProvider } from '../../state/AppState.js' diff --git a/src/components/ConsoleOAuthFlow.test.tsx b/src/components/ConsoleOAuthFlow.test.tsx index 6a332f71e..b68033d87 100644 --- a/src/components/ConsoleOAuthFlow.test.tsx +++ b/src/components/ConsoleOAuthFlow.test.tsx @@ -2,7 +2,7 @@ import { PassThrough } from 'node:stream' import { expect, test } from 'bun:test' import React from 'react' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { AppStateProvider } from '../state/AppState.js' import { createRoot } from '../ink.js' diff --git a/src/components/ExportDialog.test.tsx b/src/components/ExportDialog.test.tsx index 6f75cd8a4..8c8ed1f27 100644 --- a/src/components/ExportDialog.test.tsx +++ b/src/components/ExportDialog.test.tsx @@ -5,7 +5,7 @@ import { mkdtemp, readFile, rm } from 'fs/promises' import { tmpdir } from 'os' import { join } from 'path' import React from 'react' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { createRoot } from '../ink.js' import { KeybindingSetup } from '../keybindings/KeybindingProviderSetup.js' diff --git a/src/components/MarkdownTable.tsx b/src/components/MarkdownTable.tsx index b3670ced0..a3544b966 100644 --- a/src/components/MarkdownTable.tsx +++ b/src/components/MarkdownTable.tsx @@ -1,6 +1,6 @@ import type { Token, Tokens } from 'marked'; import React from 'react'; -import stripAnsi from 'strip-ansi'; +import { stripVTControlCharacters as stripAnsi } from 'node:util'; import { useTerminalSize } from '../hooks/useTerminalSize.js'; import { stringWidth } from '../ink/stringWidth.js'; import { wrapAnsi } from '../ink/wrapAnsi.js'; diff --git a/src/components/PromptInput/PromptInput.tsx b/src/components/PromptInput/PromptInput.tsx index 38140db85..04154d27f 100644 --- a/src/components/PromptInput/PromptInput.tsx +++ b/src/components/PromptInput/PromptInput.tsx @@ -11,7 +11,7 @@ import { type AppState, useAppState, useAppStateStore, useSetAppState } from 'sr import type { FooterItem } from 'src/state/AppStateStore.js'; import { getCwd } from 'src/utils/cwd.js'; import { isQueuedCommandEditable, popAllEditable } from 'src/utils/messageQueueManager.js'; -import stripAnsi from 'strip-ansi'; +import { stripVTControlCharacters as stripAnsi } from 'node:util'; import { companionReservedColumns } from '../../buddy/CompanionSprite.js'; import { isBuddyEnabled } from '../../buddy/feature.js'; import { findBuddyTriggerPositions, useBuddyNotification } from '../../buddy/useBuddyNotification.js'; diff --git a/src/components/ProviderManager.test.tsx b/src/components/ProviderManager.test.tsx index 03c7db1de..5c116ae29 100644 --- a/src/components/ProviderManager.test.tsx +++ b/src/components/ProviderManager.test.tsx @@ -2,7 +2,7 @@ import { PassThrough } from 'node:stream' import { afterEach, beforeEach, expect, mock, test } from 'bun:test' import React from 'react' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { createRoot } from '../ink.js' import { KeybindingSetup } from '../keybindings/KeybindingProviderSetup.js' diff --git a/src/components/StartupScreen.test.ts b/src/components/StartupScreen.test.ts index d7cf1e32b..a967e8a2b 100644 --- a/src/components/StartupScreen.test.ts +++ b/src/components/StartupScreen.test.ts @@ -22,7 +22,7 @@ afterAll(() => { } }) -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { detectProvider, printStartupScreen } from './StartupScreen.js' import { getGlobalConfig, saveGlobalConfig } from '../utils/config.js' import { diff --git a/src/components/Stats.tsx b/src/components/Stats.tsx index 766fe3ad5..9bea8ea01 100644 --- a/src/components/Stats.tsx +++ b/src/components/Stats.tsx @@ -4,7 +4,7 @@ import { plot as asciichart } from 'asciichart'; import chalk from 'chalk'; import figures from 'figures'; import React, { Suspense, use, useCallback, useEffect, useMemo, useState } from 'react'; -import stripAnsi from 'strip-ansi'; +import { stripVTControlCharacters as stripAnsi } from 'node:util'; import type { CommandResultDisplay } from '../commands.js'; import { useTerminalSize } from '../hooks/useTerminalSize.js'; import { applyColor } from '../ink/colorize.js'; diff --git a/src/components/TextInput.test.tsx b/src/components/TextInput.test.tsx index 0f18e4de3..e51f0516f 100644 --- a/src/components/TextInput.test.tsx +++ b/src/components/TextInput.test.tsx @@ -2,7 +2,7 @@ import { PassThrough } from 'node:stream' import { expect, test } from 'bun:test' import React from 'react' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { createRoot } from '../ink.js' import { AppStateProvider } from '../state/AppState.js' diff --git a/src/components/ThemePicker.test.tsx b/src/components/ThemePicker.test.tsx index 3fa682471..dd05ab0c4 100644 --- a/src/components/ThemePicker.test.tsx +++ b/src/components/ThemePicker.test.tsx @@ -2,7 +2,7 @@ import { PassThrough } from 'node:stream' import { afterAll, expect, mock, test } from 'bun:test' import React from 'react' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { createRoot, Text, useTheme } from '../ink.js' import { KeybindingSetup } from '../keybindings/KeybindingProviderSetup.js' diff --git a/src/components/design-system/ThemeProvider.test.tsx b/src/components/design-system/ThemeProvider.test.tsx index 1d3396d8b..6c42ce965 100644 --- a/src/components/design-system/ThemeProvider.test.tsx +++ b/src/components/design-system/ThemeProvider.test.tsx @@ -20,7 +20,7 @@ import { PassThrough } from 'node:stream' import { afterAll, expect, mock, test } from 'bun:test' import React, { useEffect } from 'react' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { createRoot, Text, useTheme } from '../../ink.js' import { KeybindingSetup } from '../../keybindings/KeybindingProviderSetup.js' diff --git a/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.test.tsx b/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.test.tsx index 1a94a7dca..4f70cac02 100644 --- a/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.test.tsx +++ b/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.test.tsx @@ -5,7 +5,7 @@ import { tmpdir } from 'node:os' import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test' import React from 'react' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { getOriginalCwd, setOriginalCwd } from '../../../bootstrap/state.js' import { handleInteractivePermission } from '../../../hooks/toolPermission/handlers/interactiveHandler.js' diff --git a/src/components/shell/ShellProgressMessage.tsx b/src/components/shell/ShellProgressMessage.tsx index e3b08f9b6..1bb0385f0 100644 --- a/src/components/shell/ShellProgressMessage.tsx +++ b/src/components/shell/ShellProgressMessage.tsx @@ -1,6 +1,6 @@ import { c as _c } from "react-compiler-runtime"; import React from 'react'; -import stripAnsi from 'strip-ansi'; +import { stripVTControlCharacters as stripAnsi } from 'node:util'; import { Box, Text } from '../../ink.js'; import { formatFileSize } from '../../utils/format.js'; import { MessageResponse } from '../MessageResponse.js'; diff --git a/src/hooks/useTextInput.ts b/src/hooks/useTextInput.ts index 1c9ab7eb7..c51cc025a 100644 --- a/src/hooks/useTextInput.ts +++ b/src/hooks/useTextInput.ts @@ -1,7 +1,7 @@ import { useLayoutEffect, useRef, useState } from 'react' import { isInputModeCharacter } from 'src/components/PromptInput/inputModes.js' import { useNotifications } from 'src/context/notifications.js' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { markBackslashReturnUsed } from '../commands/terminalSetup/terminalSetup.js' import { addToHistory } from '../history.js' import type { Key } from '../ink.js' diff --git a/src/ink/hooks/use-terminal-title.ts b/src/ink/hooks/use-terminal-title.ts index d820cd7ae..83e79db51 100644 --- a/src/ink/hooks/use-terminal-title.ts +++ b/src/ink/hooks/use-terminal-title.ts @@ -1,5 +1,5 @@ import { useContext, useEffect } from 'react' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { OSC, osc } from '../termio/osc.js' import { TerminalWriteContext } from '../useTerminalNotification.js' diff --git a/src/ink/stringWidth.ts b/src/ink/stringWidth.ts index 6c80d92cd..9f3517874 100644 --- a/src/ink/stringWidth.ts +++ b/src/ink/stringWidth.ts @@ -1,6 +1,6 @@ import emojiRegex from 'emoji-regex' import { eastAsianWidth } from 'get-east-asian-width' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { getGraphemeSegmenter } from '../utils/intl.js' const EMOJI_REGEX = emojiRegex() diff --git a/src/utils/exportRenderer.tsx b/src/utils/exportRenderer.tsx index 659156c17..c1793fed5 100644 --- a/src/utils/exportRenderer.tsx +++ b/src/utils/exportRenderer.tsx @@ -1,5 +1,5 @@ import React, { useRef } from 'react'; -import stripAnsi from 'strip-ansi'; +import { stripVTControlCharacters as stripAnsi } from 'node:util'; import { Messages } from '../components/Messages.js'; import { KeybindingProvider } from '../keybindings/KeybindingContext.js'; import { loadKeybindingsSyncWithWarnings } from '../keybindings/loadUserBindings.js'; diff --git a/src/utils/markdown.ts b/src/utils/markdown.ts index b2c673e6d..50e9928dd 100644 --- a/src/utils/markdown.ts +++ b/src/utils/markdown.ts @@ -1,6 +1,6 @@ import chalk from 'chalk' import { marked, type Token, type Tokens } from 'marked' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { color } from '../components/design-system/color.js' import { BLOCKQUOTE_BAR } from '../constants/figures.js' import { stringWidth } from '../ink/stringWidth.js' diff --git a/src/utils/messages/mappers.ts b/src/utils/messages/mappers.ts index aaa3168a2..6bc732f3b 100644 --- a/src/utils/messages/mappers.ts +++ b/src/utils/messages/mappers.ts @@ -19,7 +19,7 @@ import type { Message, } from 'src/types/message.js' import type { DeepImmutable } from 'src/types/utils.js' -import stripAnsi from 'strip-ansi' +import { stripVTControlCharacters as stripAnsi } from 'node:util' import { createAssistantMessage } from '../messages.js' import { getPlan } from '../plans.js' diff --git a/src/utils/staticRender.tsx b/src/utils/staticRender.tsx index 9cb2806a9..31a3b4d92 100644 --- a/src/utils/staticRender.tsx +++ b/src/utils/staticRender.tsx @@ -2,7 +2,7 @@ import { c as _c } from "react-compiler-runtime"; import * as React from 'react'; import { useLayoutEffect } from 'react'; import { PassThrough } from 'stream'; -import stripAnsi from 'strip-ansi'; +import { stripVTControlCharacters as stripAnsi } from 'node:util'; import { render, useApp } from '../ink.js'; // This is a workaround for the fact that Ink doesn't support multiple