# Jest コードリーディングガイドライン

## はじめに

このガイドラインは、Jestのコードベースを効率的に理解するための手引きです。
TypeScriptに精通していないエンジニアでも、段階的に学習できるよう構成されています。

**対象読者:**
- プロジェクトに新規参画するエンジニア
- 他言語からの経験者
- コードレビューを行う担当者

---

## 1. 言語基礎

> このセクションでは、TypeScriptの基本構文と概念を解説します。

### 1.1 プログラム構造

Jestは**TypeScript**で記述されたモノレポプロジェクトです。すべてのソースファイルは以下のCopyrightヘッダーで始まります。

```typescript
// ファイル: packages/jest-cli/src/run.ts:1-7
/**
 * 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.
 */
```

### 1.2 データ型と変数

TypeScriptでは型アノテーションを使用してデータ型を明示します。

```typescript
// ファイル: packages/jest-config/src/index.ts:28-33
type ReadConfig = {
  configPath: string | null | undefined;
  globalConfig: Config.GlobalConfig;
  hasDeprecationWarnings: boolean;
  projectConfig: Config.ProjectConfig;
};
```

**主要なデータ型パターン:**
- `string | null | undefined`: null許容型の組み合わせ
- `Array<T>`: ジェネリクスを使った配列型
- `Promise<T>`: 非同期処理の戻り値型

### 1.3 制御構造

条件分岐とループの例：

```typescript
// ファイル: packages/jest-runner/src/index.ts:97-105
async #createParallelTestRun(tests: Array<Test>, watcher: TestWatcher) {
  const resolvers = new Map<string, SerializableResolver>();
  for (const test of tests) {
    if (!resolvers.has(test.context.config.id)) {
      resolvers.set(test.context.config.id, {
        config: test.context.config,
        serializableModuleMap: test.context.moduleMap.toJSON(),
      });
    }
  }
  // ...
}
```

### 1.4 関数/メソッド定義

TypeScriptでは関数の引数と戻り値に型を指定します。

```typescript
// ファイル: packages/jest-cli/src/run.ts:20-42
export async function run(
  maybeArgv?: Array<string>,
  project?: string,
): Promise<void> {
  try {
    const argv = await buildArgv(maybeArgv);
    const projects = getProjectListFromCLIArgs(argv, project);
    const {results, globalConfig} = await runCLI(argv, projects);
    readResultsAndExit(results, globalConfig);
  } catch (error: any) {
    // エラーハンドリング
  }
}
```

**関数定義のパターン:**
- `async function`: 非同期関数
- `export`: モジュールとしてエクスポート
- `?`: オプショナルパラメータ

### 1.5 モジュール/インポート

ES6モジュール構文を使用しています。

```typescript
// ファイル: packages/jest-core/src/runJest.ts:8-38
import * as path from 'path';
import {performance} from 'perf_hooks';
import type {WriteStream} from 'tty';
import chalk from 'chalk';
import exit from 'exit-x';
import * as fs from 'graceful-fs';
import {CustomConsole} from '@jest/console';
import {
  type AggregatedResult,
  type Test,
  type TestContext,
  formatTestResults,
} from '@jest/test-result';
```

**インポートパターン:**
- `import * as name`: 名前空間としてインポート
- `import {named}`: 名前付きインポート
- `import type {T}`: 型のみインポート（実行時には存在しない）
- `@jest/*`: ワークスペース内パッケージ（packages/配下）

---

## 2. プロジェクト固有の概念

> このセクションでは、Jest特有の概念を解説します。

### 2.1 フレームワーク固有の概念

#### テストランナー（jest-circus）

```typescript
// ファイル: packages/jest-circus/src/index.ts:121-248
const test: Global.It = (() => {
  const test = (
    testName: Circus.TestNameLike,
    fn: Circus.TestFn,
    timeout?: number,
  ): void => _addTest(testName, undefined, false, fn, test, timeout);

  test.only = only;
  test.skip = skip;
  test.concurrent = concurrentTest;
  test.each = bindEach(test);

  return test;
})();
```

#### アサーションライブラリ（expect）

