# バッチ設計書 15-lint

## 概要

本ドキュメントは、Decap CMSプロジェクトにおける静的解析バッチ `lint` の設計仕様を定義する。本バッチはCSSリント（Stylelint）とJS/TSリント（ESLint）を並列実行し、コードスタイルおよび品質の問題を検出する。

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

本バッチは、Decap CMSモノレポ全体のコードに対して静的解析を実行するスクリプトである。npm-run-all（run-p）を使用して、CSSリント（lint:css）とJS/TSリント（lint:js）を並列に実行し、加えてPrettierフォーマットチェック（lint:format）も並行して行う。

**業務上の目的・背景**：コーディング規約の統一とコード品質の維持を目的とする。ESLintによるJavaScript/TypeScriptの構文・スタイルチェック、Stylelintによるcss-in-jsスタイルのチェック、Prettierによるフォーマット整合性チェックを包括的に行うことで、コードレビューの負担を軽減し、チーム全体のコード品質を一定水準に保つ。

**バッチの実行タイミング**：開発者による手動実行（随時）。No.11 test、No.12 test:ci から呼び出されるサブタスクでもある。

**主要な処理内容**：
1. `lint:css` - Stylelint でpackages配下の CSS/SCSS/JS/JSX/TS/TSX ファイルを検査（postcss-styled-syntax による css-in-js 対応）
2. `lint:js` - ESLint で packages および scripts 配下の JS/JSX/TS/TSX ファイルを検査
3. `lint:format` - Prettier で packages および scripts 配下のファイルのフォーマット差異を検出（--list-different）
4. 上記3つが run-p（npm-run-all並列実行）で同時実行される

**前後の処理との関連**：No.11 test および No.12 test:ci（lint-quiet版）の最初のサブタスクとして呼び出される。lint失敗時は No.16 format で自動修正を試みることができる。

**影響範囲**：packages/ および scripts/ 配下の全ソースファイルが検査対象。リント処理自体はファイルを変更しない読み取り専用の処理である。

## バッチ種別

静的解析（リント - コードスタイル・品質チェック）

## 実行スケジュール

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

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Node.js | Node.js 22.x または 24.x がインストールされていること |
| 依存パッケージ | `npm ci` または `npm install` で依存関係がインストール済みであること |
| 設定ファイル | .eslintrc.js, .stylelintrc, .prettierrc が存在すること |

### 実行可否判定

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

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --quiet | フラグ | No | なし | lint-quiet経由で実行時、エラーのみ出力 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| packages/**/*.{css,scss,js,jsx,ts,tsx} | ソースコード | Stylelint対象ファイル |
| {packages,scripts}/**/*.{js,jsx,ts,tsx} | ソースコード | ESLint対象ファイル |
| {packages,scripts}/**/*.{js,jsx,ts,tsx,css} | ソースコード | Prettier対象ファイル |
| .eslintrc.js | 設定ファイル | ESLint設定（babel-parser, typescript-parser, 各種プラグイン） |
| .stylelintrc | 設定ファイル | Stylelint設定（postcss-styled-syntax, stylelint-config-standard-scss） |
| .prettierrc | 設定ファイル | Prettier設定（singleQuote, trailingComma, printWidth:100） |
| .gitignore | 設定ファイル | リント除外パターン（--ignore-path .gitignore） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | リント結果（エラー・警告の一覧） |
| 標準エラー出力 | テキスト | エラー詳細 |
| プロセス終了コード | 数値 | 0: 問題なし、1以上: リントエラー検出 |

### 出力ファイル仕様

本バッチはファイル出力を行わない。

## 処理フロー

### 処理シーケンス

```
1. run-p並列実行開始
   ├─ lint:css - stylelint --ignore-path .gitignore "packages/**/*.{css,scss,js,jsx,ts,tsx}"
   │   └─ postcss-styled-syntax で css-in-js を解析
   ├─ lint:js - eslint --color --ignore-path .gitignore "{{packages,scripts}/**/,}*.{js,jsx,ts,tsx}"
   │   ├─ .js/.jsxファイル: @babel/eslint-parserで解析
   │   └─ .ts/.tsxファイル: @typescript-eslint/parserで解析
   └─ lint:format - prettier "{{packages,scripts}/**/,}*.{js,jsx,ts,tsx,css}" --list-different
       └─ フォーマットが異なるファイルのパスを出力
2. 全サブタスクの完了を待機（-c フラグにより、エラーがあっても全て完了まで実行）
3. いずれかにエラーがあればエラー終了
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始: npm run lint] --> B[run-p 並列実行開始]
    B --> C1[lint:css - Stylelint]
    B --> C2[lint:js - ESLint]
    B --> C3[lint:format - Prettier]
    C1 --> D{全サブタスク完了}
    C2 --> D
    C3 --> D
    D --> E{エラーあり?}
    E -->|あり| F[エラー終了 - 問題箇所を出力]
    E -->|なし| G[バッチ正常終了]
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | ESLintエラー | ESLintルール違反検出 | コードを修正、または `npm run format` で自動修正 |
| 1 | Stylelintエラー | Stylelintルール違反検出 | スタイルコードを修正 |
| 1 | Prettierエラー | フォーマット不一致検出 | `npm run format` で自動フォーマット |

### リトライ仕様

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

### 障害時対応

リントエラーの多くは `npm run format`（No.16）で自動修正可能である。自動修正できないエラーはエラーメッセージに従い手動で修正する。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | packages/およびscripts/配下の全対象ファイル |
| 目標処理時間 | 1分以内（並列実行により高速化） |
| メモリ使用量上限 | Node.jsデフォルトヒープサイズ |

## 排他制御

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

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | 処理中 | 各リンターの検査進捗 |
| 結果ログ | 完了時 | エラー・警告の一覧（ファイルパス、行番号、ルール名） |
| エラーログ | エラー発生時 | ルール違反の詳細情報 |

## 監視・アラート

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

## 備考

- 本バッチは `npm run lint` コマンドで実行される
- run-p の `-c` フラグにより、いずれかのサブタスクが失敗しても他のサブタスクは最後まで実行される
- `--aggregate-output` により各サブタスクの出力がまとめて表示される
- CI環境では `npm run lint-quiet`（`lint:* --quiet`）が使用され、エラーのみが出力される
- ESLint設定の主要ルール: import/order, @emotion/*, object-shorthand, func-style, prefer-const
- TypeScriptファイルには追加で @typescript-eslint/consistent-type-imports, @typescript-eslint/no-duplicate-imports が適用される
- Stylelintは postcss-styled-syntax を使用してcss-in-jsコードを解析する
- Prettierの設定: singleQuote: true, trailingComma: "all", printWidth: 100, arrowParens: "avoid"
