この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
どうも。CX事業本部Delivery部のえーたん(@eetann092)です。
lukeed/kleurとterkelg/promptsを使ってみたので紹介します。
kleur使ってみた
先にkleurを紹介します。
kleurはターミナルでの出力に簡単に色を付けることができるNode.jsライブラリです。文字や背景の色を変えるだけではなく、下線や打ち消し線といった装飾もできます。 以下が使ってみた例です。
const kleur = require("kleur")
console.log(kleur.red("red"))
console.log(kleur.green("green"))
console.log(kleur.yellow("yellow"))
console.log(kleur.blue("blue"))
console.log(kleur.magenta("magenta"))
console.log(kleur.bgWhite().black("bgWhite black"))
console.log(kleur.bgBlack().white("bgBlack white"))
console.log(kleur.bgBlack().gray("bgBlack gray"))
console.log(kleur.bgBlack().grey("bgBlack grey"))
console.log(kleur.bgBlack("bgBlack"))
console.log(kleur.bgRed("bgRed"))
console.log(kleur.bgGreen("bgGreen")) console.log(kleur.bgYellow("bgYellow"))
console.log(kleur.bgBlue("bgBlue"))
console.log(kleur.bgMagenta("bgMagenta"))
console.log(kleur.bgWhite("bgWhite"))
console.log(kleur.bold("bold"))
console.log(kleur.bgBlue(`bgBlue and ${kleur.dim("dim")}`))
console.log(kleur.underline("underline"))
console.log(kleur.bgBlue(`bgBlue and ${kleur.inverse("inverse")}`))
console.log(kleur.strikethrough("strikethrough"))
console.log(kleur.cyan("cyan"))
console.log(kleur.bgCyan("bgCyan"))
console.log(kleur.italic("italic"))
console.log(kleur.bgBlue(`bgBlue and ${kleur.hidden("hidden")}`))
筆者の環境では、cyanやイタリック、hidden
がうまく表示されていないようです。おそらくターミナルの色やフォントの設定によるものだと思います。正しく表示できるようになったら追記します。
kleur.bgBlack().gray("bgBlack gray")
のようにチェインで書けるほか、以下のようにネストして書くこともできます。
const {black, red, bgGreen, bgYellow, underline} = require("kleur")
console.log(bgYellow(underline(black("bgYellow(underline(black))"))))
console.log(red(bgGreen("red(bgGreen)")))
kleur.dim
は文字色を薄暗くしてくれる装飾です。
console.log(red(`red ${dim("dim")}`))
console.log(green(`green ${dim("dim")}`))
console.log(yellow(`yellow ${dim("dim")}`))
console.log(blue(`blue ${dim("dim")}`))
console.log(magenta(`magenta ${dim("dim")}`))
console.log(bgWhite().black(`bgWhite black ${dim("dim")}`))
console.log(bgBlack().white(`bgBlack white ${dim("dim")}`))
console.log(bgBlack().gray(`bgBlack gray ${dim("dim")}`))
console.log(bgBlack().grey(`bgBlack grey ${dim("dim")}`))
console.log(bgBlack(`bgBlack ${dim("dim")}`))
console.log(bgRed(`bgRed ${dim("dim")}`))
console.log(bgGreen(`bgGreen ${dim("dim")}`))
console.log(bgYellow(`bgYellow ${dim("dim")}`))
console.log(bgBlue(`bgBlue ${dim("dim")}`))
console.log(bgMagenta(`bgMagenta ${dim("dim")}`))
console.log(bgWhite(`bgWhite ${dim("dim")}`))
kleur.inverse
を使った部分は、文字色と背景色が入れ替わって表示されます。
console.log(red(`red ${inverse("inverse")} undo`))
console.log(green(`green ${inverse("inverse")} undo`))
console.log(yellow(`yellow ${inverse("inverse")} undo`))
console.log(blue(`blue ${inverse("inverse")} undo`))
console.log(magenta(`magenta ${inverse("inverse")} undo`))
console.log(bgWhite().black(`bgWhite black ${inverse("inverse")} undo`))
console.log(bgBlack().white(`bgBlack white ${inverse("inverse")} undo`))
console.log(bgBlack().gray(`bgBlack gray ${inverse("inverse")} undo`))
console.log(bgBlack().grey(`bgBlack grey ${inverse("inverse")} undo`))
console.log(bgBlack(`bgBlack ${inverse("inverse")} undo`))
console.log(bgRed(`bgRed ${inverse("inverse")} undo`))
console.log(bgGreen(`bgGreen ${inverse("inverse")} undo`))
console.log(bgYellow(`bgYellow ${inverse("inverse")} undo`))
console.log(bgBlue(`bgBlue ${inverse("inverse")} undo`))
console.log(bgMagenta(`bgMagenta ${inverse("inverse")} undo`))
console.log(bgWhite(`bgWhite ${inverse("inverse")} undo`))
prompts使ってみた
promptsは、CLIでよくあるプロンプトを簡単に作ることができるNode.jsライブラリです。引数にプロンプトの種類と表示したい内容を指定します。以下は文字入力のプロンプトの例です。
const prompts = require('prompts');
(async () => {
const response = await prompts({
type: "text",
message: "名前を入力してください",
name: "username",
initial: "Kerry",
validate: name => name.match(/^a{3,}/) ? "適当に入力しないで?" : true
});
console.log(response);
})();
以下が実行した例です。色が見づらいという人向けのカスタマイズは後で説明します。
type: "text",
message: "名前を入力してください",
name: "username",
initial: "Kerry",
validate: name => name.match(/^a{3,}/) ? "適当に入力しないで?" : true
name
で指定した文字列がresponse
のキーになります。初期値はinitial
に指定できます。
バリデーションはvalidate
で可能です。validate
では、true
以外を返すと「無効あると警告するメッセージ」として表示できます。
promptsでkleurが使える
onRender
では、先程紹介したkleurを使うことで、プロンプトの文字や背景色、装飾を変更できます。
const prompts = require('prompts');
(async () => {
const response = await prompts({
type: "text",
message: "onRenderのthis.msgがあったら上書きされます",
name: "username",
initial: "Kerry",
onRender(kleur) {
this.msg = `${kleur.bgBlue().yellow().underline("kleurが使える")}`;
}
});
console.log(response);
})();
promptsの日時入力を使ってみた
promptsには日時入力があります。
以下は2022年12月7日(水) 14時10分
のような形式で日時入力する例です。
const prompts = require('prompts');
(async () => {
const response = await prompts({
type: "date",
name: "day",
message: "空いてる日時を教えて下さい",
initial: new Date(),
validate: date => date < Date.now() ? "今日以降を指定してください": true,
mask: "YYYY年M月D日(dddd) H時m分",
locales: {
weekdays: ['日', '月', '火', '水', '木', '金', '土'],
},
});
console.log(response);
})();
カーソルの上下で数値を上下し、左右に動かすことで「年、月、日……」と移動できます。
デフォルトでは日本語には対応していなかったため、mask
とlocales
に自分でフォーマット指定しました。
mask: "YYYY年M月D日(dddd) H時m分",
locales: {
weekdays: ['日', '月', '火', '水', '木', '金', '土'],
},
実装を見てみると、mask
のフォーマットのdddd
はlocales
のweekdays
に対応しているようです。そのため、mask
の曜日部分にはdddd
を、locales
のweekdays
に日本語での曜日を指定しました。
CLIで簡単に日付を入力させることができるのは良いですね。
エラーメッセージが見づらい人向け
デフォルトのエラーメッセージは背景色が赤です。見づらい方もいると思うので、エラーメッセージの色を変えてみました。
まず、エラーメッセージはerrorMsgで取得できることと、
エラーメッセージの色を定義している箇所を見つけました。
エラーメッセージの表示には、kleurのred
が使われているようですね。
したがってonRender
内でerrorMsg
の表示をkleur
を使って変えることにしました。
const prompts = require('prompts');
(async () => {
const response = await prompts({
type: "text",
message: "名前を入力してください",
name: "username",
initial: "Kerry",
validate: name => name.match(/^a{3,}/) ? "適当に入力しないで?" : true,
onRender(kleur) {
this.errorMsg = `${kleur.reset().bgYellow().black(this.errorMsg)}`;
}
});
console.log(response);
})();
以下がBefore/Afterです。
最後に
promptsにはconfirmや絞り込みなど、他にもさまざまなの種類のプロンプトが使えます。ただし、2022年11月11日現在、promptsは1年ほどメンテナンスされていない状態でしたのでご注意ください。
今回使用したサンプルのコードは以下のリポジトリにあります。