```typescript
// ファイル: packages/expect/src/index.ts:105-157
export const expect: Expect = (actual: any, ...rest: Array<any>) => {
  if (rest.length > 0) {
    throw new Error('Expect takes at most one argument.');
  }
  const allMatchers = getMatchers();
  const expectation: any = {
    not: {},
    rejects: {not: {}},
    resolves: {not: {}},
  };
  // マッチャーを動的に構築
  for (const name of Object.keys(allMatchers)) {
    const matcher = allMatchers[name];
    expectation[name] = makeThrowingMatcher(matcher, false, '', actual);
    expectation.not[name] = makeThrowingMatcher(matcher, true, '', actual);
    // ...
  }
  return expectation;
};
```

#### モック機能（jest-mock）

```typescript
// ファイル: packages/jest-mock/src/index.ts:123-127
export interface Mock<T extends FunctionLike = UnknownFunction>
  extends Function, MockInstance<T> {
  new (...args: Parameters<T>): ReturnType<T>;
  (...args: Parameters<T>): ReturnType<T>;
}
```

### 2.2 プロジェクト独自のパターン

#### 設定の分離（GlobalConfig / ProjectConfig）

```typescript
// ファイル: packages/jest-config/src/index.ts:123-259
const groupOptions = (
  options: Config.ProjectConfig & Config.GlobalConfig,
): {
  globalConfig: Config.GlobalConfig;
  projectConfig: Config.ProjectConfig;
} => ({
  globalConfig: Object.freeze({
    bail: options.bail,
    maxWorkers: options.maxWorkers,
    // グローバル設定...
  }),
  projectConfig: Object.freeze({
    testEnvironment: options.testEnvironment,
    testMatch: options.testMatch,
    // プロジェクト固有設定...
  }),
});
```

---

## 3. 命名規則

> このセクションでは、プロジェクト全体で使用される命名規則を解説します。

### 3.1 ファイル・ディレクトリ命名

| パターン | 意味 | 例 |
|---------|------|-----|
| `jest-*` | Jestのコアパッケージ | `jest-core`, `jest-cli`, `jest-runner` |
| `babel-*` | Babel関連パッケージ | `babel-jest`, `babel-plugin-jest-hoist` |
| `__tests__/` | テストディレクトリ | `packages/jest-mock/src/__tests__/` |
| `*.test.ts` | テストファイル | `index.test.ts` |
| `*.snap` | スナップショットファイル | `__snapshots__/*.snap` |

### 3.2 クラス・関数・変数命名

| プレフィックス/サフィックス | 意味 | 例 |
|---------------------------|------|-----|
| `create*` | ファクトリ関数 | `createTestScheduler`, `createContext` |
| `run*` | 実行関数 | `runJest`, `runCLI`, `runTest` |
| `get*` | 取得関数 | `getMatchers`, `getState`, `getTestPaths` |
| `make*` | 生成関数 | `makeThrowingMatcher`, `makeEmptyAggregatedTestResult` |
| `*Dispatcher` | イベント配信クラス | `ReporterDispatcher` |
| `*Scheduler` | スケジューラクラス | `TestScheduler` |
| `*Resolver` | 解決クラス | `SnapshotResolver`, `Resolver` |
| `*Context` | コンテキストオブジェクト | `TestContext`, `MatcherContext` |
| `_*` | プライベートメソッド/変数 | `_dispatcher`, `_globalConfig` |
| `#*` | プライベートフィールド（ES2022） | `#eventEmitter`, `#createInBandTestRun` |

### 3.3 プログラム分類一覧

| 分類 | パッケージ名 | 役割 |
|-----|------------|------|
| エントリーポイント | `jest`, `jest-cli` | CLI起動とコマンド解析 |
| コア処理 | `jest-core` | テスト実行の中核ロジック |
| テストランナー | `jest-runner`, `jest-circus`, `jest-jasmine2` | テストの実行 |
| アサーション | `expect`, `expect-utils` | テスト検証 |
| モック | `jest-mock` | モック・スパイ機能 |
| スナップショット | `jest-snapshot`, `jest-snapshot-utils` | スナップショットテスト |
| 設定 | `jest-config`, `jest-validate` | 設定読み込みと検証 |
| トランスフォーム | `jest-transform`, `babel-jest` | コード変換 |
| 環境 | `jest-environment-node`, `jest-environment-jsdom` | テスト環境 |
| レポーター | `jest-reporters` | テスト結果出力 |
| ユーティリティ | `jest-util`, `jest-message-util` | 共通機能 |

---

## 4. ディレクトリ構造

> このセクションでは、プロジェクトのディレクトリ構造を解説します。

