# 機能設計書 76-警告プラグイン

## 概要

本ドキュメントは、webpackの警告制御に関連するプラグイン群（WarnCaseSensitiveModulesPlugin、WarnDeprecatedOptionPlugin、WarnNoModeSetPlugin、IgnoreWarningsPlugin）について、その処理内容・警告検出ロジック・フィルタリング機能を詳細に記述した機能設計書である。

### 本機能の処理概要

警告プラグイン群は、ビルドプロセス中に発生する各種警告の検出・生成・フィルタリングを担当する4つのプラグインで構成される機能である。

**業務上の目的・背景**：大規模プロジェクトではモジュール名の大文字小文字の不一致（Windows/macOS/Linuxのファイルシステム差異）、非推奨オプションの使用、modeの未設定など、ビルドの品質や移植性に影響する問題が発生しうる。これらを警告として検出し開発者に通知することで、潜在的な問題を早期に発見・修正できるようにする。同時に、不要な警告を抑制するフィルタリング機能も提供する。

**機能の利用シーン**：大文字小文字が異なるモジュール参照がある場合の警告。非推奨のoptimization.moduleIds: "hashed"の使用時。modeオプションが未設定の場合。特定の警告パターンを抑制したい場合。

**主要な処理内容**：
1. WarnCaseSensitiveModulesPlugin: モジュール識別子の大文字小文字不一致を検出
2. WarnDeprecatedOptionPlugin: 非推奨オプション値の使用を警告
3. WarnNoModeSetPlugin: mode未設定の警告
4. IgnoreWarningsPlugin: 条件に一致する警告のフィルタリング（抑制）

**関連システム・外部連携**：compilation.warnings配列への警告追加。compilation.hooks.sealフック。compilation.hooks.processWarningsフック。

**権限による制御**：本機能に権限による制御はない。

## 関連画面

本機能に直接関連する画面はない。警告はCLI出力や統計レポートに表示される。

## 機能種別

警告検出・フィルタリング処理

## 入力仕様

### 入力パラメータ

WarnCaseSensitiveModulesPlugin:
入力パラメータなし（compilation.modulesを参照）

WarnDeprecatedOptionPlugin:

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| option | string | Yes | 対象オプションパス | - |
| value | string \| number | Yes | 非推奨の値 | - |
| suggestion | string | Yes | 推奨される代替値 | - |

IgnoreWarningsPlugin:

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| ignoreWarnings | IgnoreFn[] | Yes | 警告フィルタ関数の配列 | 各関数は(warning, compilation) => booleanの形式 |

### 入力データソース

- compilation.modules（WarnCaseSensitiveModulesPlugin用）
- webpack設定の各オプション値

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| CaseSensitiveModulesWarning | WebpackError | 大文字小文字不一致の警告 |
| DeprecatedOptionWarning | WebpackError | 非推奨オプション警告 |
| NoModeWarning | WebpackError | mode未設定の警告 |
| (フィルタ結果) | WebpackError[] | フィルタリング後の警告配列 |

### 出力先

compilation.warnings配列に追加/フィルタリング。

## 処理フロー

### 処理シーケンス

```
1. WarnCaseSensitiveModulesPlugin
   ├─ compilation.hooks.seal時に発火
   ├─ 全モジュールのidentifier()をlowerCase化してMap構築
   ├─ data: URLモジュールはスキップ
   ├─ 同一lowerCase identifierに複数モジュールが存在する場合
   └─ CaseSensitiveModulesWarningをcompilation.warningsに追加

2. WarnDeprecatedOptionPlugin
   ├─ thisCompilationフックで発火
   └─ DeprecatedOptionWarningをcompilation.warningsに即追加

3. WarnNoModeSetPlugin
   ├─ thisCompilationフックで発火
   └─ NoModeWarningをcompilation.warningsに即追加

4. IgnoreWarningsPlugin
   ├─ compilation.hooks.processWarningsで発火
   └─ 警告配列からignoreWarnings条件に一致するものを除外
```

### フローチャート

