import { createInterface } from 'node:readline'; import { Cancelled, type Io } from '../src/cli/userWizard'; export function makeIo(): { io: Io; close: () => void } { const rl = createInterface({ input: process.stdin, output: process.stdout }); const queue: string[] = []; let waiting: ((line: string | null) => void) | null = null; let ended = false; rl.on('line', (line) => { if (waiting) { const w = waiting; waiting = null; w(line); } else { queue.push(line); } }); rl.on('close', () => { ended = true; if (waiting) { const w = waiting; waiting = null; w(null); } }); const io: Io = { async ask(question) { rl.setPrompt(question); rl.prompt(); const line = queue.length > 0 ? queue.shift()! : ended ? null : await new Promise((r) => (waiting = r)); if (line === null) throw new Cancelled(); return line.trim(); }, say(line = '') { console.log(line); }, }; return { io, close: () => rl.close() }; }