@magicbe/api-generator
Version:
api 生成器
360 lines (269 loc) • 8.52 kB
Markdown
# @magicbe/api-generator
一个强大的 API 代码生成器,支持从 YApi 和 Swagger 自动生成 TypeScript/JavaScript 接口定义和请求函数。
## ✨ 核心特性
- **🚀 多平台支持**: 支持 YApi 和 Swagger/OpenAPI 两大主流 API 管理平台
- **🔒 类型安全**: 自动生成完整的 TypeScript 接口定义,确保类型安全
- **🎯 智能命名**: 自动处理接口命名,支持驼峰命名转换和特殊字符处理
- **📦 嵌套接口**: 智能生成嵌套接口,保持代码结构清晰
- **🔧 特殊字符处理**: 正确处理以数字开头的属性名(使用引号包裹)
- **📋 代码格式化**: 使用 Prettier 自动格式化生成的代码
- **⚙️ 灵活配置**: 支持配置文件和命令行参数两种方式
- **📖 帮助系统**: 内置完整的帮助文档 (`--help` / `-h`)
## 🚀 快速开始
### 安装
```bash
# 全局安装
npm install -g @magicbe/api-generator
# 或
yarn global add @magicbe/api-generator
# 或
pnpm add -g @magicbe/api-generator
```
### 基本使用
#### 方法 1: 使用配置文件
创建 `api-generator.config.json` 文件:
```json
{
"type": "yapi",
"service": "https://your-yapi-domain.com",
"token": "your-api-token",
"output": "./src/api",
"target": "typescript"
}
```
运行命令:
```bash
gen-api
```
#### 方法 2: 使用命令行参数
```bash
gen-api --type yapi --service https://your-yapi-domain.com --token your-api-token --output ./src/api --target typescript
```
#### 方法 3: 查看帮助
```bash
gen-api --help
# 或
gen-api -h
```
## 📋 配置参数
### 命令行参数
| 参数 | 类型 | 说明 | 必填 |
|------|------|------|------|
| `--type` | string | API 平台类型: `yapi` \| `swagger` | ✅ |
| `--service` | string | API 服务地址 | ✅ |
| `--output` | string | 输出目录路径 | ✅ |
| `--target` | string | 目标语言: `typescript` \| `javascript` | ✅ |
| `--token` | string | YApi 访问令牌 (YApi 需要) | ❌ |
| `--cats` | string | YApi 分类 ID,多个用逗号分隔 (YApi 可选) | ❌ |
| `--resources` | string | Swagger 资源名称,多个用逗号分隔 (Swagger 可选) | ❌ |
| `--function` | string | 请求函数导入路径 (可选,默认: `@/request`) | ❌ |
| `--headers` | string | 自定义请求头,JSON 格式 (Swagger 可选) | ❌ |
| `--config` | string | 配置文件路径 (可选,默认: `./api-generator.config.json`) | ❌ |
| `--help, -h` | - | 显示帮助信息 | ❌ |
### 配置文件格式
```json
{
"type": "yapi",
"service": "https://your-yapi-domain.com",
"token": "your-api-token",
"output": "./src/api",
"target": "typescript",
"function": "@/utils/request",
"cats": [123, 456],
}
```
## 🏗️ 生成的代码结构
### 接口定义示例
```typescript
/** 用户列表 请求参数 */
export interface GetUserListQuery {
page: number;
page_size: number;
keyword?: string;
}
/** 用户列表 响应数据 */
export interface GetUserListResponseData {
total: number;
items: GetUserListResponseDataItems[];
}
/** 用户列表 响应主体 */
export interface GetUserListResponse {
code: number;
msg: string;
data: GetUserListResponseData;
}
```
### 请求函数示例
```typescript
/**
* 用户列表
* https://yapi.example.com/project/123/interface/api/456
*/
export const getUserList = (query: GetUserListQuery) =>
request.get<GetUserListResponse>('/user/list', { params: query });
```
## 🎯 智能特性详解
### 1. 智能接口命名
- **路径转换**: 自动将 API 路径转换为驼峰命名
- **HTTP 方法前缀**: 根据请求方法添加前缀 (`get`, `post`, `put`, `delete`)
- **参数处理**: 智能处理路径参数和查询参数
### 2. 嵌套接口生成
- **层次结构**: 自动识别嵌套对象结构
- **命名规则**: 使用 "当前接口名 + Key(首字母大写)" 的命名方式
- **递归处理**: 支持多层嵌套结构的递归生成
### 3. 特殊字符处理
- **数字开头属性**: 自动使用引号包裹 (如 `"0558d78b39cf4824b57b56047a8d47fc": string`)
- **命名转换**: 支持下划线、连字符等转换为驼峰命名
- **语法合规**: 确保生成的 TypeScript 代码完全符合语法规范
### 4. 类型安全增强
- **完整类型定义**: 为所有接口生成完整的 TypeScript 类型
- **可选/必填区分**: 正确识别可选参数和必填参数
- **响应数据类型**: 为响应数据提供完整的类型约束
## 📦 项目集成
### 1. 安装依赖
```bash
npm install axios
```
### 2. 配置请求实例
创建 `src/request.ts`:
```typescript
import axios from 'axios';
const request = axios.create({
baseURL: process.env.VUE_APP_API_BASE_URL,
timeout: 10000,
});
// 请求拦截器
request.interceptors.request.use(
config => {
// 添加认证头等逻辑
return config;
},
error => {
return Promise.reject(error);
}
);
// 响应拦截器
request.interceptors.response.use(
response => {
return response.data;
},
error => {
// 统一错误处理
return Promise.reject(error);
}
);
export default request;
```
### 3. 使用生成的 API
```typescript
import { getUserList } from '@/api/gen_api_123';
// 使用 API
const loadUsers = async () => {
try {
const response = await getUserList({
page: 1,
page_size: 10,
keyword: 'search'
});
console.log(response.data);
} catch (error) {
console.error('加载用户列表失败:', error);
}
};
```
## 🔧 高级用法
### YApi 分类过滤
只生成指定分类的 API:
```bash
gen-api --type yapi --service https://yapi.example.com --token your-token --output ./src/api --target typescript --cats 123,456
```
### Swagger 多资源
同时处理多个 Swagger 资源:
```bash
gen-api --type swagger --service https://swagger.example.com/swagger.json --output ./src/api --target typescript --resources user,order
```
### 自定义函数命名
```bash
gen-api --type yapi --service https://yapi.example.com --token your-token --output ./src/api --target typescript --function @/utils/custom-request
```
## 🛠️ 开发指南
### 本地开发
```bash
# 克隆项目
git clone https://github.com/your-org/api-generator.git
# 安装依赖
pnpm install
# 开发模式
pnpm dev
# 构建项目
pnpm build
```
### 项目结构
```
src/
├── Generator.ts # 基础生成器类
├── GeneratorYapi.ts # YApi 生成器基类
├── GeneratorSwaggerApi.ts # Swagger 生成器
├── library.ts # 命令行工具入口
├── help.txt # 帮助文档
└── index.ts # 主入口文件
```
### 构建脚本
- `pnpm dev`: 使用 nodemon 进行开发
- `pnpm build`: 构建 TypeScript 项目并复制帮助文件
- `pnpm lint`: ESLint 代码检查
## 🎨 代码示例
### 生成的复杂接口示例
```typescript
/** 报表详情 响应数据 */
export interface GetAdminReportDetailResponse {
code: number;
msg: string;
data: GetAdminReportDetailResponseData;
}
/** 报表详情 数据内容 */
export interface GetAdminReportDetailResponseData {
period_map: GetAdminReportDetailResponsePeriodMap;
total_count: number;
items: GetAdminReportDetailResponseDataItems[];
}
/** 报表详情 时间段映射 */
export interface GetAdminReportDetailResponsePeriodMap {
[key: string]: string;
}
/** 报表详情 项目列表 */
export interface GetAdminReportDetailResponseDataItems {
id: number;
name: string;
status: number;
"0558d78b39cf4824b57b56047a8d47fc": string; // 特殊字符处理示例
}
```
### 生成的请求函数示例
```typescript
/**
* 获取报表详情
* https://yapi.example.com/project/123/interface/api/789
*/
export const getAdminReportDetail = (query: GetAdminReportDetailQuery) =>
request.get<GetAdminReportDetailResponse>('/admin/report/detail', { params: query });
```
## 🤝 贡献指南
欢迎提交 Issue 和 Pull Request!
### 提交规范
- 使用清晰的提交信息
- 添加适当的测试用例
- 更新相关文档
- 遵循代码风格规范
## 📄 许可证
MIT License
## 🆘 支持与联系
如有问题,请通过以下方式联系:
- 📧 邮箱:304587090@qq.com
- 🌐 项目主页:[http://www.wangquan.top](http://www.wangquan.top)
- 📚 文档:参见项目 README.md
---
<div align="center">
**🎉 Happy Coding!**
如果你觉得这个项目有帮助,请给个 ⭐️ 支持一下!
</div>