Validador SemVer

Valide versões semânticas e interprete intervalos.

O que conta como versão

Gramática estrita do SemVer 2.0.0. Os três números são inteiros ASCII não negativos, sem zeros à esquerda.

MAJOR.MINOR.PATCH
quebra / compatível / correção
1.2.3-alpha.1
pré-lançamento, fica abaixo de 1.2.3
1.2.3+build.5
metadados de build, ignorados na precedência
1.2.3-0.3
identificadores numéricos de pré-lançamento são comparados como números
v1.2.3
não é uma versão semântica (FAQ da especificação)
01.2.3
inválido: zero à esquerda
1.2.3-01
inválido: pré-lançamento numérico com zero à esquerda
1.2.3+0.09
válido: metadados de build podem ter zeros à esquerda

Operadores de intervalo

1.2.3
exatamente esta versão
^1.2.3
compatível: >=1.2.3 <2.0.0-0
~1.2.3
somente patch: >=1.2.3 <1.3.0-0
>=1.2.3 <2.0.0
E de comparadores em um conjunto
1.2.3 - 2.0.0
intervalo inclusivo, espaços obrigatórios dos dois lados
1.2.x / 1.x / *
versões parciais e curingas
a || b
união: qualquer um dos conjuntos pode corresponder
~>1.2.3
alias histórico do npm, tratado como ~1.2.3

Como o npm preenche versões parciais

Verificado com o node-semver; o sufixo -0 é um sentinela do npm que exclui pré-lançamentos da próxima série.

Como o npm preenche versões parciais
IntervaloExpandido
^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

Precedência de pré-lançamento

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

Identificadores numéricos são comparados como números e ficam abaixo dos alfanuméricos; um prefixo mais curto fica abaixo. Metadados de build nunca importam.

Erros comuns

Estes são colados direto do package.json e de históricos de chat.

"1.2.3",
As aspas e a vírgula vieram do package.json - cole somente a versão.
v1.2.3
Tags do Git carregam um v; versões semânticas não.
1.2
Dois números são um intervalo, não uma versão.
1.2.3-01
O modo loose do npm lê como 1.2.3-1 e reescreve silenciosamente.

Qual conjunto de regras é usado

  • O veredito sobre uma string de versão é o SemVer 2.0.0 estrito - sem modo loose, sem reescrita, sem normalização.
  • Os intervalos seguem o node-semver do npm, porque a especificação SemVer não define intervalos.
  • Esta ferramenta é mais rígida que o npm em intervalos: um prefixo v ou um zero à esquerda dentro de um intervalo é rejeitado, e um lado vazio do || é erro em vez de "qualquer versão".
  • As leituras npm mostradas para uma versão inválida vêm de semver.valid(v, {loose:true}) e semver.coerce(v). São apenas informativas - nunca uma aprovação.
  • As posições contam pontos de código e começam em 1 na interface, e em 0 no JSON.

Como usar

  1. Cole uma versão como 1.2.3-beta.1+build.5 no campo à esquerda. Tudo abaixo é atualizado enquanto você digita - não há botão para pressionar.
  2. Opcionalmente, cole um intervalo npm como ^1.2.0 à direita para ver como a versão e o intervalo se relacionam.
  3. Leia o selo primeiro: válida ou não e, se não, qual regra quebrou em qual caractere.
  4. Marque Incluir pré-lançamento quando quiser a leitura includePrerelease do npm para o intervalo.
  5. Expanda o resultado JSON para copiar ou baixar a lista completa de problemas.

Exemplo resolvido

Versão + intervalo

1.2.3-beta.1+build.5  ^1.2.0

Resultado

SemVer válido (MAJOR 1, MINOR 2, PATCH 3, pré-lançamento beta.1, build build.5). ^1.2.0 expande para >=1.2.0 <2.0.0-0, limites [1.2.0, 2.0.0). Veredito: não satisfeito - o conjunto não tem comparador de pré-lançamento para 1.2.3.

Marque Incluir pré-lançamento e o mesmo par passa a ser satisfeito.

Limitações

  • O veredito é o SemVer 2.0.0 estrito, então v1.2.3 e 1.2.3-01 são rejeitados mesmo que o modo loose do npm os aceite ou reescreva.
  • Os intervalos seguem somente o node-semver do npm - git describe, Cargo, PEP 440 e versões de módulos Go estão fora do escopo.
  • Sem consultas a registros: a ferramenta não consegue dizer qual versão ^1.2.0 realmente instalaria.
  • Uma versão e um intervalo por vez - sem listas em lote, ordenação, comparação par a par ou prévia de incremento.
  • Números principais acima de Number.MAX_SAFE_INTEGER são sinalizados e comparados como texto, nunca convertidos para número JS.
  • Nada sai da página: sem rede, sem armazenamento, sem parâmetros na URL - recarregar limpa tudo.

Mais auxiliares para desenvolvedores que rodam inteiramente no seu navegador.