# バッチ設計書 42-CompressJson

## 概要

JSONファイルからホワイトスペースを除去し、圧縮されたJSONを出力するPowerShellスクリプトの設計書である。

### 本バッチの処理概要

本バッチは、指定されたJSONファイルを読み込み、全てのホワイトスペース（インデント、改行など）を除去した圧縮形式のJSONファイルを生成する。PowerShellの`ConvertFrom-Json`と`ConvertTo-Json -Compress`パイプラインを使用してJSON圧縮を行う。

**業務上の目的・背景**：Windows Terminalプロジェクトでは、設定ファイルやリソースファイルとしてJSONファイルが多数使用される。配布パッケージに含めるJSONファイルのサイズを最小化するため、不要なホワイトスペースを除去した圧縮版を生成する必要がある。これにより、パッケージサイズの削減とロード時間の短縮が見込まれる。

**バッチの実行タイミング**：ビルドプロセスの一部として随時実行される。JSONファイルをバイナリに埋め込む前処理として使用される。

**主要な処理内容**：
1. 入力JSONファイルの読み込み（Get-Content -Raw）
2. JSONオブジェクトへの変換（ConvertFrom-Json）
3. 圧縮JSONへの再変換（ConvertTo-Json -Compress -Depth 100）
4. UTF-8エンコーディングでの出力ファイル書き込み

**前後の処理との関連**：GenerateHeaderForJson.ps1（No.40）と連携し、圧縮されたJSONをC++ヘッダーに埋め込む場合がある。

**影響範囲**：出力されたJSONファイルはビルド成果物に含まれ、アプリケーションの設定・リソースとして使用される。

## バッチ種別

データ変換（JSON圧縮）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（ビルド時） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | ビルドプロセス |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| 入力JSONファイルの存在 | JsonFileパラメータで指定されたファイルが存在すること |
| 有効なJSON形式 | 入力ファイルが正しいJSON形式であること |
| PowerShell実行環境 | PowerShellが利用可能であること |

### 実行可否判定

2つの必須パラメータ（JsonFile、OutPath）がすべて指定されていること。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| JsonFile | string | Yes | なし | 入力JSONファイルのパス |
| OutPath | string | Yes | なし | 出力先ファイルパス |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| JsonFile | JSON | 圧縮対象のJSONファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| OutPathで指定されたファイル | JSON | ホワイトスペースが除去された圧縮JSON |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | OutPathパラメータで指定 |
| 出力先 | OutPathパラメータで指定 |
| 文字コード | UTF-8 |
| 区切り文字 | N/A（JSON形式） |

## 処理フロー

### 処理シーケンス

```
1. 入力JSONファイルの読み込み
   └─ Get-Content -Rawでファイル全体を文字列として読み込み
2. JSONオブジェクトへの変換
   └─ ConvertFrom-JsonでPowerShellオブジェクトに変換
3. 圧縮JSONへの再変換
   └─ ConvertTo-Json -Compress -Depth 100で圧縮（深さ100階層まで対応）
4. 出力ファイルへの書き込み
   └─ Out-File -Encoding utf8でUTF-8エンコーディングで書き込み
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[JSONファイル読み込み]
    B --> C[JSONオブジェクトに変換]
    C --> D[圧縮JSONに再変換]
    D --> E[UTF-8で出力ファイルに書き込み]
    E --> F[バッチ終了]
```

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

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

本バッチではデータベース操作は行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | ファイル未検出 | JsonFileが存在しない | パスを確認 |
| N/A | JSONパースエラー | 入力ファイルが不正なJSON | 入力ファイルのJSON構文を確認 |
| N/A | 書き込みエラー | OutPathへの書き込み権限がない | 出力先ディレクトリの権限を確認 |
| N/A | 深さ超過 | JSONのネストが100階層を超える | -Depthパラメータの調整 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（リトライ機構なし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

スクリプトが失敗した場合、入力JSONファイルの内容を確認し、正しいJSON形式であることを検証してから再実行する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（ファイル操作のみ） |
| コミットタイミング | Out-Fileによる一括書き込み |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1ファイル |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | 特に制約なし（JSONサイズ依存） |

## 排他制御

同一出力ファイルに対して同時実行しないこと。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 標準出力 | N/A | 明示的なログ出力なし |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| ビルド失敗 | N/A | ビルドシステム |

## 備考

- `-Depth 100`パラメータにより、最大100階層の深さまでJSONオブジェクトをシリアライズする。PowerShellの`ConvertTo-Json`はデフォルトで深さ2までしかシリアライズしないため、この明示的な指定が重要。
- 入力ファイルの読み込みには`-Raw`スイッチが使用されており、ファイル全体を1つの文字列として読み込む。
- ソースファイルパス: `tools/CompressJson.ps1`
