# an-cli

[English](./README.en.md) | [Español](./README.es.md) | [العربية](./README.ar.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) | 日本語 | [简体中文](./README.md)

## 概要

an-cliは、以下の2つのコマンドを含むフロントエンドコマンドラインツールです：

[anl typeコマンド](#anl-typeコマンド)：Swagger JSONに基づいてTypeScriptの型定義とAPIリクエスト関数を自動生成するツール。

[anl lintコマンド](#anl-lintコマンド)：ReactまたはVueプロジェクトのeslint、stylelint、prettier、commitLint、VSCode関連の設定を生成するツール。

## 特徴

- `anl type`

  - 🚀 Swagger JSON文書の自動解析
  - 📦 TypeScript型定義ファイルの生成
  - 🔄 型安全なAPIリクエスト関数の生成
  - 🎯 パスパラメータ、クエリパラメータ、リクエストボディのサポート
  - 📝 列挙型定義の自動生成
  - 🎨 コードフォーマットのサポート
  - ⚡️ ファイルアップロードのサポート
  - 🛠 設定可能なコード生成オプション

- `anl lint`
  - 🔍 各種リントツールのワンクリック設定
  - 🎨 ESLint設定の自動化
  - 🎯 Prettierフォーマット設定
  - 🔄 CommitLintコミット規約
  - 📦 VSCodeエディタ設定

## インストール

> [!NOTE]
>
> グローバルインストールが必要です

```bash
$ npm install anl -g

$ yarn global add anl
```

## 使用方法

> [!TIP]
>
> 1. 初めて使用する場合、どのような結果が生成されるか不明な場合は、まずコマンドを実行し、プロジェクトにどのような変更が発生するかを確認してから、ドキュメントを参照して設定を調整し、再度生成して最終的に理想的な結果を得ることをお勧めします
> 2. または、以下の手順に従って一つずつ実行することで、成果を得ることができます

# anl typeコマンド

## 使用方法

1. コマンドの実行

```bash
$ anl type
```

2. 設定の完了

- 初めて `anl type` コマンドを実行すると、*プロジェクトのルートディレクトリ*に `an.config.json` という名前の設定ファイルが*自動的に作成*されます（手動で作成することも可能です）。
- `anl type` コマンドを実行すると、ユーザープロジェクトのルートディレクトリにある `an.config.json` 設定ファイルを探し、その設定情報を読み取って、対応するaxiosのラッパー、設定、インターフェースリスト、インターフェースリクエスト、レスポンスタイプを生成します
- 設定ファイル内の設定項目は自由に変更できます

3. `an.config.json`設定例

- 設定ファイルはプロジェクトのルートディレクトリに配置する必要があり、移動できません
- 設定ファイル名は変更できません
- 具体的なパラメータについては[設定項目の説明](#設定項目の説明)をご覧ください

```json
{
	"saveTypeFolderPath": "apps/types",
	"saveApiListFolderPath": "apps/api/",
	"saveEnumFolderPath": "apps/enums",
	"importEnumPath": "../../enums",
	"swaggerJsonUrl": "https://generator3.swagger.io/openapi.json",
	"requestMethodsImportPath": "./fetch",
	"dataLevel": "serve",
	"formatting": {
		"indentation": "\t",
		"lineEnding": "\n"
	},
	"headers": {},
	"includeInterface": [
		{
			"path": "/api/user",
			"method": "get"
		}
	],
	"excludeInterface": [
		{
			"path": "/api/admin",
			"method": "post"
		}
	]
}
```

3. 必要に応じて設定ファイルを更新し、再度 `anl type` コマンドを実行すると、設定ファイルで指定された設定情報に基づいて、対応する型情報が生成されます

```bash
$ anl type
```

> [!NOTE]
>
> これらの設定が不明な場合は、まず `anl type` コマンドを実行して型を生成し、プロジェクトディレクトリを確認してから、設定項目の説明を参照して設定を調整し、再度生成して最終的に理想的な結果を得ることができます

## 設定項目の説明

| 設定項目                 | 型                                    | 必須   | 説明                                                                                                                                   |
| ------------------------ | ------------------------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------- |
| saveTypeFolderPath       | string                                | はい   | 型定義ファイルの保存パス                                                                                                               |
| saveApiListFolderPath    | string                                | はい   | APIリクエスト関数の保存パス                                                                                                            |
| saveEnumFolderPath       | string                                | はい   | 列挙型ファイルの保存パス                                                                                                               |
| importEnumPath           | string                                | はい   | 列挙型のインポートパス                                                                                                                 |
| swaggerJsonUrl           | string                                | はい   | Swagger JSONドキュメントのURL                                                                                                          |
| requestMethodsImportPath | string                                | はい   | リクエストメソッドのインポートパス                                                                                                     |
| dataLevel                | 'data' \| 'serve' \| 'axios'          | はい   | インターフェースの戻り値レベル                                                                                                         |
| formatting               | object                                | いいえ | コードフォーマット設定                                                                                                                 |
| headers                  | object                                | いいえ | リクエストヘッダー設定                                                                                                                 |
| includeInterface         | Array<{path: string, method: string}> | いいえ | 生成するインターフェースのリスト。この項目が設定されている場合、リスト内のインターフェースのみが生成されます                           |
| excludeInterface         | Array<{path: string, method: string}> | いいえ | 除外するインターフェースのリスト。この項目が設定されている場合、リスト内のインターフェースを除くすべてのインターフェースが生成されます |

## 生成されるファイル構造

- このファイル構造は設定ファイルに基づいて生成されます

```
project/
├── apps/
│   ├── types/
│   │   ├── models/          # すべての型定義ファイル（列挙型を除く）
│   │   ├── connectors/      # API型定義（インターフェース定義ファイル）
│   │   └── enums/           # 列挙型定義
│   └── api/
│       ├── fetch.ts         # リクエストメソッドの実装
│       └── index.ts         # APIリクエスト関数
```

## 生成されるコードの例

### 型定義ファイル

```typescript
declare namespace UserDetail_GET {
	interface Query {
		userId: string;
	}

	interface Response {
		id: string;
		name: string;
		age: number;
		role: UserRole;
	}
}
```

### APIリクエスト関数

```typescript
import { GET } from './fetch';

/**
 * ユーザー詳細の取得
 */
export const userDetailGet = (params: UserDetail_GET.Query) => GET<UserDetail_GET.Response>('/user/detail', params);
```

## 機能の説明

### 型解析

- OpenAPI 3.0仕様のすべてのデータ型をサポート
- 複雑なネスト型を自動処理
- 配列、オブジェクト、列挙型などをサポート
- インターフェースコメントを自動生成

### ファイルアップロード

ファイルアップロード型が検出された場合、対応するリクエストヘッダーが自動的に追加されます：

```typescript
export const uploadFile = (params: UploadFile.Body) =>
	POST<UploadFile.Response>('/upload', params, {
		headers: { 'Content-Type': 'multipart/form-data' },
	});
```

### エラー処理

ツールには包括的なエラー処理メカニズムが組み込まれています：

- 解析エラーの通知
- 型生成失敗の警告
- ファイル書き込みの例外処理

### インターフェースフィルタリング

ツールは設定を通じて生成するインターフェースをフィルタリングすることができます：

1. 特定のインターフェースを含める

   - `includeInterface` 設定項目で生成するインターフェースを指定
   - 設定で指定されたインターフェースのみが生成されます
   - 設定形式は `path` と `method` を含むオブジェクトの配列です

2. 特定のインターフェースを除外
   - `excludeInterface` 設定項目で除外するインターフェースを指定
   - 設定で指定されたインターフェースを除くすべてのインターフェースが生成されます
   - 設定形式は `path` と `method` を含むオブジェクトの配列です

設定例：

```json
{
	"includeInterface": [
		{
			"path": "/api/user",
			"method": "get"
		}
	],
	"excludeInterface": [
		{
			"path": "/api/admin",
			"method": "post"
		}
	]
}
```

注意：`includeInterface` と `excludeInterface` は同時に使用できません。両方が設定されている場合、`includeInterface` が優先されます。

## 開発

```bash
# 依存関係のインストール
npm install

# 開発モード
F5キーでデバッグ

# ビルド
npm run build

# ローカルリンクデバッグ
npm run blink
```

## 注意事項

1. Swagger JSONドキュメントのURLにアクセスできることを確認してください
2. 設定ファイルのパスはプロジェクトルートディレクトリからの相対パスである必要があります
3. 生成されたファイルは既存の同名ファイルを上書きします
4. 生成されたファイルはバージョン管理に含めることをお勧めします

## よくある質問

1. 生成された型ファイルのフォーマットに失敗する

   - prettierがインストールされているか確認してください
   - プロジェクトルートディレクトリにprettier設定ファイルが存在するか確認してください

2. リクエスト関数のインポートパスが間違っている
   - requestMethodsImportPathの設定が正しいか確認してください
   - リクエストメソッドファイルが存在するか確認してください

# anl lintコマンド

### 機能概要

フロントエンドプロジェクトの各種リントツールをワンクリックで設定する機能を提供します：

- ESLintコード検査
- Prettierコードフォーマット
- CommitLintコミットメッセージ規約
- VSCodeエディタ設定

### 使用方法

```bash
$ anl lint
```

### 設定詳細

#### 1. ESLint設定

- 必要な依存関係を自動インストール
- React/Vueフレームワークをサポート
- `.eslintrc.js`と`.eslintignore`を自動生成
- TypeScriptサポートを統合

#### 2. Prettier設定

- prettier関連の依存関係を自動インストール
- `.prettierrc.js`設定ファイルを生成
- デフォルト設定には以下が含まれます：
  - 行幅：80
  - タブインデント
  - シングルクォートの使用
  - アロー関数の括弧
  - その他のコードスタイル規約

#### 3. CommitLint設定

- commitlint関連の依存関係をインストール
- husky git hooksを設定
- `commitlint.config.js`を生成
- gitコミットメッセージを標準化

#### 4. VSCode設定

- `.vscode/settings.json`を作成
- エディタの自動フォーマットを設定
- デフォルトフォーマッタを設定
- 既存の設定ファイルの更新をサポート

## ライセンス

ISC License

## 貢献ガイド

[Issue](https://github.com/bianliuzhu/an-cli/issues)や[Pull Request](https://github.com/bianliuzhu/an-cli/pulls)を歓迎します！
