Semver कैलकुलेटर - सिमैंटिक वर्शन पार्स, तुलना और टेस्ट ऑनलाइन
सिमैंटिक वर्शनिंग स्ट्रिंग्स को पार्स, तुलना, सॉर्ट करें और npm-शैली रेंज के विरुद्ध टेस्ट करें। कैरेट, टिल्ड, वाइल्डकार्ड और OR रेंज सपोर्ट — 100% क्लाइंट-साइड, सर्वर को कोई डेटा नहीं भेजा जाता।
अक्सर पूछे जाने वाले प्रश्न
सिमैंटिक वर्शनिंग (SemVer) क्या है?
सिमैंटिक वर्शनिंग एक वर्शनिंग मानक है जो तीन-भाग संख्या प्रारूप का उपयोग करता है: MAJOR.MINOR.PATCH। MAJOR पिछड़ी-असंगत परिवर्तनों के लिए, MINOR पिछड़ी-संगत नई सुविधाओं के लिए, और PATCH पिछड़ी-संगत बग फिक्स के लिए बढ़ता है।
मैं इस semver कैलकुलेटर टूल का उपयोग कैसे करूं?
अपनी आवश्यकता के अनुसार चार टैब में से एक चुनें: (1) तुलना — दो वर्शन दर्ज करें, (2) रेंज जांच — एक वर्शन और npm-शैली रेंज दर्ज करें, (3) सॉर्ट — कई वर्शन पेस्ट करें, (4) बंप — अगले major, minor, patch वर्शन देखें।
क्या मेरा वर्शन डेटा सुरक्षित है?
सभी पार्सिंग, तुलना और रेंज जांच 100% क्लाइंट-साइड पर आपके ब्राउज़र में JavaScript का उपयोग करके की जाती है। कोई डेटा किसी सर्वर को नहीं भेजा जाता।
कैरेट (^) और टिल्ड (~) रेंज में क्या अंतर है?
कैरेट (^) रेंज उन परिवर्तनों की अनुमति देता है जो सबसे बाएं गैर-शून्य अंक को नहीं बदलते: ^1.2.3 का अर्थ है >=1.2.3 <2.0.0। टिल्ड (~) रेंज केवल पैच-स्तर के परिवर्तनों की अनुमति देता है: ~1.2.3 का अर्थ है >=1.2.3 <1.3.0।
SemVer प्री-रिलीज़ वर्शन को कैसे संभालता है?
प्री-रिलीज़ वर्शन हाइफ़न के साथ जोड़े जाते हैं (उदा., 1.0.0-alpha)। उनकी सामान्य वर्शन से कम प्राथमिकता होती है, इसलिए 1.0.0-alpha < 1.0.0।
बिल्ड मेटाडेटा क्या है और क्या यह तुलना को प्रभावित करता है?
बिल्ड मेटाडेटा प्लस चिह्न के साथ जोड़ा जाता है (उदा., 1.0.0+build.123)। SemVer 2.0.0 विनिर्देश के अनुसार, बिल्ड मेटाडेटा को प्राथमिकता निर्धारित करते समय अनदेखा किया जाना चाहिए।
क्या मैं एक बार में कई वर्शन का परीक्षण कर सकता हूं?
हां। रेंज जांच टैब में, बैच मोड सक्षम करें और कई वर्शन (प्रति पंक्ति एक) दर्ज करें। टूल प्रत्येक वर्शन का परीक्षण करेगा और रंग-कोडित परिणाम दिखाएगा।
कोड उदाहरण
// 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']