Files

31 lines
1.3 KiB
JavaScript
Raw Permalink Normal View History

2026-08-27 21:09:14 +00:00
// The interactive workload for scripts/orderfile/generate.ts. Reads stdin,
// writes stdout, drives readline. Traced twice: once on a pipe, once on a
// terminal (ptyrun.c), which is the only way to reach isatty, the window size,
// raw mode, and readline's line editor with its cursor escapes.
//
// Fed "world\none\ntwo\nquit\n". `quit` is what makes it exit, so it never has
// to wait for an end-of-input that a terminal may not deliver.
const { createInterface } = require("node:readline");
const terminal = Boolean(process.stdin.isTTY && process.stdout.isTTY);
process.stdout.write(`tty=${terminal} ${process.stdout.columns ?? 0}x${process.stdout.rows ?? 0}\n`);
process.stdout.write(Buffer.alloc(8192, 0x2e)); // more than one write's worth
if (terminal) {
process.stdout.write(`\ncolors=${process.stdout.hasColors?.(256)}\n`);
process.stdin.setRawMode(true);
process.stdin.setRawMode(false);
}
const rl = createInterface({ input: process.stdin, output: process.stdout, terminal, prompt: "> " });
let lines = 0;
rl.question("\nname? ", name => {
process.stdout.write(`hi ${name.trim()}\n`);
rl.on("line", line => {
process.stdout.write(`${++lines}: ${line.trim()}\n`);
if (line.trim() === "quit") return rl.close();
rl.prompt();
});
rl.prompt();
});
rl.on("close", () => process.stdout.write(`read ${lines} lines\n`));