# 通知設計書 8-ModuleDependencyError

## 概要

本ドキュメントは、Webpackにおけるモジュール依存関係の解析時に発生するエラーを表す `ModuleDependencyError` クラスの設計仕様を記述する。依存関係オブジェクトの `getErrors()` メソッドから返されるエラーを、モジュールおよび位置情報と関連付けてラップする。

### 本通知の処理概要

ModuleDependencyError は、依存関係解析フェーズで検出されたエラーをモジュール情報・ソースコード位置情報と共に保持するクラスである。ModuleDependencyWarning（No.3）のエラー版に相当し、Compilationの `reportDependencyErrorsAndWarnings` メソッド内で生成される。

**業務上の目的・背景**：Webpackのモジュール依存関係解析では、import/exportのリンクエラーや、存在しないエクスポートの参照など、致命的な問題が発生することがある。これらのエラーを、どのモジュールのどの位置で発生したかという情報と共に開発者に通知することで、問題箇所の迅速な特定と修正を支援する。

**通知の送信タイミング**：Compilation.reportDependencyErrorsAndWarnings実行時（Compilation.js 行3569）。各依存関係の `getErrors()` メソッドが返すエラーが存在する場合に生成される。

**通知の受信者**：Webpackビルドを実行した開発者。Stats出力を通じてエラーとして表示される。

**通知内容の概要**：元のエラーメッセージ、発生モジュール情報（module）、ソースコード上の位置情報（loc）が含まれる。元エラーの `hideStack` フラグに応じて、スタックトレースの表示方法が変わる。

**期待されるアクション**：開発者は、位置情報（loc）を参照して該当ソースコードを確認し、依存関係の記述方法の修正（import/export文の修正、存在しないエクスポートの参照削除など）を行う。

## 通知種別

ビルドプロセス内エラー通知（コンソール出力 / Stats JSON / Stats HTML）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（Compilation.errors配列への直接push） |
| 優先度 | 高（エラー） |
| リトライ | なし |

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

Compilationの `reportDependencyErrorsAndWarnings` メソッド内で、各依存関係ブロックを再帰的に走査し、依存関係の `getErrors()` が返すエラーをModuleDependencyErrorでラップして `Compilation.errors` 配列に直接pushする。

## 通知テンプレート

### メール通知の場合

該当なし（ビルド出力として表示される）。

### 本文テンプレート

```
{err.message}
```

hideStack=false の場合のdetails:
```
{err.stackの2行目以降}
```

hideStack=true の場合のstack:
```
{err.stackの2行目以降}

{元のWebpackError.stack}
```

### 添付ファイル

該当なし。

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| module | 依存関係を持つモジュール | コンストラクタ引数 | Yes |
| err | 元のエラーオブジェクト（ErrorWithHideStack型） | 依存関係のgetErrors()戻り値 | Yes |
| loc | 依存関係のソースコード位置情報 | 依存関係オブジェクトのlocプロパティ | Yes |
| name | エラー名称（固定値 "ModuleDependencyError"） | クラス内で設定 | Yes |
| details | スタックトレース（hideStack=falseの場合） | err.stackの加工結果 | No |
| error | 元のエラーオブジェクト参照 | コンストラクタ引数のerr | No |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 依存関係報告 | Compilation.reportDependencyErrorsAndWarnings | dependency.getErrors()が値を返す場合 | Compilation.js 行3566-3572 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| stats.errors=false | webpack設定でerrors表示を無効にしている場合 |
| getErrors()がnull/undefinedを返す | 依存関係にエラーがない場合は生成されない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[Compilation.reportDependencyErrorsAndWarnings] --> B[依存関係ブロックを走査]
    B --> C[dependency.getErrors 呼び出し]
    C --> D{エラーあり?}
    D -->|Yes| E[ModuleDependencyError生成]
    D -->|No| F[スキップ]
    E --> G{err.hideStack?}
    G -->|false| H[detailsにスタックトレース設定]
    G -->|true| I[stackプロパティに結合]
    H --> J[Compilation.errors.push]
    I --> J
    J --> K[Stats出力]
    F --> L[次の依存関係へ]
