---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 160
  claims_with_evidence: 155
  claims_without_evidence: 5
confidence_derived: 0.97
---

# 根拠レポート：lib-template 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：155 / 160、根拠なし：5
- 優先レビュー（高）
  1. **C-080, C-081**：deprecated関数はモジュールスコープ内のプライベート関数であり、外部テストからのアクセス方法が不明確
  2. **C-092**：MainTemplate.hooks.renderManifest.tapの非推奨フック互換性テストは、compilation mockの複雑さにより実行可能性に根拠不足
  3. **C-093, C-094**：renderCurrentHashCodeは非推奨メソッドであり、テスト対象としての優先度とテスト実行の実現可能性に要確認
  4. **C-079**：data URIのMIMEタイプ処理はmime-typesパッケージに依存しており、期待結果の正確性に要確認

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `lib/Template.js` - Template クラス定義（静的メソッド群）
- E-02: `lib/Template.js` 行30-43 - 正規表現定数定義
- E-03: `lib/Template.js` 行91-421 - Template クラス実装
- E-04: `lib/Template.js` 行96-102 - getFunctionContent メソッド
- E-05: `lib/Template.js` 行108-113 - toIdentifier メソッド
- E-06: `lib/Template.js` 行119-122 - toComment メソッド
- E-07: `lib/Template.js` 行128-131 - toNormalComment メソッド
- E-08: `lib/Template.js` 行137-142 - toPath メソッド
- E-09: `lib/Template.js` 行149-173 - numberToIdentifier メソッド
- E-10: `lib/Template.js` 行179-211 - numberToIdentifierContinuation メソッド
- E-11: `lib/Template.js` 行217-225 - indent メソッド
- E-12: `lib/Template.js` 行232-237 - prefix メソッド
- E-13: `lib/Template.js` 行243-248 - asString メソッド
- E-14: `lib/Template.js` 行260-282 - getModulesArrayBounds メソッド
- E-15: `lib/Template.js` 行291-355 - renderChunkModules メソッド
- E-16: `lib/Template.js` 行362-404 - renderRuntimeModules メソッド
- E-17: `lib/Template.js` 行411-420 - renderChunkRuntimeModules メソッド
- E-18: `lib/TemplatedPathPlugin.js` 行24-36 - prepareId 関数
- E-19: `lib/TemplatedPathPlugin.js` 行52-80 - hashLength 関数
- E-20: `lib/TemplatedPathPlugin.js` 行89-109 - replacer 関数
- E-21: `lib/TemplatedPathPlugin.js` 行121-133 - deprecated 関数
- E-22: `lib/TemplatedPathPlugin.js` 行144-383 - replacePathVariables 関数
- E-23: `lib/TemplatedPathPlugin.js` 行387-398 - TemplatedPathPlugin クラス
- E-24: `lib/MainTemplate.js` 行44-347 - MainTemplate クラス
- E-25: `lib/MainTemplate.js` 行49-294 - constructor メソッド
- E-26: `lib/MainTemplate.js` 行296-313 - renderCurrentHashCode メソッド
- E-27: `lib/MainTemplate.js` 行349-369 - requireFn, outputOptions プロパティ
- E-28: `lib/InitFragment.js` 行56-192 - InitFragment クラス
- E-29: `lib/InitFragment.js` 行64-70 - constructor メソッド
- E-30: `lib/InitFragment.js` 行76-78 - getContent メソッド
- E-31: `lib/InitFragment.js` 行84-86 - getEndContent メソッド
- E-32: `lib/InitFragment.js` 行95-165 - addToSource 静的メソッド
- E-33: `lib/InitFragment.js` 行170-178 - serialize メソッド
- E-34: `lib/InitFragment.js` 行183-191 - deserialize メソッド
- E-35: `lib/InitFragment.js` 行196-203 - STAGE 定数定義
- E-36: `lib/ConditionalInitFragment.js` 行41-118 - ConditionalInitFragment クラス
- E-37: `lib/ConditionalInitFragment.js` 行50-60 - constructor メソッド
- E-38: `lib/ConditionalInitFragment.js` 行66-77 - getContent メソッド
- E-39: `lib/ConditionalInitFragment.js` 行83-94 - getEndContent メソッド
- E-40: `lib/ConditionalInitFragment.js` 行100-117 - merge メソッド
- E-41: `lib/ConditionalInitFragment.js` 行22-36 - wrapInCondition 関数
- E-42: `lib/ConcatenationScope.js` 行31-176 - ConcatenationScope クラス
- E-43: `lib/ConcatenationScope.js` 行37-49 - constructor メソッド
- E-44: `lib/ConcatenationScope.js` 行55-57 - isModuleInScope メソッド
- E-45: `lib/ConcatenationScope.js` 行63-70 - registerExport メソッド
- E-46: `lib/ConcatenationScope.js` 行76-83 - registerRawExport メソッド
- E-47: `lib/ConcatenationScope.js` 行89-94 - getRawExport メソッド
- E-48: `lib/ConcatenationScope.js` 行100-107 - setRawExportMap メソッド
- E-49: `lib/ConcatenationScope.js` 行112-114 - registerNamespaceExport メソッド
- E-50: `lib/ConcatenationScope.js` 行121-145 - createModuleReference メソッド
- E-51: `lib/ConcatenationScope.js` 行151-153 - isModuleReference 静的メソッド
- E-52: `lib/ConcatenationScope.js` 行159-175 - matchModuleReference 静的メソッド
- E-53: `lib/ConcatenationScope.js` 行178-179 - DEFAULT_EXPORT, NAMESPACE_OBJECT_EXPORT 定数
- E-54: `lib/ConcatenationScope.js` 行19-20 - MODULE_REFERENCE_REGEXP 正規表現