```mermaid
flowchart TD
    A[ビルド開始] --> B[WarnNoModeSetPlugin]
    B --> C{mode設定?}
    C -->|No| D[NoModeWarning追加]
    C -->|Yes| E[スキップ]

    A --> F[WarnDeprecatedOptionPlugin]
    F --> G[DeprecatedOptionWarning追加]

    A --> H[sealフック]
    H --> I[WarnCaseSensitiveModulesPlugin]
    I --> J[モジュールidentifierのlowerCase比較]
    J --> K{重複あり?}
    K -->|Yes| L[CaseSensitiveModulesWarning追加]
    K -->|No| M[スキップ]

    D --> N[processWarningsフック]
    G --> N
    L --> N
    N --> O[IgnoreWarningsPlugin]
    O --> P[条件一致警告を除外]
    P --> Q[最終警告リスト]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-76-01 | 大文字小文字検出 | 同一モジュールのidentifierがlowerCaseで一致する場合に警告 | WarnCaseSensitiveModulesPlugin |
| BR-76-02 | data:URL除外 | data: URLモジュールは大文字小文字チェックの対象外 | resourceResolveData.encodedContentが定義されている場合 |
| BR-76-03 | 非推奨オプション警告形式 | "The value '{value}' for option '{option}' is deprecated. Use '{suggestion}' instead."形式 | WarnDeprecatedOptionPlugin |
| BR-76-04 | 警告フィルタリング | ignoreWarningsの条件に一致する警告をwarnings配列から除外 | IgnoreWarningsPlugin |
| BR-76-05 | フィルタ条件 | message/module/file の各RegExpパターンでAND条件マッチ | IgnoreWarningsPlugin |

### 計算ロジック

特になし。

## データベース操作仕様

本機能にデータベース操作はない。

## エラー処理

### エラーケース一覧

本機能はエラーではなく警告を生成する。エラーは発生しない。

### リトライ仕様

リトライは不要。

## トランザクション仕様

トランザクション管理は不要。

## パフォーマンス要件

WarnCaseSensitiveModulesPluginは全モジュールのイテレーションを行うため、大量のモジュールがある場合はsealフェーズのオーバーヘッドとなる。ただしMapベースの比較で効率化されている。

## セキュリティ考慮事項

特になし。

## 備考

- WarnCaseSensitiveModulesPluginはWebpackOptionsApplyで常時適用される
- WarnNoModeSetPluginはtypeof options.mode !== "string"の場合のみ適用される
- WarnDeprecatedOptionPluginはmoduleIds: "hashed"の場合に適用される
- IgnoreWarningsPluginはignoreWarnings設定が存在する場合のみ適用される

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WebpackError.js | `lib/WebpackError.js` | 警告クラスの基底クラス |

#### Step 2: 各プラグインの実装

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | WarnCaseSensitiveModulesPlugin.js | `lib/WarnCaseSensitiveModulesPlugin.js` | sealフックでの大文字小文字チェック |
| 2-2 | WarnDeprecatedOptionPlugin.js | `lib/WarnDeprecatedOptionPlugin.js` | 非推奨オプション警告生成 |
| 2-3 | WarnNoModeSetPlugin.js | `lib/WarnNoModeSetPlugin.js` | mode未設定警告 |
| 2-4 | IgnoreWarningsPlugin.js | `lib/IgnoreWarningsPlugin.js` | processWarningsフックでのフィルタリング |

**主要処理フロー（WarnCaseSensitiveModulesPlugin）**:
- **24行目**: compilation.hooks.seal.tapでフック登録
- **26行目**: moduleWithoutCase Mapの初期化
- **27-47行目**: 全モジュールのイテレーションとlowerCase比較
- **32-38行目**: data: URL除外ロジック
- **48-58行目**: 重複検出時のCaseSensitiveModulesWarning生成

**主要処理フロー（IgnoreWarningsPlugin）**:
- **31行目**: compilation.hooks.processWarnings.tapでフック登録
- **32-35行目**: warnings.filterで条件一致警告を除外

### プログラム呼び出し階層図

```
WebpackOptionsApply.process()
    |
    +-- new WarnCaseSensitiveModulesPlugin().apply(compiler)
    |       +-- compilation.hooks.seal.tap()
    |               +-- compilation.modules [iterate]
    |               +-- CaseSensitiveModulesWarning → compilation.warnings
    |
    +-- new WarnNoModeSetPlugin().apply(compiler) [条件付き]
    |       +-- compilation.hooks.thisCompilation.tap()
    |               +-- NoModeWarning → compilation.warnings
    |
    +-- new WarnDeprecatedOptionPlugin().apply(compiler) [条件付き]
    |       +-- compilation.hooks.thisCompilation.tap()
    |               +-- DeprecatedOptionWarning → compilation.warnings
    |
    +-- new IgnoreWarningsPlugin().apply(compiler) [条件付き]
            +-- compilation.hooks.compilation.tap()
                    +-- compilation.hooks.processWarnings.tap()
                            +-- warnings.filter()
```

### データフロー図

```
[入力]                       [処理]                           [出力]

compilation.modules ----> WarnCaseSensitiveModulesPlugin --> CaseSensitiveModulesWarning
options.mode -----------> WarnNoModeSetPlugin ------------> NoModeWarning
options.optimization ---> WarnDeprecatedOptionPlugin -----> DeprecatedOptionWarning

上記警告 ------+
               |
compilation    v
.warnings --> IgnoreWarningsPlugin --> フィルタ済みwarnings
               ^
ignoreWarnings |
条件 ----------+
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| WarnCaseSensitiveModulesPlugin.js | `lib/WarnCaseSensitiveModulesPlugin.js` | ソース | 大文字小文字不一致検出プラグイン |
| WarnDeprecatedOptionPlugin.js | `lib/WarnDeprecatedOptionPlugin.js` | ソース | 非推奨オプション警告プラグイン |
| WarnNoModeSetPlugin.js | `lib/WarnNoModeSetPlugin.js` | ソース | mode未設定警告プラグイン |
| IgnoreWarningsPlugin.js | `lib/IgnoreWarningsPlugin.js` | ソース | 警告フィルタリングプラグイン |
| CaseSensitiveModulesWarning.js | `lib/CaseSensitiveModulesWarning.js` | ソース | 大文字小文字不一致警告クラス |
| NoModeWarning.js | `lib/NoModeWarning.js` | ソース | mode未設定警告クラス |
