# 機能設計書 26-JSONPライブラリ出力

## 概要

本ドキュメントは、webpackのJsonpLibraryPluginによるJSONP形式でのライブラリ出力機能について記述する。

### 本機能の処理概要

JsonpLibraryPluginは、webpackでバンドルされたライブラリをJSONP（JSON with Padding）形式で出力する機能を提供する。指定されたコールバック関数名でバンドル全体をラップし、スクリプトタグによるクロスドメイン読み込みを可能にする。

**業務上の目的・背景**：JSONP形式は、CORS制約を回避してクロスドメインでデータやコードを読み込む古典的な手法である。CDNから配信されるライブラリや、サードパーティスクリプトの読み込みで利用されるパターンを実現する。

**機能の利用シーン**：`output.library.type: 'jsonp'` を指定してJSONP形式のバンドルを生成する。ライブラリ名がコールバック関数名となる。

**主要な処理内容**：
1. ライブラリ名をパースし、文字列であることを検証する
2. renderメソッドでソースコードを `libraryName(source)` 形式でラップする
3. チャンクハッシュにプラグイン固有情報を反映する

**関連システム・外部連携**：EnableLibraryPluginを通じて有効化される。ExportPropertyLibraryPluginと連携可能。

**権限による制御**：本機能に権限による制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 画面機能マッピングに該当する画面なし |

## 機能種別

コード生成処理（JSONP形式ラッパーコードの生成）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| library.name | string | Yes | JSONP コールバック関数名 | 文字列必須 |

### 入力データソース

webpack設定の `output.library` オプション。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| source | ConcatSource | `name(source)` 形式のバンドルソース |

### 出力先

JavascriptModulesPluginのrenderフックを通じて、バンドルファイルとして出力される。

## 処理フロー

### 処理シーケンス

```
1. オプションパース（parseOptions）
   └─ nameが文字列でなければエラー
2. レンダリング（render）
   ├─ compilation.getPath でチャンクテンプレートを適用
   └─ ConcatSource("name(", source, ")") を返却
3. チャンクハッシュ（chunkHash）
   └─ "JsonpLibraryPlugin" + name をハッシュに追加
```

### フローチャート

```mermaid
flowchart TD
    A[renderメソッド呼び出し] --> B[compilation.getPathでname解決]
    B --> C["ConcatSource: name + ( + source + )"]
    C --> D[ConcatSource返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 名前必須 | JSONP出力にはライブラリ名（コールバック関数名）が必須 | 常時 |
| BR-02 | 文字列のみ | ライブラリ名は単純な文字列のみ許可 | 常時 |

### 計算ロジック

出力形式: `{name}({bundleSource})`

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

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

本機能にデータベース操作はない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Error | nameが文字列でない場合 | "Jsonp library name must be a simple string" |

### リトライ仕様

リトライ処理はない。

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

トランザクション管理はない。

## パフォーマンス要件

非常にシンプルなラッパー生成であり、パフォーマンスへの影響は無視できる。

## セキュリティ考慮事項

JSONPパターンはXSS攻撃のベクトルとなりうるため、コールバック関数名の信頼性確保が重要。

## 備考

- 最もシンプルなライブラリプラグインの一つ（93行）
- compilation.getPathによりチャンクテンプレート変数（[name], [hash]等）がname内で展開される

---

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

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | JsonpLibraryPlugin.js | `lib/library/JsonpLibraryPlugin.js` | JsonpLibraryPluginParsed型（30-32行目）- name |

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | JsonpLibraryPlugin.js | `lib/library/JsonpLibraryPlugin.js` | プラグイン全体（93行のコンパクトなファイル） |

**主要処理フロー**:
1. **53-64行目**: parseOptions - name文字列バリデーション
2. **72-77行目**: render - `${name}(` + source + `)` のConcatSource生成
3. **86-89行目**: chunkHash - プラグイン名とname情報のハッシュ追加

### プログラム呼び出し階層図

```
EnableLibraryPlugin.apply()
    │
    ├─ ExportPropertyLibraryPlugin.apply()
    │
    └─ JsonpLibraryPlugin.apply()
           │
           └─ AbstractLibraryPlugin.apply()
                  ├─ hooks.render.tap() ──▶ render()
                  │      └─ ConcatSource("name(", source, ")")
                  └─ hooks.chunkHash.tap() ──▶ chunkHash()
```

### データフロー図

```
[入力]                     [処理]              [出力]

library.name ────────▶ parseOptions() ──▶ {name: string}

ソースコード ────────▶ render() ────────▶ "callbackName(bundleCode)"
                        (ConcatSource)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| JsonpLibraryPlugin.js | `lib/library/JsonpLibraryPlugin.js` | ソース | JSONP形式ラッパーの生成 |
| AbstractLibraryPlugin.js | `lib/library/AbstractLibraryPlugin.js` | ソース | ライブラリプラグインの基底クラス |
| EnableLibraryPlugin.js | `lib/library/EnableLibraryPlugin.js` | ソース | ライブラリタイプの有効化 |
| ExportPropertyLibraryPlugin.js | `lib/library/ExportPropertyLibraryPlugin.js` | ソース | 特定エクスポートの抽出 |
