Inquirer

20 2月

Inquirer提供了友好的命令行交互方式,支持:询问,输入回答,校验等。

  • Question对象
  • Answers对象
  • Separator分隔符
  • 示例
    • list
    • rawlist
    • expand
    • checkbox
    • confirm
    • input
    • password
    • editor
  • 插件

API不复杂,询问:inquirer.prompt(questions) -> promise,参数是Question对象数组,返回一个promise。

Question对象

type:String型,可设置list,rawlist,expand,checkbox,confirm,input(默认),password,editor

name:String型,answer的key

message:String | Function型,问题。
    如果定义为函数,第一个参数将是当前会话的答案,和上面的name形成key-value对。

default:String | Number | Boolean | Array | Function型,如果用户没有输入任何内容,就使用默认值。
    如果定义为函数,第一个参数将是当前会话的答案

choices:Array | Function型,问题数组,可以是简单的字符串。
    选项数组还可以包含一个Separator分隔符。如果定义为函数,第一个参数将是当前会话的答案。

validate:Function型,校验用户的输入。无效返回false,并提供错误消息。

filter:Function型,接收用户输入,处理后返回answers。类似vue里的filter,常用于处理文本。

transformer:Function型,接收用户输入,返回一个转换后的值显示给用户。转换只影响在编辑时显示的内容。它不修改answers。

when:Function | Boolean型,接收当前用户的answers,并根据是否应询问此问题,返回true或false。

pageSize:Number型,更改使用list、rawList、expand、checkbox时的行数。

prefix,suffix:String型,前缀和后缀。

// default, choices, validate, filter,when被定义成Function的话,都支持异步调用,可以返回promise。

Answers对象

是个k-v对象,value值如下:

  • confirm:返回bool
  • input:返回string
  • rawlist,list:返回被选中的值

Separator分隔符

支持分隔符,默认是——–

choices: [ "Choice A", new inquirer.Separator(), "choice B" ]

示例

list

支持type, name, message, choices[, default, filter]属性。

var inquirer = require('inquirer');

inquirer
  .prompt([                           // 数组表示有多个询问
    {                                 // 第一个询问
      type: 'list',
      name: 'theme',                  // 第一个answer的key
      message: 'What do you want to do?',
      choices: [
        'Order a pizza',
        'Make a reservation',
        new inquirer.Separator(),     // choices里可以有分隔符
        'Ask for opening hours',
        {
          name: 'Contact support',    // 可以是对象,name就是显示的字符串
          disabled: 'Unavailable at this time'
        },
        'Talk to the receptionist'
      ]
    },
    {                                 // 第二个询问
      type: 'list',
      name: 'size',                   // 第二个answer的key
      message: 'What size do you need?',
      choices: ['Jumbo', 'Large', 'Standard', 'Medium', 'Small', 'Micro'],
      filter: function(val) {         // filter处理answer,这里将用户的选择全部转成小写字母
        return val.toLowerCase();
      }
    }
  ])
  .then(answers => {
    console.log(JSON.stringify(answers, null, '  '));
  });



rawlist

支持type, name, message, choices[, default, filter]属性。

将list的代码中type改成rawlist,效果如下,询问界面稍有不同,左侧出现数字index,结果完全一致。


expand

支持type, name, message, choices[, default]属性。

常用于对一个问题有多种答案。例如文件冲突,是覆盖,还是显示diff等。注意choices里的对象必须有个key属性,值只能是是小写字母。默认会有个h,输入h会显示帮助信息(就是显示choices里的对象的name)

var inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'expand',
      message: 'Conflict on `file.js`: ',
      name: 'overwrite',
      choices: [
        {
          key: 'y',                 // 必须有个小写字母的key
          name: 'Overwrite',
          value: 'overwrite'
        },
        {
          key: 'a',
          name: 'Overwrite this one and all next',
          value: 'overwrite_all'
        },
        {
          key: 'd',
          name: 'Show diff',
          value: 'diff'
        },
        new inquirer.Separator(),
        {
          key: 'x',
          name: 'Abort',
          value: 'abort'
        }
      ]
    }
  ])
  .then(answers => {
    console.log(JSON.stringify(answers, null, '  '));
  });