## 3) Claims と根拠の対応（レビューの主戦場）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | getFunctionContentが関数テンプレートからコンテンツを抽出する | E-04 | ○ |
| C-002 | 複数行の関数テンプレートが正しく処理される | E-04, E-02 | ○ |
| C-003 | toIdentifierが有効な文字列を識別子に変換する | E-05, E-02 | ○ |
| C-004 | 先頭が数字の場合にアンダースコアが付加される | E-05 (IDENTIFIER_NAME_REPLACE_REGEX) | ○ |
| C-005 | 文字列以外が渡された場合に空文字が返却される | E-05 (typeof str !== "string" チェック) | ○ |
| C-006 | 空文字列が渡された場合にそのまま返却される | E-05 | ○ |
| C-007 | toCommentが文字列をバンドルコメントに変換する | E-06 | ○ |
| C-008 | コメント終了記号がエスケープされる | E-06 (COMMENT_END_REGEX) | ○ |
| C-009 | falsy値で空文字が返却される（toComment） | E-06 (!str チェック) | ○ |
| C-010 | nullで空文字が返却される（toComment） | E-06 (!str チェック) | ○ |
| C-011 | toNormalCommentが文字列を通常コメントに変換する | E-07 | ○ |
| C-012 | toNormalCommentでコメント終了記号がエスケープされる | E-07 (COMMENT_END_REGEX) | ○ |
| C-013 | falsy値で空文字が返却される（toNormalComment） | E-07 (!str チェック) | ○ |
| C-014 | toPathがパスを正規化する | E-08, E-02 | ○ |
| C-015 | 先頭・末尾のハイフンが除去される | E-08 (MATCH_PADDED_HYPHENS_REPLACE_REGEX) | ○ |
| C-016 | 文字列以外で空文字が返却される（toPath） | E-08 (typeof str !== "string" チェック) | ○ |
| C-017 | 空文字列でそのまま返却される（toPath） | E-08 | ○ |
| C-018 | numberToIdentifierで0がaに変換される | E-09 (START_LOWERCASE_ALPHABET_CODE + 0) | ○ |
| C-019 | 25がzに変換される | E-09 (DELTA_A_TO_Z - 1 = 25) | ○ |
| C-020 | 26がAに変換される | E-09 (START_UPPERCASE_ALPHABET_CODE + 0) | ○ |
| C-021 | 51がZに変換される | E-09 | ○ |
| C-022 | 52がアンダースコアに変換される | E-09 (n === DELTA_A_TO_Z) | ○ |
| C-023 | 53がドル記号に変換される | E-09 (最後のreturn "$") | ○ |
| C-024 | 54以上で複数文字の識別子が生成される | E-09 (n >= NUMBER_OF_IDENTIFIER_START_CHARS の再帰) | ○ |
| C-025 | numberToIdentifierContinuationで0がaに変換される | E-10 | ○ |
| C-026 | 数字(52-61)が0-9に変換される | E-10 (n < 10 のブロック) | ○ |
| C-027 | 64以上で複数文字の継続識別子が生成される | E-10 (n >= NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS の再帰) | ○ |
| C-028 | indentで文字列にタブインデントが追加される | E-11 | ○ |
| C-029 | 複数行文字列の各行にインデントが追加される | E-11 (正規表現置換) | ○ |
| C-030 | 配列が渡された場合に各要素がインデントされ結合される | E-11 (Array.isArray チェック) | ○ |
| C-031 | 改行で始まる文字列にはインデントが付加されない | E-11 (str[0] === "\n" チェック) | ○ |
| C-032 | 空文字列で空文字が返却される（indent） | E-11 (!str チェック) | ○ |
| C-033 | prefixでカスタムプレフィックスが追加される | E-12 | ○ |
| C-034 | 複数行文字列の各行にプレフィックスが追加される | E-12 | ○ |
| C-035 | 空文字列で空文字が返却される（prefix） | E-12 (!str チェック) | ○ |
| C-036 | asStringで配列が改行区切りの文字列に変換される | E-13 (Array.isArray チェック, join("\n")) | ○ |
| C-037 | asStringで文字列がそのまま返却される | E-13 (return str) | ○ |
| C-038 | 空配列で空文字が返却される | E-13 ([].join("\n") = "") | ○ |
| C-039 | getModulesArrayBoundsで数値IDの最適な配列形式境界が返却される | E-14 | ○ |
| C-040 | スパースなIDでfalseが返却される | E-14 (arrayOverhead >= objectOverhead) | ○ |
| C-041 | 文字列IDでfalseが返却される | E-14 (typeof moduleId !== "number") | ○ |
| C-042 | モジュール1件の場合の境界 | E-14 | ○ |
| C-043 | renderChunkModulesで配列形式レンダリング | E-15 (bounds !== false のブロック) | ○ |
| C-044 | renderChunkModulesでオブジェクト形式レンダリング | E-15 (else ブロック) | ○ |
| C-045 | 空モジュール配列でnullが返却される | E-15 (modules.length === 0) | ○ |
| C-046 | renderModuleがnullを返す場合に'false'が使用される | E-15 (renderModule(module, renderInObject) \|\| "false") | ○ |
| C-047 | renderRuntimeModulesでコメント付きレンダリング | E-16 | ○ |
| C-048 | shouldIsolate=trueでアロー関数で囲まれる | E-16 (supportsArrowFunction() のブロック) | ○ |
| C-049 | shouldIsolate=trueでIIFEで囲まれる | E-16 (else ブロック) | ○ |
| C-050 | 空のランタイムモジュール配列で空のSourceが返却される | E-16 | ○ |
| C-051 | renderChunkRuntimeModulesでプレフィックス付きレンダリング | E-17 | ○ |
| C-052 | prepareIdで文字列IDが安全な形式に正規化される | E-18 | ○ |
| C-053 | 数値IDがそのまま返却される | E-18 (typeof id !== "string" チェック) | ○ |
| C-054 | 動的IDが正規表現置換付きで返却される | E-18 (テスト正規表現マッチ) | ○ |
| C-055 | replacerで値がReplacer関数に変換される | E-20 | ○ |
| C-056 | 関数値がReplacer呼び出し時に評価される | E-20 (typeof value === "function") | ○ |
| C-057 | null値でallowEmpty=falseでエラーがスローされる | E-20 (throw new Error) | ○ |
| C-058 | null値でallowEmpty=trueで空文字が返却される | E-20 (return "") | ○ |
| C-059 | hashLengthでハッシュ長が指定された場合にスライスされる | E-19 (hash.slice(0, length)) | ○ |
| C-060 | handlerが存在する場合にhandlerの結果が使用される | E-19 (result = handler(length)) | ○ |
| C-061 | assetInfoにimmutableフラグとハッシュ情報が設定される | E-19 (assetInfo.immutable = true) | ○ |
| C-062 | 同じhashNameに複数のハッシュが設定された場合に配列になる | E-19 (Array.isArray チェック) | ○ |
| C-063 | [name]プレースホルダーが正しく置換される | E-22 (replacements.set("name", ...)) | ○ |
| C-064 | [ext]プレースホルダーが正しく置換される | E-22 (replacements.set("ext", ...)) | ○ |
| C-065 | [path]プレースホルダーが正しく置換される | E-22 (replacements.set("path", ...)) | ○ |
| C-066 | [query]プレースホルダーが正しく置換される | E-22 (replacements.set("query", ...)) | ○ |
| C-067 | [fragment]プレースホルダーが正しく置換される | E-22 (replacements.set("fragment", ...)) | ○ |
| C-068 | [fullhash]プレースホルダーが正しく置換される | E-22 (replacements.set("fullhash", ...)) | ○ |
| C-069 | [fullhash:8]のようにハッシュ長指定が機能する | E-22, E-19 | ○ |
| C-070 | [id]プレースホルダーがチャンクIDで置換される | E-22 (data.chunk ブロック, replacements.set("id", ...)) | ○ |
| C-071 | [chunkhash]プレースホルダーが正しく置換される | E-22 (replacements.set("chunkhash", ...)) | ○ |
| C-072 | [contenthash]プレースホルダーが正しく置換される | E-22 (replacements.set("contenthash", ...)) | ○ |
| C-073 | data.moduleが設定されている場合にモジュールIDで置換される | E-22 (data.module ブロック) | ○ |
| C-074 | [url]プレースホルダーが正しく置換される | E-22 (data.url ブロック) | ○ |
| C-075 | [runtime]プレースホルダーが文字列runtimeで置換される | E-22 (typeof data.runtime === "string") | ○ |
| C-076 | runtimeが文字列でない場合にアンダースコアで置換される | E-22 (else ブロック, replacer("_")) | ○ |
| C-077 | pathが関数の場合に関数が呼び出される | E-22 (typeof path === "function") | ○ |
| C-078 | エスケープされたプレースホルダーがリテラルとして残る | E-22 (match.startsWith("[\\") チェック) | ○ |
| C-079 | data URIファイル名が正しく処理される | E-22 (data.filename.match(/^data:/) ブロック) | △ |
| C-080 | deprecated関数が元の関数を呼び出す | E-21 | △ |
| C-081 | 同じメッセージの非推奨関数がキャッシュされる | E-21 (deprecationCache) | △ |
| C-082 | TemplatedPathPlugin.applyでフックにtapされる | E-23 | ○ |
| C-083 | MainTemplate constructorでoutputOptionsが保存される | E-25 (this._outputOptions = outputOptions) | ○ |
| C-084 | outputOptionsがundefinedで空オブジェクトが使用される | E-25 (outputOptions \|\| {}) | ○ |
| C-085 | hooksオブジェクトがfreezeされる | E-25 (Object.freeze) | ○ |
| C-086 | hooks.modules.tapでErrorがスローされる | E-25 (throw new Error) | ○ |
| C-087 | hooks.moduleObj.tapでErrorがスローされる | E-25 (throw new Error) | ○ |
| C-088 | hooks.beforeStartup.tapでErrorがスローされる | E-25 (throw new Error) | ○ |
| C-089 | hooks.startup.tapでErrorがスローされる | E-25 (throw new Error) | ○ |
| C-090 | hooks.afterStartup.tapでErrorがスローされる | E-25 (throw new Error) | ○ |
| C-091 | hooks.hotBootstrap.tapでErrorがスローされる | E-25 (throw new Error) | ○ |
| C-092 | hooks.renderManifest.tapで非推奨警告付きtap | E-25 | △ |
| C-093 | renderCurrentHashCodeでハッシュコードが生成される | E-26 | ○ |
| C-094 | renderCurrentHashCodeでlength指定時にスライスされる | E-26 (if (length) ブロック) | ○ |
| C-095 | requireFnでRuntimeGlobals.requireが返却される | E-27 | ○ |
| C-096 | outputOptionsで_outputOptionsが返却される | E-27 | ○ |
| C-097 | InitFragment constructorでプロパティが設定される | E-29 | ○ |
| C-098 | endContentが省略された場合にundefinedになる | E-29 | ○ |
| C-099 | getContentでcontentが返却される | E-30 | ○ |
| C-100 | getEndContentでendContentが返却される | E-31 | ○ |
| C-101 | addToSourceでフラグメントがソースに追加される | E-32 | ○ |
| C-102 | 空フラグメント配列でソースがそのまま返却される | E-32 (return source) | ○ |
| C-103 | 同じキーのフラグメントが重複排除される | E-32 (keyedFragments.get) | ○ |
| C-104 | mergeメソッドを持つフラグメントがマージされる | E-32 (typeof fragment.merge === "function") | ○ |
| C-105 | mergeAllメソッドを持つフラグメントが一括マージされる | E-32 (typeof fragment.mergeAll === "function") | ○ |
| C-106 | mergeAllを持つがkeyがないフラグメントでエラー | E-32 (throw new Error) | ○ |
| C-107 | フラグメントがstageとpositionでソートされる | E-32, sortFragmentWithIndex関数 | ○ |
| C-108 | endContentが逆順で追加される | E-32 (endContents.reverse()) | ○ |
| C-109 | serializeで全プロパティがシリアライズされる | E-33 | ○ |
| C-110 | deserializeで全プロパティがデシリアライズされる | E-34 | ○ |
| C-111 | STAGE_CONSTANTSが10である | E-35 | ○ |
| C-112 | 全ステージ定数が昇順で定義されている | E-35 | ○ |
| C-113 | ConditionalInitFragment constructorでruntimeConditionが設定される | E-37 | ○ |
| C-114 | runtimeConditionのデフォルト値がtrue | E-37 (runtimeCondition = true) | ○ |
| C-115 | runtimeCondition=trueでcontentがそのまま返却される | E-38 (this.runtimeCondition === true) | ○ |
| C-116 | runtimeCondition=falseで空文字が返却される | E-38 (this.runtimeCondition === false) | ○ |
| C-117 | runtimeConditionがRuntimeSpecで条件付きコードが返却される | E-38 (wrapInCondition) | ○ |
| C-118 | runtimeConditionExpressionが'true'でcontentがそのまま返却される | E-38 (expr === "true") | ○ |
| C-119 | contentがfalsyで空文字が返却される | E-38 (\|\| !this.content) | ○ |
| C-120 | runtimeCondition=trueでendContentがそのまま返却される | E-39 | ○ |
| C-121 | runtimeCondition=falseで空文字が返却される（getEndContent） | E-39 | ○ |
| C-122 | runtimeConditionがRuntimeSpecで条件付きendContentが返却される | E-39 | ○ |
| C-123 | endContentがfalsyで空文字が返却される | E-39 (\|\| !this.endContent) | ○ |
| C-124 | mergeでthis.runtimeCondition=trueの場合にthisが返却される | E-40 | ○ |
| C-125 | mergeでother.runtimeCondition=trueの場合にotherが返却される | E-40 | ○ |
| C-126 | mergeでthis.runtimeCondition=falseの場合にotherが返却される | E-40 | ○ |
| C-127 | mergeでother.runtimeCondition=falseの場合にthisが返却される | E-40 | ○ |
| C-128 | mergeで両方がRuntimeSpecの場合にmergeRuntimeで結合される | E-40 (mergeRuntime) | ○ |
| C-129 | wrapInConditionで文字列ソースが条件式でラップされる | E-41 (typeof source === "string") | ○ |
| C-130 | wrapInConditionでSourceオブジェクトが条件式でラップされる | E-41 (else ブロック) | ○ |
| C-131 | ConcatenationScope constructorで配列がMapに変換される | E-43 (Array.isArray) | ○ |
| C-132 | MapのmodulesMapがそのまま使用される | E-43 | ○ |
| C-133 | isModuleInScopeでスコープ内モジュールにtrueが返却される | E-44 | ○ |
| C-134 | isModuleInScopeでスコープ外モジュールにfalseが返却される | E-44 | ○ |
| C-135 | registerExportでエクスポートが正しく登録される | E-45 | ○ |
| C-136 | registerExportで同じ名前の二重登録が無視される | E-45 (!has チェック) | ○ |
| C-137 | exportMapが初期化されていない場合に新規作成される | E-45 (!this._currentModule.exportMap) | ○ |
| C-138 | registerRawExportで生エクスポートが登録される | E-46 | ○ |
| C-139 | registerRawExportで同じ名前の二重登録が無視される | E-46 (!has チェック) | ○ |
| C-140 | getRawExportで登録済みの生エクスポートが取得できる | E-47 | ○ |
| C-141 | getRawExportで未登録名でundefinedが返却される | E-47 | ○ |
| C-142 | getRawExportでrawExportMap未初期化でundefinedが返却される | E-47 (!this._currentModule.rawExportMap) | ○ |
| C-143 | setRawExportMapで既存エクスポートが更新される | E-48 (has チェック後 set) | ○ |
| C-144 | setRawExportMapで未登録エクスポートでは何もしない | E-48 (has チェックで弾かれる) | ○ |
| C-145 | registerNamespaceExportでシンボルが設定される | E-49 | ○ |
| C-146 | createModuleReferenceで基本的な参照文字列が生成される | E-50 | ○ |
| C-147 | namespaceエクスポートで'ns'が使用される | E-50 (ids ? ... : "ns") | ○ |
| C-148 | callフラグが参照文字列に含まれる | E-50 (callFlag) | ○ |
| C-149 | directImportフラグが参照文字列に含まれる | E-50 (directImportFlag) | ○ |
| C-150 | deferredImportフラグが参照文字列に含まれる | E-50 (deferredImportFlag) | ○ |
| C-151 | asiSafe=trueが'_asiSafe1'として含まれる | E-50 (asiSafeFlag) | ○ |
| C-152 | asiSafe=falseが'_asiSafe0'として含まれる | E-50 (asiSafeFlag) | ○ |
| C-153 | isModuleReferenceで有効な参照でtrueが返却される | E-51, E-54 | ○ |
| C-154 | isModuleReferenceで無効な文字列でfalseが返却される | E-51, E-54 | ○ |
| C-155 | matchModuleReferenceで有効な参照が正しくパースされる | E-52 | ○ |
| C-156 | hexエンコードされたIDが正しくデコードされる | E-52 (Buffer.from(match[2], "hex")) | ○ |
| C-157 | matchModuleReferenceで無効な文字列でnullが返却される | E-52 (if (!match) return null) | ○ |
| C-158 | deferredImportフラグが正しくパースされる | E-52 (Boolean(match[5])) | ○ |
| C-159 | DEFAULT_EXPORTが正しい値で定義されている | E-53 | ○ |
| C-160 | NAMESPACE_OBJECT_EXPORTが正しい値で定義されている | E-53 | ○ |