```
jest-main/
├── packages/           # 55以上のパッケージ（モノレポ）
│   ├── jest/           # メインエントリーポイント
│   ├── jest-cli/       # CLIインターフェース
│   ├── jest-core/      # コアロジック
│   ├── jest-runner/    # テストランナー
│   ├── jest-circus/    # デフォルトテストフレームワーク
│   ├── expect/         # アサーションライブラリ
│   ├── jest-mock/      # モッキングライブラリ
│   ├── jest-config/    # 設定処理
│   ├── jest-transform/ # コード変換
│   └── ...
├── e2e/                # E2Eテスト（190以上のテストスイート）
├── examples/           # 使用例
├── scripts/            # ビルド・メンテナンススクリプト
├── website/            # ドキュメントサイト
├── docs/               # マークダウンドキュメント
└── .github/            # GitHub Actions設定
```

### 各ディレクトリの役割

| ディレクトリ | 役割 | 主要ファイル |
|-------------|------|-------------|
| `packages/jest-cli/` | CLIコマンド解析と実行 | `bin/jest.js`, `src/run.ts`, `src/args.ts` |
| `packages/jest-core/` | テスト実行の中核 | `src/runJest.ts`, `src/TestScheduler.ts` |
| `packages/jest-runner/` | テストファイルの実行 | `src/index.ts`, `src/testWorker.ts` |
| `packages/jest-circus/` | テストフレームワーク | `src/index.ts`, `src/run.ts`, `src/state.ts` |
| `packages/expect/` | アサーション | `src/index.ts`, `src/matchers.ts` |
| `packages/jest-mock/` | モック機能 | `src/index.ts` |
| `packages/jest-config/` | 設定読み込み | `src/index.ts`, `src/normalize.ts` |
| `e2e/` | 統合テスト | `__tests__/*.test.ts`, 各フィクスチャディレクトリ |

---

## 5. アーキテクチャ

> このセクションでは、プロジェクトのアーキテクチャパターンを解説します。

### 5.1 全体アーキテクチャ

Jestは**パイプラインアーキテクチャ**を採用しており、テスト実行は以下のフローで処理されます。

```
┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   jest-cli  │───>│  jest-core  │───>│ jest-runner │
│  (CLI解析)  │    │ (オーケスト │    │ (テスト実行)│
└─────────────┘    │  レーション) │    └─────────────┘
                   └─────────────┘           │
                          │                  ▼
                          │         ┌─────────────┐
                          │         │jest-circus  │
                          │         │(テストFW)   │
                          │         └─────────────┘
                          │                  │
                          ▼                  ▼
                   ┌─────────────┐    ┌─────────────┐
                   │jest-reporters│   │   expect    │
                   │ (結果出力)   │<───│ (アサート)  │
                   └─────────────┘    └─────────────┘
```

### 5.2 レイヤー構成

| レイヤー | 責務 | 代表的なファイル |
|---------|------|-----------------|
| CLI Layer | コマンドライン解析、引数処理 | `packages/jest-cli/src/run.ts` |
| Orchestration Layer | テスト発見、スケジューリング | `packages/jest-core/src/runJest.ts` |
| Runner Layer | テストファイルの並列/直列実行 | `packages/jest-runner/src/index.ts` |
| Framework Layer | describe/test/expect API | `packages/jest-circus/src/index.ts` |
| Environment Layer | テスト環境の分離 | `packages/jest-environment-node/src/index.ts` |
| Transform Layer | コード変換（Babel等） | `packages/jest-transform/src/ScriptTransformer.ts` |
| Reporter Layer | 結果のフォーマットと出力 | `packages/jest-reporters/` |

### 5.3 データフロー

```
1. CLI引数解析 (jest-cli)
       │
       ▼
2. 設定読み込み (jest-config)
       │
       ▼
3. テストファイル発見 (jest-core/SearchSource)
       │
       ▼
4. テストスケジューリング (jest-core/TestScheduler)
       │
       ▼
5. ワーカープロセス起動 (jest-worker)
       │
       ▼
6. テスト実行 (jest-runner → jest-circus)
       │
       ▼
7. 結果集約・レポート (jest-reporters)
```

---

## 6. 主要コンポーネント

> このセクションでは、主要なコンポーネントとその連携を解説します。

### 6.1 エントリーポイント

