交互提示

交互提示

交互提示(prompts)是你可以用来接收用户输入的交互式终端组件。Ace 的交互提示由 @poppinss/prompts 包提供支持,它支持以下提示类型。

  • input
  • list
  • password
  • confirm
  • toggle
  • select
  • multi-select
  • autocomplete

Ace 的交互提示在设计时就考虑了测试。在编写测试时,你可以拦截提示并以编程方式对它们作出响应。

相关阅读:测试 ace 命令

显示提示

你可以使用所有 Ace 命令上可用的 this.prompt 属性来显示提示。

import { BaseCommand } from '@adonisjs/core/ace'
export default class GreetCommand extends BaseCommand {
async run() {
const modelName = await this.prompt.ask('Enter the model name')
console.log(modelName)
}
}

提示选项

以下是提示接受的选项列表。你可以将此表作为唯一权威参考。

选项 被以下接受 描述

default (String)

所有提示

未输入值时使用的默认值。在 selectmultiselectautocomplete 提示中,该值必须是选项数组的索引。

name (String)

所有提示

提示的唯一名称

hint (String)

所有提示

显示在提示旁边的提示文本

result (Function)

所有提示

转换提示的返回值。result 方法的输入值取决于提示类型。例如,multiselect 提示的值将是一个已选选项的数组。

{
result(value) {
return value.toUpperCase()
}
}

format (Function)

所有提示

在用户键入时实时格式化输入值。格式化仅应用于 CLI 输出,不影响返回值。

{
format(value) {
return value.toUpperCase()
}
}

validate (Function)

所有提示

校验用户输入。从方法返回 true 将通过校验。返回 false 或错误消息字符串将被视为失败。

{
validate(value) {
return value.length > 6
? true
: 'Model name must be 6 characters long'
}
}

limit (Number)

autocomplete

限制要显示的选项数量。你需要滚动才能看到其余的选项。

文本输入

你可以使用 prompt.ask 方法渲染用于接受文本输入的提示。该方法接受提示消息作为第一个参数,以及 选项对象 作为第二个参数。

await this.prompt.ask('Enter the model name')
// 校验输入
await this.prompt.ask('Enter the model name', {
validate(value) {
return value.length > 0
}
})
// 默认值
await this.prompt.ask('Enter the model name', {
default: 'User'
})

掩码输入

顾名思义,掩码输入提示会遮蔽终端中的用户输入。你可以使用 prompt.secure 方法显示掩码提示。

该方法接受提示消息作为第一个参数,以及 选项对象 作为第二个参数。

await this.prompt.secure('Enter account password')
await this.prompt.secure('Enter account password', {
validate(value) {
return value.length < 6
? 'Password must be 6 characters long'
: true
}
})

选项列表

你可以使用 prompt.choice 方法显示用于单选的列表。该方法接受以下参数。

  1. 提示消息。
  2. 选项数组。
  3. 可选的 选项对象
await this.prompt.choice('Select package manager', [
'npm',
'yarn',
'pnpm'
])

要指定不同的显示值,你可以将选项定义为对象。name 属性作为提示结果返回,message 属性显示在终端中。

await this.prompt.choice('Select database driver', [
{
name: 'sqlite',
message: 'SQLite'
},
{
name: 'mysql',
message: 'MySQL'
},
{
name: 'pg',
message: 'PostgreSQL'
}
])

多选选项

你可以使用 prompt.multiple 方法允许在选项列表中进行多项选择。接受的参数与 choice 提示相同。

await this.prompt.multiple('Select database drivers', [
{
name: 'sqlite',
message: 'SQLite'
},
{
name: 'mysql',
message: 'MySQL'
},
{
name: 'pg',
message: 'PostgreSQL'
}
])

确认操作

你可以使用 prompt.confirm 方法显示带有 Yes/No 选项的确认提示。该方法接受提示消息作为第一个参数,以及 选项对象 作为第二个参数。

confirm 提示返回一个布尔值。

const deleteFiles = await this.prompt.confirm(
'Want to delete all files?'
)
if (deleteFiles) {
}

要自定义 Yes/No 选项的显示值,你可以使用 prompt.toggle 方法。

const deleteFiles = await this.prompt.toggle(
'Want to delete all files?',
['Yup', 'Nope']
)
if (deleteFiles) {
}

自动补全

autocomplete 提示是 select 和 multi-select 提示的组合,但具备对选项进行模糊搜索的能力。

const selectedCity = await this.prompt.autocomplete(
'Select your city',
await getCitiesList()
)