# バッチ設計書 19-type-check

## 概要

本ドキュメントは、Decap CMSプロジェクトにおけるTypeScript型チェックバッチ `type-check` の設計仕様を定義する。本バッチはTypeScriptコンパイラ（tsc）を使用して、プロジェクト全体の型安全性を検証する。

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

本バッチは、Decap CMSモノレポ全体のTypeScriptソースコードに対して型チェックを実行するスクリプトである。`tsc --noEmit` コマンドを使用し、コンパイル出力を生成せずに型エラーのみを検出する。tsconfig.jsonの設定に基づき、packages配下の全TypeScriptファイルが検査対象となる。

**業務上の目的・背景**：TypeScriptの型システムを活用して、ランタイムエラーの発生を未然に防止する。型の不整合、未使用変数、未使用パラメータなどの問題を静的に検出することで、コードの信頼性を向上させる。strict モードが有効であり、高い型安全性が確保されている。

**バッチの実行タイミング**：開発者による手動実行（随時）。No.11 test、No.12 test:ci のサブタスクとしても実行される。`npm run type-check:watch` でウォッチモードも利用可能。

**主要な処理内容**：
1. tsconfig.json を読み込み、コンパイラオプションを取得
2. include パターン（`**/src/**/*`）に一致するTypeScriptファイルを検索
3. exclude パターン（node_modules, `**/*.spec.ts`）を除外
4. `tsc --noEmit` で型チェックを実行（出力ファイルは生成しない）

**前後の処理との関連**：No.11 test および No.12 test:ci のサブタスクとして、lintの後・test:unitの前に実行される。パスエイリアス（tsconfig.json の paths）により、パッケージ間の型参照が解決される。

**影響範囲**：packages/ 配下の全TypeScriptファイル（`**/src/**/*`）が検査対象。型チェック自体はファイルを変更しない読み取り専用の処理であるが、`--noEmit` により.jsファイルや.d.tsファイルの出力も行わない。

## バッチ種別

静的解析（TypeScript型チェック）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | なし |
| 実行日 | なし |
| トリガー | 手動、またはtest/test:ciからの自動呼び出し |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js | Node.js 22.x または 24.x がインストールされていること |
| TypeScript | TypeScript ^4.9.4 がインストール済みであること |
| tsconfig.json | プロジェクトルートにtsconfig.jsonが存在すること |

### 実行可否判定

特別な実行可否判定は行わない。前提条件が満たされていれば常に実行可能である。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --watch | フラグ | No | なし | type-check:watch経由で実行時、ファイル変更の監視モード |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| **/src/**/* | TypeScript/JavaScript | 型チェック対象のソースファイル |
| tsconfig.json | JSON | TypeScriptコンパイラ設定 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | 型エラーの一覧（ファイルパス、行番号、エラーコード、エラーメッセージ） |
| プロセス終了コード | 数値 | 0: 型エラーなし、1以上: 型エラー検出 |

### 出力ファイル仕様

本バッチはファイル出力を行わない（--noEmit オプション）。

## 処理フロー

### 処理シーケンス

```
1. tsconfig.json 読み込み
   ├─ compilerOptions: strict, noEmit, jsx: react, target: esnext, module: esnext
   ├─ include: **/src/**/*
   └─ exclude: node_modules, **/*.spec.ts
2. パスエイリアス解決
   ├─ decap-cms-backend-bitbucket -> packages/decap-cms-backend-bitbucket/src
   ├─ decap-cms-backend-github -> packages/decap-cms-backend-github/src
   ├─ decap-cms-backend-gitlab -> packages/decap-cms-backend-gitlab/src
   ├─ decap-cms-lib-util -> packages/decap-cms-lib-util/src
   └─ decap-cms-lib-widgets -> packages/decap-cms-lib-widgets/src
3. 型チェック実行
   └─ 全対象ファイルの型整合性を検証
4. 結果出力
   └─ 型エラーがあれば一覧を出力してエラー終了
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始: tsc --noEmit] --> B[tsconfig.json読み込み]
    B --> C[対象ファイル検索 - **/src/**/*]
    C --> D[除外パターン適用 - node_modules, *.spec.ts]
    D --> E[パスエイリアス解決]
    E --> F[型チェック実行]
    F --> G{型エラーあり?}
    G -->|あり| H[エラー一覧を出力]
    H --> I[エラー終了]
    G -->|なし| J[バッチ正常終了]
```

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

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

本バッチはデータベースへのアクセスを行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | 型エラー | TypeScript型の不整合検出 | 型定義を修正後に再実行 |
| 1 | 未使用変数 | noUnusedLocals: true によりローカル変数の未使用を検出 | 未使用変数を削除またはアンダースコアプレフィックスを付与 |
| 1 | 未使用パラメータ | noUnusedParameters: true により関数パラメータの未使用を検出 | 未使用パラメータを削除またはアンダースコアプレフィックスを付与 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（手動再実行） |
| リトライ間隔 | なし |
| リトライ対象エラー | なし |

### 障害時対応

型エラーのメッセージに従いソースコードの型定義を修正する。パスエイリアスの問題はtsconfig.jsonのpaths設定を確認する。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | **/src/**/* に一致する全TypeScript/JavaScriptファイル |
| 目標処理時間 | 数十秒〜1分程度 |
| メモリ使用量上限 | Node.jsデフォルトヒープサイズ |

## 排他制御

同時実行の制御は行わない。読み取り専用の処理であるため、並列実行しても問題ない。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| エラーログ | 型エラー検出時 | ファイルパス、行番号、エラーコード（TSxxxx）、エラーメッセージ |
| 終了ログ | 正常終了時 | なし（エラーがなければ無出力） |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | なし（ローカル実行のため） | なし |
| エラー件数 | なし（ローカル実行のため） | なし |

## 備考

- 本バッチは `npm run type-check` コマンドで実行される
- `npm run type-check:watch` でウォッチモード（ファイル変更検知で自動再実行）が利用可能
- tsconfig.json の主要設定:
  - strict: true（厳密な型チェック）
  - noEmit: true（出力ファイルを生成しない）
  - jsx: react
  - target: esnext, module: esnext, moduleResolution: node
  - isolatedModules: true
  - noUnusedLocals: true, noUnusedParameters: true
  - allowJs: true（JavaScriptファイルも型チェック対象）
  - skipLibCheck: true（ライブラリの型定義チェックをスキップ）
  - useUnknownInCatchVariables: false
- パスエイリアス（5パッケージ）により、パッケージ間の型参照がsrcディレクトリに解決される
- TypeScriptバージョン: ^4.9.4
