# 通知設計書 15-重複パッケージ警告

## 概要

本ドキュメントは、`@babel/preset-env`において、`esmodules`と`browsers`ターゲットが同時に指定された場合に出力される警告通知の仕様を定義する。

### 本通知の処理概要

この通知は、開発者が`@babel/preset-env`のターゲット設定で`esmodules: true`と`browsers`オプションを同時に指定した場合に、`browsers`設定が無視されることを警告する機能である。

**業務上の目的・背景**：`@babel/preset-env`では、トランスパイル対象のブラウザ/環境を指定するために複数のターゲット指定方法がある。`esmodules: true`はES Modulesをネイティブサポートするブラウザをターゲットとし、`browsers`オプションはbrowserslistクエリでターゲットを指定する。両方が指定された場合、`esmodules`が優先され`browsers`は無視される。この警告は、開発者に設定の競合を通知し、意図しない動作を防ぐために存在する。

**通知の送信タイミング**：`getLocalTargets`関数内で、`optionsTargets.esmodules`と`optionsTargets.browsers`の両方が存在する場合に送信される。

**通知の受信者**：Babelを使用してJavaScript/TypeScriptコードをトランスパイルする開発者。コンソール出力を通じて通知される。

**通知内容の概要**：`esmodules`と`browsers`ターゲットが同時に指定されており、`browsers`設定が無視されることを説明する警告メッセージ。

**期待されるアクション**：開発者は`esmodules`または`browsers`のいずれか一方のみを使用するよう設定を見直すことが推奨される。

## 通知種別

コンソール出力（console.warn）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 中 |
| リトライ | なし（コンソール出力のため） |

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

標準エラー出力（stderr）経由でコンソールに出力される。Babelを実行している開発者に対して直接表示される。

## 通知テンプレート

### コンソール出力の場合

| 項目 | 内容 |
|-----|------|
| 出力先 | console.warn |
| 形式 | テキスト（複数行） |

### 本文テンプレート

```
@babel/preset-env: esmodules and browsers targets have been specified together.
`browsers` target, `{browsers設定値}` will be ignored.
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| browsers設定値 | 無視されるbrowsersオプションの値 | `optionsTargets.browsers.toString()` | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API呼び出し | getLocalTargets関数の実行 | `optionsTargets?.esmodules && optionsTargets.browsers` | esmodulesとbrowsersの両方が設定されている場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| esmodules が未設定または false | esmodulesターゲットが有効でない場合 |
| browsers が未設定 | browsersオプションが設定されていない場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[getLocalTargets呼び出し] --> B{esmodulesが設定<br>されている?}
    B -->|No| C[getTargets呼び出し]
    B -->|Yes| D{browsersも設定<br>されている?}
    D -->|No| C
    D -->|Yes| E[console.warn出力]
    E --> C
```

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

### 参照テーブル一覧

該当なし（コンパイラプリセットのため、データベースアクセスは行わない）

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | - | この警告自体はエラーではなく、処理を中断しない |

### リトライ仕様

該当なし（一度の警告出力のみ）

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 制限なし | プリセット初期化時に一度だけ出力 |

### 配信時間帯

制限なし（Babelコンパイル実行時）

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

- 設定オプション値（browsersクエリ）を出力するが、これは通常機密情報ではない
- ローカル環境のコンソールへの出力のため、情報漏洩リスクは低い

## 備考

- `esmodules: true`は、ES Modulesをネイティブサポートするブラウザ（Chrome 61+, Firefox 60+, Safari 10.1+等）をターゲットとする
- `browsers`オプションはbrowserslistクエリ形式（例: `"> 0.5%, last 2 versions"`）を受け付ける
- この警告により、開発者は意図しないターゲット設定を早期に発見できる

---

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

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

### 推奨読解順序

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

まず、ターゲットオプションの型定義を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types.ts | `packages/babel-preset-env/src/types.ts` | Options["targets"]の型定義 |
| 1-2 | types.ts | `packages/babel-helper-compilation-targets/src/types.d.ts` | InputTargets型の定義 |

**読解のコツ**: targetsオプションは`esmodules: boolean`と`browsers: string | string[]`を含むオブジェクト。

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

処理の起点となる`getLocalTargets`関数を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.ts | `packages/babel-preset-env/src/index.ts` | getLocalTargets関数の開始（156行目） |

**主要処理フロー**:
1. **163-168行目**: esmodulesとbrowsersの競合チェックと警告出力
2. **170-177行目**: getTargets関数の呼び出し

#### Step 3: 警告出力処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | index.ts | `packages/babel-preset-env/src/index.ts` | esmodulesとbrowsers競合警告（163-168行目） |

**主要処理フロー**:
- **163行目**: `optionsTargets?.esmodules && optionsTargets.browsers`の条件チェック
- **164-167行目**: console.warn出力（複数行メッセージ）

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

```
declarePreset (index.ts:195)
    │
    └─ getLocalTargets (237-244行目で呼び出し)
           │
           ├─ esmodules && browsers チェック (163行目)
           │      └─ console.warn (164-167行目)
           │
           └─ getTargets (170行目)
                  └─ @babel/helper-compilation-targets
```

### データフロー図

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

Options {                 declarePreset
  targets: {         ───▶ ├─ normalizeOptions
    esmodules: true,      └─ getLocalTargets
    browsers: "> 1%"           ├─ 競合チェック          ───▶ console.warn
  }                            └─ getTargets                 (条件付き)
}
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.ts | `packages/babel-preset-env/src/index.ts` | ソース | プリセットのエントリーポイントと警告出力 |
| types.ts | `packages/babel-preset-env/src/types.ts` | ソース | 型定義（Options等） |
| index.ts | `packages/babel-helper-compilation-targets/src/index.ts` | ソース | getTargets関数の実装 |
| types.d.ts | `packages/babel-helper-compilation-targets/src/types.d.ts` | ソース | InputTargets型の定義 |
