Calculadora Semver - Analizar, Comparar y Probar Versiones Semánticas en Línea
Analice, compare, ordene y pruebe cadenas de versionado semántico con rangos estilo npm. Soporta caret, tilde, comodines y rangos OR — 100% del lado del cliente, no se envían datos al servidor.
Preguntas Frecuentes
¿Qué es el Versionado Semántico (SemVer)?
El Versionado Semántico es un estándar que utiliza un formato de tres partes: MAJOR.MINOR.PATCH. MAJOR se incrementa para cambios incompatibles, MINOR para nuevas características compatibles y PATCH para correcciones de errores compatibles. Está definido por la especificación SemVer 2.0.0 y se usa en prácticamente todos los ecosistemas de paquetes modernos, incluyendo npm, PyPI, Cargo y Go modules.
¿Cómo uso esta herramienta de calculadora semver?
Elija una de las cuatro pestañas según su necesidad: (1) Comparar — ingrese dos versiones para ver cuál es mayor, (2) Verificar Rango — ingrese una versión y un rango estilo npm para probar si la versión lo satisface, (3) Ordenar — pegue múltiples versiones para ordenarlas por precedencia, (4) Incrementar — ingrese una versión para ver las siguientes versiones major, minor, patch y pre-release.
¿Son seguros mis datos de versión? ¿Se envían a un servidor?
Todo el análisis, comparación y verificación de rangos se realiza 100% del lado del cliente en su navegador usando JavaScript. No se transmiten datos a ningún servidor. A diferencia de herramientas que consultan el registro npm, esta herramienta funciona completamente sin conexión.
¿Cuál es la diferencia entre los rangos caret (^) y tilde (~)?
El rango caret (^) permite cambios que no modifiquen el dígito no-cero más a la izquierda: ^1.2.3 significa >=1.2.3 <2.0.0. El rango tilde (~) solo permite cambios a nivel de parche: ~1.2.3 significa >=1.2.3 <1.3.0. Para versiones 0.x, el caret es más restrictivo: ^0.2.3 significa >=0.2.3 <0.3.0.
¿Cómo maneja SemVer las versiones pre-release?
Las versiones pre-release se agregan con un guion (ej., 1.0.0-alpha, 1.0.0-beta.1). Tienen menor precedencia que la versión normal asociada, por lo que 1.0.0-alpha < 1.0.0. Los identificadores se comparan de izquierda a derecha: los numéricos como enteros, los alfanuméricos lexicalmente.
¿Qué son los metadatos de compilación y afectan la comparación?
Los metadatos de compilación se agregan con el signo más (ej., 1.0.0+build.123). Según la especificación SemVer 2.0.0, los metadatos de compilación DEBEN ignorarse al determinar la precedencia de versión. Esto significa que 1.0.0+build.1 y 1.0.0+build.999 se consideran iguales.
¿Puedo probar un rango contra múltiples versiones a la vez?
Sí. En la pestaña Verificar Rango, active el Modo por lotes para ingresar múltiples versiones (una por línea). La herramienta probará cada versión contra su expresión de rango y mostrará resultados codificados por colores.
Ejemplos de Código
// Semantic Versioning Parser & Comparator
function parseSemVer(version) {
const match = version.trim().match(
/^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([\w.]+))?(?:\+([\w.]+))?$/
);
if (!match) return null;
return {
major: parseInt(match[1], 10),
minor: parseInt(match[2], 10),
patch: parseInt(match[3], 10),
prerelease: match[4]
? match[4].split('.').map(id => /^\d+$/.test(id) ? parseInt(id, 10) : id)
: [],
build: match[5] ? match[5].split('.') : [],
};
}
function compareSemVer(a, b) {
for (const key of ['major', 'minor', 'patch']) {
if (a[key] > b[key]) return 1;
if (a[key] < b[key]) return -1;
}
if (a.prerelease.length > 0 && b.prerelease.length === 0) return -1;
if (a.prerelease.length === 0 && b.prerelease.length > 0) return 1;
const len = Math.max(a.prerelease.length, b.prerelease.length);
for (let i = 0; i < len; i++) {
if (i >= a.prerelease.length) return -1;
if (i >= b.prerelease.length) return 1;
const ai = a.prerelease[i], bi = b.prerelease[i];
if (ai === bi) continue;
if (typeof ai === 'number' && typeof bi === 'number') return ai < bi ? -1 : 1;
if (typeof ai === 'number') return -1;
if (typeof bi === 'number') return 1;
return ai < bi ? -1 : 1;
}
return 0;
}
function sortVersions(versions, ascending = true) {
return versions
.map(v => ({ raw: v, parsed: parseSemVer(v) }))
.filter(v => v.parsed !== null)
.sort((a, b) => compareSemVer(a.parsed, b.parsed) * (ascending ? 1 : -1))
.map(v => v.raw);
}
// Example
const versions = ['2.0.0', '1.0.0-alpha', '1.0.0', '1.2.3', '0.9.0'];
console.log('Sorted:', sortVersions(versions));
// ['0.9.0', '1.0.0-alpha', '1.0.0', '1.2.3', '2.0.0']