# 機能設計書 15-EditorConfig統合

## 概要

本ドキュメントは、PrettierにおけるEditorConfig統合機能について記述する。

### 本機能の処理概要

**業務上の目的・背景**：EditorConfigは、異なるエディタやIDE間で一貫したコーディングスタイルを維持するための設定ファイル形式である。多くのプロジェクトでは既に.editorconfigファイルが存在し、インデントスタイルや行末文字などの基本設定が定義されている。PrettierがEditorConfig設定を読み込むことで、既存のプロジェクト設定との整合性を保ちつつ、追加のフォーマット設定をPrettierで適用できる。

**機能の利用シーン**：
- 既存プロジェクトへのPrettier導入時
- チーム全体でエディタ設定を共有している環境での使用時
- Prettier設定とEditorConfig設定の併用時
- VS Code等のエディタでのファイル保存時自動フォーマット時

**主要な処理内容**：
1. ファイルパスに対応する.editorconfigファイルの検索
2. プロジェクトルート（.git/.hg/.svn/.jj等）の検出
3. EditorConfig設定のパースと読み込み
4. EditorConfig設定からPrettier設定への変換
5. 設定のキャッシュ管理

**関連システム・外部連携**：
- editorconfig-without-wasm ライブラリ（EditorConfigパース）
- プロジェクトルート検出システム（find-project-root.js）
- 設定キャッシュシステム

**権限による制御**：なし（全ユーザーが利用可能）

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 20 | Configuration - Configuration File | 補助機能 | .editorconfigとの統合方法を説明 |

## 機能種別

データ取得・変換処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| file | string | Yes | EditorConfig設定を取得するファイルのパス | 有効なファイルパス |
| options | object | No | オプション設定 | - |
| options.shouldCache | boolean | No | キャッシュを使用するか | - |

### 入力データソース

- ファイルシステムからの.editorconfigファイル読み込み

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| config | object \| undefined | 変換されたPrettier設定。EditorConfig設定がない場合はundefined |
| config.useTabs | boolean | タブ使用設定 |
| config.tabWidth | number | タブ幅 |
| config.printWidth | number | 行幅（max_line_length由来） |
| config.singleQuote | boolean | シングルクォート使用（非公式） |
| config.endOfLine | string | 改行コード（"lf", "crlf", "cr"） |

### 出力先

- resolveConfig関数へのマージ用データ提供

## 処理フロー

### 処理シーケンス

```
1. loadEditorconfig関数が呼び出される
   └─ ファイルパスを絶対パスに解決
2. キャッシュ確認
   └─ キャッシュ有効かつキャッシュ存在時はキャッシュから返却
3. loadEditorconfigInternal関数で実際の読み込み
   └─ ファイルのディレクトリを取得
4. findProjectRoot関数でプロジェクトルートを検出
   └─ .git、.hg、.svn、.jj等のVCSディレクトリを検索
5. parseEditorconfig関数でEditorConfig設定をパース
   └─ プロジェクトルートを検索範囲の上限として使用
6. editorConfigToPrettier関数でPrettier設定に変換
   └─ indent_style、indent_size、tab_width等を変換
7. 変換結果を返却（キャッシュに保存）
```

### フローチャート

