Skip to content

LintSync ​

Держите конфиги ESLint, Prettier и Stylelint в синхроне с общим пресетом — в одном проекте или сразу во многих — не теряя локальные правки.

Возможности ​

  • Точечные правки, а не переписывание файла целиком — LintSync записывает правила пресета прямо в существующие конфиги (не нужен пакет для extends); ваши комментарии, стиль кавычек и форматирование вне затронутых ключей сохраняются.
  • Владение по ключам — небольшой .lintsync/manifest.json отслеживает, какие ключи последний раз применил пресет, поэтому обычное обновление пресета и правило, изменённое вручную, никогда не путаются между собой.
  • Разрешение конфликтов, а не молчаливая перезапись — ключ, отличающийся и от манифеста, и от текущего пресета — это конфликт: LintSync открывает интерактивный TUI для его разрешения (или безопасно падает в CI) и никогда не пишет файл наполовину.
  • Четыре встроенных пресета — vue-app, react-app, npm-lib и общий base, каждый со своим набором правил ESLint/Prettier/Stylelint и списком зависимостей для установки. Пресеты живут внутри самого LintSync, поэтому npm update -g lintsync — это и есть способ получить обновления пресетов, отдельный пакет с конфигом публиковать не нужно.
  • Сборка и сохранение собственного пресета — интерактивный конструктор берёт живой список опций Prettier и около 80 правил Stylelint прямо из официальных конфигов -recommended/-standard, и сохраняет результат локально для повторного использования в любом проекте на машине.
  • Пакетный режим по многим проектам — реестр известных проектов с тегами и фильтрацией позволяет sync/status пройтись по всем сразу через --all, с одним общим кодом возврата для CI.
  • JSON/JSONC, YAML и JS/TS конфиги — включая современный flat config ESLint (export default [...]) и CommonJS module.exports.
  • Миграция старых конфигов — migrate eslint --to flat и аналоги для Prettier/Stylelint переносят конфиг в новый формат или расположение, никогда не удаляя исходник и не перезаписывая существующую цель.

Как это работает ​

Пресет — это встроенный (или сохранённый локально пользовательский) набор правил для каждого инструмента, плюс нужные зависимости и список ключей, которые он считает своими (managedKeys). lintsync init устанавливает эти зависимости, записывает конфиг каждого инструмента из пресета и сохраняет запись в манифесте — этот файл нужно коммитить.

Манифест — не источник истины, а запись «что последний раз применил пресет». Каждый запуск sync/status заново читает реальный конфиг и сравнивает его и с манифестом, и с текущим пресетом:

  • Файл совпадает с манифестом (ключ не трогали) → тихо обновляется до текущего значения пресета.
  • Файл уже совпадает с пресетом → делать нечего.
  • Файл отличается и от того, и от другого → конфликт. Ничего не записывается, пока он не разрешён.

get/set/unset редактируют поле конфига напрямую и намеренно не трогают манифест — ручная правка это ровно то, что должно всплыть конфликтом на следующем sync, а не молча потеряться.