# 通知設計書 68-WINDOW_CONFIG_LUA_DEPRECATED

## 概要

本ドキュメントは、Lua Language Server における `WINDOW_CONFIG_LUA_DEPRECATED` 通知の設計仕様を定義する。この通知は、サードパーティライブラリの設定ファイルとして`config.lua`が使用されている場合に、廃止された形式であることをユーザーに警告し、`config.json`への移行を促すために使用される。

### 本通知の処理概要

**業務上の目的・背景**：Lua Language Serverのサードパーティライブラリ機能では、各ライブラリの設定を定義するために設定ファイルを使用する。従来は`config.lua`形式が使用されていたが、現在は`config.json`形式が推奨されている。`config.lua`はセキュリティリスク（任意のLuaコード実行の可能性）や保守性の観点から非推奨となった。本通知は、まだ`config.lua`を使用しているサードパーティライブラリが検出された際に、ユーザーに対して移行を促すメッセージとして使用される。

**通知の送信タイミング**：サードパーティライブラリの設定読み込み時に、`config.json`が見つからず`config.lua`が使用された場合に送信される。

**通知の受信者**：IDEやエディタを使用している開発者（ユーザー）に対して、情報ダイアログとして表示される。

**通知内容の概要**：「`config.lua`は廃止されました。代わりに`config.json`を使用してください。」という警告メッセージ。

**期待されるアクション**：ユーザーは「config.jsonに変換」ボタンをクリックして自動変換を行うか、手動で設定ファイルを移行する。

## 通知種別

アプリ内通知（LSP window/showMessageRequest）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期（ユーザー入力待ち） |
| 優先度 | 中（Info） |
| リトライ | 無 |

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

LSPプロトコルを通じて、接続中のクライアント（IDE/エディタ）に直接送信される。

## 通知テンプレート

### メール通知の場合

該当なし（LSP通知のみ）

### 本文テンプレート

英語:
```
`config.lua` is deprecated, please use `config.json` instead.
```

日本語:
```
`config.lua` は廃止されました。代わりに `config.json` を使用してください。
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | テンプレート変数は使用されない | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 内部処理 | サードパーティライブラリ設定読み込み | config.jsonが存在せず、config.luaが存在する場合 | loadSingle3rdConfig関数で検出 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| config.json存在 | config.jsonが存在する場合は送信されない |
| config.lua不存在 | config.luaも存在しない場合は送信されない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[load3rdConfig呼び出し] --> B[loadSingle3rdConfig]
    B --> C[loadSingle3rdConfigFromJson]
    C --> D{config.json存在?}
    D -->|Yes| E[JSON設定を返す]
    D -->|No| F[loadSingle3rdConfigFromLua]
    F --> G{config.lua存在?}
    G -->|No| H[nil返却]
    G -->|Yes| I[Lua設定読み込み]
    I --> J[client.requestMessage]
    J --> K[WINDOW_CONFIG_LUA_DEPRECATED表示]
    K --> L{WINDOW_CONVERT_CONFIG_LUA選択?}
    L -->|Yes| M[JSON形式に変換して保存]
    M --> N[config.lua削除]
    L -->|No| O[処理続行]
    N --> O
    E --> O
    H --> O
```

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

### 参照テーブル一覧

該当なし（データベースは使用しない）

### 更新テーブル一覧

該当なし（ファイルシステムへの書き込み）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 変換失敗 | JSONへの変換が失敗した場合 | エラーログを出力 |
| ファイル書き込み失敗 | 権限不足やディスク容量不足 | エラーログを出力 |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（随時送信）

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

- `config.lua`は任意のLuaコードを実行できるため、セキュリティリスクがある
- `config.json`への移行により、設定ファイルによる任意コード実行のリスクが軽減される
- 変換処理ではjson-beautifyライブラリを使用してJSON形式に変換

## 備考

