UNPKG

constatic

Version:

Constatic is a CLI for creating and managing modern TypeScript projects, providing an organized structure and features that streamline development.

121 lines (120 loc) 4.17 kB
// src/helpers/ui.ts import ck from "chalk"; import { cliLang, l } from "./lang.js"; import { setTimeout } from "node:timers/promises"; function uiMessage(texts, style) { const lang = cliLang.get(); return style ? style(texts[lang]) : texts[lang]; } var keys = { tab: ck.cyan("<tab>"), enter: ck.cyan("<enter>"), get space() { return l({ "en-US": ck.cyan("<space>"), "pt-BR": ck.cyan("<espaço>") }); }, a: ck.cyan("<a>") }; var instructions = { get checkbox() { return ` ` + uiMessage({ "en-US": `Controls: ${keys.space} select/deselect | ${keys.a} select all | ${keys.enter} proceed`, "pt-BR": `Controles: ${keys.space} selecionar/deselecionar | ${keys.a} selecionar tudo | ${keys.enter} prosseguir` }, ck.dim); }, get searchSelect() { return () => { return ` ` + uiMessage({ "en-US": `Controls: ${keys.tab} select/deselect | ${keys.enter} proceed`, "pt-BR": `Controles: ${keys.tab} selecionar/desselecionar | ${keys.enter} prosseguir` }, ck.dim); }; } }; var commonTexts = { get back() { return uiMessage({ "en-US": ck.dim(`⤶ Back`), "pt-BR": ck.dim(`⤶ Voltar`) }); } }; var colors = { azoxo: "#5865F2" }; function divider() { console.log(); } var cliTableChars = { "top-left": "╭", "top-right": "╮", "bottom-right": "╯", "bottom-left": "╰" }; function resolveValue(input) { return typeof input === "function" ? input() : input; } async function showUsage(cmd, parent) { const cmdMeta = await resolveValue(cmd.meta || {}); const subCommands = Object.entries(await resolveValue(cmd.subCommands || {})).map(([name, cmd2]) => ({ name, ...cmd2 })); const parentMeta = await resolveValue(parent?.meta || {}); const args = Object.entries(await resolveValue(cmd.args || {})).map(([name, arg]) => { arg.name = name; return arg; }); const posArgs = args.filter((arg) => arg.type === "positional"); const flags = args.filter((arg) => arg.type !== "positional"); const options = subCommands.length >= 1 ? `[subcommand]` : args.length >= 1 ? `[--flags] ` + posArgs.map(({ name }) => `<${name}>`).join(" ") : ""; const command = parentMeta.name ? `${parentMeta.name} ${cmdMeta.name}` : cmdMeta.name; console.log(ck.dim(`${cmdMeta.description}`)); console.log(ck.cyan("$"), ck.underline("Command usage:"), ck.cyan(command), ck.cyan(options)); divider(); if (subCommands.length >= 1) { console.log(ck.blue("$"), ck.underline("Subcommands:")); const maxLength = Math.max(...subCommands.map((subcmd) => subcmd.name.length)); for (const arg of subCommands) { const padded = `<${arg.name}>`.padEnd(maxLength + 2, " "); const meta = await resolveValue(arg.meta || {}); console.log(` ${ck.blue(padded)} ${ck.gray(meta.description)}`); } divider(); } if (posArgs.length >= 1) { console.log(ck.blue("◆"), ck.underline("Command args:")); const maxLength = Math.max(...posArgs.map((arg) => arg.name.length)); for (const { name, description, valueHint: hint } of posArgs) { const padded = `<${name}>`.padEnd(maxLength + 2, " "); console.log(` ${ck.blue(padded)} ${ck.gray(description)} ${hint ? `: ${hint}` : ""}`); } divider(); } if (flags.length >= 1) { console.log(ck.blue("⚑"), ck.underline("Command flags:")); const maxLength = Math.max(...flags.map((f) => { const all = (Array.isArray(f.alias) ? f.alias : f.alias ? [f.alias] : []).map((a) => a.length === 1 ? `-${a}` : `--${a}`); all.push(`--${f.name}`); return all.join(", ").length; })); for (const flag of flags) { const aliases = (Array.isArray(flag.alias) ? flag.alias : flag.alias ? [flag.alias] : []).map((alias) => alias.length === 1 ? `-${alias}` : `--${alias}`); aliases.push(`--${flag.name}`); const aliasStrPlain = aliases.join(", "); const padded = aliasStrPlain.padEnd(maxLength + 1, " "); console.log(` ${ck.blue(padded)} ${ck.gray(flag.description)}`); } } } export { uiMessage, setTimeout as sleep, showUsage, instructions, divider, commonTexts, colors, cliTableChars };