Jun 21 / Jessica Felix

Decifrando os Símbolos (~) e (^): Desvendando o Significado em Projetos

Uso dos símbolos ^ e ~

Em português: (~) til e (^) circunflexo. Em inglês, (~) tilde e (^) caret. Você pode continuar chamando esses símbolos pelo apelido carinhoso (minhoquinha e chapeuzinho) mas agora já sabe os nomes técnicos.

Em arquivos package.json, package-lock.json ou outro que especifique dependências, você pode encontrar os símbolos de ^ e ~ antes do range (intervalo) de versão:
Dentro desses arquivos, é comum encontrar as dependências acompanhadas de símbolos como (~) e (^) seguidos por números de versão. Mas o que esses símbolos representam e como eles afetam o gerenciamento das dependências?

Entenda cada parte:
(~) ou (^) especificam os intervalos de versão
(~) “aproximadamente equivalente à versão”
(^) “compatível com a versão”
X.Y.Z (major.minor.patch), juntos nesta ordem e formato, indicam o número de versão. Individualmente, Z, Y e Z são identificadores de versão
major (maior), minor (minor) e patch (correção) são categorias de numero de versão
^X.Y.Z ou ~X.Y.Z juntos nesta ordem e formato, formam ranges de versão
Ranges de versão especificam quais intervalos (de A até B, exceto B) de versões de uma dependência funcionarão no projeto.
Vamos explorar alguns exemplos práticos para entender melhor.

Exemplo 1:
"basic-auth": "^2.0.1"
Neste exemplo, o símbolo (^) indica que a versão da dependência "basic-auth" é compatível com a versão especificada, permitindo atualizações nas versões minor e patch. Isso significa que, se a versão atual é 2.0.1, você pode atualizar para 2.0.2, 2.1.0, 2.1.1 e assim por diante, desde que essas atualizações não modifiquem a versão major (o primeiro número).

Exemplo 2:
"union": "~1.5.0"
Aproximadamente equivalente à versão(~) como em "union": "~1.5.0" , permite alterações do identificador de patch se uma versão no identificador minor corresponder ao especificado no comparador.
Em "union": "~1.5.0" , ~ permite versões de 1.5.0 até 1.5.99 mas não inclui 1.6.0. As versões major e minor devem corresponder ao valor do identificador especificado, mas qualquer versão de patch maior ou igual à especificada é válida.

Exemplo 3:
"url-join": "^4.0.1"

Compatível com a versão (^) permite alterações que não modifiquem o identificador que esteja mais à esquerda, aceitando atualizações minor e de patch para as versões 1.0.0 e superiores. Para versões que modificam apenas o patch, por exemplo ^0.0.1 o range permitido seria >=0.0.1 <0.0.2 , já que não podemos modificar o valor mais à esquerda, o 1.
Em "url-join: "^4.0.1" o identificador mais à esquerda é o major. Qualquer versão minor ou de patch que seja maior ou igual ao especificado é válida. O ^ permitiria versões até 4.99.99 por exemplo mas, não permitira 5.0.0 porque o 4 é o dígito mais a esquerda em "^4.0.1".

Ilustrando o que foi dito:
Print retirado de https://devhints.io/semver em 07/03/2023

Jessica Felix

Olá, sou a Jess! Sou desenvolvedora Javascript desde 2019 e trabalho atualmente dedicada a frontend. Sou tech lead voluntária na plataforma Lacrei Saúde, lider da comunidade Nerdzão e organizadora da comunidade Woman That React. Também trabalho como revisora de conteúdo técnico sobre javascript :)