cliverse.js 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // cliverse.js
  2. function isWin(){ return /^win/.test(process.platform) }
  3. try {
  4. if(isWin()) {
  5. var win_verse = require('./win_verse')
  6. var shell_verse = win_verse;
  7. }
  8. else {
  9. var lin_verse = require('./lin_verse')
  10. var shell_verse = lin_verse;
  11. }
  12. }
  13. catch(e) {
  14. console.dir(e);
  15. console.error('cli environment detection failed')
  16. }
  17. const BUILD_VERSION = '[VI]Version: {version} - built on {date}[/VI]';
  18. shell_verse.getVersion = function getVersion() { return BUILD_VERSION; }
  19. console.log('----------------------')
  20. // console.dir(c)
  21. console.log('----------------------')
  22. // process.exit()
  23. const fs = require('fs')
  24. var {nodeShellExec, createTask} = require('./nodeshell')
  25. var prompt = function(choices, label, defaultchoice, selectedchoice){
  26. // prompt accepts either an array or an object as choices.
  27. var choices = choices || [];
  28. defaultchoice = defaultchoice || choices[0] || selectedchoice || choices[Object.keys(choices)[0]]
  29. var ci = 0;
  30. return this.prompter.ask(
  31. `${label} \n` + Object.keys(choices).map(
  32. choice => {
  33. ++ci; var choice_label = isNaN(+choice) ? `${ci}) (${choice})` : ci + ')';
  34. return ` ${choice_label} ${choices[choice]} `
  35. }).join('\n')
  36. + `\n d) default ( <= ${ defaultchoice || choices[0]} ) : `
  37. + `\n selected ( <= ${ selectedchoice || defaultchoice || choices[0]} ) : `
  38. ).then(choice => {
  39. // propName = promptable.interpret(propValue)
  40. if(!choice && selectedchoice) return selectedchoice;
  41. if(!choice) return defaultchoice || choices[0];
  42. if(choice && isNaN(+choice)) {
  43. if(choice === 'd') return defaultchoice || choices[0];
  44. try {
  45. return JSON.parse(choice);
  46. }
  47. catch(e) {
  48. // console.error(e)
  49. return choice // Treat it as a string if it is not parsable
  50. }
  51. }
  52. return choices[(+choice) - 1];
  53. })
  54. }
  55. const readline = require("readline");
  56. var cli = {
  57. nodeShellExec
  58. , get prompter() {
  59. var prompt_interface = {
  60. ask : function(q){
  61. // Needs to be serialized. Parallel asks are not possible.
  62. const clii = readline.createInterface({ input: process.stdin, output: process.stdout });
  63. return new Promise((resolve, reject)=>{
  64. clii.question(q, (answer)=>{
  65. console.log(answer)
  66. try {
  67. clii.close();
  68. console.log("readline.createInterface closed");
  69. resolve(answer)
  70. }
  71. catch(e) {
  72. reject(e)
  73. }
  74. })
  75. })
  76. }
  77. }
  78. return prompt_interface
  79. }
  80. , prompt
  81. , createTask
  82. , shell_verse : shell_verse
  83. }
  84. module.exports = cli