Валидатор SemVer

Проверяйте семантические версии и разбирайте диапазоны.

Что считается версией

Строгая грамматика SemVer 2.0.0. Три числа — неотрицательные целые ASCII без ведущих нулей.

MAJOR.MINOR.PATCH
несовместимые / совместимые / исправления
1.2.3-alpha.1
пререлиз, стоит ниже 1.2.3
1.2.3+build.5
метаданные сборки, не влияют на приоритет
1.2.3-0.3
числовые идентификаторы пререлиза сравниваются как числа
v1.2.3
не семантическая версия (FAQ спецификации)
01.2.3
некорректно: ведущий ноль
1.2.3-01
некорректно: числовой пререлиз с нулём в начале
1.2.3+0.09
корректно: метаданные сборки могут дополняться нулями

Операторы диапазонов

1.2.3
ровно эта версия
^1.2.3
совместимо: >=1.2.3 <2.0.0-0
~1.2.3
только патч: >=1.2.3 <1.3.0-0
>=1.2.3 <2.0.0
И компараторов в одном наборе
1.2.3 - 2.0.0
включающий диапазон, нужны пробелы с обеих сторон
1.2.x / 1.x / *
частичные версии и подстановочные знаки
a || b
объединение: подходит любой из наборов
~>1.2.3
исторический псевдоним npm, обрабатывается как ~1.2.3

Как npm дополняет частичные версии

Проверено по node-semver; суффикс -0 — это сторожевой знак npm, исключающий пререлизы следующей серии.

Как npm дополняет частичные версии
ДиапазонРазвёрнутый вид
^1.2.3>=1.2.3 <2.0.0-0
^0.2.3>=0.2.3 <0.3.0-0
^0.0.3>=0.0.3 <0.0.4-0
^1>=1.0.0 <2.0.0-0
~1.2.3>=1.2.3 <1.3.0-0
~1.2>=1.2.0 <1.3.0-0
~1>=1.0.0 <2.0.0-0
1.2.x>=1.2.0 <1.3.0-0
1.x>=1.0.0 <2.0.0-0
1.2.3 - 2.0.0>=1.2.3 <=2.0.0
1.2.3 - 2>=1.2.3 <3.0.0-0
>1.x>=2.0.0

Приоритет пререлизов

1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0

Числовые идентификаторы сравниваются как числа и стоят ниже буквенно-цифровых; более короткий префикс ниже. Метаданные сборки никогда не важны.

Частые ошибки

Обычно их вставляют прямо из package.json и переписки.

"1.2.3",
Кавычки и запятая попали из package.json — вставляйте только версию.
v1.2.3
В тегах Git есть v, в семантических версиях — нет.
1.2
Два числа — это диапазон, а не версия.
1.2.3-01
Нестрогий режим npm читает это как 1.2.3-1 и молча переписывает.

По какому своду правил

  • Вердикт по строке версии — строгий SemVer 2.0.0: без нестрогого режима, без переписывания, без нормализации.
  • Диапазоны следуют npm node-semver, поскольку спецификация SemVer не определяет диапазоны.
  • В диапазонах инструмент строже npm: префикс v или ведущий ноль внутри диапазона отклоняются, а пустая сторона || считается ошибкой, а не «любой версией».
  • Толкования npm для некорректной версии получены из semver.valid(v, {loose:true}) и semver.coerce(v). Это только информация — никогда не зачёт.
  • Позиции считаются в кодовых точках и начинаются с 1 в интерфейсе и с 0 в JSON.

Как пользоваться

  1. Вставьте версию, например 1.2.3-beta.1+build.5, в левое поле. Всё ниже обновляется по мере ввода — нажимать кнопку не нужно.
  2. При желании вставьте справа диапазон npm, например ^1.2.0, чтобы увидеть, как версия соотносится с диапазоном.
  3. Сначала прочитайте значок: корректно или нет, а если нет — какое правило нарушено и на каком символе.
  4. Включите «Учитывать пререлизы», если нужно толкование диапазона с includePrerelease, как в npm.
  5. Разверните «Результат JSON», чтобы скопировать или скачать полный список замечаний.

Разобранный пример

Версия + диапазон

1.2.3-beta.1+build.5  ^1.2.0

Результат

Корректный SemVer (MAJOR 1, MINOR 2, PATCH 3, пререлиз beta.1, сборка build.5). ^1.2.0 разворачивается в >=1.2.0 <2.0.0-0, границы [1.2.0, 2.0.0). Вердикт: не выполнено — в наборе нет компаратора пререлиза для 1.2.3.

Включите «Учитывать пререлизы», и та же пара станет выполненной.

Ограничения

  • Вердикт строго по SemVer 2.0.0, поэтому v1.2.3 и 1.2.3-01 отклоняются, хотя нестрогий режим npm их принимает или переписывает.
  • Диапазоны следуют только npm node-semver — версии git describe, Cargo, PEP 440 и модулей Go не входят в область применения.
  • Обращений к реестру нет: инструмент не скажет, какая версия на самом деле установится по ^1.2.0.
  • Одна версия и один диапазон за раз — без пакетных списков, сортировки, попарного сравнения и предпросмотра повышения версии.
  • Основные номера выше Number.MAX_SAFE_INTEGER помечаются и сравниваются как текст, никогда не преобразуясь в число JS.
  • Ничего не покидает страницу: без сети, хранилища и параметров URL — перезагрузка всё очищает.

Другие помощники разработчика, которые работают полностью в вашем браузере.