Aceite a entrada da linha de comando em Node.js

Como criar um programa Node.js de CLI interativa?

Desde a versão 7 o Node.js possui o módulo readline para fazer exatamente isso: obter entradas de uma stream de leitura, como a process.stdin, via terminal, durante a execução de um programa Node.js, uma linha por vez.

const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
})
readline.question(`What's your name?`, name => {
console.log(`Hi ${name}!`)
readline.close()
})

Esse trecho de código pergunta o nome do usuário, e uma vez que o texto é inserido e o usuário pressiona enter, nós enviamos uma saudação.

O método question() exibe o primeiro parâmetro (a pergunta) e aguarda pela entrada do usuário. A função de callback é invocada uma vez que o enter é pressionado.

Nessa função de callback, nós fechamos a interface do readline.

readline oferece diversos outros métodos, e você pode conferir todos na documentação linkada acima.

Se você precisa solicitar uma senha, o ideal é que os caracteres digitados sejam trocados pelo símbolo de *.

A maneira mais simples de fazer isso é utilizar o pacote readline-sync, que é muito similar em termos de API.

Outra solução mais completa e abstrata é fornecida pelo pacote Inquirer.js.

Instale-o utilizando npm install inquirer, e então você poderá replicar o código acima dessa forma:

const inquirer = require('inquirer')
var questions = [
{
type: 'input',
name: 'name',
message: "What's your name?"
}
]
inquirer.prompt(questions).then(answers => {
console.log(`Hi ${answers['name']}!`)
})

Inquirer.js permite com que você faça diversas coisas como perguntas de múltipla escolha, ter radio buttons, confirmações e muito mais.

Vale a pena conhecer todas as alternativas, especialmente as nativas do Node.js, mas se você planeja levar a CLI para outro nível, Inquirer.js é ótima escolha.