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
JavaScript
// 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
};