import { openSync } from 'fs'import { ReadStream } from 'tty'import type { RenderOptions } from '../ink.js'import { isEnvTruthy } from './envUtils.js'import { logError } from './log.js'// Cached stdin override - computed once per processlet cachedStdinOverride: ReadStream | undefined | null = null/*** Gets a ReadStream for /dev/tty when stdin is piped.* This allows interactive Ink rendering even when stdin is a pipe.* Result is cached for the lifetime of the process.*/function getStdinOverride(): ReadStream | undefined {// Return cached result if already computedif (cachedStdinOverride !== null) {return cachedStdinOverride}// No override needed if stdin is already a TTYif (process.stdin.isTTY) {cachedStdinOverride = undefinedreturn undefined}// Skip in CI environmentsif (isEnvTruthy(process.env.CI)) {cachedStdinOverride = undefinedreturn undefined}// Skip if running MCP (input hijacking breaks MCP)if (process.argv.includes('mcp')) {cachedStdinOverride = undefinedreturn undefined}// No /dev/tty on Windowsif (process.platform === 'win32') {cachedStdinOverride = undefinedreturn undefined}// Try to open /dev/tty as an alternative input sourcetry {const ttyFd = openSync('/dev/tty', 'r')const ttyStream = new ReadStream(ttyFd)// Explicitly set isTTY to true since we know /dev/tty is a TTY.// This is needed because some runtimes (like Bun's compiled binaries)// may not correctly detect isTTY on ReadStream created from a file descriptor.ttyStream.isTTY = truecachedStdinOverride = ttyStreamreturn cachedStdinOverride} catch (err) {logError(err as Error)cachedStdinOverride = undefinedreturn undefined}}/*** Returns base render options for Ink, including stdin override when needed.* Use this for all render() calls to ensure piped input works correctly.** @param exitOnCtrlC - Whether to exit on Ctrl+C (usually false for dialogs)*/export function getBaseRenderOptions(exitOnCtrlC: boolean = false,): RenderOptions {const stdin = getStdinOverride()const options: RenderOptions = { exitOnCtrlC }if (stdin) {options.stdin = stdin}return options}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。