# 通知設計書 18-スタンドアロン警告

## 概要

本ドキュメントは、`@babel/standalone`において、カスタムプラグイン/プリセットの登録時に出力される警告通知の仕様を定義する。

### 本通知の処理概要

この通知は、開発者が`@babel/standalone`で既に登録済みのプラグインまたはプリセットを再登録しようとした場合に、上書きされることを警告する機能である。

**業務上の目的・背景**：`@babel/standalone`はブラウザ環境でBabelを使用するためのバンドル版である。組み込みのプラグイン/プリセットに加えて、`registerPlugin`/`registerPreset`関数を通じてカスタムのプラグイン/プリセットを追加できる。同名のプラグイン/プリセットを登録すると既存のものが上書きされるが、これは意図しない動作である可能性がある。特に`env`プリセットについては、`@babel/preset-env-standalone`との統合により発生する重複を特別に扱う。

**通知の送信タイミング**：`registerPlugin`または`registerPreset`関数が呼び出された時、かつ同名のプラグイン/プリセットが既に登録されている場合に送信される。

**通知の受信者**：ブラウザ環境でBabelを使用する開発者。コンソール出力を通じて通知される。

**通知内容の概要**：登録しようとしているプラグイン/プリセット名と、上書きされることを説明する警告メッセージ。`env`プリセットの場合は特別なメッセージが出力される。

**期待されるアクション**：開発者は重複登録を避けるか、意図的な上書きであることを確認することが推奨される。`env`プリセットの重複の場合は`@babel/preset-env-standalone`を削除することが推奨される。

## 通知種別

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

## 送信仕様

### 基本情報

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

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

ブラウザのコンソールに出力される。開発者ツールのコンソールタブで確認可能。

## 通知テンプレート

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

| 項目 | 内容 |
|-----|------|
| 出力先 | console.warn |
| 形式 | テキスト |

### 本文テンプレート

#### プラグイン重複時

```
A plugin named "{プラグイン名}" is already registered, it will be overridden
```

#### プリセット重複時（envプリセット以外）

```
A preset named "{プリセット名}" is already registered, it will be overridden
```

#### envプリセット重複時

```
@babel/preset-env is now included in @babel/standalone, please remove @babel/preset-env-standalone
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| プラグイン名/プリセット名 | 重複登録しようとしている名前 | `name`パラメータ | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API呼び出し | registerPlugin関数の実行 | `Object.hasOwn(availablePlugins, name)` | 同名のプラグインが既に登録されている場合 |
| API呼び出し | registerPreset関数の実行 | `Object.hasOwn(availablePresets, name)` | 同名のプリセットが既に登録されている場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| プラグイン/プリセットが未登録 | 同名のプラグイン/プリセットが存在しない場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[registerPlugin/registerPreset呼び出し] --> B{同名が既に登録済み?}
    B -->|No| C[プラグイン/プリセットを登録]
    B -->|Yes| D{プリセットでname === 'env'?}
    D -->|Yes| E[console.warn出力:<br>preset-env-standalone削除推奨]
    D -->|No| F[console.warn出力:<br>上書き警告]
    E --> C
    F --> C
```

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

### 参照テーブル一覧

該当なし（ブラウザ実行のため、データベースアクセスは行わない）

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | - | この警告自体はエラーではなく、処理を中断しない（登録は実行される） |

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 制限なし | 登録時に毎回出力（重複抑制なし） |

### 配信時間帯

制限なし（API呼び出し時）

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

- プラグイン/プリセット名のみを出力し、機密情報は含まない
- ブラウザのコンソールへの出力のため、本番環境では開発者ツールを開かない限り見えない

## 備考

- `@babel/standalone`はブラウザでのBabel使用を目的としたバンドル
- `availablePlugins`と`availablePresets`は組み込みのプラグイン/プリセットを格納するオブジェクト
- `registerPlugins`と`registerPresets`は複数のプラグイン/プリセットを一括登録する関数
- `@babel/preset-env`は`@babel/standalone`に組み込まれているため、別途`@babel/preset-env-standalone`をロードする必要はない

---

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

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

### 推奨読解順序

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

まず、`availablePlugins`と`availablePresets`オブジェクトの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | index.ts | `packages/babel-standalone/src/index.ts` | availablePlugins定義（50行目） |
| 1-2 | index.ts | `packages/babel-standalone/src/index.ts` | availablePresets定義（60-87行目） |

**読解のコツ**: `availablePlugins`と`availablePresets`はRecord型のオブジェクトで、名前をキーとしてプラグイン/プリセットの関数を格納する。

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.ts | `packages/babel-standalone/src/index.ts` | registerPlugin関数（206-213行目） |
| 2-2 | index.ts | `packages/babel-standalone/src/index.ts` | registerPreset関数（229-243行目） |

**主要処理フロー**:
1. **207行目/230行目**: Object.hasOwnで既存チェック
2. **208-210行目/231-238行目**: console.warn出力
3. **212行目/242行目**: 登録実行

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | index.ts | `packages/babel-standalone/src/index.ts` | プラグイン警告（208-210行目） |
| 3-2 | index.ts | `packages/babel-standalone/src/index.ts` | プリセット警告（231-238行目） |

**主要処理フロー**:
- **207行目**: `Object.hasOwn(availablePlugins, name)`チェック
- **208-210行目**: プラグイン重複警告
- **230行目**: `Object.hasOwn(availablePresets, name)`チェック
- **231行目**: `name === "env"`の特別判定
- **232-234行目**: envプリセット用警告
- **236-238行目**: 通常プリセット用警告

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

```
registerPlugin (index.ts:206)
    │
    ├─ Object.hasOwn(availablePlugins, name) (207行目)
    │      └─ console.warn (208-210行目)
    │
    └─ availablePlugins[name] = plugin (212行目)

registerPreset (index.ts:229)
    │
    ├─ Object.hasOwn(availablePresets, name) (230行目)
    │      ├─ name === "env" 判定 (231行目)
    │      │      └─ console.warn: env専用メッセージ (232-234行目)
    │      └─ console.warn: 通常メッセージ (236-238行目)
    │
    └─ availablePresets[name] = preset (242行目)
```

### データフロー図

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

registerPlugin(           registerPlugin
  name,              ───▶ ├─ 既存チェック
  plugin                  │      └─ hasOwn判定
)                         ├─ 警告出力（条件付き）      ───▶ console.warn
                          └─ 登録実行

registerPreset(           registerPreset
  name,              ───▶ ├─ 既存チェック
  preset                  │      └─ hasOwn判定
)                         ├─ env判定（条件付き）
                          ├─ 警告出力（条件付き）      ───▶ console.warn
                          └─ 登録実行
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.ts | `packages/babel-standalone/src/index.ts` | ソース | @babel/standaloneのメインエントリーポイント |
| generated/plugins.ts | `packages/babel-standalone/src/generated/plugins.ts` | ソース | 組み込みプラグインの自動生成ファイル |
| transformScriptTags.ts | `packages/babel-standalone/src/transformScriptTags.ts` | ソース | スクリプトタグ変換機能 |
