allow‑list .gitignore で無視された @source ディレクトリを明示的にスキャンできるように修正

tailwindlabs/tailwindcss

Tailwind CSS の @source ディレクティブが、リポジトリルートの allow‑list 形式 .gitignore によって除外されたフォルダでも、明示的に指定すれば走査されるようになり、クラス抽出の欠落が解消されました。

背景

従来、@source が指すパスが .gitignoreallow‑list* で全体除外し ! で例外を許可)にマッチすると、スキャナはそのディレクトリ全体をスキップし、対象テンプレートから生成される CSS クラスが失われていました(Issue #19844)。この挙動は vendor/ のように Git で無視されても実装上は重要なリソースを含むケースで特に問題となります。Tailwind は Auto ソースに対してデフォルトで Git の無視規則を適用しており、明示的に @source で指定した場合でも同様に除外されていました。

技術的な変更

ソース種別の拡張crates/oxide/src/scanner/sources.rsSourceEntry::External のコメントを更新し、"gitignore で無視されるが明示的に追加されたフォルダ" を表す旨を明記しました。また、fxhash::FxHashMapignore::gitignore::Gitignore のインポートを追加し、gitignore の状態を高速に判定できる基盤を整えました。

Auto → External の昇格ロジックpublic_source_entries_to_private_source_entries 内で、Auto と判定されたエントリが実際に gitignore により無視されているかをチェックし、対象が無視されていれば External に変換します。この変更により、明示的な @sourcegitignore の除外をバイパスし、スキャン対象に加わります。

Walker の無視パターン調整crates/oxide/src/scanner/mod.rsemit(base, "!/**/*".to_owned()) に変更し、外部ソースが常に全ファイルを対象にするパターンを簡潔に記述しました。これに伴い、Pattern ソースの正規化ロジックも SourceEntry::Pattern { base, pattern } => Some((base.into(), pattern.into())) とシンプル化しました。

テストの追加crates/oxide/tests/scanner.rsintegrations/cli/index.test.ts に、allow‑list .gitignore 環境下で明示的 @source が正しく走査されることを検証するテストケースを追加しました。これらのテストは、実際のリポジトリ構成をシミュレートし、期待通り External ソースとして検出されることを確認します。

設計判断

既存キー拡張で後方互換性を維持:新しい設定キーを導入せず、AutoExternal の変換ロジックで機能追加を実現したため、既存の @source 設定やプラグインは変更不要です。これにより、利用者は既存の @source 文法をそのまま使い続けられます。

最小侵入的変更:walker のパターン文字列を一行にまとめ、Pattern の正規化ロジックを簡素化した点は、コードベース全体への影響を最小限に抑える意図が見えます。加えて、gitignore 判定を高速ハッシュマップで実装したことで、追加コストが最小化されています。

テスト駆動の安全性:新規テストが既存テストスイートに統合されたことで、将来的なリファクタリング時にこの振る舞いが壊れにくくなっています。テストは allow‑list と deny‑list の両シナリオを網羅し、設計選択の正当性を自動で保証します。

まとめ

この PR は、@source.gitignore の allow‑list によって除外されたフォルダでも明示的にスキャンできるよう、Auto ソースを External に昇格させるロジックと walker のパターン調整を導入した点が核心です。既存インターフェースを保ちつつ、テストで裏付けられた安全な実装変更により、Tailwind のクラス抽出がより堅牢になりました。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
0fe96e44

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文、背景、技術的変更、設計判断(任意)、まとめの5要素が揃っており、"総論→各論→結論" の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

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

コードブロックにファイル名付きシンタックスハイライトは使用されていませんが、必須ではありません。PR へのリンクは "[PR #20214](URL)" と記載されており、形式的に # で始まるリンクではあるものの、仕様通りの "[#123](URL)" ではない点が若干の違いです。

対象読者への適合性 ✓ PASS

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

Tailwind CSS の内部実装や Rust/TypeScript のコード変更に焦点を当てており、エンジニア向けの技術レベルです。初心者向けの過度な解説はありません。

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

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

各セクションは総論パラグラフ→各論パラグラフ→結論パラグラフの構成となり、段落はトピックセンテンスで始まり、1段落1トピック・6文以下で書かれています。段落間は空行で区切られています。

Diff内容との照合 ✓ PASS

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

記事中の変更点(emit のパターン、SourceEntry のコメント、インポート追加、テストコード等)は、提供された Diff と完全に一致しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

"@source"、"allow‑list"、"Auto"、"External"、"gitignore" などの用語は PR および Diff と一致し、誤用は見られません。

説明の技術的正確性 ✓ PASS

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

技術的な主張は PR の説明と Diff に裏付けられており、因果関係も論理的です。

事実の突合 ✓ PASS

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

記事の全ての事実は PR タイトル・説明・Diff に基づいており、根拠のない数値や外部知識の付加はありません。

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

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

PR 番号 (#20214)、Issue 番号 (#19844) などは正しく記載されています。数値的な誤りはありません。

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

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

記事タイトルは PR の内容(allow‑list .gitignore で除外されたフォルダでも @source が走査できるように修正)を正確に表現しています。

外部知識の正確性 ✓ PASS

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

バージョンサポートやリリース日程など、PR に記載されていない外部知識は一切含まれていません。

時間表現の正確性 ✓ PASS

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

時間表現は使用されておらず、PR の記述と食い違いもありません。