## 4) 不足情報（Unknown / Missing）
- C-079: data URIファイル名の処理は`mime-types`パッケージの`mime.extension()`に依存しており、特定のMIMEタイプに対する返却値を検証するにはパッケージの仕様確認が必要
  - 候補：mime-typesパッケージのドキュメント / テストケース / ソースコード
- C-080, C-081: `deprecated`関数はモジュールスコープのプライベート関数であり、直接テストするには`replacePathVariables`経由でレガシープレースホルダー（[hash], [filebase]等）を使用する間接的なテストが必要
  - 候補：既存のwebpack テストスイート / TemplatedPathPlugin の統合テスト
- C-092: MainTemplate.hooks.renderManifest.tapの互換性テストは、compilation.hooks.renderManifest のモック構築が複雑であり、非推奨フックの動作検証には統合テスト環境が必要
  - 候補：既存のwebpackテストスイート / MainTemplate の統合テスト

## 5) リスクフラグ（レビュー観点）
- 0: Template.jsの静的メソッド群（純粋関数が多く、テスト容易性が高い）
- 0: ConcatenationScope.jsの静的メソッド群（正規表現ベースのパース/マッチングで、テスト容易性が高い）
- 1: TemplatedPathPlugin.jsのreplacePathVariables（複数のデータコンテキストの組み合わせが多く、テストケースの網羅性にリスクあり）
- 1: InitFragment.addToSource（merge/mergeAll/キー重複排除のロジックが複雑で、テストのモック構築に注意が必要）
- 1: ConditionalInitFragment.getContent/getEndContent（runtimeTemplate.runtimeConditionExpressionのモックが必要）
- 2: MainTemplate.js（大半が非推奨メソッド/フックであり、webpack 6で削除予定。テスト投資の費用対効果に要検討）

## 6) レビュアーチェックリスト（最小）
- [ ] Template.jsの各静的メソッドに対して、正常系・異常系・境界値が網羅されているか
- [ ] TemplatedPathPlugin.jsのreplacePathVariablesで、全プレースホルダー（file, query, fragment, path, base, name, ext, fullhash, id, chunkhash, contenthash, modulehash, url, runtime）がテスト対象に含まれているか
- [ ] MainTemplate.jsの非推奨メソッド/フックのテスト優先度が適切か（webpack 6での削除予定を考慮）
- [ ] InitFragment.addToSourceのmerge/mergeAll/キー重複排除ロジックのテストケースが十分か
- [ ] ConditionalInitFragment.mergeの全分岐（true/false/RuntimeSpec の組み合わせ）がカバーされているか
- [ ] ConcatenationScope.createModuleReferenceの各オプションフラグ（call, directImport, deferredImport, asiSafe）がテスト対象に含まれているか
- [ ] ConcatenationScope.matchModuleReferenceのデコード処理（hex -> JSON -> ids）が正しく検証されているか
- [ ] data URI処理（C-079）のmime-typesパッケージ依存部分の期待結果が正確か確認する
