# 通知設計書 30-設定ファイル読み込みログ

## 概要

本ドキュメントは、`@babel/core`における設定ファイルの読み込み状況をコンソールに出力するログ機能の設計について記載する。

### 本通知の処理概要

この通知は、Babelの設定ファイル（babel.config.js、.babelrcなど）の読み込み状況や、ignore/onlyの設定による処理スキップ状況をコンソールにログ出力する機能を提供する。デバッグ用のログ出力として機能し、設定の適用状況を確認できるようにする。

**業務上の目的・背景**：Babelの設定は複数のファイル（babel.config.js、.babelrc、package.json内のbabel設定など）から読み込まれ、環境やファイルパスによって異なる設定が適用される。この機能により、開発者はどの設定が適用されているか、なぜ特定のファイルが処理されないかを確認でき、設定のデバッグが容易になる。

**通知の送信タイミング**：`buildRootChain`関数内で`context.showConfig`がtrueの場合に設定情報がログ出力される。また、`shouldIgnore`関数内でファイルがignore/only設定によりスキップされる場合に、`context.showConfig`がtrueであればログ出力される。

**通知の受信者**：Babel設定をデバッグしている開発者が対象。BABEL_SHOW_CONFIG環境変数を設定して有効化する。

**通知内容の概要**：ログには、対象ファイル名、適用される設定ファイル（configFile、babelrc、programmatic）、およびignore/onlyによるスキップ理由が含まれる。

**期待されるアクション**：開発者は、ログ出力を確認して設定の適用状況を理解し、必要に応じて設定ファイルを修正することが期待される。

## 通知種別

コンソールログ（console.log）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 低（デバッグ用） |
| リトライ | 無 |

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

標準出力（stdout）に対してconsole.logで出力される。context.showConfigがtrueの場合のみ出力される。

## 通知テンプレート

### コンソール出力

| 項目 | 内容 |
|-----|------|
| 出力先 | stdout（console.log経由） |
| 形式 | プレーンテキスト（複数行） |

### 本文テンプレート（設定情報表示）

```
Babel configs on "${filename}" (ascending priority):
${configReport}

${babelRcReport}

${programmaticReport}

-----End Babel configs-----
```

### 本文テンプレート（ignore/onlyスキップ）

```
No config is applied to "${filename}" because it matches one of `ignore: ${ignoreList}` from "${dirname}"
```

または

```
No config is applied to "${filename}" because it fails to match one of `only: ${onlyList}` from "${dirname}"
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| なし | - | - | 添付ファイルなし |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| filename | 対象ファイルのパス | context.filename | Yes |
| configReport | configFile設定の内容 | ConfigPrinter.output() | No |
| babelRcReport | .babelrc設定の内容 | ConfigPrinter.output() | No |
| programmaticReport | プログラム的設定の内容 | ConfigPrinter.output() | No |
| ignoreList | ignore設定のリスト | JSON.stringify(ignore) | No |
| onlyList | only設定のリスト | JSON.stringify(only) | No |
| dirname | 設定ファイルのディレクトリ | 設定ファイルの場所 | No |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 設定読み込み | buildRootChain関数の実行 | context.showConfig === true | 設定ファイルの読み込み時（266行目） |
| ファイルスキップ | shouldIgnore関数の実行 | context.showConfig === true かつ ignore/onlyマッチ | ignoreまたはonly設定によるスキップ時（868行目、882行目） |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| context.showConfigがfalse | デフォルト。環境変数BABEL_SHOW_CONFIG_FORで有効化 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[buildRootChain呼び出し] --> B{context.showConfig?}
    B -->|false| C[ログ出力なし]
    B -->|true| D[設定読み込み]
    D --> E[ConfigPrinterで設定情報収集]
    E --> F[console.logで設定情報出力]
    F --> G[処理継続]
    C --> G
```

### shouldIgnore時のフロー

