Get Argument From Pipe But Also Run Prompts?
Solution 1:
I found a solution using a combination of packages, namely prompts and ttys.
I switched to prompts because it allows you to configure a variable called stdin for each question which means you can decide where to take input from.
Most prompt packages seem to default to using process.stdin as the input. This is normally fine but when you pipe data into a command, process.stdin is occupied by the pipe, hence the problem I was having before. However, if you know that process.stdin is occupied by the pipe you can still get keyboard input from the user.
This is where ttys comes in. It's a very simple package which checks whether pipe has been used or not.
I can almost recreate the successful result I outlined in my question with the following script -- the only thing missing is the pre-prompt message (Going to bring up a prompt). And I've added pipe-args and yargs to show that the piped in data is preserved.
#!/usr/bin/env nodeconst prompts = require("prompts");
const tty = require("tty");
const pipe = require("pipe-args").load();
const argv = require("yargs").argv;
const ttys = require("ttys");
const questions = [0, 1, 2, 3, 4]
  .map(x => ({
    type: "text",
    name: `prompt-${x}`,
    message: "This is a test -- enter something",
    stdin: ttys.stdin
  }));
const onSubmit = function (prompt, answer) {
  console.log("Result", answer); // => { value: 24 }
};
(async () => {
  const response = awaitprompts(questions, { onSubmit });
  console.log(argv);
  ttys.stdin.destroy();
})();
Solution 2:
You can use cat after in a subshell, like this:
(echo"file2.md"; cat) | .myscript.js --f1 file1.md
(echo hello world; cat) | ./prompt-test.js
You can also add exec to do it with one less process:
(echo"file2.md"; execcat) | .myscript.js --f1 file1.md
(echo hello world; execcat) | ./prompt-test.js
You can also put cat on the outside and use -:
cat <(echo"file2.md") - | .myscript.js --f1 file1.md
cat <(echo hello world) - | ./prompt-test.js
Post a Comment for "Get Argument From Pipe But Also Run Prompts?"