-
Notifications
You must be signed in to change notification settings - Fork 198
Description
Creating a new issue to track this as #57 was incorrectly closed, and I don't have the access to re-open it as valid:
process.stdout.cursorTois only defined when the shell you're running in isn't capturing the output. You need to checkprocess.stdout.isTTYbefore trying to access it.Source:
https://nodejs.org/api/process.html#a-note-on-process-io
https://nodejs.org/api/tty.html#writestreamcursortox-y-callbackOriginally posted by @ItsHarper in #57 (comment)
process.stdout.cursorTois only defined when the shell you're running in isn't capturing the output. You need to checkprocess.stdout.isTTYbefore trying to access it.
- https://nodejs.org/api/process.html#a-note-on-process-io
To check if a stream is connected to a TTY context, check the
isTTYproperty.- https://nodejs.org/api/tty.html
When Node.js detects that it is being run with a text terminal ("TTY") attached,
process.stdinwill, by default, be initialized as an instance oftty.ReadStreamand bothprocess.stdoutandprocess.stderrwill, by default, be instances oftty.WriteStream. The preferred method of determining whether Node.js is being run within a TTY context is to check that the value of theprocess.stdout.isTTYproperty istrueIs it possible by any chance that you're trying to run humanify using an old node.js? It seems that
stdout.cursorTois introduced in node.js version 17, so this implies that your node.js version would have been under that.Based on the above, we can see this behaviour in node v22, so it wasn't just an issue with running an older version of node:
⇒ node --version v22.16.0⇒ node -p -e "Boolean(process.stdout.isTTY)" true ⇒ node -p -e "Boolean(process.stdout.isTTY)" | cat false⇒ node -p -e "process.stdout.cursorTo(0)" true ⇒ node -p -e "process.stdout.cursorTo(0)" | cat [eval]:1 process.stdout.cursorTo(0) ^ TypeError: process.stdout.cursorTo is not a function at [eval]:1:16 at runScriptInThisContext (node:internal/vm:209:10) at node:internal/process/execution:449:12 at [eval]-wrapper:6:24 at runScriptInContext (node:internal/process/execution:447:60) at evalFunction (node:internal/process/execution:87:30) at evalScript (node:internal/process/execution:99:3) at node:internal/main/eval_string:74:3 Node.js v22.16.0
I'll fix the underlying issue in coming versions.
@jehna So this is still a valid issue that should be fixed, and this issue should be re-opened to track that.
Usage:
Lines 25 to 31 in 7beba2d
export function showPercentage(percentage: number) { const percentageStr = Math.round(percentage * 100); if (!verbose.enabled) { process.stdout.clearLine?.(0); process.stdout.cursorTo(0); process.stdout.write(`Processing: ${percentageStr}%`); } else { Example of a potential fix:
export function showPercentage(percentage: number) { const percentageStr = Math.round(percentage * 100); const canUseCursorOps = process.stdout.isTTY && typeof process.stdout.clearLine === "function" && typeof process.stdout.cursorTo === "function"; if (!verbose.enabled && canUseCursorOps) { process.stdout.clearLine(0); process.stdout.cursorTo(0); process.stdout.write(`Processing: ${percentageStr}%`); } else { verbose.log(`Processing: ${percentageStr}%`); } if (percentage === 1 && canUseCursorOps) { process.stdout.write("\n"); } }Ideally a similar more explicit fix would be added to
clearLineinshowProgressas well, instead of just relying on the optional chaining syntax.
You can see that this would also be an issue with
process.stdout.clearLine:⇒ node -p -e "process.stdout.clearLine(0)" | cat [eval]:1 process.stdout.clearLine(0) ^ TypeError: process.stdout.clearLine is not a function at [eval]:1:16 at runScriptInThisContext (node:internal/vm:209:10) at node:internal/process/execution:449:12 at [eval]-wrapper:6:24 at runScriptInContext (node:internal/process/execution:447:60) at evalFunction (node:internal/process/execution:87:30) at evalScript (node:internal/process/execution:99:3) at node:internal/main/eval_string:74:3 Node.js v22.16.0Except that in the code, you're calling
process.stdout.clearLinewith the optional chaining syntax like this:Line 10 in 7beba2d
process.stdout.clearLine?.(0); Line 28 in 7beba2d
process.stdout.clearLine?.(0); Whereas for
process.stdout.cursorToyou're not using the optional chaining syntax:Line 29 in 7beba2d
process.stdout.cursorTo(0); Looking at the git blame / history, the progress feature seemed to be first added in 70e3196 on Aug 9, 2024, and neither used the optional chaining syntax:
But then the optional chaining was added to
clearLinein 05b6a8e on Aug 9, 2024 as it broke the CI:Originally posted by @0xdevalias in #57 (comment)