# 機能設計書 13-設定ファイル解決（resolveConfig）

## 概要

本ドキュメントは、Prettierにおける設定ファイル解決機能（resolveConfig）について記述する。

### 本機能の処理概要

**業務上の目的・背景**：Prettierはプロジェクト固有の設定を設定ファイルから読み込むことで、チーム全体で統一されたフォーマットルールを適用できる。resolveConfig関数は、指定されたファイルパスに対して適用される設定を、設定ファイル（.prettierrc、package.json等）とEditorConfigから検索・解決し、マージされた設定オブジェクトを返す。これにより、エディタ統合やCI環境で一貫したフォーマット設定を適用できる。

**機能の利用シーン**：
- エディタプラグインがファイル保存時に適用設定を取得する際
- CLIがファイルをフォーマットする前に設定を解決する際
- APIを使用したプログラマティックな設定取得時
- CI/CD パイプラインでのフォーマット検証時

**主要な処理内容**：
1. 指定されたファイルパスから設定ファイルを検索
2. Prettier設定ファイル（.prettierrc等）の読み込みとパース
3. EditorConfig設定の読み込みと変換（オプション）
4. overridesセクションによるファイルパターン別設定のマージ
5. 設定のキャッシュ管理（パフォーマンス最適化）
6. 相対パスプラグインの解決

**関連システム・外部連携**：
- 設定ファイル検索システム（config-searcher.js）
- EditorConfig統合システム（editorconfig/index.js）
- micromatch（globパターンマッチング）
- url-or-path（URL/パス変換）

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 16 | Usage - API | 補助機能 | APIでの設定解決関数の使い方を説明 |
| 20 | Configuration - Configuration File | 主機能 | 設定ファイルの読み込み・解決方法を説明 |
| 22 | Editors - Editor Integration | 補助機能 | エディタでの設定ファイル解決を説明 |

## 機能種別

データ取得・変換処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| fileUrlOrPath | string \| URL | Yes | 設定を解決するファイルのパスまたはURL | 有効なファイルパスまたはURL |
| options | object | No | オプション設定 | - |
| options.useCache | boolean | No | キャッシュを使用するか（デフォルト: true） | - |
| options.config | string \| URL | No | 使用する設定ファイルのパス（省略時は自動検索） | 有効なファイルパス |
| options.editorconfig | boolean | No | EditorConfigを読み込むか（デフォルト: true） | - |

### 入力データソース

- ファイルシステムからの設定ファイル読み込み
- EditorConfigファイル（.editorconfig）の読み込み

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| config | object \| null | 解決された設定オブジェクト。設定が見つからない場合はnull |
| config.* | any | Prettierオプション（tabWidth, useTabs, singleQuote等） |

### 出力先

- 呼び出し元への設定オブジェクト返却

## 処理フロー

### 処理シーケンス

```
1. resolveConfig関数が呼び出される
   └─ optionsのデフォルト値設定（useCache: true）
2. fileUrlOrPathをパスに変換
   └─ toPath関数でURL対応
3. Prettier設定とEditorConfig設定を並列で取得
   └─ loadPrettierConfig: 設定ファイルの読み込み
   └─ loadEditorconfig: EditorConfig設定の読み込み（オプション有効時）
4. 設定が見つからない場合はnullを返却
   └─ result, editorConfigured両方が空の場合
5. 設定のマージ
   └─ EditorConfig設定をベースに
   └─ Prettier設定を上書き（mergeOverrides適用）
6. プラグインの相対パス解決
   └─ 相対パスを設定ファイルからの絶対パスに変換
7. マージされた設定を返却
```

### フローチャート

