Меню
Библиотека npm

Termic

Библиотека для красивых консольных приложений на Node.js: цвета, темы и анимации прогресса без зависимостей.

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 и бесплатен для любых проектов.