1001Ferramentas
📦 Dev

Testador de Range SemVer

Testa quais versões satisfazem um range semver (^1.2.3, ~2.0, >=1 <2) e explica o intervalo em limite inferior e superior.

Aceita ^1.2.3, ~2.0, >=1 <2, 1.2.x, 1.2.3 - 2.3.4 e ^1 || ^2.

Caret, til e pré-lançamentos

O caret trava o campo mais à esquerda que não é zero, então ^1.2.3 aceita até 1.999.999 e ^0.2.3 para em 0.2.x, porque na linha 0.x é o minor que carrega as quebras. O til é mais restrito: ~1.2.3 só move o patch. Escrever ~1 é a exceção, já que sem minor não há nada abaixo para segurar, e ele se comporta como ^1.

Um pré-lançamento como 2.0.0-rc.1 ordena abaixo de 2.0.0, então por comparação pura ele cabe em >=1.0.0 <2.0.0. Mesmo assim o npm recusa, a não ser que o próprio range cite um pré-lançamento com o mesmo major.minor.patch — por isso ^1.2.3 nunca pega 1.5.0-beta, mas >=1.5.0-beta.0 pega.

O que o range ^1.2.3 realmente aceita

O package.json pede ^1.2.3, o lockfile trouxe a 1.9.5 e alguém no code review quer saber se isso está certo. Cole o range e a lista de versões publicadas do pacote: cada linha sai marcada com um visto ou um x, o conjunto que casou e o motivo exato da recusa, do tipo 2.0.0 acima do limite superior <2.0.0. Nada é enviado para servidor nenhum, a conta roda no próprio navegador.

Antes de comparar qualquer coisa, o operador vira um par de limites. O caret ^1.2.3 abre até 2.0.0 sem incluir, mas ^0.2.3 para em 0.3.0, porque na linha 0.x é o minor que carrega as mudanças que quebram. O til ~1.2.3 libera só o patch. Curinga 1.2.x, faixa 1.2.3 - 2.3.4 e alternativas com barra dupla também são normalizadas, então dá para comparar dois ranges escritos de jeitos diferentes.

A pegadinha mora no pré-lançamento. Por ordenação pura, 2.0.0-rc.1 é menor que 2.0.0 e caberia em ^1.2.3, mas o npm só aceita uma versão com hífen quando o próprio range cita um pré-lançamento com o mesmo major.minor.patch. Por isso ^1.2.3 nunca instala 1.5.0-beta, enquanto >=1.5.0-beta.0 <2.0.0 instala sem reclamar. A caixa de incluir pré-lançamentos mostra os dois cenários lado a lado.

Perguntas frequentes

Qual a diferença prática entre ^1.2.3 e ~1.2.3?
O caret segura o primeiro campo diferente de zero e libera tudo abaixo dele: ^1.2.3 aceita de 1.2.3 até 1.999.999. O til segura um campo a mais, então ~1.2.3 vai só de 1.2.3 a 1.2.999. Em produção o til dá atualizações de correção; o caret aceita também funcionalidade nova.
Por que a versão beta aparece como recusada?
Por padrão a ferramenta segue a regra do npm: versão com hífen só entra se o range mencionar um pré-lançamento da mesma tupla major.minor.patch. Marque a caixa de incluir pré-lançamentos para ver o resultado da comparação numérica pura, que é o que algumas outras linguagens usam.
O que 1.2.x e ^0.0.3 significam?
O curinga 1.2.x vira >=1.2.0 <1.3.0, ou seja, qualquer patch daquele minor. Já ^0.0.3 é o caso mais fechado do caret: vira >=0.0.3 <0.0.4 e aceita exatamente uma versão, porque numa linha 0.0.x a spec assume que qualquer incremento pode quebrar o consumidor.

Ferramentas Relacionadas