# 機能設計書 86-CMSエントリポイント

## 概要

本ドキュメントは、Decap CMSのCDN配布用エントリポイントパッケージ（`decap-cms`）の機能設計について記述する。本パッケージは全ての構成パッケージを統合した単一バンドルを提供し、scriptタグによるCDN配布を可能にする。

### 本機能の処理概要

**業務上の目的・背景**：Decap CMSはモジュラーアーキテクチャで構成されているが、多くのユーザーはCDN経由でscriptタグを使用して簡単にCMSを導入したいと考える。本パッケージは全パッケージ（コア、バックエンド、ウィジェット、メディアライブラリ、ロケール）を単一のJavaScriptバンドルに統合し、scriptタグで読み込むだけでCMSが起動する環境を提供する。

**機能の利用シーン**：静的サイトジェネレーターを使用するプロジェクトで、admin/index.htmlに`<script src="https://unpkg.com/decap-cms">`のようにscriptタグを追加するだけでCMSを導入する場面で使用される。

**主要な処理内容**：
1. `decap-cms-app`パッケージの読み込みとCMSオブジェクトの取得
2. 外部メディアライブラリ（Cloudinary、Uploadcare）の登録
3. `window.CMS_MANUAL_INIT`フラグが未設定の場合、自動的に`CMS.init()`を実行
4. グローバルスコープ（`window`）への`CMS`、`initCMS`、`createClass`、`h`の公開
5. バージョン番号のコンソールログ出力

**関連システム・外部連携**：CDN（unpkg、jsdelivr等）、decap-cms-appパッケージ、decap-cms-media-library-cloudinary、decap-cms-media-library-uploadcare

**権限による制御**：`window.CMS_MANUAL_INIT`フラグにより自動初期化の制御が可能。

## 関連画面

本パッケージは全画面の起動エントリポイントであるため、全画面に関連する。

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | 全画面 | 主機能 | CMSアプリケーション全体のブートストラップ |

## 機能種別

パッケージング / アプリケーションブートストラップ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| window.CMS_MANUAL_INIT | boolean | No | trueの場合、自動初期化をスキップ | - |

### 入力データソース

windowグローバルオブジェクト、DECAP_CMS_VERSION定数（ビルド時にwebpackで注入）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| window.CMS | object | CMSオブジェクト（全APIメソッドを含む） |
| window.initCMS | function | CMS.init関数への参照 |
| window.createClass | function | createReactClassへの参照（カスタムウィジェット用） |
| window.h | function | React.createElementへの参照（JSX代替） |
| DecapCms | object | 名前付きエクスポート（CMSオブジェクトのスプレッド） |

### 出力先

グローバルスコープ（window）、ESモジュールエクスポート

## 処理フロー

### 処理シーケンス

```
1. モジュール読み込み
   ├─ decap-cms-appからCMSオブジェクトをインポート
   └─ extensions.jsで外部メディアライブラリを登録

2. 自動初期化チェック
   ├─ window.CMS_MANUAL_INITがfalsy → CMS.init()実行
   └─ window.CMS_MANUAL_INITがtruthy → 手動初期化モード（ログ出力）

3. グローバル公開
   ├─ window.CMS = CMS
   ├─ window.initCMS = CMS.init
   ├─ window.createClass = createReactClass（未設定時）
   └─ window.h = React.createElement（未設定時）

4. バージョンログ
   └─ DECAP_CMS_VERSIONが存在すればコンソール出力
```

### フローチャート

```mermaid
flowchart TD
    A[パッケージ読み込み] --> B[extensions.js実行]
    B --> C[Cloudinary/Uploadcareメディアライブラリ登録]
    C --> D{window.CMS_MANUAL_INIT?}
    D -->|false/未設定| E[CMS.init自動実行]
    D -->|true| F[手動初期化モードログ出力]
    E --> G[windowにCMS/initCMS/createClass/h公開]
    F --> G
    G --> H{DECAP_CMS_VERSION存在?}
    H -->|Yes| I[バージョンログ出力]
    H -->|No| J[完了]
    I --> J
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-86-01 | 自動初期化 | `window.CMS_MANUAL_INIT`が未設定またはfalsyの場合、自動的に`CMS.init()`を実行 | パッケージ読み込み時 |
| BR-86-02 | 手動初期化 | `window.CMS_MANUAL_INIT`がtruthyの場合、自動初期化をスキップし手動でinitを呼ぶ必要がある | CMS_MANUAL_INITフラグが設定されている場合 |
| BR-86-03 | グローバル既存値の保護 | `window.createClass`と`window.h`は既に値がある場合は上書きしない | window上に既存値がある場合 |
| BR-86-04 | メディアライブラリ自動登録 | Cloudinary/Uploadcareメディアライブラリが自動的に登録される | extensions.js読み込み時 |

### 計算ロジック

該当なし

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

該当なし

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

なし

## エラー処理

### エラーケース一覧

本パッケージは明示的なエラーハンドリングを行わない。初期化エラーはCMS.init内部で処理される。

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 本パッケージは全パッケージを統合したバンドルであり、ファイルサイズが大きい
- webpackのmax_old_space_size=4096でビルドされる（メモリ使用量が大きいため）

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

- CDN経由で配布されるため、CDNのセキュリティ（SRI、HTTPS）に依存する
- window.CMSとしてグローバルに公開されるため、サードパーティスクリプトからアクセス可能

## 備考

- パッケージバージョン: 3.10.0
- React（^19.1.0）とReactDOM（^19.1.0）を依存に含む（CDNバンドルのため直接依存）
- codemirror（^5.46.0）も直接依存に含む
- decap-cms-appをコアパッケージとして使用

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | index.js | `packages/decap-cms/src/index.js` | 全体の初期化フローと公開API |

**主要処理フロー**:
1. **1-4行目**: decap-cms-appからCMSインポート、extensions.js読み込み
2. **9-13行目**: CMS_MANUAL_INITフラグによる自動/手動初期化分岐
3. **18-28行目**: windowグローバルへのCMS/initCMS/createClass/h公開
4. **31-33行目**: DecapCmsエクスポート

#### Step 2: 拡張機能登録を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | extensions.js | `packages/decap-cms/src/extensions.js` | メディアライブラリ登録 |

**主要処理フロー**:
- **1-2行目**: CMS、uploadcare、cloudinaryのインポート
- **6-7行目**: registerMediaLibraryで外部メディアライブラリを登録

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

```
decap-cms/src/index.js
    |
    +-- decap-cms-app（CMSオブジェクト取得）
    |      +-- decap-cms-core（コアパッケージ）
    |      +-- 全バックエンド/ウィジェット/ロケール登録
    |
    +-- extensions.js
    |      +-- CMS.registerMediaLibrary(uploadcare)
    |      +-- CMS.registerMediaLibrary(cloudinary)
    |
    +-- [!CMS_MANUAL_INIT] CMS.init()
    |
    +-- window.CMS = CMS
    +-- window.initCMS = CMS.init
    +-- window.createClass = createReactClass
    +-- window.h = React.createElement
```

### データフロー図

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

decap-cms-app ──────────▶ index.js ──────────────▶ window.CMS
extensions.js ──────────▶   |                      window.initCMS
                            +-- CMS.init()          window.createClass
window.CMS_MANUAL_INIT ─▶   |                      window.h
                            +-- バージョンログ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.js | `packages/decap-cms/src/index.js` | ソース | CDN配布用エントリーポイント |
| extensions.js | `packages/decap-cms/src/extensions.js` | ソース | 外部メディアライブラリ登録 |
| package.json | `packages/decap-cms/package.json` | 設定 | パッケージ依存関係定義 |
