# バッチ設計書 12-fix

## 概要

本ドキュメントは、webpackプロジェクトにおけるnpm script `fix` の処理内容、実行条件、入出力仕様、エラー処理等を定義するバッチ設計書である。

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

`fix` は、webpackプロジェクトのコード品質に関する問題を自動修正する一括実行バッチである。ESLintによるコードスタイルの自動修正、プロジェクト固有の特殊リント処理の書き込みモード実行、Prettierによるコードフォーマットの3段階で処理を実行し、コードベース全体を規定のスタイルに整形する。

**業務上の目的・背景**：webpackプロジェクトでは、ESLintルール違反、型定義の不整合、スキーマフォーマットの不一致、自動生成コードの未更新、コードフォーマットの不統一など、多岐にわたるコード品質の問題が発生しうる。これらを一括で自動修正するスクリプトを提供することで、開発者がCIで検出されたリントエラーを効率的に解消できるようにする。`yarn lint` でエラーが検出された場合に `yarn fix` を実行することで、修正可能な問題を自動的に解決する。

**バッチの実行タイミング**：開発者がローカル環境でリントエラーを修正する際に手動実行する。CIで `yarn lint` が失敗した場合の修正手段として使用される。

**主要な処理内容**：
1. `yarn fix:code` - ESLintの `--fix` オプションによるコード自動修正（`node node_modules/eslint/bin/eslint.js --cache --fix .`）
2. `yarn fix:special` - プロジェクト固有の特殊リント処理を `--write` オプション付きで実行
   - `inherit-types --write` - 型継承の自動修正
   - `format-schemas --write` - スキーマフォーマットの自動修正
   - `generate-runtime-code.js --write` - ランタイムコードの再生成・書き込み
   - `generate-wasm-code.js --write` - WASMコードの再生成・書き込み
   - `compile-to-definitions --write` - 型定義のコンパイル・書き込み
   - `precompile-schemas --write` - スキーマプリコンパイル・書き込み
   - `generate-types --no-template-literals --write` - 型生成・書き込み
3. `yarn fmt` - Prettierによるプロジェクト全体のコードフォーマット

**前後の処理との関連**：`yarn lint` で検出されたエラーの修正手段として使用される。`fix:code` は `lint:code` の自動修正版、`fix:special` は `lint:special` の書き込みモード版、`fmt` は `fmt:check` の書き込みモード版である。修正後は再度 `yarn lint` を実行して問題が解消されたことを確認する。

**影響範囲**：プロジェクト内の全JavaScript/TypeScriptファイル、JSONスキーマファイル、型定義ファイル、自動生成コードファイルに対して変更を加える可能性がある。具体的には、ESLintルールに基づくコード修正、`lib/util/semver.js` のランタイムコード領域、`lib/util/hash/xxhash64.js` および `lib/util/hash/md4.js` のWASMコード領域、`schemas/` 配下のJSONスキーマ、`types.d.ts` 等の型定義ファイルが影響を受ける。

## バッチ種別

コード自動修正 / フォーマット

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動実行（`yarn fix`） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js 16以上 | generate-runtime-code.js および generate-wasm-code.js が Node.js 16以上を要求 |
| npm依存関係インストール済み | `node_modules` 配下にeslint、prettier、toolingパッケージ等が必要 |
| terser インストール済み | generate-runtime-code.js が terser を利用 |
| assemblyscript インストール済み | generate-wasm-code.js が assemblyscript を利用 |
| prettier インストール済み | コードフォーマットおよびgenerate-runtime-code.js で利用 |
| eslint インストール済み | fix:code で利用 |

### 実行可否判定

