# 機能設計書 57-改行コード（endOfLine）

## 概要

本ドキュメントは、Prettierの`endOfLine`オプションに関する機能設計書である。このオプションは、フォーマット後のファイルで使用する行末文字（改行コード）を制御する。オペレーティングシステムによって標準の改行コードが異なるため、クロスプラットフォーム開発において重要な設定である。

### 本機能の処理概要

**業務上の目的・背景**：異なるOSを使用する開発チームでは、改行コードの不一致が問題となる。WindowsはCRLF（\r\n）、macOS/LinuxはLF（\n）を使用する。Gitでの差分表示やCI/CDパイプラインでの一貫性を保つため、改行コードの統一が必要である。このオプションにより、プロジェクト全体で改行コードを統一できる。

**機能の利用シーン**：すべてのコードフォーマット時に使用される。特に、クロスプラットフォーム開発、Gitリポジトリでの整合性維持、CIでのフォーマットチェックにおいて重要である。

**主要な処理内容**：
1. オプション値（lf/crlf/cr/auto）の読み込み
2. autoの場合、ファイル内の改行コードを検出
3. フォーマット後のテキストに指定された改行コードを適用
4. プリンター処理で改行文字を変換

**関連システム・外部連携**：すべての言語パーサー・プリンター、EditorConfigと連携して動作する。

**権限による制御**：権限による制御は存在しない。設定ファイルまたはCLIオプションで指定する。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 2 | Playground | 補助機能 | サイドバーから改行コードオプションを設定 |
| 19 | Configuration - Options | 主機能 | endOfLineオプションの詳細説明 |

## 機能種別

設定オプション / フォーマット制御

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| endOfLine | choice | No | 使用する改行コード | "lf", "crlf", "cr", "auto"のいずれか |

### 入力データソース

- 設定ファイル（.prettierrc、prettier.config.js等）
- CLIオプション（--end-of-line）
- プログラマティックAPI呼び出し時のオプションオブジェクト
- EditorConfigファイル（end_of_line）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| formattedCode | string | 改行コード設定が適用されたフォーマット済みコード |

### 出力先

フォーマット結果は呼び出し元に返却される（標準出力、ファイル、API戻り値）。

## 処理フロー

### 処理シーケンス

```
1. オプション解析
   └─ endOfLineオプションの値を取得（デフォルト: "lf"）
2. auto時の改行検出
   └─ guessEndOfLine関数でファイル内の改行コードを検出
3. 入力正規化
   └─ normalizeEndOfLine関数で全ての改行をLFに変換
4. フォーマット処理
   └─ 内部的にLFを使用してフォーマット
5. 改行コード変換
   └─ convertEndOfLineOptionToCharacter関数で最終的な改行コードに変換
6. 出力
   └─ 指定された改行コードでテキストを出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{endOfLine値は?}
    B -->|auto| C[guessEndOfLine実行]
    B -->|lf/crlf/cr| D[指定値を使用]
    C --> E[最初のCR/LF位置を検出]
    E --> F{検出結果}
    F -->|CRLF| G[crlf]
    F -->|CR| H[cr]
    F -->|その他| I[lf]
    D --> J[入力をLFに正規化]
    G --> J
    H --> J
    I --> J
    J --> K[フォーマット処理]
    K --> L[convertEndOfLineOptionToCharacter]
    L --> M[最終出力]
    M --> N[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-57-1 | デフォルト動作 | LF（\n）を使用 | endOfLine = "lf"（デフォルト） |
| BR-57-2 | CRLF | CRLF（\r\n）を使用 | endOfLine = "crlf" |
| BR-57-3 | CR | CR（\r）を使用 | endOfLine = "cr" |
| BR-57-4 | auto | ファイル内の最初の改行を検出して使用 | endOfLine = "auto" |
| BR-57-5 | auto検出ロジック | 最初の\rの後に\nがあればCRLF、なければCR、それ以外はLF | auto時 |
| BR-57-6 | EditorConfig | end_of_lineから自動設定 | EditorConfig設定時 |

### 計算ロジック

```javascript
// 改行コード検出（end-of-line.js）
function guessEndOfLine(text) {
  const index = text.indexOf("\r");
  if (index !== -1) {
    return text.charAt(index + 1) === "\n" ? "crlf" : "cr";
  }
  return "lf";
}