```mermaid
flowchart TD
    A[開始: loadEditorconfig] --> B[絶対パスに解決]
    B --> C{キャッシュ存在?}
    C -->|Yes & shouldCache| D[キャッシュから返却]
    C -->|No| E[loadEditorconfigInternal]
    E --> F[path.dirname取得]
    F --> G[findProjectRoot]
    G --> H[parseEditorconfig]
    H --> I[editorConfigToPrettier]
    I --> J{変換結果あり?}
    J -->|Yes| K[設定オブジェクト返却]
    J -->|No| L[undefined返却]
    D --> M[終了]
    K --> M
    L --> M
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-015-01 | インデントスタイル | indent_style="space"→useTabs=false、indent_style="tab"→useTabs=true | indent_style設定時 |
| BR-015-02 | タブ幅変換 | useTabs=falseの場合、indent_sizeをtabWidthに設定 | indent_sizeが正の整数の場合 |
| BR-015-03 | 行幅変換 | max_line_length="off"→printWidth=Infinity、数値→printWidthに設定 | max_line_length設定時 |
| BR-015-04 | クォート変換 | quote_type="single"→singleQuote=true（非公式機能） | quote_type設定時 |
| BR-015-05 | 改行コード変換 | end_of_line="lf"|"crlf"|"cr"→endOfLineに設定 | end_of_line設定時 |
| BR-015-06 | 空結果処理 | 変換結果が空オブジェクトの場合はundefinedを返却 | 常時 |

### 計算ロジック

**tabWidth決定ロジック**:
1. useTabs=falseかつindent_sizeが正の整数 → indent_sizeをtabWidthに
2. tab_widthが正の整数 → tab_widthをtabWidthに
3. それ以外 → tabWidth設定なし

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

### 操作別データベース影響一覧

データベース操作なし（ファイルシステムのみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パースエラー | .editorconfigの構文エラー | editorconfig-without-wasmがハンドル |

### リトライ仕様

ファイル読み込みエラー時のリトライは行わない

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

トランザクション管理なし（読み取り専用処理）

## パフォーマンス要件

- キャッシュヒット時: 1ms以下
- キャッシュミス時: 5ms以下

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

- .editorconfigファイルの読み取りのみ
- 任意のコード実行リスクなし

## 備考

- quote_type設定は非公式機能（EditorConfig標準ではない）
- プロジェクトルート検出は.git等のVCSディレクトリを使用
- CLIの`--editorconfig`オプションで有効/無効を切り替え可能（デフォルト有効）

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | resolve-config.js | `src/config/resolve-config.js` | loadEditorconfig呼び出し箇所 |
| 1-2 | index.js | `src/config/editorconfig/index.js` | EditorConfig読み込みのメイン実装 |

**主要処理フロー**:
1. **27-34行目（resolve-config.js）**: loadEditorconfig関数の呼び出し
2. **18-21行目（editorconfig/index.js）**: clearEditorconfigCache - キャッシュクリア
3. **23-29行目**: loadEditorconfigInternal - 内部読み込み処理
4. **35-47行目**: loadEditorconfig - 公開API（キャッシュ管理含む）

#### Step 2: 設定変換処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | editorconfig-to-prettier.js | `src/config/editorconfig/editorconfig-to-prettier.js` | 設定変換ロジック |

**主要処理フロー**:
- **1行目**: isPositiveInteger - 正の整数判定
- **3-54行目**: editorConfigToPrettier - メイン変換関数
- **19-23行目**: indent_style/indent_size からuseTabs決定
- **26-30行目**: tabWidth決定
- **32-36行目**: printWidth決定（max_line_length）
- **39-43行目**: singleQuote決定（quote_type）
- **45-47行目**: endOfLine決定

#### Step 3: プロジェクトルート検出を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | find-project-root.js | `src/config/find-project-root.js` | VCSディレクトリ検出 |

**主要処理フロー**:
- プロジェクトルート（.git、.hg、.svn、.jj）の検出ロジック

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

```
resolveConfig(filePath, options)
    │
    └─ loadEditorconfig(filePath, options)
           │
           ├─ キャッシュ確認
           │
           └─ loadEditorconfigInternal(file, options)
                  │
                  ├─ findProjectRoot(directory)
                  │      └─ VCSディレクトリ検索（.git等）
                  │
                  ├─ parseEditorconfig(file, {root})
                  │      └─ editorconfig-without-wasm
                  │
                  └─ editorConfigToPrettier(editorConfig)
                         ├─ indent_style → useTabs
                         ├─ indent_size/tab_width → tabWidth
                         ├─ max_line_length → printWidth
                         ├─ quote_type → singleQuote
                         └─ end_of_line → endOfLine
```

### データフロー図

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

filePath ───▶ findProjectRoot() ───▶ root
    │                                   │
    │                                   ▼
    └───▶ parseEditorconfig(file, {root})
                    │
                    ▼
              EditorConfig
              {indent_style,
               indent_size,
               tab_width,
               max_line_length,
               quote_type,
               end_of_line}
                    │
                    ▼
          editorConfigToPrettier()
                    │
                    ▼
              Prettier設定
              {useTabs,
               tabWidth,
               printWidth,
               singleQuote,
               endOfLine}
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.js | `src/config/editorconfig/index.js` | ソース | EditorConfig読み込みメイン |
| editorconfig-to-prettier.js | `src/config/editorconfig/editorconfig-to-prettier.js` | ソース | 設定変換ロジック |
| find-project-root.js | `src/config/find-project-root.js` | ソース | プロジェクトルート検出 |
| resolve-config.js | `src/config/resolve-config.js` | ソース | EditorConfig統合呼び出し元 |
| cli-options.evaluate.js | `src/cli/cli-options.evaluate.js` | ソース | --editorconfigオプション定義 |
