# 通知設計書 25-MinMaxSizeWarning

## 概要

本ドキュメントは、Webpackにおける `MinMaxSizeWarning` の通知仕様を定義する。SplitChunksPlugin設定でminSizeがmaxSizeより大きい不正な設定が検出された場合に発行される設定警告クラスである。

### 本通知の処理概要

MinMaxSizeWarningは、Webpackの最適化フェーズ（SplitChunksPlugin実行時）において、チャンク分割設定のminSizeがmaxSizeより大きい矛盾した設定が検出された場合に発行される警告通知である。

**業務上の目的・背景**：SplitChunksPluginにおけるminSizeとmaxSizeの設定は、チャンク分割の挙動を制御する重要なパラメータである。minSize > maxSizeの矛盾した設定は、意図しないチャンク分割結果を生む可能性がある。開発者が設定ミスに早期に気付けるようにするための警告である。

**通知の送信タイミング**：SplitChunksPlugin の processChunkFromMinMaxCache処理中、各チャンクの最大サイズ検証時にminSizeとmaxSizeの比較が行われ、矛盾が検出された時点で発行される。

**通知の受信者**：Webpackビルドを実行する開発者。compilation.warningsに蓄積されビルド出力として表示される。

**通知内容の概要**：対象のキャッシュグループ名（複数の場合はカンマ区切り）、設定されたminSizeとmaxSizeの値をフォーマットして表示する。

**期待されるアクション**：開発者は、webpack.config.jsのoptimization.splitChunks設定を確認し、minSizeをmaxSize以下に修正するか、maxSizeをminSize以上に修正する。

## 通知種別

ビルド警告（Webpack Compilation Warning）。コンソール出力およびStats APIを通じて開発者に通知される。

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（SplitChunksPlugin処理中に即座に生成） |
| 優先度 | 中（警告レベル） |
| リトライ | なし（一度きりの警告発行） |

### 送信先決定ロジック

SplitChunksPlugin内で各キャッシュグループおよびソースタイプごとにminSizeとmaxSizeを比較し、矛盾が検出された場合に生成される。同一の矛盾設定に対して重複警告を防ぐため、incorrectMinMaxSizeSet（Set）で既出チェックが行われる。

## 通知テンプレート

### メール通知の場合

該当なし。本通知はメール通知ではなく、Webpackビルド出力として表示される。

### 本文テンプレート

```
WARNING in SplitChunksPlugin
{Cache group キャッシュグループ名 | Fallback cache group}
Configured minSize ({minSize}) is bigger than maxSize ({maxSize}).
This seem to be a invalid optimization.splitChunks configuration.
```

### 添付ファイル

該当なし。

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| keys | キャッシュグループ名の配列（undefined可） | chunkConfig.keys | No |
| minSize | 設定されたminSize値（バイト） | splitChunks設定のminSize | Yes |
| maxSize | 設定されたmaxSize値（バイト） | splitChunks設定のmaxSize | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 最適化処理 | SplitChunksPlugin.processChunkFromMinMaxCache | minSizeValue > maxSizeValue（ソースタイプ別に比較） | 各チャンク・各ソースタイプごとに検査 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| minSize <= maxSize | 正常な設定の場合は警告なし |
| 同一warningKeyが既出 | incorrectMinMaxSizeSet で重複排除。同じキー・サイズ組み合わせの警告は1回のみ |
| maxSizeが空オブジェクト | Object.keys(maxSize).length === 0 の場合はスキップ |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[SplitChunksPlugin: チャンク最大サイズ処理] --> B[maxSizeのキーをループ]
    B --> C{minSizeValue > maxSizeValue?}
    C -->|No| D[次のキーへ]
    C -->|Yes| E[warningKey生成]
    E --> F{incorrectMinMaxSizeSetに既出?}
    F -->|Yes| G[スキップ]
    F -->|No| H[incorrectMinMaxSizeSetに追加]
    H --> I[MinMaxSizeWarning生成]
    I --> J[compilation.warnings.push]
    J --> K[処理継続]
    D --> K
    G --> K
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし。Webpackはデータベースを使用しない。

### 更新テーブル一覧

該当なし。

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 該当なし | - | 矛盾設定があっても警告のみで処理は継続する |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし。ビルド実行時に即座に警告が生成される。

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

