SemVer 範囲チェッカー | ^ ~ とバージョン範囲の一致判定
バージョンと範囲式を入力すると、そのバージョンが範囲を満たすかどうかを判定するツール。キャレット (^)、チルダ (~)、x 範囲 (1.x)、比較演算子 (>=1.0.0 <2.0.0)、ハイフン範囲 (1.0.0 - 2.0.0) を解釈し、一致 / 不一致の結果と、その範囲が許可する最小・最大バージョンを表示する。
💡 このツールについて
package.json の依存指定を眺めて「^1.2.3 って結局 1.9.0 まで入るの?」と迷った経験がある人向けの即答機。SemVer の範囲演算子は一見シンプルだが、記号ごとに許可される窓の幅が違う。^1.2.3 は 2.0.0 未満まで、~1.2.3 はもっと狭く 1.2.x のパッチ更新のみ。さらにキャレットは 1.0.0 未満で挙動が変わり、^0.2.3 は 0.2.x だけを許可する。1.0 未満のマイナー更新は破壊的変更とみなされるためだ。
特に時間短縮になるのが最小・最大の境界表示。演算子を頭の中で展開しなくても、解決後の境界バージョンが直接見え、>=1.0.0 のような上限なし範囲には ∞ が出る。平易な解釈文と合わせれば、lockfile の解決結果や Dependabot の更新提案を、semver パッケージを入れたり REPL を立てたりせずに数秒で確認できる。
🧐 よくある質問
^1.2.3 に 2.0.0 は含まれる?
含まれない。キャレットは >=1.2.3 <2.0.0 を許可するため 2.0.0 は窓のすぐ外。最大バージョン欄に 1.x の上限が表示される。
^ と ~ の違いは?
キャレットは左端の非ゼロ桁を変えない範囲 (通常はマイナーとパッチ) を許可する。チルダはマイナーが指定された場合パッチ更新のみを許可し、~1.2.3 は 1.2.x を許すが 1.3.0 は許さない。
^0.2.3 の挙動が違うのはなぜ?
1.0.0 未満では SemVer は各マイナー更新を破壊的変更として扱う。そのため ^0.2.3 は <1.0.0 ではなく >=0.2.3 <0.3.0 に解決される。
1.0.0-beta のようなプレリリースはどう扱われる?
プレリリースは正式版より低い優先度を持ち、1.0.0-beta は 1.0.0 より前に並ぶ。本ツールはプレリリースタグを解析し、範囲判定時にその順序を反映する。
複合範囲も判定できる?
できる。空白区切りの比較演算子は AND 結合 (>=1.0.0 <2.0.0)、|| は範囲全体を OR 結合する。どちらの論理が効いているかは解釈文に表示される。
📚 豆知識
Semantic Versioning を広めたのは GitHub 共同創業者の Tom Preston-Werner で、2010 年に「依存地獄」と呼んだ問題に対抗するため SemVer 仕様を公開した。日常的に使われる ^ と ~ 演算子は実は SemVer のコア仕様には含まれておらず、npm の node-semver ライブラリ由来だ。npm がキャレット範囲を保存時のデフォルト接頭辞に採用したことで事実上の文法になった。package.json がキャレットだらけなのはこのためで、npm install lodash を実行すると npm は ^4.17.21 と書き込み、4.x 系の今後のマイナー・パッチ更新すべてに静かに同意させる。他のエコシステムもこの考え方を取り入れつつ規則を調整しており、Rust の Cargo は素の 1.2.3 要件を既定でキャレット相当に扱う。