```mermaid
flowchart TD
    A[shouldIgnore呼び出し] --> B{ignoreにマッチ?}
    B -->|Yes| C{context.showConfig?}
    C -->|true| D[console.logでスキップ理由出力]
    C -->|false| E[ログ出力なし]
    B -->|No| F{onlyにマッチしない?}
    F -->|Yes| G{context.showConfig?}
    G -->|true| H[console.logでスキップ理由出力]
    G -->|false| I[ログ出力なし]
    F -->|No| J[処理継続]
    D --> K[true返却（スキップ）]
    E --> K
    H --> K
    I --> K
    J --> L[false返却（処理続行）]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| なし | - | データベースは使用しない |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| なし | - | データベースは使用しない |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | - | ログ出力のみでエラーは発生しない |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（設定読み込み時に同期的に出力）

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

- ファイルパスや設定内容が出力される
- 機密情報を含む設定がある場合は注意が必要
- 本番環境ではshowConfigを無効にすることを推奨

## 備考

- debug()関数（obugライブラリ）を使用したデバッグログも存在するが、それとは別にcontext.showConfigで制御されるログ出力がある
- BABEL_SHOW_CONFIG_FOR環境変数で特定のファイルのみshowConfigを有効にできる
- ConfigPrinterクラスが設定情報のフォーマットを担当する

---

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

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

### 推奨読解順序

#### Step 1: 設定情報のログ出力を理解する

buildRootChain関数内でのログ出力を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | config-chain.ts | `packages/babel-core/src/config/config-chain.ts` | buildRootChain関数内のログ出力（265-274行目） |

**読解のコツ**: `context.showConfig`がtrueの場合にのみログが出力される。

#### Step 2: エラーメッセージの内容を理解する

ログ出力の内容を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | config-chain.ts | `packages/babel-core/src/config/config-chain.ts` | console.logの呼び出し（266-273行目） |

**主要処理フロー**:
1. **行265**: `if (context.showConfig)`で条件チェック
2. **行266-273**: `console.log(...)`で設定情報を出力
3. **行267**: 対象ファイル名を含むヘッダー
4. **行269-271**: configReport、babelRcReport、programmaticReportを出力
5. **行272**: フッター「-----End Babel configs-----」

#### Step 3: shouldIgnore関数のログ出力を理解する

ignore/only設定によるスキップ時のログ出力を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | config-chain.ts | `packages/babel-core/src/config/config-chain.ts` | shouldIgnore関数（853-888行目） |

**主要処理フロー**:
- **行859-870**: ignoreにマッチした場合のログ出力
- **行873-885**: onlyにマッチしない場合のログ出力

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

```
@babel/core 設定読み込み
    │
    └─ buildRootChain(opts, context)
           │
           ├─ ConfigPrinter で設定情報収集
           │
           ├─ context.showConfig === true の場合
           │      └─ console.log(設定情報)  ← ログ出力
           │
           └─ shouldIgnore(context, ignore, only, dirname)
                  │
                  ├─ ignore マッチ && context.showConfig
                  │      └─ console.log(スキップ理由)  ← ログ出力
                  │
                  └─ only 非マッチ && context.showConfig
                         └─ console.log(スキップ理由)  ← ログ出力
```

### データフロー図

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

設定ファイル群 ───▶ buildRootChain関数 ───▶ ConfigChain or null
      │                     │
      │                     ▼ (showConfig === true)
      │               ConfigPrinter.output() ───▶ stdout（設定情報ログ）
      │
      └─ shouldIgnore関数 ───▶ boolean
                │
                ▼ (マッチ && showConfig)
          console.log ───▶ stdout（スキップ理由ログ）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| config-chain.ts | `packages/babel-core/src/config/config-chain.ts` | ソース | 設定チェーン構築とログ出力 |
| printer.ts | `packages/babel-core/src/config/printer.ts` | ソース | ConfigPrinterクラス |
| index.ts | `packages/babel-core/src/config/index.ts` | ソース | 設定読み込みのエントリーポイント |
| full.ts | `packages/babel-core/src/config/full.ts` | ソース | 完全な設定オブジェクトの構築 |