```javascript
// ファイル: packages/jest-cli/bin/jest.js:9-17
const importLocal = require('import-local');

if (!importLocal(__filename)) {
  if (process.env.NODE_ENV == null) {
    process.env.NODE_ENV = 'test';
  }
  require('..').run();
}
```

CLIの実行は`run()`関数から始まります：

```typescript
// ファイル: packages/jest-cli/src/run.ts:20-42
export async function run(
  maybeArgv?: Array<string>,
  project?: string,
): Promise<void> {
  const argv = await buildArgv(maybeArgv);
  const projects = getProjectListFromCLIArgs(argv, project);
  const {results, globalConfig} = await runCLI(argv, projects);
  readResultsAndExit(results, globalConfig);
}
```

### 6.2 ビジネスロジック

#### runCLI - テスト実行のエントリー

```typescript
// ファイル: packages/jest-core/src/cli/index.ts:38-141
export async function runCLI(
  argv: Config.Argv,
  projects: Array<string>,
): Promise<{
  results: AggregatedResult;
  globalConfig: Config.GlobalConfig;
}> {
  const {globalConfig, configs, hasDeprecationWarnings} = await readConfigs(
    argv,
    projects,
  );
  // 設定に基づいてテスト実行
  await _run10000(globalConfig, configs, /* ... */);
  return {globalConfig, results};
}
```

#### runJest - テスト実行の中核

```typescript
// ファイル: packages/jest-core/src/runJest.ts:137-336
export default async function runJest({
  contexts,
  globalConfig,
  outputStream,
  testWatcher,
  // ...
}): Promise<void> {
  // テストパス取得
  const testRunData = await Promise.all(
    contexts.map(async (context) => {
      const searchSource = new SearchSource(context);
      const matches = await getTestPaths(/* ... */);
      return {context, matches};
    }),
  );

  // テストスケジューラ作成
  const scheduler = await createTestScheduler(globalConfig, {/* ... */});

  // テスト実行
  const results = await scheduler.scheduleTests(allTests, testWatcher);
}
```

### 6.3 データアクセス

#### 設定の読み込み

```typescript
// ファイル: packages/jest-config/src/index.ts:80-121
export async function readConfig(
  argv: Config.Argv,
  packageRootOrConfig: string | Config.InitialOptions,
): Promise<ReadConfig> {
  const {config: initialOptions, configPath} = await readInitialOptions(
    argv.config,
    { packageRootOrConfig }
  );
  const {options, hasDeprecationWarnings} = await normalize(
    initialOptions,
    argv,
    configPath,
  );
  const {globalConfig, projectConfig} = groupOptions(options);
  return { configPath, globalConfig, hasDeprecationWarnings, projectConfig };
}
```

### 6.4 ユーティリティ/共通機能

```typescript
// ファイル: packages/jest-util/src/index.ts:1-39
export {default as clearLine} from './clearLine';
export {default as createDirectory} from './createDirectory';
export {default as ErrorWithStack} from './ErrorWithStack';
export {default as installCommonGlobals} from './installCommonGlobals';
export {default as isPromise} from './isPromise';
export {default as deepCyclicCopy} from './deepCyclicCopy';
export {default as requireOrImportModule} from './requireOrImportModule';
```

**主要ユーティリティ:**
- `graceful-fs`: ファイル操作（`fs`の代わりに使用必須）
- `chalk`: ターミナル出力の色付け
- `deepCyclicCopy`: 循環参照を含むオブジェクトのコピー

---

## 7. よく使われるパターン

> このセクションでは、コード内で頻出するパターンを解説します。

### パターン一覧

| パターン | 説明 | 出現頻度 | 代表的なファイル |
|---------|------|---------|-----------------|
| イベントエミッター | 非同期イベント通知 | 高 | `jest-runner/src/index.ts` |
| ファクトリ関数 | オブジェクト生成の抽象化 | 高 | `jest-core/src/TestScheduler.ts` |
| ディスパッチャー | 状態管理とイベント配信 | 中 | `jest-circus/src/state.ts` |
| Promiseチェーン | 非同期処理の連鎖 | 高 | 全般 |
| 型ガード | 型の絞り込み | 中 | `jest-validate/` |

### 各パターンの詳細

#### パターン1: イベントエミッター

**目的:** テスト実行中のイベントを非同期に通知する

