# 機能設計書 44-オブジェクトのブラケットスペース（bracketSpacing）

## 概要

本ドキュメントは、Prettierのオブジェクトブラケットスペース制御機能（bracketSpacing）の設計仕様を定義する。

### 本機能の処理概要

bracketSpacingオプションは、オブジェクトリテラルのブラケット（波括弧）の内側にスペースを挿入するかどうかを制御する。`{ foo: bar }` のようにスペースを入れるか、`{foo: bar}` のようにスペースなしで出力するかを選択できる。

**業務上の目的・背景**：
オブジェクトリテラルのブラケット内スペースは、コードの可読性に影響を与えるスタイル要素である。スペースを入れることで視覚的に要素が区別しやすくなる一方、スペースなしでは全体的にコンパクトな見た目になる。この機能により、プロジェクト全体で一貫したオブジェクトリテラルのスタイルを自動的に適用でき、コードベース全体の統一感を維持できる。

**機能の利用シーン**：
1. 可読性を重視してブラケット内にスペースを入れたい場合（true）
2. コンパクトなコードスタイルを好むプロジェクトでスペースなしにしたい場合（false）
3. 既存のコードベースのスタイルに合わせたい場合
4. ESLintのobject-curly-spacingルールと一致させたい場合

**主要な処理内容**：
1. bracketSpacingオプションの値取得（true/false）
2. オブジェクトリテラルの検出
3. ブラケット内のスペース出力制御
4. 空オブジェクトの特別処理

**関連システム・外部連携**：
- JavaScript/TypeScript/GraphQL/YAMLパーサー
- CLI、API、エディタプラグインからの呼び出し

**権限による制御**：
特になし。全てのユーザーが同一の機能を使用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 2 | Playground | 補助機能 | サイドバーからブラケットスペースを設定 |
| 19 | Configuration - Options | 主機能 | bracketSpacingオプションの詳細説明 |

## 機能種別

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

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| bracketSpacing | boolean | No | ブラケット内にスペースを入れるかどうか | true/falseのみ |

### 入力データソース

- 設定ファイル（.prettierrc、prettier.config.js、package.json等）
- CLI引数（--bracket-spacing / --no-bracket-spacing）
- API呼び出し時のオプションオブジェクト

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| formatted | string | ブラケットスペースが適切に制御されたフォーマット済みコード |

### 出力先

- 標準出力（CLIの場合）
- ファイル（--write オプション使用時）
- API戻り値

## 処理フロー

### 処理シーケンス

```
1. オプション解析
   └─ bracketSpacingオプションの値を取得（デフォルト: true）
2. オブジェクトリテラル検出
   └─ ObjectExpression、ObjectPattern等のノードを特定
3. プロパティ有無判定
   └─ 空オブジェクトかどうかを確認
4. スペース出力
   └─ オプション値に基づいてline/softlineを選択
```

### フローチャート

```mermaid
flowchart TD
    A[ObjectExpression/ObjectPattern検出] --> B{プロパティあり?}
    B -->|No| C[空オブジェクト出力]
    B -->|Yes| D{bracketSpacingの値}
    D -->|true| E[line を使用]
    D -->|false| F[softline を使用]
    E --> G[出力: { foo: bar }]
    F --> H[出力: {foo: bar}]
    C --> I[出力: {}]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-44-01 | デフォルト設定 | デフォルトでは true（スペースあり） | bracketSpacing未指定 |
| BR-44-02 | スペースあり | true ではブラケット内にスペースを挿入 | bracketSpacing: true |
| BR-44-03 | スペースなし | false ではブラケット内のスペースを省略 | bracketSpacing: false |
| BR-44-04 | 空オブジェクト | 空のオブジェクト `{}` にはスペースを入れない | properties.length === 0 |
| BR-44-05 | 複数行オブジェクト | 複数行にわたる場合は改行で処理 | 常に適用 |

### 計算ロジック

スペース出力の決定:
```javascript
const spacing = options.bracketSpacing ? line : softline;
// line: 折りたたまれた場合にスペースになる
// softline: 折りたたまれた場合に空になる
```

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

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

該当なし（本機能はデータベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | バリデーションエラー | bracketSpacingに不正な値が指定された場合 | 正しいboolean値を指定する |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 処理時間への影響は軽微
- 既存のAST走査に統合されている

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

特になし

## 備考

- GraphQL、YAMLでも同様のオプションが適用される
- import文の中括弧にも影響する

---

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

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

### 推奨読解順序

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

オプション定義を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | common-options.evaluate.js | `src/common/common-options.evaluate.js` | bracketSpacingオプションの定義（5-11行目） |

**読解のコツ**: bracketSpacingはboolean型でデフォルトtrue。descriptionとoppositeDescriptionの両方が定義されている。

#### Step 2: オブジェクト出力処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | object.js | `src/language-js/print/object.js` | printObject関数でのbracketSpacing使用（147行目） |

**主要処理フロー**:
1. **138-145行目**: parts.length === 0 の場合は空オブジェクト処理
2. **147行目**: `const spacing = options.bracketSpacing ? line : softline;`
3. **148-157行目**: スペースを使ってオブジェクトの内容を出力

#### Step 3: 他の言語での使用を確認

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | options.js | `src/language-graphql/options.js` | GraphQLでのbracketSpacing参照 |
| 3-2 | options.js | `src/language-yaml/options.js` | YAMLでのbracketSpacing参照 |

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

```
format() / formatWithCursor()
    │
    ├─ core.formatWithCursor()
    │      └─ printToDoc()
    │             └─ printer.print()
    │                    │
    │                    ├─ printObject() [object.js]
    │                    │      │
    │                    │      ├─ options.bracketSpacing チェック
    │                    │      │
    │                    │      └─ spacing = line or softline
    │                    │
    │                    ├─ printGraphQL [printer-graphql.js]
    │                    │      └─ options.bracketSpacing
    │                    │
    │                    └─ printYAML [printer-yaml.js]
    │                           └─ options.bracketSpacing
```

### データフロー図

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

options.bracketSpacing ──▶ printObject() ─────────▶ "{ foo }" or "{foo}"
                         │
                         ├─ true → line
                         │
                         └─ false → softline
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| common-options.evaluate.js | `src/common/common-options.evaluate.js` | ソース | bracketSpacingオプション定義 |
| object.js | `src/language-js/print/object.js` | ソース | オブジェクトリテラル出力処理 |
| options.js | `src/language-js/options.js` | ソース | JavaScript言語オプション（bracketSpacing参照） |
| options.js | `src/language-graphql/options.js` | ソース | GraphQL言語オプション |
| options.js | `src/language-yaml/options.js` | ソース | YAML言語オプション |
| printer-graphql.js | `src/language-graphql/printer-graphql.js` | ソース | GraphQLプリンター |
| printer-yaml.js | `src/language-yaml/printer-yaml.js` | ソース | YAMLプリンター |
| module.js | `src/language-js/print/module.js` | ソース | import/export文の出力処理 |
