O que os símbolos(~) e (^) representam nas dependências de projetos?
Tags: npm, javascript, beginners
Published: 2023-03-09 02:35:49

> 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.

## Uso dos símbolos ^ e ~
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:

```ssh
      "dependencies": {
        "basic-auth": "^2.0.1",
        "chalk": "^4.1.2",
        "corser": "^2.0.1",
        "he": "^1.2.0",
        "html-encoding-sniffer": "^3.0.0",
        "http-proxy": "^1.18.1",
        "mime": "^1.6.0",
        "minimist": "^1.2.6",
        "opener": "^1.5.1",
        "portfinder": "^1.0.28",
        "secure-compare": "3.0.1",
        "union": "~1.5.0",
        "url-join": "^4.0.1"
      },
```
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.

**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.

**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:

| ![Tabela de significado de símbolos citados no texto](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lhmazgaollxq7m1rkq6r.png) |
|:--:|
| Print retirado de https://devhints.io/semver em 07/03/2023|


---

### Links para se aprofundar nos assuntos:

[Comparadores](https://classic.yarnpkg.com/lang/en/docs/dependency-versions/#toc-comparators)
[Comparador de versões avançado](https://github.com/npm/node-semver#advanced-range-syntax)
[Diferença entre build, version e release](http://softwaretestingmeasy.blogspot.com/2012/08/difference-between-buildrelease-and.html)
[Diferença entre til e circunflexo](https://nodesource.com/blog/semver-tilde-and-caret/)
[Major, minor e patch](https://medium.com/fiverr-engineering/major-minor-patch-a5298e2e1798)
[Range de versões](https://github.com/npm/node-semver#versions)
[Versão de software](https://en.wikipedia.org/wiki/Software_versioning)
[Versionamento](https://semver.org/lang/pt-BR/)