# 通知設計書 11-レガシーデコレータ警告

## 概要

本ドキュメントは、Babelのクラス機能プラグイン（`@babel/plugin-proposal-class-properties`等）において、レガシーデコレータの`loose`モード設定に関する警告通知の仕様を定義する。

### 本通知の処理概要

この通知は、開発者がBabelのクラス機能プラグインで`loose: true`オプションを使用しながら、同時に`assumptions`設定で明示的な値を設定した場合に警告を出力する機能である。

**業務上の目的・背景**：Babelのクラス機能プラグイン群（class properties、private methods等）では、従来`loose`オプションでコンパイル方式を制御していた。しかし、Babel 7.13以降、より細かい制御を可能にする`assumptions`設定が導入された。`loose: true`と`assumptions`の両方を設定すると、設定の意図が不明確になり、互換性の問題を引き起こす可能性がある。この警告は、開発者に設定の見直しを促すために存在する。

**通知の送信タイミング**：プラグインの初期化時（`createClassFeaturePlugin`関数が呼び出された時）に、`loose: true`が設定されており、かつ`setPublicClassFields`、`privateFieldsAsProperties`、`privateFieldsAsSymbols`のいずれかの`assumption`が明示的に設定されている場合に送信される。

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

**通知内容の概要**：使用中のプラグイン名、明示的に設定された`assumption`名、推奨される`assumptions`設定への移行方法を含む警告メッセージ。

**期待されるアクション**：開発者は`loose: true`オプションを削除し、代わりにトップレベルの`assumptions`設定で`setPublicClassFields: true`および`privateFieldsAsSymbols: true`を設定することが推奨される。

## 通知種別

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

## 送信仕様

### 基本情報

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

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

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

## 通知テンプレート

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

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

### 本文テンプレート

```
[{プラグイン名}]: You are using the "loose: true" option and you are explicitly setting a value for the {assumption名} assumption{複数形のsがあれば追加}. The "loose" option can cause incompatibilities with the other class features plugins, so it's recommended that you replace it with the following top-level option:
	"assumptions": {
		"setPublicClassFields": true,
		"privateFieldsAsSymbols": true
	}
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| プラグイン名 | 警告を発生させたプラグイン名 | `name`パラメータ | Yes |
| assumption名 | 明示的に設定されたassumption名のリスト | `setPublicClassFields`, `privateFieldsAsProperties`, `privateFieldsAsSymbols`の各assumption値 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| API呼び出し | createClassFeaturePlugin関数の実行 | `loose === true` かつ `explicit.length !== 0` | プラグイン初期化時にlooseオプションとassumption設定の両方が存在する場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| loose !== true | looseオプションがtrue以外の場合 |
| explicit.length === 0 | setPublicClassFields、privateFieldsAsProperties、privateFieldsAsSymbolsのいずれも明示的に設定されていない場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[createClassFeaturePlugin呼び出し] --> B{loose === true?}
    B -->|No| C[警告なし]
    B -->|Yes| D[assumption値をチェック]
    D --> E{setPublicClassFieldsが<br>明示的に設定?}
    E -->|Yes| F[explicitに追加]
    E -->|No| G{privateFieldsAsPropertiesが<br>明示的に設定?}
    F --> G
    G -->|Yes| H[explicitに追加]
    G -->|No| I{privateFieldsAsSymbolsが<br>明示的に設定?}
    H --> I
    I -->|Yes| J[explicitに追加]
    I -->|No| K{explicit.length !== 0?}
    J --> K
    K -->|Yes| L[console.warn出力]
    K -->|No| C
    L --> M[プラグイン処理続行]
    C --> M
```

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

### 参照テーブル一覧

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

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

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

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 制限なし | プラグイン初期化時に一度だけ出力 |

### 配信時間帯

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

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

- 設定情報のみを出力し、ソースコードや機密情報は含まない
- ローカル環境のコンソールへの出力のため、情報漏洩リスクは低い

## 備考

- この警告はBabel 7.13以降のassumptions機能導入に伴い追加された
- 警告を無視してもコンパイルは継続されるが、他のクラス機能プラグインとの互換性問題が発生する可能性がある

---

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

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

### 推奨読解順序

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

まず、プラグインオプションの型定義とassumption機能を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | index.ts | `packages/babel-helper-create-class-features-plugin/src/index.ts` | Optionsインターフェース（38-46行目）でプラグインオプションの構造を確認 |

**読解のコツ**: TypeScriptのインターフェース定義を確認し、`loose`オプションがオプショナルなboolean型であることを理解する。

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.ts | `packages/babel-helper-create-class-features-plugin/src/index.ts` | createClassFeaturePlugin関数の開始（48行目） |

**主要処理フロー**:
1. **60-66行目**: api.assumptionを使用して各assumption値を取得
2. **77行目**: `loose === true`の条件チェック開始
3. **78-89行目**: 各assumptionが明示的に設定されているかチェック
4. **90-103行目**: 明示的な設定がある場合にconsole.warnを出力

#### Step 3: assumption取得処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | index.ts | `packages/babel-helper-create-class-features-plugin/src/index.ts` | api.assumption呼び出し（60-66行目） |

**主要処理フロー**:
- **60行目**: `setPublicClassFields` assumptionの取得
- **61行目**: `privateFieldsAsSymbols` assumptionの取得
- **62行目**: `privateFieldsAsProperties` assumptionの取得

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

```
createClassFeaturePlugin (index.ts:48)
    │
    ├─ api.assumption("setPublicClassFields")
    │
    ├─ api.assumption("privateFieldsAsSymbols")
    │
    ├─ api.assumption("privateFieldsAsProperties")
    │
    └─ console.warn (条件付き: 91行目)
           └─ 警告メッセージ出力
```

### データフロー図

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

Options {                 createClassFeaturePlugin
  loose: true,       ───▶ ├─ assumption値チェック   ───▶ console.warn
  ...                     ├─ explicit配列構築            (条件付き)
}                         └─ メッセージ生成

PluginAPI {
  assumption()       ───▶ 各assumption値を取得
}
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.ts | `packages/babel-helper-create-class-features-plugin/src/index.ts` | ソース | 警告ロジックのメイン実装 |
| features.ts | `packages/babel-helper-create-class-features-plugin/src/features.ts` | ソース | FEATURES定数とisLoose関数の定義 |