```typescript
// ファイル: packages/jest-runner/src/index.ts:50-61
export default class TestRunner extends EmittingTestRunner {
  readonly #eventEmitter = new Emittery<TestEvents>();

  async runTests(
    tests: Array<Test>,
    watcher: TestWatcher,
    options: TestRunnerOptions,
  ): Promise<void> {
    return options.serial
      ? this.#createInBandTestRun(tests, watcher)
      : this.#createParallelTestRun(tests, watcher);
  }
}
```

**解説:** `Emittery`ライブラリを使用し、テストの開始/成功/失敗イベントを発火。レポーターがこれらのイベントをサブスクライブして結果を表示。

#### パターン2: ファクトリ関数

**目的:** 複雑な初期化ロジックをカプセル化

```typescript
// ファイル: packages/jest-core/src/TestScheduler.ts:60-69
export async function createTestScheduler(
  globalConfig: Config.GlobalConfig,
  context: TestSchedulerContext,
): Promise<TestScheduler> {
  const scheduler = new TestScheduler(globalConfig, context);
  await scheduler._setupReporters();
  return scheduler;
}
```

**解説:** `createTestScheduler`はTestSchedulerの作成とセットアップを行い、完全に初期化されたインスタンスを返す。

#### パターン3: ディスパッチャーパターン

**目的:** 状態変更を一元管理し、副作用を分離

```typescript
// ファイル: packages/jest-circus/src/index.ts:70-91
const _dispatchDescribe = (
  blockFn: Circus.BlockFn,
  blockName: Circus.BlockNameLike,
  describeFn: DescribeFn,
  mode?: Circus.BlockMode,
) => {
  dispatchSync({
    asyncError,
    blockName,
    mode,
    name: 'start_describe_definition',
  });
  const describeReturn = blockFn();
  dispatchSync({blockName, mode, name: 'finish_describe_definition'});
};
```

**解説:** テストブロックの開始と終了を`dispatchSync`でステートマシンに通知。

---

## 8. 業務フロー追跡の実践例

> このセクションでは、実際の業務フローをコードで追跡する方法を解説します。

### 8.1 フロー追跡の基本手順

1. エントリーポイントを特定
2. 処理の流れを追跡（呼び出し関係を追う）
3. データの変換を確認
4. 最終的な出力を確認

### 8.2 フロー追跡の実例

#### 例1: jestコマンド実行からテスト結果出力まで

**概要:** `jest`コマンドを実行してから、テスト結果が表示されるまでの流れ

**処理フロー:**
```
jest.js → run() → runCLI() → runJest() → TestScheduler → TestRunner → expect
```

**詳細な追跡:**

1. **CLIエントリーポイント** (`packages/jest-cli/bin/jest.js:16`)
   ```javascript
   require('..').run();
   ```

2. **引数解析とCLI実行** (`packages/jest-cli/src/run.ts:20-29`)
   ```typescript
   export async function run(maybeArgv?: Array<string>): Promise<void> {
     const argv = await buildArgv(maybeArgv);
     const projects = getProjectListFromCLIArgs(argv, project);
     const {results, globalConfig} = await runCLI(argv, projects);
   }
   ```

3. **設定読み込み** (`packages/jest-core/src/cli/index.ts:53-56`)
   ```typescript
   const {globalConfig, configs, hasDeprecationWarnings} = await readConfigs(
     argv,
     projects,
   );
   ```

4. **テスト実行** (`packages/jest-core/src/runJest.ts:305-314`)
   ```typescript
   const scheduler = await createTestScheduler(globalConfig, {/* ... */});
   const results = await scheduler.scheduleTests(allTests, testWatcher);
   ```

5. **個別テスト実行** (`packages/jest-runner/src/index.ts:77-84`)
   ```typescript
   return runTest(
     test.path,
     this._globalConfig,
     test.context.config,
     test.context.resolver,
     this._context,
   );
   ```

### 8.3 フロー追跡チェックリスト

- [ ] エントリーポイント（`packages/jest-cli/bin/jest.js`）を特定したか
- [ ] 呼び出し関係（`run` → `runCLI` → `runJest`）を把握したか
- [ ] データの変換ポイント（設定正規化、テスト結果集約）を確認したか
- [ ] エラーハンドリング（try-catch、exit codes）を確認したか
- [ ] 最終的な出力（レポーター、終了コード）を確認したか

---

## 9. 設計書の参照順序

> このセクションでは、プロジェクト理解のための設計書参照順序を案内します。

### 9.1 目的別ロードマップ

