VERSIONS.txtのバージョン重複を修正

shoelace-style/webawesome

Web AwesomeのVERSIONS.txtファイルでバージョン番号が誤って結合される問題が修正されました。この変更により、バージョン管理スクリプトがファイルの整合性を保つように改善されています。

背景

VERSIONS.txtには、これまでリリースされた全バージョンが記録されています。しかし、update-root-version.jsスクリプトの実装に問題があり、バージョン3.2.0と3.2.1が改行なしで「3.2.03.2.1」として結合されていました。

この問題は、スクリプトが新しいバージョンをファイルに追加する際の処理に起因していました。fs.appendFileSyncを使用していたため、既存の内容に改行なしで追記されるケースがあったと考えられます。

技術的な変更

packages/webawesome/scripts/update-root-version.js の処理フローが改善されました。ファイルの読み込み、バージョンの管理、書き込みの各段階で変更が加えられています。

変更前:

const versions = fs.readFileSync(versionsFile, { encoding: 'utf8' }).split(/\r?\n/);

if (!versions.includes(currentVersion)) {
  fs.appendFileSync(versionsFile, webawesomePackageJSON.version);
}

変更後:

const versions = fs
  .readFileSync(versionsFile, { encoding: 'utf8' })
  .split(/\r?\n/)
  .filter(Boolean)
  .sort((a, b) => {
    return a.localeCompare(b);
  });

if (!versions.includes(currentVersion)) {
  versions.push(currentVersion);
}

fs.writeFileSync(versionsFile, versions.join('\n'));

主な変更点は3つあります。

第一に、.filter(Boolean) が追加され、空行が除外されるようになりました。これにより、ファイル末尾の改行やその他の空行がバージョンリストから除外されます。

第二に、.sort((a, b) => a.localeCompare(b)) でバージョンがソートされるようになりました。コメントにあるように、将来的にはセマンティックバージョニングを理解した適切なソート処理への置き換えが予定されていますが、現時点では文字列の辞書順ソートが使用されています。

第三に、バージョンの追加方法が fs.appendFileSyncから配列操作とfs.writeFileSyncの組み合わせ に変更されました。新しいバージョンは配列にpushされ、最終的に改行で結合されたテキストとしてファイル全体が書き直されます。

VERSIONS.txt の修正では、結合されていた「3.2.03.2.1」が適切に分割され、2つの独立したバージョン番号として記録されるようになりました。

設計判断

ファイル全体の書き直し方式 が採用されました。

このアプローチは、追記方式(append)と比較して処理コストが高くなる可能性がありますが、ファイルの整合性を保証しやすくなります。バージョンリストのソートや空行の除去といった正規化処理を、書き込みのたびに確実に適用できます。

また、コメントで示されているように、現在の辞書順ソートは暫定的な実装です。セマンティックバージョニングのルール(major.minor.patchの数値比較)を理解したソート処理への移行が今後の課題として認識されています。現時点では「3.10.0」が「3.2.0」より前にソートされる問題が残りますが、段階的な改善方針が取られています。

まとめ

本PRは、VERSIONS.txtの書き込みロジックを改善し、バージョン番号の結合問題を解決しました。fs.appendFileSyncから配列ベースのアプローチに変更することで、ファイルの整合性を保ちながら、将来的なセマンティックバージョニング対応への道筋も示しています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

「総論→各論→結論」の構成が明確です。リード文、背景、技術的な変更、設計判断、まとめの各要素が適切に配置されており、記事全体の流れが非常に分かりやすいです。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライトは正しく使用されています。しかし、GitHubのPRリンク記法がガイドライン([#123](URL))と異なり、[PR #2025](URL)形式になっています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

Node.jsのファイルシステム操作やバージョニングスクリプトに関する内容であり、専門知識を持つエンジニアという対象読者に完全に適合しています。過度な説明はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

パラグラフ・ライティングの原則が非常によく守られています。各セクションは総論から始まり、各段落はトピックセンテンスで開始されています。1段落1トピックが徹底され、段落の長さも適切です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードブロックは、提供されたDiffの内容を正確に反映しています。変更前後のコード引用は適切で、ファイルパスも一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「fs.appendFileSync」「fs.writeFileSync」「セマンティックバージョニング」「localeCompare」などの技術用語が、文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

コード変更に関する技術的な説明は正確かつ論理的です。`filter(Boolean)`の役割や、追記から全体書き込みへの変更理由の説明は、Diffの内容と完全に整合しています。

事実の突合 ⚠ WARNING

PR情報による主張の裏付け(ハルシネーション検出)

記事の主張の大部分はPR情報で裏付けられています。しかし、「現時点では「3.10.0」が「3.2.0」より前にソートされる問題が残ります」という具体例は、PR情報にはなく、コードの挙動から推測される補足情報です。事実の捏造ではありませんが、厳密にはPR外の情報です。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#2025)やバージョン番号(3.2.0, 3.2.1)など、記事内の数値や固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「VERSIONS.txtのバージョン重複を修正」は、PRのタイトル「fix versioning issue」の内容をより具体的に、かつ正確に表現しており、非常に適切です。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

LTSやEOLなど、PR情報に基づかない外部知識の追加はありません。記事内容はPRの範囲内に留まっています。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「将来的には...置き換えが予定されています」という時間表現は、Diff内のTODOコメントの内容を正確に反映しており、時間表現の歪曲はありません。