# Jest

## 概要

Jestは、シンプルさに重点を置いた、JavaScript向けのテスティングフレームワークです。ほとんどのJavaScriptプロジェクトで設定不要ですぐに動作し、高速なテスト実行、スナップショットテスト、コードカバレッジなどの機能を提供します。55以上のパッケージで構成されるモノレポ構造で、Lerna-liteとYarn Workspacesで管理されています。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| ゼロコンフィグ | ほとんどのJavaScriptプロジェクトで設定不要で動作 |
| 高速なフィードバック | インタラクティブなウォッチモードで変更ファイルに関連するテストのみを実行 |
| スナップショットテスト | 大きなオブジェクトのスナップショットを取得し、変更を追跡 |
| 並列テスト実行 | ワーカープロセスでテストを並列実行しパフォーマンスを最大化 |
| モック機能 | 関数、モジュール、タイマーのモック機能を標準搭載 |
| コードカバレッジ | Istanbulを使用したコードカバレッジレポート生成 |
| TypeScriptサポート | Babel経由またはts-jestでTypeScriptをサポート |
| 複数環境 | Node.js環境とJSDOM環境をサポート |

## 技術スタック

### コア

- 言語: TypeScript (JavaScriptにコンパイル)
- パッケージマネージャー: Yarn 4.12.0 (Berry with node-modules linker)
- Node.js: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 (v20.x推奨)
- ビルドツール: Webpack, Babel, TypeScript Compiler
- モノレポマネージャー: Lerna-lite
- バージョン: 30.2.0

### 主要ライブラリ

- @babel/core: Babelコンパイラコア
- @babel/preset-env: 環境に応じたBabelプリセット
- @babel/preset-typescript: TypeScript用Babelプリセット
- webpack: モジュールバンドラー
- typescript: TypeScriptコンパイラ
- eslint: リンター
- prettier: コードフォーマッター
- graceful-fs: ファイルシステム操作
- chalk: ターミナル出力のカラーリング

## ディレクトリ構成

```
jest-main/
├── packages/               # 55以上のJestパッケージ
│   ├── jest/              # メインエントリーポイント
│   ├── jest-cli/          # コマンドラインインターフェース
│   ├── jest-config/       # 設定ハンドリング
│   ├── jest-core/         # コアテストランナー
│   ├── jest-runtime/      # モジュールランタイム
│   ├── jest-circus/       # デフォルトテストランナー
│   ├── jest-jasmine2/     # レガシーテストランナー
│   ├── expect/            # アサーションライブラリ
│   ├── jest-snapshot/     # スナップショットテスト
│   ├── babel-jest/        # Babelトランスフォーマー
│   └── ...                # その他のパッケージ
├── e2e/                    # 190以上のE2E統合テスト
│   ├── __tests__/         # E2Eテストファイル
│   └── */                 # テストフィクスチャ
├── examples/               # 使用例
│   ├── typescript/        # TypeScriptの例
│   ├── react/             # Reactの例
│   ├── angular/           # Angularの例
│   └── ...                # その他の例
├── scripts/                # ビルド・メンテナンススクリプト
├── website/                # ドキュメントウェブサイト (Docusaurus)
├── docs/                   # Markdownドキュメント
├── .github/workflows/      # CI/CD設定
├── package.json            # モノレポルート設定
├── lerna.json              # Lerna設定
├── jest.config.mjs         # Jestテスト設定
├── tsconfig.json           # TypeScript設定
├── eslint.config.mjs       # ESLint設定
└── babel.config.js         # Babel設定
```

## セットアップ

### 必要条件

- Node.js: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 (v20.x推奨)
- Python: node-gypに必要
- Mercurial (hg): 一部のE2Eテストに必要 (macOS: `brew install hg`)

### インストール手順

1. Corepackを有効化:

```bash
corepack enable
```

2. 依存関係をインストール (約45秒):

```bash
yarn install
```

CI環境や変更取得時はロックファイルの変更を防ぐため以下を使用:

```bash
yarn install --immutable
```

3. プロジェクトをビルド:

通常の開発では以下で十分 (約5秒):

```bash
yarn build:js
```

型定義を含む完全ビルド (3-5分):

```bash
yarn build
```

## 開発

### 開発ワークフロー

ファイル変更時に自動リビルドするウォッチモード:

```bash
yarn watch
```

ビルド成果物をクリア:

```bash
yarn build-clean
```

### テスト実行

全テスト実行 (10分以上):

```bash
yarn test
```

特定のテストファイルを実行:

```bash
yarn jest path/to/test.test.ts
```

カバレッジ付きで実行:

```bash
yarn jest-coverage
```

CIモードで実行:

```bash
yarn test-ci-partial:parallel --max-workers <N> --shard=<M>/<N>
```

### リント・コード品質

全コードのリント (JavaScript, TypeScript, Markdown):

```bash
yarn lint
```

Prettierでフォーマット:

```bash
yarn lint:prettier
```

フォーマットチェック:

```bash
yarn lint:prettier:ci
```

型チェック:

```bash
yarn typecheck
```

Yarn制約チェック:

```bash
yarn constraints
```

制約の自動修正:

```bash
yarn constraints --fix
```

重複依存関係のチェック:

```bash
yarn dedupe --check
```

### コード規約

- インデント: 2スペース (タブ禁止)
- 行の長さ: 80文字推奨
- クォート: シングルクォート (`'`) 優先
- セミコロン: 必須
- トレイリングカンマ: 必須
- `fs`の代わりに`graceful-fs`を使用
- `global`の代わりに`globalThis`を使用
- オブジェクトキーとインポートはアルファベット順にソート

### 著作権ヘッダー

全ての`.js`, `.ts`, `.tsx`, `.mjs`, `.cjs`ファイルに以下のヘッダーが必要:

```javascript
/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
```
