import { z } from "zod" import { NamedError } from "../util/error" export namespace UI { const LOGO = [ `█▀▀█ █▀▀█ █▀▀ █▀▀▄ █▀▀ █▀▀█ █▀▀▄ █▀▀`, `█░░█ █░░█ █▀▀ █░░█ █░░ █░░█ █░░█ █▀▀`, `▀▀▀▀ █▀▀▀ ▀▀▀ ▀ ▀ ▀▀▀ ▀▀▀▀ ▀▀▀ ▀▀▀`, ] export const CancelledError = NamedError.create( "UICancelledError", z.object({}), ) export const Style = { TEXT_HIGHLIGHT: "\x1b[96m", TEXT_HIGHLIGHT_BOLD: "\x1b[96m\x1b[1m", TEXT_DIM: "\x1b[90m", TEXT_DIM_BOLD: "\x1b[90m\x1b[1m", TEXT_NORMAL: "\x1b[0m", TEXT_NORMAL_BOLD: "\x1b[1m", TEXT_WARNING: "\x1b[93m", TEXT_WARNING_BOLD: "\x1b[93m\x1b[1m", TEXT_DANGER: "\x1b[91m", TEXT_DANGER_BOLD: "\x1b[91m\x1b[1m", TEXT_SUCCESS: "\x1b[92m", TEXT_SUCCESS_BOLD: "\x1b[92m\x1b[1m", TEXT_INFO: "\x1b[94m", TEXT_INFO_BOLD: "\x1b[94m\x1b[1m", } export function println(...message: string[]) { print(...message) Bun.stderr.write("\n") } export function print(...message: string[]) { blank = false Bun.stderr.write(message.join(" ")) } let blank = false export function empty() { if (blank) return println("" + Style.TEXT_NORMAL) blank = true } export function logo() { empty() for (const row of LOGO) { print(" ") for (let i = 0; i < row.length; i++) { const color = i > 18 ? Bun.color("white", "ansi") : Bun.color("gray", "ansi") const char = row[i] print(color + char) } println() } empty() } export async function input(prompt: string): Promise { const readline = require("readline") const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }) return new Promise((resolve) => { rl.question(prompt, (answer: string) => { rl.close() resolve(answer.trim()) }) }) } }