Working with stdin and stdout

1. Reading from stdin (process.stdin)

Example: Async iterator

process.stdin.setEncoding("utf8");
for await (const chunk of process.stdin) {
  console.log("got:", chunk);
}
EventFires
dataChunk available
endEOF
readableUse with read()

2. Writing to stdout (process.stdout)

MethodNotes
process.stdout.write(str)No newline added
console.logAdds newline + format
process.stdout.isTTYTrue if interactive

3. Writing to stderr (process.stderr)

Example

process.stderr.write("error happened\n");
console.error("structured error", { code: 42 });

4. Handling Input Events

EventUse
dataStreamed chunks
endStdin closed (Ctrl+D)
errorI/O failure

5. Piping Data Between Streams

Example: Uppercase pipeline

import { Transform, pipeline } from "node:stream";
import { promisify } from "node:util";
const upper = new Transform({
  transform(chunk, _, cb) { cb(null, chunk.toString().toUpperCase()); }
});
await promisify(pipeline)(process.stdin, upper, process.stdout);

6. Setting Raw Mode (setRawMode)

ModeEffect
setRawMode(true)Reads keystrokes immediately, no buffering, no Ctrl+C handling
setRawMode(false)Line-buffered (default)

7. Using TTY Module (tty.isatty)

APIReturns
tty.isatty(fd)Boolean
process.stdout.isTTYShortcut for stdout
process.stdin.isTTYDetect piped input

8. Detecting Terminal Size (process.stdout.columns)

PropertyReturns
process.stdout.columnsWidth in cols
process.stdout.rowsHeight in rows
"resize" eventFires on terminal resize

9. Handling ANSI Colors

CodeEffect
\x1b[31m / \x1b[0mRed / reset
\x1b[1mBold
chalk / picocolorsIdiomatic libraries
Note: Disable colors when !process.stdout.isTTY or process.env.NO_COLOR is set.

10. Creating Progress Bars

Example: Manual bar

function bar(pct) {
  const w = 30, filled = Math.round(w * pct);
  process.stdout.write(`\r[${"#".repeat(filled)}${"-".repeat(w-filled)}] ${(pct*100).toFixed(0)}%`);
}
LibraryUse
cli-progressMulti-bar, ETA
oraSpinners
listr2Task lists