キャッシュグループ名とサイズ値のみであり、機密情報は含まれない。

## 備考

- WebpackErrorを基底クラスとして継承している
- SizeFormatHelpers.formatSizeでサイズをフォーマット表示
- keysがundefinedの場合は "Fallback cache group" として表示
- keysが1つの場合は "Cache group {name}"、複数の場合は "Cache groups {name1}, {name2}" として表示
- 矛盾設定があってもminSizeをmaxSizeとして扱う（Math.max(value, minSizeValue)）ため、ビルド自体は継続する

---

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

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

### 推奨読解順序

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

MinMaxSizeWarningクラスとSizeFormatHelpersの関係を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | WebpackError.js | `lib/WebpackError.js` | 基底クラス |
| 1-2 | MinMaxSizeWarning.js | `lib/optimize/MinMaxSizeWarning.js` | keys, minSize, maxSizeの3引数でメッセージを構築 |
| 1-3 | SizeFormatHelpers.js | `lib/SizeFormatHelpers.js` | formatSize関数でバイト数を人間可読形式に変換 |

**読解のコツ**: keysの有無とkeys.lengthで表示メッセージが分岐する点に注意。18-24行目のif/else分岐を確認すること。

#### Step 2: エントリーポイントを理解する

SplitChunksPlugin内での警告発行箇所を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SplitChunksPlugin.js | `lib/optimize/SplitChunksPlugin.js` | 1735-1753行目のminSize/maxSize比較ロジック |

**主要処理フロー**:
1. **1735-1737行目**: Object.keys(maxSize) でソースタイプをループ
2. **1738-1739行目**: maxSizeValueとminSizeValueを取得
3. **1740-1742行目**: typeof minSizeValue === "number" && minSizeValue > maxSizeValue で矛盾チェック
4. **1744-1747行目**: warningKeyを生成（重複排除用）
5. **1748行目**: incorrectMinMaxSizeSet.has(warningKey) で既出チェック
6. **1749行目**: Setに追加
7. **1750-1752行目**: compilation.warnings.push(new MinMaxSizeWarning(...))

#### Step 3: 矛盾時のフォールバック動作を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | SplitChunksPlugin.js | `lib/optimize/SplitChunksPlugin.js` | 1758-1763行目で矛盾時にMath.maxでフォールバック |

**主要処理フロー**:
- **1758-1763行目**: mapObjectでmaxSizeの各値をMath.max(value, minSizeValue)に補正。これにより矛盾設定でもビルドが継続可能

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

```
SplitChunksPlugin.apply()
    |
    +-- compilation.hooks.optimizeChunks.tap()
            |
            +-- チャンクループ処理
                    |
                    +-- maxSizeのソースタイプループ (1735行目)
                    |       |
                    |       +-- minSize/maxSize比較 (1740-1742行目)
                    |       |
                    |       +-- warningKey生成・重複チェック (1744-1749行目)
                    |       |
                    |       +-- new MinMaxSizeWarning(keys, minSizeValue, maxSizeValue)
                    |               |
                    |               +-- SizeFormatHelpers.formatSize(minSize) (28行目)
                    |               +-- SizeFormatHelpers.formatSize(maxSize) (29行目)
                    |
                    +-- compilation.warnings.push(warning)
                    |
                    +-- Math.max(value, minSizeValue) でフォールバック (1760-1761行目)
```

### データフロー図

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

splitChunks.minSize ----------> ソースタイプ別比較 ----------> MinMaxSizeWarning
splitChunks.maxSize ---------->     |                              |
chunkConfig.keys -------------->    v                              v
                             incorrectMinMaxSizeSet          compilation.warnings[]
                             (重複排除)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| MinMaxSizeWarning.js | `lib/optimize/MinMaxSizeWarning.js` | ソース | 警告クラス本体 |
| SplitChunksPlugin.js | `lib/optimize/SplitChunksPlugin.js` | ソース | 警告の生成・発行を行うプラグイン |
| WebpackError.js | `lib/WebpackError.js` | ソース | 基底エラー/警告クラス |
| SizeFormatHelpers.js | `lib/SizeFormatHelpers.js` | ソース | サイズフォーマットユーティリティ |
