# 機能設計書 24-サポート情報表示（--support-info）

## 概要

本ドキュメントは、Prettier CLIにおける`--support-info`オプションの機能設計を記述する。このオプションは、対応言語、パーサー、オプションの情報をJSON形式で出力する。

### 本機能の処理概要

**業務上の目的・背景**：Prettierがサポートする言語やオプションは、ビルトインプラグインや外部プラグインによって拡張される。エディタ統合やツール開発者は、現在利用可能な言語・オプション情報をプログラマティックに取得する必要がある。本機能は、この情報をCLIから取得する手段を提供する。

**機能の利用シーン**：
- エディタプラグインでのオプションUI生成
- ドキュメント自動生成
- 言語サポート確認
- デバッグ・診断

**主要な処理内容**：
1. getSupportInfo API呼び出し
2. 言語一覧の名前順ソート
3. オプション一覧の名前順ソート
4. CLI固有のプロパティ除去
5. JSON形式での出力

**関連システム・外部連携**：
- APIの`getSupportInfo`関数を内部で使用
- ビルトインプラグインおよび外部プラグインからの情報収集

**権限による制御**：特になし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 15 | Usage - CLI | 補助機能 | CLIでのサポート情報表示を説明 |

## 機能種別

情報取得 / 診断

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| --support-info | boolean | No | サポート情報表示の有効化 | - |

### 入力データソース

- CLIコマンドライン引数
- ビルトインプラグイン
- 外部プラグイン（--plugin指定時）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| languages | array | サポートされる言語の配列 |
| options | array | 利用可能なオプションの配列 |

### 出力先

- 標準出力（JSON形式、Prettierでフォーマット済み）

**出力例**（一部抜粋）：
```json
{
  "languages": [
    {
      "name": "JavaScript",
      "parsers": ["babel", "acorn", "espree", "meriyah"],
      "extensions": [".js", ".mjs", ".cjs"],
      ...
    }
  ],
  "options": [
    {
      "name": "printWidth",
      "type": "int",
      "default": 80,
      "description": "...",
      ...
    }
  ]
}
```

## 処理フロー

### 処理シーケンス

```
1. getSupportInfo API呼び出し
   └─ プラグインから言語・オプション情報を収集

2. 言語一覧の処理
   └─ 名前順にソート

3. オプション一覧の処理
   └─ 名前順にソート
   └─ CLI固有プロパティ（cliName, cliCategory, cliDescription）を除去

4. 結果の構築
   └─ { languages, options }オブジェクトを作成

5. フォーマットと出力
   └─ JSON文字列化
   └─ Prettierでフォーマット
   └─ 標準出力に表示
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[getSupportInfo呼び出し]
    B --> C[言語一覧ソート]
    C --> D[オプション一覧ソート]
    D --> E[CLI固有プロパティ除去]
    E --> F[JSON構築]
    F --> G[Prettierフォーマット]
    G --> H[標準出力]
    H --> I[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-24-1 | 名前順ソート | languagesとoptionsは名前順でソートされる | 常時 |
| BR-24-2 | CLIプロパティ除去 | cliName, cliCategory, cliDescriptionは出力から除去 | 常時 |
| BR-24-3 | 非推奨オプション除外 | deprecatedオプションはデフォルトで除外 | showDeprecated未指定時 |
| BR-24-4 | パーサー選択肢拡張 | parserオプションの選択肢は言語定義から収集 | 常時 |

### 計算ロジック

**名前順ソート**：
```javascript
sortByName = (array) => array.sort((a, b) => a.name.localeCompare(b.name));
```

## データベース操作仕様

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

特定のエラーケースは定義されていない。

### リトライ仕様

リトライは行わない。

## トランザクション仕様

トランザクション管理は不要。

## パフォーマンス要件

- プラグイン読み込みを含むため、初回実行時は若干の遅延がありうる
- 結果はキャッシュされないため、毎回計算される

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

- 言語・オプション情報のみを出力
- 機密情報の漏洩リスクはない

## 備考

- API関数`getSupportInfo`のCLIラッパー
- エディタ統合での利用を想定

---

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

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

### 推奨読解順序

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

出力されるSupportInfoの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | support.js | `src/main/support.js` | getSupportInfo関数の戻り値構造 |

**読解のコツ**: JSDocコメントで戻り値の型が定義されている。

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

CLIオプションの定義とメイン処理の流れを把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | cli-options.evaluate.js | `src/cli/cli-options.evaluate.js` | supportInfoオプションの定義 |
| 2-2 | index.js | `src/cli/index.js` | --support-infoの処理分岐 |

**主要処理フロー**:
- **223-226行目（cli-options）**: supportInfoオプション定義
- **83-85行目（index.js）**: printSupportInfo呼び出し

#### Step 3: CLI実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | print-support-info.js | `src/cli/print-support-info.js` | printSupportInfo関数の実装 |

**主要処理フロー**:
- **5-6行目**: sortByName関数定義
- **8-15行目**: supportInfo構築（ソートとプロパティ除去）
- **17-19行目**: JSON出力のフォーマットと表示

#### Step 4: API実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | support.js | `src/main/support.js` | getSupportInfo関数の実装 |
| 4-2 | index.js | `src/index.js` | withPluginsラッパー |

**主要処理フロー（support.js）**:
- **16-17行目**: プラグインから言語情報を収集
- **19-47行目**: オプション情報の構築
- **32-37行目**: parserオプションの選択肢拡張
- **40-44行目**: pluginDefaultsの収集

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

```
src/cli/index.js::main()
    │
    ├─ --support-info検出
    │
    └─ src/cli/print-support-info.js::printSupportInfo()
           │
           ├─ src/index.js::getSupportInfo()
           │      │
           │      └─ withPlugins()
           │             │
           │             ├─ loadBuiltinPlugins()
           │             ├─ loadPlugins()
           │             │
           │             └─ src/main/support.js::getSupportInfo()
           │                    ├─ 言語情報収集
           │                    ├─ オプション情報収集
           │                    └─ pluginDefaults収集
           │
           ├─ sortByName() - ソート
           │
           ├─ omit() - CLIプロパティ除去
           │
           ├─ stringify() - JSON文字列化
           │
           └─ format() - Prettierフォーマット
```

### データフロー図

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

--support-info ─────────▶ getSupportInfo() ──────────────▶ { languages, options }
                               │
ビルトインプラグイン ────────▶│
外部プラグイン ─────────────▶│
                               ▼
                         ソート処理 ─────────────────────▶ ソート済み配列
                               │
                               ▼
                         プロパティ除去 ─────────────────▶ クリーンなオプション
                               │
                               ▼
                         JSON構築 ────────────────────────▶ { languages, options }
                               │
                               ▼
                         Prettierフォーマット ────────────▶ 整形されたJSON
                               │
                               ▼
                         printToScreen ───────────────────▶ 標準出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| print-support-info.js | `src/cli/print-support-info.js` | ソース | CLI実装 |
| support.js | `src/main/support.js` | ソース | API実装 |
| cli-options.evaluate.js | `src/cli/cli-options.evaluate.js` | ソース | オプション定義 |
| index.js | `src/cli/index.js` | ソース | CLIエントリーポイント |
| index.js | `src/index.js` | ソース | API公開エントリーポイント |
| utilities.js | `src/cli/utilities.js` | ソース | omit関数等ユーティリティ |
