Как установить значение по умолчанию для ответа с помощью Inquirer? - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь создать небольшой скрипт сборки, который будет запрашивать у пользователя местоположение заголовков mysql, если они не найдены в пути по умолчанию.Сейчас я использую inquirer, чтобы запросить у пользователя ввод, который работает нормально, но я столкнулся со следующей проблемой:

'use strict'
const inquirer = require('inquirer')
const fs = require('fs')

const MYSQL_INCLUDE_DIR = '/usr/include/mysql'

let questions = [
  {
    type: 'input',
    name: 'MYSQL_INCLUDE_DIR',
    message: 'Enter path to mysql headers',
    default: MYSQL_INCLUDE_DIR,
    when: (answers) => {
      return !fs.existsSync(MYSQL_INCLUDE_DIR)
    },
    validate: (path) => {
      return fs.existsSync(path)
    }
  }
]

inquirer.prompt(questions)
  .then((answers) => {
    // Problem is that answers.MYSQL_INCLUDE_DIR might be undefined at this point.
  })

Если путь по умолчанию к заголовкам mysqlнайденный, тогда вопрос не будет отображаться, и поэтому ответ не будет задан.Как я могу установить значение по умолчанию для вопроса, фактически не показывая его пользователю?

Решение вышеизложенного также позволило бы сделать это вместо использования глобальной переменной:

let questions = [
  {
    type: 'input',
    name: 'MYSQL_INCLUDE_DIR',
    message: 'Enter path to mysql headers',
    default: MYSQL_INCLUDE_DIR,
    when: (answers) => {
      return !fs.existsSync(answers.MYSQL_INCLUDE_DIR)
    },
    validate: (path) => {
      return fs.existsSync(path)
    }
  }
]

1 Ответ

0 голосов
/ 16 октября 2018

Как насчет:

inquirer.prompt(questions)
  .then((answers) => {
    const mysqlIncludeDir = answers && answers.MYSQL_INCLUDE_DIR ? answers.MYSQL_INCLUDE_DIR : MYSQL_INCLUDE_DIR;
  })

Или более кратко:

inquirer.prompt(questions)
  .then((answers) => {
    const theAnswers = {
      MYSQL_INCLUDE_DIR,
      ...answers
    };
    // theAnswers should be the answers you want
    const mysqlIncludeDir = theAnswers.MYSQL_INCLUDE_DIR;
    // mysqlIncludeDir should now be same as first solution above
  })

Или более обобщенно с помощью lodash, что-то вроде:

const myPrompt = (questions) => inquirer.prompt(questions)
  .then((answers) => {
    return {
      ...(_.omitBy(_.mapValues(_.keyBy(questions, 'name'), 'default'), q => !q)),
      ...answers
    };
  })

myPrompt(questions)
  .then((answers) => {
    // should be the answers you want
  })

Этопоследнее решение должно вызывать любой вопрос с default и when, которые в противном случае могли бы скрыть его значение по умолчанию, чтобы его значение по умолчанию было принудительно включено в ответы.

...