```mermaid
flowchart TD
    A[開始: resolveConfig] --> B[オプションデフォルト設定]
    B --> C[fileUrlOrPathをパス変換]
    C --> D[並列処理開始]
    D --> E[loadPrettierConfig]
    D --> F[loadEditorconfig]
    E --> G{設定ファイル存在?}
    F --> G
    G -->|どちらもない| H[null返却]
    G -->|どちらかある| I[設定マージ]
    I --> J[EditorConfig設定ベース]
    J --> K[mergeOverrides適用]
    K --> L{プラグイン配列存在?}
    L -->|Yes| M[相対パス解決]
    L -->|No| N[マージ設定返却]
    M --> N
    H --> O[終了]
    N --> O
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-013-01 | 設定優先順位 | Prettier設定 > EditorConfig設定 | 両方存在する場合 |
| BR-013-02 | overridesマッチング | filesパターンに一致するファイルにoverrideを適用 | overridesセクションが存在する場合 |
| BR-013-03 | キャッシュ使用 | useCache=trueの場合、キャッシュ済み設定を返却 | デフォルト有効 |
| BR-013-04 | プラグイン相対パス | 相対パス（.で始まる）を設定ファイル基準の絶対パスに変換 | pluginsが配列の場合 |
| BR-013-05 | null返却条件 | Prettier設定もEditorConfig設定も見つからない場合 | 常時 |

### 計算ロジック

**overridesマッチングロジック**:
1. 設定ファイルからの相対パスを計算
2. パターンをスラッシュ有無で分類
3. micromatch.isMatchでパターンマッチング
4. マッチした場合、optionsをマージ

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | TypeError | 設定ファイルの型が不正 | "Config is only allowed to be an object" |
| - | Error | ローダーが見つからない | "No loader specified for extension" |
| - | SyntaxError | 設定ファイルの構文エラー | パースエラーをそのままスロー |

### リトライ仕様

ファイル読み込みエラー時のリトライは行わない（設定ファイルの修正が必要）

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

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

## パフォーマンス要件

- キャッシュ有効時: 1ms以下（キャッシュヒット時）
- キャッシュ無効時: 10ms以下（設定ファイル読み込み含む）

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

- 設定ファイル内のJavaScriptコードは評価される（.prettierrc.js等）
- 外部パッケージからの設定読み込み時は注意が必要

## 備考

- 非同期関数として実装されている
- Promise.allで並列処理を行いパフォーマンスを最適化

---

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

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

### 推奨読解順序

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

設定オブジェクトの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | resolve-config.js | `src/config/resolve-config.js` | 関数シグネチャと戻り値の型 |

**読解のコツ**: JSDocコメントで型情報が提供されている。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.js | `src/index.js` | resolveConfig関数のエクスポート |
| 2-2 | resolve-config.js | `src/config/resolve-config.js` | メインの実装 |

**主要処理フロー**:
1. **16-18行目**: clearCache関数 - 全キャッシュクリア
2. **70-97行目**: resolveConfig関数 - メインの設定解決処理
3. **74-77行目**: Promise.allで並列読み込み
4. **83-86行目**: 設定のマージ処理
5. **88-94行目**: プラグイン相対パスの解決

#### Step 3: 設定ファイル検索処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | prettier-config/index.js | `src/config/prettier-config/index.js` | 設定ファイルキャッシュ管理 |
| 3-2 | config-searcher.js | `src/config/prettier-config/config-searcher.js` | 設定ファイル検索ロジック |
| 3-3 | load-config.js | `src/config/prettier-config/load-config.js` | 設定ファイル読み込み |

**主要処理フロー**:
- **12-15行目（index.js）**: clearPrettierConfigCache - キャッシュクリア
- **22-31行目（index.js）**: loadPrettierConfig - 設定ファイル読み込み
- **54-64行目（index.js）**: searchPrettierConfig - 設定ファイル検索
- **12-39行目（config-searcher.js）**: CONFIG_FILE_NAMES - サポートするファイル名一覧

#### Step 4: overridesマッチング処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | resolve-config.js | `src/config/resolve-config.js` | mergeOverrides関数とpathMatchesGlobs関数 |

**主要処理フロー**:
- **110-129行目**: mergeOverrides関数 - overridesセクションの適用
- **132-152行目**: pathMatchesGlobs関数 - globパターンマッチング

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

```
prettier.resolveConfig(filePath, options)
    │
    ├─ toPath(fileUrlOrPath)
    │
    ├─ Promise.all([...])
    │      │
    │      ├─ loadPrettierConfig(filePath, options)
    │      │      ├─ searchPrettierConfig(directory)
    │      │      │      └─ FileSearcher.search()
    │      │      └─ loadConfig(configFile)
    │      │             └─ loaders[extension](file)
    │      │
    │      └─ loadEditorconfig(filePath, options)
    │             ├─ findProjectRoot(directory)
    │             └─ parseEditorconfig(file)
    │
    ├─ mergeOverrides(result, filePath)
    │      └─ pathMatchesGlobs(relativeFilePath, patterns)
    │             └─ micromatch.isMatch()
    │
    └─ プラグイン相対パス解決
```

### データフロー図

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

filePath ───▶ searchPrettierConfig() ───▶ configFile
    │                                          │
    │                                          ▼
    │                          loadConfig() ───▶ config
    │                                          │
    └───▶ loadEditorconfig() ───▶ editorConfig
                                              │
                                              ▼
                         マージ処理 ───▶ {editorConfig + config}
                              │
                              ▼
                    mergeOverrides() ───▶ 最終設定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| resolve-config.js | `src/config/resolve-config.js` | ソース | メインのresolveConfig実装 |
| index.js | `src/config/prettier-config/index.js` | ソース | 設定ファイルキャッシュ管理 |
| config-searcher.js | `src/config/prettier-config/config-searcher.js` | ソース | 設定ファイル検索 |
| load-config.js | `src/config/prettier-config/load-config.js` | ソース | 設定ファイル読み込み |
| loaders.js | `src/config/prettier-config/loaders.js` | ソース | ファイル形式別ローダー |
| load-external-config.js | `src/config/prettier-config/load-external-config.js` | ソース | 外部設定読み込み |
| index.js | `src/config/editorconfig/index.js` | ソース | EditorConfig読み込み |
| editorconfig-to-prettier.js | `src/config/editorconfig/editorconfig-to-prettier.js` | ソース | EditorConfig変換 |
| find-project-root.js | `src/config/find-project-root.js` | ソース | プロジェクトルート検索 |
| index.js | `src/index.js` | ソース | API公開エントリーポイント |
