npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

microtypo

v0.1.0

Published

Russian typography that never mangles your code, URLs, or markup. Zero-dependency, safe on untrusted text

Downloads

25

Readme

Microtypo

NPM version Build status Coverage status Dependency status

Движок русской типографики для Node.js. Приводит обычный текст к типографским правилам: угловые кавычки «», длинное и среднее тире, неразрывные пробелы, символы валют, оптическое выравнивание, абзацы. По умолчанию возвращает обычный текст; HTML-разметку и HTML-сущности включают флагами.

import { microtypo } from 'microtypo';

microtypo('Он сказал: "Я -- Корвин", и замолчал.');
// 'Он сказал: «Я — Корвин», и замолчал.'
  • Чистый JavaScript, только ESM, ноль продакшен зависимостей.
  • Node.js >= 26.4.
  • По умолчанию — обычный Unicode-текст. Разметка <p>, <span>, <a> включается флагом html: true, глифы как HTML-сущности — флагом entities: true.

Установка

pnpm add microtypo
# или: npm install microtypo

Использование

Разовая функция собирает движок под один вызов:

import { microtypo } from 'microtypo';

microtypo('Корвин ступил на Отражение "Земля".');
// 'Корвин ступил на Отражение «Земля».'

Markdown (HTML, JSON, YAML) можно передать как формат данных:

## Донесение из Амбера

Корвин спросил : "Амбер ?! Рэндом ( без карты , но с Козырем ) всё равно идёт..."

- Оберон правил в 2012-2015 г., а совет назначили на 12-15 января.
- Рэндом вёл 100-500 всадников и 12345 теней.
- Фиона отметила 3 кг серебра, 1/2 меры воды и 40 руб. монет.
- Блейз нашёл § 12, карту № 7, зал 10x12 м и клинок длиной 5".
- В Ардене было -5 °С; шанс пройти Лабиринт -- 50 %.
- Дворкин сверил: 2 != 3, 2 <= 3, 4 >= 1.
- Дворкин записал: т.е. Лабиринт, и т.д.
- Знак (c) Оберон, метка (tm) Козыри.
- Дворкин оставил знак: `Лабиринт -- Отражение`.

[Рэбма](https://amber.example/rebma?path=arden-shadow)
microtypo(markdown, { input: 'markdown' });
/*
## Донесение из Амбера

Корвин спросил: «Амбер?! Рэндом (без карты, но с Козырем) всё равно идёт…»

- Оберон правил в 2012–2015 гг., а совет назначили на 12–15 января.
- Рэндом вёл 100–500 всадников и 12 345 теней.
- Фиона отметила 3 кг серебра, ½ меры воды и 40 ₽ монет.
- Блейз нашёл § 12, карту № 7, зал 10×12 м и клинок длиной 5″.
- В Ардене было -5 °C; шанс пройти Лабиринт — 50%.
- Дворкин сверил: 2 ≠ 3, 2 ≤ 3, 4 ≥ 1.
- Дворкин записал: т. е. Лабиринт, и т. д.
- Знак © Оберон, метка ™ Козыри.
- Дворкин оставил знак: `Лабиринт -- Отражение`.

[Рэбма](https://amber.example/rebma?path=arden-shadow)
*/

Экземпляр компилирует правила один раз, чтобы использовать их несколько раз в движке:

import { MicroTypo } from 'microtypo';

const typo = new MicroTypo({
  html: true
});

for (const post of feed) {
  post.body = typo.process(post.body);
}

Производительность

Для циклов, пакетной обработки, серверных обработчиков и лент создавайте MicroTypo один раз и переиспользуйте экземпляр. Вызов microtypo(text, config) удобен для разовой обработки, но каждый раз создаёт новый экземпляр и заново компилирует настройки.

Не повышайте maxInputLength для публичного недоверенного ввода без собственных нагрузочных тестов. Лимит 30 000 — часть DoS-защиты: maxProcessingMs проверяется между стадиями и не может остановить уже исполняющееся регулярное выражение.

Конфигурация

Единый объект с тремя уровнями настройки:

  • Направлениеhtml, entities, input, лимиты maxInputLength и maxProcessingMs. input принимает и строку, и объектную форму для форматов Markdown, JSON, XML, YAML, TOML, front-matter и защиты шаблонных разделителей.
  • Правилаrules: { 'группа.правило': bool } для точечного включения и отключения правил.
  • Вывод разметкиrender управляет выдаваемой разметкой при html: true.

Подробности — в разделе конфигурация.

Документация

  • Конфигурация — три уровня настройки и форматы ввода.
  • Правила — двенадцать групп правил и их идентификаторы.
  • CLI — фильтр stdin→stdout.
  • Безопасность — модель угроз, лимиты, ошибки.
  • Расширение — методы экземпляра, пользовательские группы правил, типизированные ошибки.

Безопасность

Microtypo типографирует текст, но не очищает HTML: разметка сохраняется байт-в-байт, включая <script>. Недоверенный ввод, который отображается как HTML, очищайте отдельно (Sanitizer, DOMPurify). Движок защищает собственную целостность: удаляет зарезервированный PUA, ограничивает длину и время обработки и выбрасывает типизированные ошибки. Смотрите раздел безопасность.

Автор

Алексей Симоненко

Лицензия

MIT. Смотрите файл LICENSE.