# 機能設計書 65-@babel/plugin-proposal-export-default-from

## 概要

本ドキュメントは、Babelの`export default from`構文を変換する提案プラグイン `@babel/plugin-proposal-export-default-from` の機能設計を定義する。

### 本機能の処理概要

本プラグインは、TC39で提案されている`export default from`構文をES2015互換のコードに変換する機能を提供する。この構文は、モジュールのデフォルトエクスポートを別の名前で再エクスポートする際の簡潔な記法を提供する。

**業務上の目的・背景**：現在のJavaScriptでは、デフォルトエクスポートを再エクスポートする際に `import x from './mod'; export { x };` のような2段階の記述が必要である。`export default from`構文を使用することで、`export x from './mod';` のように1行で記述でき、コードの簡潔性と可読性が向上する。

**機能の利用シーン**：
- ライブラリのエントリーポイントでの再エクスポート
- バレルファイル（index.js）での複数モジュールの集約
- モジュールのファサードパターン実装

**主要な処理内容**：
1. ExportNamedDeclarationノードを検出
2. ExportDefaultSpecifierを通常のExportSpecifierに変換
3. 他のspecifierとの混在を処理（分離または統合）

**関連システム・外部連携**：`@babel/core`のAST変換機能を利用する。パーサープラグイン`exportDefaultFrom`を有効化する。

**権限による制御**：特にロールや権限による制御はない。Babel設定ファイルでのプラグイン有効化により機能する。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 本機能はCLIツールまたはビルドプロセスで使用され、GUI画面との関連はない |

## 機能種別

コード変換処理（AST変換）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| - | - | - | 本プラグインにはオプションパラメータはない | - |

### 入力データソース

- ソースコードからのASTノード（ExportNamedDeclarationノード、ExportDefaultSpecifier含む）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| transformedAST | AST Node | 変換後のAST（ExportNamedDeclaration） |

### 出力先

- 変換後のJavaScriptコード（Babelのパイプライン出力）

## 処理フロー

### 処理シーケンス

```
1. ExportNamedDeclaration訪問
   └─ specifiers[0]がExportDefaultSpecifierでない場合はスキップ
2. ExportDefaultSpecifierを抽出
   └─ exported名を取得
3. 残りのspecifiersを確認
   └─ 全てがExportSpecifierの場合：同じノードに統合
   └─ 他の種類がある場合：別ノードとして挿入
4. ExportSpecifierに変換
   └─ default → exported名 の形式に変換
```

### フローチャート

```mermaid
flowchart TD
    A[ExportNamedDeclaration検出] --> B{specifiers[0] が ExportDefaultSpecifier?}
    B -->|No| Z[処理スキップ]
    B -->|Yes| C[ExportDefaultSpecifier抽出]
    C --> D[exported名取得]
    D --> E{残りのspecifiersが全てExportSpecifier?}
    E -->|Yes| F[同じノードに統合]
    F --> G[specifiers.unshift]
    E -->|No| H[別ノードとして挿入]
    H --> I[path.insertBefore]
    G --> J[終了]
    I --> J
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | ExportDefaultSpecifier判定 | specifiers[0]がExportDefaultSpecifierの場合のみ変換 | 常時 |
| BR-02 | ExportSpecifier統合 | 残りのspecifiersが全てExportSpecifierの場合は同じノードに統合 | 全specifiersがExportSpecifier |
| BR-03 | 別ノード挿入 | ExportNamespaceSpecifierなど他の種類がある場合は別ノードとして挿入 | 他の種類のspecifierが存在 |
| BR-04 | default変換 | ExportDefaultSpecifierのexportedをdefaultからの名前付きエクスポートに変換 | 常時 |

### 計算ロジック

- 単純変換: `export x from './mod'` → `export { default as x } from './mod'`
- 混在変換: `export x, { y } from './mod'` → `export { default as x, y } from './mod'`
- 分離変換: `export x, * as ns from './mod'` → `export { default as x } from './mod'; export * as ns from './mod'`

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | データベース操作なし |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 構文エラー | export default from構文が不正 | ソースコードを修正する |

### リトライ仕様

リトライ処理は不要（コンパイル時のエラーはリトライ対象外）

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

トランザクション管理は不要（ファイル変換処理のため）

## パフォーマンス要件

- シンプルな変換処理のため、パフォーマンス上の懸念は少ない
- 大規模コードベースでも数秒以内で変換完了すること

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

- ソースコード変換のため、実行時のセキュリティリスクは限定的
- 生成されるコードはオリジナルと同等のセキュリティ特性を持つ

## 備考

- TC39 Stage 1 提案
- ES Modulesの利便性向上を目的
- 他のエクスポート形式との組み合わせに対応

---

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

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

### 推奨読解順序

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

export default from構文の変換では、ExportDefaultSpecifierとExportSpecifierが主要なデータ構造となる。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | index.ts | `packages/babel-plugin-proposal-export-default-from/src/index.ts` | ExportDefaultSpecifierの構造（exportedプロパティ） |

**読解のコツ**: `ExportDefaultSpecifier`はexported（エクスポート名）のみを持ち、`ExportSpecifier`はlocal（元の名前）とexported（エクスポート名）を持つ。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.ts | `packages/babel-plugin-proposal-export-default-from/src/index.ts` | ExportNamedDeclarationのvisitor |

**主要処理フロー**:
1. **9行目**: manipulateOptionsでexportDefaultFromパーサープラグインを追加
2. **12-15行目**: ExportDefaultSpecifierの判定
3. **17行目**: exported名の取得（specifiers.shift()で抽出）
4. **19-24行目**: 残りspecifiersが全てExportSpecifierの場合の処理
5. **26-32行目**: 他の種類のspecifierがある場合の処理

#### Step 3: 変換パターンを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | index.ts | `packages/babel-plugin-proposal-export-default-from/src/index.ts` | t.exportSpecifierによる変換 |

**コード解説**:
```javascript
// 20-21行目の変換
specifiers.unshift(
  t.exportSpecifier(t.identifier("default"), exported),  // default as x
);

// 26-31行目の別ノード挿入
path.insertBefore(
  t.exportNamedDeclaration(
    null,
    [t.exportSpecifier(t.identifier("default"), exported)],
    t.cloneNode(source),
  ),
);
```

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

```
@babel/core (transform)
    │
    └─ @babel/plugin-proposal-export-default-from/src/index.ts
           │
           └─ ExportNamedDeclaration visitor
                  │
                  ├─ t.isExportDefaultSpecifier (判定)
                  │
                  ├─ specifiers.shift() (ExportDefaultSpecifier抽出)
                  │
                  ├─ specifiers.every(isExportSpecifier)
                  │      │
                  │      ├─ true: specifiers.unshift (統合)
                  │      │
                  │      └─ false: path.insertBefore (分離)
                  │
                  └─ t.exportSpecifier (変換)
```

### データフロー図

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

ExportNamedDeclaration     ExportDefaultSpecifier判定        ExportNamedDeclaration
export x from './mod'      ───▶                              export { default as x }
                           ExportSpecifier生成                from './mod'
                           統合または分離
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.ts | `packages/babel-plugin-proposal-export-default-from/src/index.ts` | ソース | プラグインエントリーポイント、変換ロジック |
| package.json | `packages/babel-plugin-proposal-export-default-from/package.json` | 設定 | パッケージ定義・依存関係 |
