Termic — наша библиотека для приложений командной строки на Node.js. Она оформляет вывод в терминале: цвета, стили, темы и анимации прогресса. У неё нет зависимостей, и она не расширяет String.prototype.
Обычные консольные утилиты выглядят одинаково: белый текст, иногда красная ошибка. Мы хотели, чтобы приятный вывод делался одной строкой, а не отдельным проектом внутри проекта.
Установка
npm install termicПервый пример
const { cli, colors, styler } = require("termic");
cli.println("Hello World");
cli.println(styler.color.red.background.green.italic.underline("Hello World"));Стили собираются цепочкой и применяются в том порядке, в котором вы их написали. Строка не меняется: на выходе обычная строка с управляющими кодами.
Цвета
Именованные цвета, RGB и HEX работают одинаково для текста и фона:
styler.color.red.underline("Hello");
styler.color.hex("#ffffff").bold("Hello");
styler.color.rgb([255, 255, 0])("Hello");
styler.background.red.underline("Hello");
styler.background.hex("#ffffff").underline("Hello");
styler.background.rgb([255, 255, 0]).underline("Hello");Библиотека сама определяет, что поддерживает терминал, включая 256 цветов и Truecolor.
Модификаторы
| Модификатор | Что делает |
|---|---|
bold | Жирный текст |
dim | Приглушённый текст |
italic | Курсив, поддерживается не везде |
underline | Подчёркивание, поддерживается не везде |
doubleline | Двойное подчёркивание |
inverse | Меняет местами цвет текста и фона |
hidden | Невидимый текст |
crossedout | Зачёркивание |
reset | Сбрасывает стиль |
Темы
Тема — это обычная переменная. Определите стили один раз и используйте по всему приложению:
const { cli, styler } = require("termic");
const error = styler.color.red;
const warning = styler.color.orange;
cli.println(error("Error!"));
cli.println(warning("Warning!!!"));Анимации и прогресс
Для долгих операций есть рендерер, который обновляет несколько элементов одной строки. Вот копирование файла с индикатором:
const fs = require("node:fs");
const { styler, renderer, animations } = require("termic");
const source = "example.txt";
const target = "example_copy.txt";
const bar = renderer.progress(animations.animation1);
const label = renderer.progress({ frames: ["Copying"] });
const DONE = styler.color.rgb([24, 24, 24]).background.green.bold(" DONE ");
fs.stat(source, (err, stat) => {
let copied = 0;
const stream = fs.createReadStream(source);
stream.on("data", (chunk) => {
copied += chunk.length;
bar.set(((copied / stat.size) * 100).toFixed(2));
});
stream.on("end", () => {
bar.end(DONE);
label.end("Copied");
});
stream.pipe(fs.createWriteStream(target));
});
renderer.render([
[styler.bold("Copying files:")],
[" ", bar, label, animations.simpleDots],
]);В библиотеке есть готовые анимации, например animations.dots, а своя задаётся объектом:
const spinner = { interval: 80, frames: ["-", "\\", "|", "/"] };Форматирование значений
cli.println умеет красиво печатать не только строки, но и числа, функции, объекты, классы, символы, null и undefined, подобно console.log:
const { println } = require("termic").cli;
println({ hello: () => {}, nested: { key: "value" } });
println(Symbol("id"));
println(class Example {});Что дальше
Проект развивается: мы исправляем ошибки и планируем новые возможности. Предложения и сообщения об ошибках принимаем на GitHub. Termic распространяется по лицензии MIT и бесплатен для любых проектов.