Validador de SemVer

Valida versiones semánticas y analiza rangos.

Qué cuenta como versión

Gramática estricta de SemVer 2.0.0. Los tres números son enteros ASCII no negativos sin ceros iniciales.

MAJOR.MINOR.PATCH
ruptura / compatible / corrección
1.2.3-alpha.1
preliminar, queda por debajo de 1.2.3
1.2.3+build.5
metadatos de compilación, se ignoran para la precedencia
1.2.3-0.3
los identificadores preliminares numéricos se comparan como números
v1.2.3
no es una versión semántica (FAQ de la especificación)
01.2.3
no válida: cero inicial
1.2.3-01
no válida: preliminar numérica rellenada con ceros
1.2.3+0.09
válida: los metadatos de compilación pueden rellenarse con ceros

Operadores de rango

1.2.3
exactamente esta versión
^1.2.3
compatible: >=1.2.3 <2.0.0-0
~1.2.3
solo parches: >=1.2.3 <1.3.0-0
>=1.2.3 <2.0.0
AND de comparadores en un mismo conjunto
1.2.3 - 2.0.0
rango inclusivo, con espacios obligatorios a ambos lados
1.2.x / 1.x / *
versiones parciales y comodines
a || b
unión: cualquiera de los conjuntos puede coincidir
~>1.2.3
alias histórico de npm, tratado como ~1.2.3

Cómo completa npm las versiones parciales

Verificado con node-semver; el sufijo -0 es un centinela de npm que excluye las versiones preliminares de la serie siguiente.

Cómo completa npm las versiones parciales
RangoExpandido
^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

Precedencia de las versiones preliminares

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

Los identificadores numéricos se comparan como números y quedan por debajo de los alfanuméricos; un prefijo más corto tiene menor precedencia. Los metadatos de compilación nunca importan.

Errores frecuentes

Estos se pegan tal cual desde package.json y desde historiales de chat.

"1.2.3",
Las comillas y la coma han venido de package.json: pega solo la versión.
v1.2.3
Las etiquetas de Git llevan una v; las versiones semánticas no.
1.2
Dos números son un rango, no una versión.
1.2.3-01
El modo loose de npm lo lee como 1.2.3-1 y lo reescribe en silencio.

Qué reglamento se usa

  • El veredicto sobre una cadena de versión es SemVer 2.0.0 estricto: sin modo loose, sin reescritura y sin normalización.
  • Los rangos siguen npm node-semver, porque la especificación SemVer no define rangos.
  • Esta herramienta es más estricta que npm con los rangos: se rechaza un prefijo v o un cero inicial dentro de un rango, y un lado vacío de || es un error en lugar de «cualquier versión».
  • Las lecturas de npm que se muestran para una versión no válida proceden de semver.valid(v, {loose:true}) y semver.coerce(v). Son solo informativas: nunca equivalen a aprobar.
  • Las posiciones cuentan puntos de código y empiezan en 1 en la interfaz y en 0 en el JSON.

Cómo se usa

  1. Pega una versión como 1.2.3-beta.1+build.5 en el campo de la izquierda. Todo lo de abajo se actualiza mientras escribes: no hay ningún botón que pulsar.
  2. Opcionalmente, pega un rango de npm como ^1.2.0 a la derecha para ver cómo se relacionan la versión y el rango.
  3. Lee primero la insignia: válida o no, y si no lo es, qué regla falla en qué carácter.
  4. Marca «Incluir versiones preliminares» cuando quieras la lectura includePrerelease de npm para el rango.
  5. Despliega «Resultado JSON» para copiar o descargar la lista completa de problemas.

Ejemplo resuelto

Versión + rango

1.2.3-beta.1+build.5  ^1.2.0

Resultado

SemVer válido (MAJOR 1, MINOR 2, PATCH 3, preliminar beta.1, compilación build.5). ^1.2.0 se expande a >=1.2.0 <2.0.0-0, límites [1.2.0, 2.0.0). Veredicto: no cumple; el conjunto no tiene un comparador preliminar para 1.2.3.

Marca «Incluir versiones preliminares» y el mismo par pasa a cumplirse.

Limitaciones

  • El veredicto es SemVer 2.0.0 estricto, así que se rechazan v1.2.3 y 1.2.3-01 aunque el modo loose de npm los acepte o los reescriba.
  • Los rangos siguen solo npm node-semver: git describe, Cargo, PEP 440 y las versiones de módulos de Go quedan fuera del alcance.
  • Sin consultas a registros: la herramienta no puede decirte qué versión instalaría realmente ^1.2.0.
  • Una versión y un rango a la vez: sin listas por lotes, sin ordenación, sin comparación por pares y sin vista previa de incrementos.
  • Los números centrales por encima de Number.MAX_SAFE_INTEGER se marcan y se comparan como texto, nunca se convierten a un número JS.
  • Nada sale de la página: sin red, sin almacenamiento y sin parámetros en la URL; al recargar se borra todo.

Más utilidades para desarrolladores que se ejecutan por completo en tu navegador.