From 83a286949bcb3ecf56301cb7bd57f080fbdadc34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9?= Date: Sun, 10 Mar 2024 00:32:36 +0000 Subject: [PATCH] feat(prompts): add few prompts --- src/index.tsx | 21 ---------------- src/lib/prompts/cancel.ts | 6 +++++ src/lib/prompts/index.ts | 5 ++++ src/lib/prompts/intro.ts | 6 +++++ src/lib/prompts/log.ts | 43 ++++++++++++++++++++++++++++++++ src/lib/prompts/note.ts | 39 +++++++++++++++++++++++++++++ src/lib/prompts/outro.ts | 6 +++++ src/lib/prompts/select-option.ts | 4 +-- src/lib/prompts/types.ts | 5 ++++ 9 files changed, 112 insertions(+), 23 deletions(-) create mode 100644 src/lib/prompts/cancel.ts create mode 100644 src/lib/prompts/intro.ts create mode 100644 src/lib/prompts/log.ts create mode 100644 src/lib/prompts/note.ts create mode 100644 src/lib/prompts/outro.ts diff --git a/src/index.tsx b/src/index.tsx index 4d54d26..e69de29 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,21 +0,0 @@ -import { Confirm, MultiSelect, Password, Select, SelectOption } from "~/lib/prompts/" - -// const p = await -// const p2 = await -// const p3 = await - -// const p4 = await ( -// -// ) - -// const p5 = ( -// -// -// -// -// -// ) diff --git a/src/lib/prompts/cancel.ts b/src/lib/prompts/cancel.ts new file mode 100644 index 0000000..6b04c41 --- /dev/null +++ b/src/lib/prompts/cancel.ts @@ -0,0 +1,6 @@ +import c from "picocolors" +import { S } from "./symbols" + +export function Cancel({ message = "" }: { message?: string }) { + process.stdout.write(`${c.gray(S.BAR_END)} ${c.red(message)}\n\n`) +} diff --git a/src/lib/prompts/index.ts b/src/lib/prompts/index.ts index de57844..73fcdd8 100644 --- a/src/lib/prompts/index.ts +++ b/src/lib/prompts/index.ts @@ -5,3 +5,8 @@ export * from "./confirm" export * from "./select" export * from "./select-option" export * from "./multi-select" +export * from "./note" +export * from "./cancel" +export * from "./intro" +export * from "./outro" +export * from "./log" diff --git a/src/lib/prompts/intro.ts b/src/lib/prompts/intro.ts new file mode 100644 index 0000000..e77a38b --- /dev/null +++ b/src/lib/prompts/intro.ts @@ -0,0 +1,6 @@ +import c from "picocolors" +import { S } from "./symbols" + +export function Intro({ title = "" }: { title?: string }) { + process.stdout.write(`${c.gray(S.BAR_START)} ${title}\n`) +} diff --git a/src/lib/prompts/log.ts b/src/lib/prompts/log.ts new file mode 100644 index 0000000..da23b07 --- /dev/null +++ b/src/lib/prompts/log.ts @@ -0,0 +1,43 @@ +import c from "picocolors" +import { S } from "./symbols" +import type { LogMessageOptions } from "./types" + +function Message({ message, symbol }: LogMessageOptions = {}) { + const parts = [`${c.gray(S.BAR)}`] + + if (message) { + const [firstLine, ...lines] = message.split("\n") + parts.push(`${symbol} ${firstLine}`, ...lines.map(ln => `${c.gray(S.BAR)} ${ln}`)) + } + + process.stdout.write(`${parts.join("\n")}\n`) +} + +function Info({ message }: { message: string }) { + Message({ message, symbol: c.blue(S.INFO) }) +} + +function Success({ message }: { message: string }) { + Message({ message, symbol: c.green(S.SUCCESS) }) +} + +function Step({ message }: { message: string }) { + Message({ message, symbol: c.green(S.STEP_SUBMIT) }) +} + +function Warning({ message }: { message: string }) { + Message({ message, symbol: c.yellow(S.WARN) }) +} + +function error({ message }: { message: string }) { + Message({ message, symbol: c.red(S.ERROR) }) +} + +export const Log = { + Message, + Info, + Success, + Step, + Warning, + Error: error, +} \ No newline at end of file diff --git a/src/lib/prompts/note.ts b/src/lib/prompts/note.ts new file mode 100644 index 0000000..270d791 --- /dev/null +++ b/src/lib/prompts/note.ts @@ -0,0 +1,39 @@ +import c from "picocolors" +import { S } from "./symbols" + +const strip = (str: string) => str.replace(ansiRegex(), "") + +export function Note({ message = "", title ="" }: { message?: string; title?: string }) { + const lines = `\n${message}\n`.split("\n") + const titleLen = strip(title).length + + const len = + Math.max( + lines.reduce((sum, ln) => { + const line = strip(ln) + return line.length > sum ? line.length : sum + }, 0), + titleLen + ) + 2 + + const msg = lines + .map(ln => `${c.gray(S.BAR)} ${c.dim(ln)}${" ".repeat(len - strip(ln).length)}${c.gray(S.BAR)}`) + .join("\n") + + process.stdout.write( + `${c.gray(S.BAR)}\n${c.green(S.STEP_SUBMIT)} ${c.reset(title)} ${c.gray( + S.BAR_H.repeat(Math.max(len - titleLen - 1, 1)) + S.CORNER_TOP_RIGHT + )}\n${msg}\n${c.gray(S.CONNECT_LEFT + S.BAR_H.repeat(len + 2) + S.CORNER_BOTTOM_RIGHT)}\n` + ) +} + +// Adapted from https://github.com/chalk/ansi-regex +// @see LICENSE +function ansiRegex() { + const pattern = [ + "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", + "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))", + ].join("|") + + return new RegExp(pattern, "g") +} diff --git a/src/lib/prompts/outro.ts b/src/lib/prompts/outro.ts new file mode 100644 index 0000000..4f8d537 --- /dev/null +++ b/src/lib/prompts/outro.ts @@ -0,0 +1,6 @@ +import c from "picocolors" +import { S } from "./symbols" + +export function Outro({ message = "" }: { message?: string }) { + process.stdout.write(`${c.gray(S.BAR)}\n${c.gray(S.BAR_END)} ${message}\n\n`) +} diff --git a/src/lib/prompts/select-option.ts b/src/lib/prompts/select-option.ts index 659286f..f01c4fc 100644 --- a/src/lib/prompts/select-option.ts +++ b/src/lib/prompts/select-option.ts @@ -1,5 +1,5 @@ -import type { Option } from "./types"; +import type { Option } from "./types" export function SelectOption({ value, label, hint }: Option) { return { value, label, hint } -} \ No newline at end of file +} diff --git a/src/lib/prompts/types.ts b/src/lib/prompts/types.ts index e9661cc..778dea7 100644 --- a/src/lib/prompts/types.ts +++ b/src/lib/prompts/types.ts @@ -40,3 +40,8 @@ export type MultiSelectOptions = { required?: boolean cursorAt?: Value } + +export type LogMessageOptions = { + message?: string + symbol?: string +}