Oh MyUtils

Semver計算機 - セマンティックバージョンの解析・比較・テスト オンライン

セマンティックバージョニング文字列を解析、比較、ソートし、npm形式のレンジに対してテストします。キャレット、チルダ、ワイルドカード、ORレンジをサポート — 100%クライアントサイド、データはサーバーに送信されません。

比較する2つの有効なバージョンを入力してください

よくある質問

セマンティックバージョニング(SemVer)とは何ですか?

セマンティックバージョニングは、MAJOR.MINOR.PATCHの3部分からなるバージョニング標準です。MAJORは後方互換性のない変更、MINORは後方互換性のある新機能、PATCHは後方互換性のあるバグ修正で増加します。SemVer 2.0.0仕様で定義され、npm、PyPI、Cargo、Goモジュールなどほぼすべてのパッケージエコシステムで使用されています。

このsemver計算機ツールはどのように使いますか?

ニーズに応じて4つのタブから選択してください:(1) 比較 — 2つのバージョンを入力して大小を確認、(2) レンジチェック — バージョンとnpmスタイルのレンジを入力してテスト、(3) ソート — 複数のバージョンを貼り付けて優先順位でソート、(4) バンプ — バージョンを入力して次のmajor、minor、patch、pre-releaseバージョンを確認。

バージョンデータは安全ですか?サーバーに送信されますか?

すべての解析、比較、レンジチェックは、ブラウザ内でJavaScriptを使用して100%クライアントサイドで実行されます。データはサーバーに送信されません。npmレジストリにクエリを送る他のツールとは異なり、完全にオフラインで動作します。

キャレット(^)とチルダ(~)レンジの違いは何ですか?

キャレット(^)レンジは最左の非ゼロ桁を変更しない変更を許可します:^1.2.3は>=1.2.3 <2.0.0を意味します。チルダ(~)レンジはパッチレベルの変更のみ許可します:~1.2.3は>=1.2.3 <1.3.0を意味します。0.xバージョンの場合、キャレットはより制限的に動作します:^0.2.3は>=0.2.3 <0.3.0を意味します。

SemVerはプレリリースバージョンをどのように扱いますか?

プレリリースバージョンはハイフンで追加されます(例:1.0.0-alpha、1.0.0-beta.1)。通常バージョンより低い優先順位を持つため、1.0.0-alpha < 1.0.0です。識別子は左から右に比較され、数値は整数として、英数字は辞書順で比較されます。

ビルドメタデータとは何ですか?バージョン比較に影響しますか?

ビルドメタデータはプラス記号で追加されます(例:1.0.0+build.123)。SemVer 2.0.0仕様により、ビルドメタデータはバージョン優先順位の決定時に無視されなければなりません。つまり、1.0.0+build.1と1.0.0+build.999は同じ優先順位とみなされます。

一度に複数のバージョンをテストできますか?

はい。レンジチェックタブでバッチモードを有効にすると、複数のバージョンを1行に1つずつ入力できます。ツールは各バージョンをレンジ式に対してテストし、色分けされた結果を表示します。

コード例

// 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']

関連ツール