交互提示
交互提示(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)
}
}
提示选项
以下是提示接受的选项列表。你可以将此表作为唯一权威参考。
| 选项 | 被以下接受 | 描述 |
|
|
所有提示 |
未输入值时使用的默认值。在 |
|
|
所有提示 |
提示的唯一名称 |
|
|
所有提示 |
显示在提示旁边的提示文本 |
|
| 所有提示 |
转换提示的返回值。 |
|
| 所有提示 |
在用户键入时实时格式化输入值。格式化仅应用于 CLI 输出,不影响返回值。 |
|
| 所有提示 |
校验用户输入。从方法返回 |
|
|
|
限制要显示的选项数量。你需要滚动才能看到其余的选项。 |
文本输入
你可以使用 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 方法显示用于单选的列表。该方法接受以下参数。
- 提示消息。
- 选项数组。
- 可选的 选项对象。
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()
)