- `WINDOW_CONVERT_CONFIG_LUA`ボタンと組み合わせて表示される
- 変換後、元の`config.lua`は削除される
- 変換はjsonb.beautify関数で行われ、読みやすいJSON形式で出力される
- サードパーティライブラリ作成者向けのメッセージ

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | library.lua | `script/library.lua` | サードパーティライブラリの設定構造を理解する |

**読解のコツ**: config.jsonとconfig.luaの両方の形式を理解する

#### Step 2: 設定読み込みロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | library.lua | `script/library.lua` | loadSingle3rdConfig関数（340-383行目）が設定読み込みの起点 |
| 2-2 | library.lua | `script/library.lua` | loadSingle3rdConfigFromJson関数（285-305行目）でJSON形式読み込み |
| 2-3 | library.lua | `script/library.lua` | loadSingle3rdConfigFromLua関数（307-337行目）でLua形式読み込み |

**主要処理フロー**:
1. **341行**: まずloadSingle3rdConfigFromJsonを試行
2. **342-343行**: JSON読み込み失敗時にloadSingle3rdConfigFromLuaを試行
3. **348-355行**: Lua形式の場合、廃止警告と変換オプションを表示

#### Step 3: 変換ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | library.lua | `script/library.lua` | 347行目でjsonb.beautifyによるJSON変換 |
| 3-2 | library.lua | `script/library.lua` | 351-353行目で変換後の保存と元ファイル削除 |

**主要処理フロー**:
- **347行**: jsonb.beautify(cfg)でLuaテーブルをJSON文字列に変換
- **351行**: fsu.saveFileでconfig.jsonを保存
- **352行**: fsu.fileRemoveでconfig.luaを削除

#### Step 4: 多言語対応を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | script.lua | `locale/en-us/script.lua` | 609-610行目で英語メッセージテンプレートを確認 |
| 4-2 | script.lua | `locale/ja-jp/script.lua` | 609-610行目で日本語メッセージテンプレートを確認 |

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

```
load3rdConfig (404行)
    |
    └─ load3rdConfigInDir (387行)
           |
           └─ loadSingle3rdConfig (340行)
                  |
                  ├─ loadSingle3rdConfigFromJson (341行)
                  |      └─ (成功時) config返却
                  |
                  └─ loadSingle3rdConfigFromLua (343行)
                         |
                         ├─ jsonb.beautify (347行)
                         |
                         └─ client.requestMessage (348行)
                                |
                                ├─ WINDOW_CONFIG_LUA_DEPRECATED
                                |
                                └─ WINDOW_CONVERT_CONFIG_LUA
                                       |
                                       ├─ fsu.saveFile (351行)
                                       |
                                       └─ fsu.fileRemove (352行)
```

### データフロー図

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

サードパーティ       ───▶  loadSingle3rdConfig      ───▶  設定オブジェクト
ライブラリディレクトリ      |
                           v
                    loadSingle3rdConfigFromJson
                           |
                           v (失敗)
                    loadSingle3rdConfigFromLua
                           |
                           v
                    jsonb.beautify
                           |
                           v
            WINDOW_CONFIG_LUA_DEPRECATED ───▶ ユーザー確認ダイアログ
                           |
                           v (変換選択)
                    fsu.saveFile ───▶ config.json作成
                           |
                           v
                    fsu.fileRemove ───▶ config.lua削除
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| library.lua | `script/library.lua` | ソース | サードパーティライブラリ設定読み込み |
| client.lua | `script/client.lua` | ソース | メッセージリクエスト送信 |
| json-beautify.lua | 外部ライブラリ | ソース | JSON形式変換 |
| fs-utility.lua | `script/fs-utility.lua` | ソース | ファイル操作 |
| script.lua | `locale/en-us/script.lua` | ローカライズ | 英語メッセージテンプレート |
| script.lua | `locale/ja-jp/script.lua` | ローカライズ | 日本語メッセージテンプレート |