// 改行コード変換
function convertEndOfLineOptionToCharacter(endOfLineOption) {
  return endOfLineOption === "cr" ? "\r"
    : endOfLineOption === "crlf" ? "\r\n"
    : "\n";
}
```

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

データベース操作は発生しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 値エラー | 未定義の値が指定された場合 | Prettierのオプション検証でエラーが発生 |

### リトライ仕様

リトライは不要（同期的な設定適用処理）。

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

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

## パフォーマンス要件

文字列置換処理のため、大きなファイルではパフォーマンスに影響する可能性があるが、通常のコードサイズでは問題ない。

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

セキュリティに関する特別な考慮事項は存在しない。

## 備考

- Gitのcore.autocrlf設定との相互作用に注意が必要。
- CRのみの使用は非常にまれ。
- EditorConfigのend_of_lineから自動設定される。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | core-options.evaluate.js | `src/main/core-options.evaluate.js` | endOfLineオプションの定義 |

**読解のコツ**: このファイルでは、endOfLineがchoice型で4つの選択肢（lf, crlf, cr, auto）を持つことを確認する。

#### Step 2: 改行処理ユーティリティを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | end-of-line.js | `src/common/end-of-line.js` | 改行関連のユーティリティ関数 |

**主要処理フロー**:
1. **22-28行目**: guessEndOfLine - auto時の改行検出
2. **34-40行目**: convertEndOfLineOptionToCharacter - オプション値を文字に変換
3. **52-64行目**: countEndOfLineCharacters - 改行文字をカウント
4. **71-73行目**: normalizeEndOfLine - 全ての改行をLFに正規化

#### Step 3: コア処理での使用を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | core.js | `src/main/core.js` | endOfLineの使用箇所 |

**主要処理フロー**:
- **70行目**: フォーマット結果に改行コードを適用
- **212行目**: 範囲フォーマット時にLFを内部で使用
- **233-234行目**: LF以外の場合に改行を置換
- **285-287行目**: autoの場合にguessEndOfLineを呼び出し

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

```
formatWithCursor (core.js)
    │
    ├─ normalizeInputAndOptions (271行目)
    │      ├─ guessEndOfLine (286行目) ← auto時
    │      └─ normalizeEndOfLine (298行目)
    │
    ├─ coreFormat (355行目)
    │      └─ printDocToString
    │             └─ convertEndOfLineOptionToCharacter (184行目)
    │
    └─ formatRange (345行目)
           ├─ endOfLine: "lf" で処理 (212行目)
           └─ 最後にconvertEndOfLineOptionToCharacter (234行目)
```

### データフロー図

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

オプション設定 ───▶ guessEndOfLine ───▶ 検出された改行コード
(endOfLine)          (auto時)          (lf/crlf/cr)
        │
        ▼
ソースコード ───▶ normalizeEndOfLine ───▶ LF正規化テキスト
        │              (全て\nに)
        ▼
        ───▶ フォーマット処理 ───▶ フォーマット済みテキスト
        │
        ▼
        ───▶ convertEndOfLine ───▶ 最終出力
                 OptionToCharacter
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| core-options.evaluate.js | `src/main/core-options.evaluate.js` | ソース | オプション定義（64-90行目） |
| end-of-line.js | `src/common/end-of-line.js` | ソース | 改行処理ユーティリティ |
| core.js | `src/main/core.js` | ソース | endOfLine使用箇所 |
| printer.js | `src/document/printer/printer.js` | ソース | プリンターでの改行処理（175, 184行目） |
| editorconfig-to-prettier.js | `src/config/editorconfig/editorconfig-to-prettier.js` | ソース | EditorConfig変換（46行目） |
| index.d.ts | `src/index.d.ts` | 型定義 | TypeScript型定義（417行目） |