全ての前提条件が満たされていれば実行可能。`&&` 演算子によりコマンドが連結されているため、`fix:code` が失敗した場合は `fix:special` 以降は実行されない。同様に `fix:special` が失敗した場合は `fmt` は実行されない。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | 本バッチはパラメータを受け取らない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| プロジェクト内全ファイル | JavaScript/TypeScript/JSON等 | ESLintおよびPrettierの対象ファイル |
| lib/util/semver.js | JavaScript | ランタイムコード再生成対象 |
| lib/util/hash/xxhash64.js | JavaScript | WASMコード再生成対象（xxhash64） |
| lib/util/hash/md4.js | JavaScript | WASMコード再生成対象（md4） |
| schemas/*.json | JSON | スキーマフォーマット修正対象 |
| types.d.ts | TypeScript定義 | 型定義再生成対象 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| プロジェクト内各ファイル | JavaScript/TypeScript/JSON等 | 修正されたファイルが上書き保存される |
| 標準出力/標準エラー | テキスト | 各修正処理の結果メッセージ |
| .eslintcache | バイナリ | ESLintキャッシュの更新 |
| .prettiercache | バイナリ | Prettierキャッシュの更新 |

### 出力ファイル仕様

各ツールが対象ファイルを直接上書きする形で出力する。

| 項目 | 内容 |
|-----|------|
| ファイル名 | 各対象ファイル（変更があったファイルのみ上書き） |
| 出力先 | プロジェクトルートからの各ファイルパス |
| 文字コード | UTF-8 |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. fix:code 実行
   └─ ESLint --fix で全プロジェクトファイルを自動修正（--cache付き）
2. fix:special 実行
   ├─ inherit-types --write: 型継承の自動修正・書き込み
   ├─ format-schemas --write: スキーマフォーマットの修正・書き込み
   ├─ generate-runtime-code.js --write: ランタイムコードの再生成・書き込み
   ├─ generate-wasm-code.js --write: WASMコードの再生成・書き込み
   ├─ compile-to-definitions --write: 型定義のコンパイル・書き込み
   ├─ precompile-schemas --write: スキーマプリコンパイル・書き込み
   └─ generate-types --no-template-literals --write: 型生成・書き込み
3. fmt 実行
   └─ Prettier でプロジェクト全体のコードフォーマット（--write付き）
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[fix:code<br>ESLint --fix]
    B -->|成功| C[fix:special]
    B -->|失敗| Z[バッチ異常終了]
    C --> C1[inherit-types --write]
    C1 -->|成功| C2[format-schemas --write]
    C1 -->|失敗| Z
    C2 -->|成功| C3[generate-runtime-code.js --write]
    C2 -->|失敗| Z
    C3 -->|成功| C4[generate-wasm-code.js --write]
    C3 -->|失敗| Z
    C4 -->|成功| C5[compile-to-definitions --write]
    C4 -->|失敗| Z
    C5 -->|成功| C6[precompile-schemas --write]
    C5 -->|失敗| Z
    C6 -->|成功| C7[generate-types --write]
    C6 -->|失敗| Z
    C7 -->|成功| D[fmt<br>Prettier --write]
    C7 -->|失敗| Z
    D -->|成功| E[バッチ正常終了]
    D -->|失敗| Z
```

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

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 該当なし | 該当なし | 該当なし | 該当なし |

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| exit 1 | ESLint修正不可 | 自動修正できないESLintエラーが存在する場合 | 手動でコードを修正 |
| exit 1 | fix:special処理失敗 | 各toolingコマンドの実行時エラー | エラーメッセージを確認し、個別に対処 |
| Error | Node.jsバージョン不足 | Node.js 16未満で実行 | Node.js 16以上にアップグレード |
| Error | terser圧縮失敗 | ランタイムコードのスタイルが規定外 | lib/util/semver.jsのエクスポート関数をアロー関数形式に修正 |
| Error | AssemblyScriptコンパイル失敗 | WASMソースコードの構文エラー | AssemblyScriptソースファイルを修正 |

### リトライ仕様

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

### 障害時対応

`&&` による連結のため、失敗したステップのエラーメッセージを確認し、個別のfixコマンド（`yarn fix:code`、`yarn fix:special`、`yarn fmt`）を順次実行して問題箇所を特定する。自動修正不可能なESLintエラーは手動での修正が必要。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし（データベース操作なし） |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし（ファイル変更のロールバックはgit restoreで対応） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | プロジェクト内の全対象ファイル（数百〜数千ファイル） |
| 目標処理時間 | 数分〜十数分（ESLint + AssemblyScriptコンパイル + Prettier） |
| メモリ使用量上限 | デフォルトのNode.jsヒープ上限（約1.5GB） |

## 排他制御

同一プロジェクトディレクトリ内での同時実行は想定していない。ファイルの直接上書きを行うため、同時実行するとファイルの競合が発生する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | ESLint実行時 | 修正されたファイルの一覧 |
| 進捗ログ | fix:special各コマンド実行時 | `{file} updated` 等のメッセージ（標準エラー） |
| 進捗ログ | Prettier実行時 | フォーマットされたファイルの一覧 |
| エラーログ | 処理失敗時 | 各コマンドのエラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| プロセス終了コード | != 0 | 標準エラー出力（ローカル実行のため、開発者が直接確認） |

## 備考

- `fix` は `fix:code && fix:special && fmt` の順で実行される。ESLintの自動修正後にプロジェクト固有の修正を行い、最後にPrettierでフォーマットを統一する順序は意図的である。
- `fix:special` は `lint:special` と同じtoolingコマンドを使用するが、`--write` オプションが付与されることで書き込みモードで実行される。
- `lint:special` にあった `lockfile-lint` と `schemas-lint` は `fix:special` には含まれていない。これらは検証のみで自動修正機能を持たないためである。
- ESLintは `--cache` オプションにより `.eslintcache` を使用し、変更のないファイルのチェックをスキップする。
- Prettierも `--cache` オプションによりキャッシュを使用する。