#### 全体像を把握したい場合
1. `README.md` - プロジェクト概要
2. `CONTRIBUTING.md` - 開発ガイドライン
3. `.github/copilot-instructions.md` - 詳細な技術情報

#### 特定機能を理解したい場合
1. `packages/{機能名}/README.md` - パッケージ概要
2. `packages/{機能名}/src/index.ts` - エクスポートAPI
3. `packages/{機能名}/src/__tests__/` - テストコード

#### 改修作業を行う場合
1. 対象パッケージの`package.json` - 依存関係確認
2. `tsconfig.json` - TypeScript設定
3. `e2e/` - 統合テストでの使用例

### 9.2 ドキュメント一覧

| ドキュメント | 概要 | 参照タイミング |
|-------------|------|---------------|
| `README.md` | プロジェクト概要とクイックスタート | 初回参照 |
| `CONTRIBUTING.md` | コントリビューションガイド | 開発開始前 |
| `CHANGELOG.md` | 変更履歴 | 機能変更確認時 |
| `.github/copilot-instructions.md` | 技術詳細ガイド | 詳細な技術情報が必要な時 |
| `website/docs/` | 公式ドキュメント | API仕様確認時 |

---

## 10. トラブルシューティング

> このセクションでは、コードリーディング時によくある問題と解決法を解説します。

### よくある疑問と回答

#### Q: `graceful-fs`と`fs`の違いは？
A: `graceful-fs`はファイル操作のエラーハンドリングを強化したライブラリです。ESLintで`fs`の直接使用は禁止されています。

```typescript
// 正しい: graceful-fsを使用
import * as fs from 'graceful-fs';

// 誤り: fsを直接使用（ESLintエラー）
import * as fs from 'fs';
```

#### Q: `@jest/*`パッケージはどこにある？
A: `packages/`配下にあります。例：`@jest/core` → `packages/jest-core`

#### Q: プライベートメソッドの`#`と`_`の違いは？
A: `#`はES2022のプライベートフィールド構文（真のプライベート）、`_`は慣例的なプライベート表記（アクセス可能）です。

### デバッグのヒント

1. **ログ出力の確認**
   - `--debug`フラグでデバッグ情報出力
   - `console`の代わりに`CustomConsole`を使用

2. **テストの絞り込み実行**
   ```bash
   yarn jest packages/jest-mock/src/__tests__/index.test.ts
   ```

3. **ビルドエラーの解消**
   ```bash
   yarn build-clean && yarn build:js
   ```

---

## 付録

### A. 用語集

| 用語 | 説明 |
|-----|------|
| TestRunner | テストファイルを実行するコンポーネント |
| TestScheduler | テストの実行順序を管理するコンポーネント |
| TestContext | テスト実行に必要な環境情報 |
| Matcher | `expect`で使用するアサーション関数 |
| Transformer | ソースコードを変換するコンポーネント（Babel等） |
| HasteMap | ファイルシステムのキャッシュ機構 |
| Circus | Jestのデフォルトテストランナー |
| Jasmine2 | レガシーテストランナー |

### B. ファイル一覧

| ファイル/ディレクトリ | 説明 | 主な内容 |
|---------------------|------|---------|
| `packages/jest-cli/bin/jest.js` | CLIエントリーポイント | プロセス起動 |
| `packages/jest-cli/src/run.ts` | CLI実行関数 | 引数解析、runCLI呼び出し |
| `packages/jest-core/src/runJest.ts` | テスト実行中核 | テスト発見、スケジューリング |
| `packages/jest-core/src/TestScheduler.ts` | テストスケジューラ | レポーター管理、結果集約 |
| `packages/jest-runner/src/index.ts` | テストランナー | ワーカー管理、テスト実行 |
| `packages/jest-circus/src/index.ts` | テストフレームワーク | describe/test/expect定義 |
| `packages/expect/src/index.ts` | アサーションライブラリ | マッチャー実装 |
| `packages/jest-mock/src/index.ts` | モッキング | fn/spyOn実装 |
| `packages/jest-config/src/index.ts` | 設定処理 | 設定読み込み、正規化 |

### C. 参考資料

- [Jest公式ドキュメント](https://jestjs.io)
- [TypeScript公式ドキュメント](https://www.typescriptlang.org/docs/)
- [Lerna-lite](https://github.com/lerna-lite/lerna-lite) - モノレポ管理
- [Emittery](https://github.com/sindresorhus/emittery) - イベントエミッター
