# 通知設計書 2-ConfigError

## 概要

本ドキュメントは、Prettierにおいて設定ファイルの読み込みやパーサー・プリンターの初期化に失敗した場合に発生するエラー通知「ConfigError」の設計を記述する。

### 本通知の処理概要

ConfigErrorは、Prettierの設定に関連するエラーを表す通知であり、パーサーやプリンターの解決に失敗した場合に発生する。

**業務上の目的・背景**：Prettierは様々なパーサーとプリンターを使用してコードをフォーマットする。ユーザーが存在しないパーサー名を指定したり、対応するプリンターが見つからない場合、適切なエラーメッセージを表示して問題を通知する必要がある。これにより、ユーザーは設定の誤りを迅速に特定し、修正することができる。

**通知の送信タイミング**：`prettier.format()`等のAPI呼び出し時、または CLI実行時に、指定されたパーサー名に対応するプラグインが見つからない場合、あるいはパーサーのAST形式に対応するプリンターが見つからない場合に発生する。具体的には`src/main/parser-and-printer.js`の`getParserPluginByParserName`関数および`getPrinterPluginByAstFormat`関数内で検出される。

**通知の受信者**：CLIを使用しているユーザー、またはAPI経由でPrettierを呼び出しているアプリケーション開発者。

**通知内容の概要**：パーサーまたはプリンターの解決に失敗したこと、およびその理由を示すエラーメッセージ。スタンドアロンバンドル使用時には、プラグインを明示的に追加する必要があることも通知される。

**期待されるアクション**：ユーザーは正しいパーサー名を指定するか、必要なプラグインをインストール・設定する必要がある。

## 通知種別

CLIエラー出力（標準エラー出力への出力）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 高 |
| リトライ | なし |

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

エラーが発生した時点で即座に標準エラー出力（stderr）に出力される。CLI実行時には`context.logger.error()`を通じて出力され、プロセスは`process.exit(1)`で即座に終了する（全ファイルに影響するため）。

## 通知テンプレート

### メール通知の場合

該当なし（CLI出力のみ）

### 本文テンプレート

パーサー解決失敗時：
```
[error] Couldn't resolve parser "{parserName}".
```

スタンドアロンバンドル使用時（パーサー）：
```
[error] Couldn't resolve parser "{parserName}". Plugins must be explicitly added to the standalone bundle.
```

プリンター解決失敗時：
```
[error] Couldn't find plugin for AST format "{astFormat}".
```

スタンドアロンバンドル使用時（プリンター）：
```
[error] Couldn't find plugin for AST format "{astFormat}". Plugins must be explicitly added to the standalone bundle.
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| parserName | 指定されたパーサー名 | options.parser | Yes（パーサーエラー時） |
| astFormat | AST形式名 | parser.astFormat | Yes（プリンターエラー時） |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API呼び出し | format/formatWithCursor実行 | 指定パーサーが見つからない | プラグインにパーサーが存在しない |
| API呼び出し | format/formatWithCursor実行 | AST形式のプリンターが見つからない | プラグインにプリンターが存在しない |
| CLI実行 | prettierコマンド実行 | --parserで無効なパーサー指定 | 存在しないパーサー名を指定 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| なし | ConfigErrorは常に表示される |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[format呼び出し] --> B[normalizeFormatOptions]
    B --> C[getParserPluginByParserName]
    C --> D{パーサープラグイン存在?}
    D -->|Yes| E[initParser]
    D -->|No| F[ConfigError発生]
    E --> G[getPrinterPluginByAstFormat]
    G --> H{プリンタープラグイン存在?}
    H -->|Yes| I[initPrinter]
    H -->|No| J[ConfigError発生]
    F --> K[エラーメッセージ出力]
    J --> K
    K --> L[process.exit 1]
```

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

### 参照テーブル一覧

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

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| パーサー解決エラー | 指定パーサーがプラグインに存在しない | 正しいパーサー名を指定、または必要なプラグインをインストール |
| プリンター解決エラー | AST形式に対応するプリンターがない | 対応するプラグインをインストール |

