# バッチ設計書 10-cleanE2e.mjs

## 概要

本ドキュメントは、Jestモノレポにおける E2E テストディレクトリクリーンアップバッチ `cleanE2e.mjs` の設計仕様を記載したものです。このバッチは E2E テストディレクトリ内の node_modules を削除し、テスト環境をクリーンな状態に戻します。

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

**業務上の目的・背景**：Jest の E2E テストは、各テストケースディレクトリ内に独自の node_modules を持つことがあります。テストの実行後、これらの node_modules が残留するとディスク容量を消費し、次回のテスト実行時に予期しない影響を与える可能性があります。本バッチは、E2E テストディレクトリ内の node_modules を一括削除することで、テスト環境を初期化し、クリーンな状態でのテスト実行を保証します。

**バッチの実行タイミング**：開発者が `yarn clean-e2e` コマンドを実行した際に随時実行されます。E2E テストの前後や、ディスク容量の確保が必要な場合に実行します。CI/CD パイプラインでは、テスト実行前のクリーンアップとして使用されることがあります。

**主要な処理内容**：
1. E2E テストディレクトリパターン（`e2e/{*,*/*}/node_modules/`）を glob で検索
2. 除外対象ディレクトリをフィルタリング
3. 検出された node_modules ディレクトリを再帰的に削除

**前後の処理との関連**：他のビルドやテスト処理とは独立して実行可能です。E2E テスト（`yarn test-e2e`）の前に実行することで、クリーンな状態でテストを開始できます。

**影響範囲**：`e2e/` ディレクトリ配下の node_modules ディレクトリが削除されます。一部の除外対象ディレクトリは保護されます。

## バッチ種別

クリーンアップ処理 / ファイル削除 / メンテナンス

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（開発者操作時）/ CI/CD |
| 実行時刻 | 任意 |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | `yarn clean-e2e` コマンド実行 / CI/CDパイプライン |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js環境 | ^18.14.0 \|\| ^20.0.0 \|\| ^22.0.0 \|\| >=24.0.0 |
| e2e ディレクトリ存在 | リポジトリルートに e2e/ ディレクトリが存在すること |

### 実行可否判定

- `e2e/` ディレクトリが存在し、アクセス可能であること
- ファイル削除権限があること

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | コマンドライン引数は受け付けない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| e2e/*/node_modules/ | ディレクトリ | 削除対象の node_modules |
| e2e/*/*/node_modules/ | ディレクトリ | ネストされた削除対象 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| ファイルシステム | - | node_modules ディレクトリの削除 |

### 出力ファイル仕様

ファイル出力は行いません。ディレクトリ削除のみを実行します。

## 処理フロー

### 処理シーケンス

```
1. 除外対象の定義
   └─ excludedModules 配列に保護するパスを定義
2. ルートディレクトリの決定
   └─ fileURLToPath と path.resolve でスクリプトからの相対パスを計算
3. node_modules 検索
   └─ glob.sync で e2e/{*,*/*}/node_modules/ パターンにマッチするディレクトリを取得
4. フィルタリング
   └─ excludedModules に含まれるパスを除外
5. 削除処理
   └─ 各ディレクトリに対して fs.rmSync を実行
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[excludedModules 定義]
    B --> C[rootDir 計算]
    C --> D[glob.sync で node_modules 検索]
    D --> E{対象ディレクトリあり?}
    E -->|なし| F[バッチ終了]
    E -->|あり| G[各ディレクトリをループ]
    G --> H{excludedModules に含まれる?}
    H -->|はい| I[スキップ]
    H -->|いいえ| J[fs.rmSync で削除]
    I --> K[次のディレクトリ]
    J --> K
    K --> G
    G -->|全て処理完了| F
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| N/A | - | - | データベースへのアクセスなし |

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

データベース操作は発生しません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| EACCES | 権限エラー | ファイル削除権限がない | 適切な権限で実行 |
| ENOENT | ファイル不在 | 削除対象が存在しない | 通常は問題なし（force: true） |

### リトライ仕様

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

### 障害時対応

1. エラーメッセージを確認し、問題のディレクトリを特定
2. ファイル権限を確認（ロックされているファイルがないか）
3. 手動でディレクトリを削除

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（ファイルシステム操作のみ） |
| コミットタイミング | N/A |
| ロールバック条件 | N/A（削除操作は復元不可） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 数十〜百数十ディレクトリ |
| 目標処理時間 | 数秒〜数十秒 |
| メモリ使用量上限 | 低（ファイル操作のみ） |

## 排他制御

- E2E テスト実行中は実行しないこと（テスト失敗の原因となる）
- 同時実行は非推奨（同一ディレクトリへの操作競合）

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| N/A | - | ログ出力なし |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 非0 | CI/CDパイプライン（設定時） |

## 備考

### 除外されるディレクトリ

以下のディレクトリは削除対象から除外されます：

- `e2e/global-setup-node-modules/node_modules/`
- `e2e/presets/cjs/node_modules/`
- `e2e/presets/js/node_modules/`
- `e2e/presets/js-type-module/node_modules/`
- `e2e/presets/json/node_modules/`
- `e2e/presets/mjs/node_modules/`
- `e2e/resolve-conditions/node_modules/`
- `e2e/retain-all-files/node_modules/`

これらは E2E テストの実行に必要な固定的な依存関係を持つテストケースです。

### glob パターン

- `e2e/{*,*/*}/node_modules/`：1階層または2階層のネストに対応
- `absolute: true`：絶対パスで結果を取得
- `ignore: excludedModules`：除外パターンを適用

### 注意事項

- `force: true` オプションにより、存在しないディレクトリでもエラーにならない
- `recursive: true` オプションにより、ディレクトリ内の全ファイルを削除
- graceful-fs を使用してファイル操作の安定性を向上
- normalize() でパス区切り文字を統一
