# バッチ設計書 9-check-deps.js

## 概要

本ドキュメントは、依存関係のバージョン固定を検証するスクリプト `scripts/check-deps.js` の設計仕様を記載したものです。

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

本バッチは、プロジェクト内の複数のpackage.jsonファイルを検査し、依存パッケージのバージョンが固定されているか（^や~プレフィックスが使用されていないか）を検証します。

**業務上の目的・背景**：Prettierプロジェクトでは、依存パッケージのバージョンを厳密に管理し、ビルドの再現性を確保しています。semverの範囲指定（^や~）を使用すると、異なる環境やタイミングで異なるバージョンがインストールされる可能性があります。本バッチは、全ての依存パッケージが特定のバージョンに固定されていることを検証し、ビルドの一貫性を保証します。

**バッチの実行タイミング**：CI/CDパイプラインでの検証時、依存パッケージの追加・更新後に実行されます。

**主要な処理内容**：
1. プロジェクト内の複数のpackage.jsonファイルを順次読み込み
2. dependencies、devDependencies、resolutionsの各セクションを検査
3. バージョン指定が^または~で始まる場合はエラーを報告
4. 全ファイルの検査結果を出力

**前後の処理との関連**：本バッチはCI/CDの一部として実行され、PRマージ前の品質チェックに使用されます。

**影響範囲**：複数のpackage.jsonファイル（ルート、website、scripts/release等）の検証。process.exitCodeの設定によりCIの成功/失敗を制御。

## バッチ種別

検証・リント / 依存関係管理

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（PR時、依存パッケージ更新時） |
| 実行時刻 | 任意 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | CI/CD / 手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js環境 | Node.jsがインストールされていること |
| package.jsonファイル | 検査対象のpackage.jsonファイルが存在すること |

### 実行可否判定

検査対象のpackage.jsonが存在しない場合はエラーとなります。

## 入力仕様

### 入力パラメータ

本バッチはコマンドライン引数を受け取りません。

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | - |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| ./package.json | JSON | ルートのpackage.json |
| ./website/package.json | JSON | websiteのpackage.json |
| ./scripts/release/package.json | JSON | リリーススクリプトのpackage.json |
| ./scripts/tools/bundle-test/package.json | JSON | バンドルテストのpackage.json |
| ./scripts/tools/eslint-plugin-prettier-internal-rules/package.json | JSON | ESLintプラグインのpackage.json |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| stdout | テキスト | 検査対象ファイルパスと結果 |
| stderr | テキスト | エラーメッセージ |
| process.exitCode | 数値 | 0:成功、1:エラーあり |

### 出力ファイル仕様

本バッチはファイル出力を行いません。

## 処理フロー

### 処理シーケンス

```
1. 検査対象ディレクトリ一覧の定義
   └─ 5つのディレクトリパスを配列で定義
2. 各package.jsonのループ処理
   └─ ファイルパスを出力
   └─ validatePackageJson関数を呼び出し
3. package.jsonの検証
   └─ JSONを読み込み・パース
   └─ dependencies, devDependencies, resolutionsを検査
4. バージョン形式の検証
   └─ 各パッケージのバージョンが^または~で始まるか確認
   └─ 該当する場合はエラーメッセージを出力
5. 結果の出力
   └─ エラーがなければPASSを表示
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[ディレクトリ一覧定義]
    B --> C[ディレクトリループ]
    C --> D[ファイルパス出力]
    D --> E[validatePackageJson呼び出し]
    E --> F[JSONパース]
    F --> G[プロパティループ]
    G --> H[パッケージループ]
    H --> I{^または~で開始?}
    I -->|Yes| J[エラー出力]
    I -->|No| K{次パッケージ?}
    J --> L[process.exitCode = 1]
    L --> K
    K -->|Yes| H
    K -->|No| M{次プロパティ?}
    M -->|Yes| G
    M -->|No| N{ok = true?}
    N -->|Yes| O[PASS出力]
    N -->|No| P[スキップ]
    O --> Q{次ディレクトリ?}
    P --> Q
    Q -->|Yes| C
    Q -->|No| R[バッチ終了]
```

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

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

本バッチはデータベースを使用しません。

### テーブル別操作詳細

N/A

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Version not pinned | バージョンが^または~で始まる | バージョンを固定値に変更 |
| - | File read error | package.jsonが存在しない | ファイルの存在を確認 |

### リトライ仕様

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

### 障害時対応

バージョン固定エラーが検出された場合、package.jsonのバージョン指定を修正（^や~を削除）してください。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（読み取り専用） |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 5つのpackage.jsonファイル |
| 目標処理時間 | 1秒以内 |
| メモリ使用量上限 | Node.jsデフォルト制限に依存 |

## 排他制御

読み取り専用の処理のため、排他制御は不要です。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | 各ファイル検査時 | `Checking '{ファイルパス}'...` |
| 成功ログ | 検査成功時 | `All dependency versions are pinned.` |
| エラーログ | エラー検出時 | `ERROR Dependency "{パッケージ名}" in "{プロパティ}" should be pinned.` |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| process.exitCode | 1 | CI/CD失敗 |

## 備考

- node-style-textパッケージでコンソール出力に色付け（bgRed, gray, blue, underline等）
- fs/promisesで非同期ファイル読み込み
- 検査対象プロパティ：dependencies, devDependencies, resolutions
- バージョンの最初の文字（version[0]）で^または~をチェック
- 各ディレクトリ間に空行を挿入して視認性を向上
- okフラグで各ファイルの検査結果を追跡
- PROJECT_ROOTを基準に相対パスを構築