### リトライ仕様

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

## 配信設定

### レート制限

該当なし

### 配信時間帯

該当なし

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

パーサー名やAST形式名がエラーメッセージに含まれるが、これらはユーザーが指定した値または内部的な識別子であり、機密情報ではない。

## 備考

- ConfigErrorは設定の根本的な問題を示すため、1ファイルで発生すると全ファイルに影響する
- そのためprocess.exit(1)で即座にプロセスを終了する
- スタンドアロンバンドル（ブラウザ版等）使用時は、プラグインを明示的に追加する必要があることが追加メッセージとして表示される

---

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

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

### 推奨読解順序

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

ConfigErrorクラスの定義を理解することで、エラーの基本構造を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | errors.js | `src/common/errors.js` | ConfigErrorクラスの定義（1-3行目）。Errorクラスを継承したシンプルなエラークラス |

**読解のコツ**: ES6クラス構文を使用。`name`プロパティでエラー名「ConfigError」を定義している。

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

パーサー・プリンター解決ロジックの実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | parser-and-printer.js | `src/main/parser-and-printer.js` | パーサー・プリンター解決とエラー発生箇所（12-56行目） |

**主要処理フロー**:
1. **12行目**: `getParserPluginByParserName`関数定義
2. **22-24行目**: プラグインからパーサーを検索（`findLast`で後方から検索）
3. **29行目**: エラーメッセージを構築
4. **30-32行目**: スタンドアロンバンドル時の追加メッセージ
5. **34行目**: `throw new ConfigError(message)`でエラーをスロー
6. **37行目**: `getPrinterPluginByAstFormat`関数定義
7. **43-45行目**: プラグインからプリンターを検索
8. **50-53行目**: エラーメッセージ構築（スタンドアロン対応含む）
9. **55行目**: `throw new ConfigError(message)`でエラーをスロー

#### Step 3: CLI層でのエラーハンドリングを理解する

CLIでConfigErrorがどのように処理されるかを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | format.js | `src/cli/format.js` | handleError関数でのConfigErrorの特別処理（56-60行目） |

**主要処理フロー**:
- **56行目**: `error instanceof errors.ConfigError`でConfigErrorを判定
- **58行目**: `context.logger.error(error.message)`でエラーメッセージ出力
- **60行目**: `process.exit(1)`で即座に終了（全ファイルに影響するため）

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

```
prettier.format() / CLI実行
    │
    ├─ normalizeFormatOptions() [src/main/normalize-format-options.js:22]
    │      │
    │      ├─ getParserPluginByParserName() [src/main/parser-and-printer.js:12]
    │      │      └─ throw ConfigError [34行目]
    │      │
    │      └─ getPrinterPluginByAstFormat() [src/main/parser-and-printer.js:37]
    │             └─ throw ConfigError [55行目]
    │
    └─ handleError() [src/cli/format.js:26] (CLI使用時)
           ├─ ConfigError判定 [56行目]
           ├─ context.logger.error() [58行目]
           └─ process.exit(1) [60行目]
```

### データフロー図

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

options              getParserPluginByParserName  ConfigError
├── parser: "xxx"    ├─ plugins.findLast()         │
├── plugins: [...]   └─ パーサー存在チェック         v
                                               handleError()
                     getPrinterPluginByAstFormat    │
                     ├─ plugins.findLast()          v
                     └─ プリンター存在チェック    stderr出力
                                               [error] メッセージ
                                                    │
                                                    v
                                               process.exit(1)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| errors.js | `src/common/errors.js` | ソース | ConfigErrorクラス定義 |
| parser-and-printer.js | `src/main/parser-and-printer.js` | ソース | パーサー・プリンター解決とエラー発生 |
| normalize-format-options.js | `src/main/normalize-format-options.js` | ソース | フォーマットオプション正規化（パーサー・プリンター初期化呼び出し） |
| format.js | `src/cli/format.js` | ソース | CLIでのエラーハンドリング |
| logger.js | `src/cli/logger.js` | ソース | エラーメッセージ出力 |