```

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

### 参照テーブル一覧

該当なし（データベースは使用しない）。

### 更新テーブル一覧

該当なし（データベースは使用しない）。

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| err.messageが未定義 | getErrors()が不正な値を返す | err.messageを直接superに渡すため、undefinedが伝搬する可能性がある |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（ビルド実行時に即座に出力される）。

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

スタックトレースにファイルパス情報が含まれるため、本番環境でのログ公開時には注意が必要。

## 備考

- ModuleDependencyError は `makeSerializable` で登録されていない（ModuleDependencyWarningとは異なる）。これはファイル末尾に `makeSerializable` の呼び出しがないことから確認できる。ただし、基底クラスのWebpackErrorがシリアライズ対応しているため、基本的なシリアライズ機能は利用可能。
- `error` プロパティはシリアライズされない（行32のコメント参照）。デシリアライズ後は `error` が `undefined` になる可能性がある。
- ModuleDependencyWarning（No.3）とほぼ同じ構造だが、(1) `super(err.message)` と `super(err ? err.message : "")` でnullチェックの有無が異なる、(2) Compilation.errors に追加される点が異なる。
- `ErrorWithHideStack` 型は `ModuleBuildError.js` からインポートされている。

---

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

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

### 推奨読解順序

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

ModuleDependencyErrorの構造と、ModuleDependencyWarningとの共通点・相違点を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | ModuleDependencyError.js | `lib/ModuleDependencyError.js` | コンストラクタ引数（module, err, loc）、hideStackによるスタック処理の分岐、makeSerializableの未使用 |
| 1-2 | ModuleDependencyWarning.js | `lib/ModuleDependencyWarning.js` | 比較対象: ほぼ同一構造だがnullチェックとmakeSerializableの有無が異なる |

**読解のコツ**: ModuleDependencyError（行21-41）はModuleDependencyWarning（行21-41）とほぼ同一構造。重要な違いとして、(1) `super(err.message)` でerrのnullチェックがない点、(2) `makeSerializable` が呼ばれていない点に注目する。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Compilation.js | `lib/Compilation.js` | reportDependencyErrorsAndWarningsメソッド（行3552-3581）でのgetErrors()呼び出し |

**主要処理フロー**:
1. **行3566**: `d.getErrors(this.moduleGraph)` で各依存関係のエラーを取得
2. **行3569**: `new ModuleDependencyError(module, e, d.loc)` でインスタンス生成
3. **行3570**: `this.errors.push(error)` でCompilationのエラー配列に追加

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

```
Compilation.reportDependencyErrorsAndWarnings()  [Compilation.js 行3552]
    │
    ├─ dependency.getErrors(moduleGraph)           [行3566]
    │      └─ (各依存関係クラスのgetErrors実装)
    │
    └─ new ModuleDependencyError(module, e, d.loc)  [行3569]
           ├─ super(err.message)                     [行22]
           └─ hideStack分岐処理                      [行26-40]
```

### データフロー図

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

dependency              ───> getErrors()                ───> WebpackError[]
    │                                                         │
    │                                                         v
module, err, loc        ───> ModuleDependencyError      ───> Compilation.errors[]
                              コンストラクタ                    │
                              hideStack分岐                    v
                                                         Stats出力(エラー)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| ModuleDependencyError.js | `lib/ModuleDependencyError.js` | ソース | 依存関係エラークラス定義 |
| WebpackError.js | `lib/WebpackError.js` | ソース | 基底エラー/警告クラス |
| Compilation.js | `lib/Compilation.js` | ソース | reportDependencyErrorsAndWarningsメソッド |
| ModuleDependencyWarning.js | `lib/ModuleDependencyWarning.js` | ソース | 比較対象: 警告版の同等クラス |
| ModuleBuildError.js | `lib/ModuleBuildError.js` | ソース | ErrorWithHideStack型の定義元 |