checkbox

支持type, name, message, choices[, filter, validate, default]属性。

加上{checked: true}表示默认选中项,{disabled: ‘xxx’}表示禁用和禁用的理由。

var inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'checkbox',
      message: 'Select toppings',
      name: 'toppings',
      choices: [
        new inquirer.Separator(' = The Cheeses = '),    // 可以自定义分隔符
        {
          name: 'Mozzarella',
          checked: true                                 // 表示默认选中项
        },
        {
          name: 'Cheddar'
        },
        {
          name: 'Parmesan'
        },
        new inquirer.Separator(' = The usual ='),
        {
          name: 'Mushroom'
        },
        {
          name: 'Tomato',
          disabled: 'out of stock'                      // 可以设禁用
        }
      ],
      validate: function(answer) {
        if (answer.length < 1) { 
          return 'You must choose at least one topping.'; 
        } 
        return true; 
      } 
    } 
  ]) 
  .then(answers => {
    console.log(JSON.stringify(answers, null, '  '));
  });


confirm

支持type, name, message, [default]属性。询问 true/false:

var inquirer = require('inquirer');

var questions = [
    {
        type: 'confirm',
        name: 'toBeDelivered',
        message: 'Is this for delivery?',
        default: false           // 给个默认值,用户不输入直接回车的话就用这个默认值
    }
];

inquirer.prompt(questions).then(answers => {
    console.log('\nOrder receipt:');
    console.log(JSON.stringify(answers, null, '  '));
});


input

支持type, name, message[, default, filter, validate, transformer]属性。

var inquirer = require('inquirer');
var chalkPipe = require('chalk-pipe');

var questions = [
  {
    type: 'input',
    name: 'first_name',
    message: "What's your first name"
  },
  {
    type: 'input',
    name: 'last_name',
    message: "What's your last name",
    default: function() {
      return 'Doe';
    }
  },
  {
    type: 'input',
    name: 'fav_color',
    message: "What's your favorite color",
    transformer: function(color, answers, flags) {     // transformer只影响显示效果,不影响answers结果
      const text = chalkPipe(color)(color);            // 显示时根据用户输入的名字,用chalk-pipe展示颜色效果
      if (flags.isFinal) {
        return text + '!';
      }

      return text;
    }
  },
  {
    type: 'input',
    name: 'phone',
    message: "What's your phone number",
    validate: function(value) {                        // 校验用户输入是否合法
      var pass = value.match(
        /^([01]{1})?[-.\s]?\(?(\d{3})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})\s?((?:#|ext\.?\s?|x\.?\s?){1}(?:\d+)?)?$/i
      );
      if (pass) {
        return true;
      }

      return 'Please enter a valid phone number';
    }
  }
];

inquirer.prompt(questions).then(answers => {
  console.log(JSON.stringify(answers, null, '  '));
});

password

支持type, name, message, mask,[, default, filter, validate]属性。

const inquirer = require('inquirer');

inquirer
  .prompt([
    {
      type: 'password',
      message: 'Enter a password',
      name: 'password1',
    },
    {
      type: 'password',
      message: 'Enter a masked password',
      name: 'password2',
      mask: '*',              // 密码打星号
    }
  ])
  .then(answers => console.log(JSON.stringify(answers, null, '  ')));

editor

支持type, name, message[, default, filter, validate]属性。就是个vi编辑器。

var inquirer = require('inquirer');

var questions = [
  {
    type: 'editor',
    name: 'bio',
    message: 'Please write a short bio of at least 3 lines.',
    validate: function(text) {
      if (text.split('\n').length < 3) { return 'Must be at least 3 lines.'; } return true; } } ]; inquirer.prompt(questions).then(answers => {
  console.log(JSON.stringify(answers, null, '  '));
});

插件

autocomplete

checkbox-plus

datetime

inquirer-select-line

inquirer-fuzzy-path

inquirer-chalk-pipe

inquirer-prompt-suggest

inquirer-s3

inquirer-autosubmit-prompt

inquirer-search-checkbox

command

发表评论

电子邮件地址不会被公开。 必填项已用*标注