Dune Tools Dune Tools Collection

CLI

@dune2/cli 是一个功能丰富的命令行工具集,主要用于处理 API 生成等任务。

CLI

@dune2/cli 是一个功能丰富的命令行工具集,主要用于从 Swagger/OpenAPI 文档生成类型安全的 API 客户端代码。

安装

npm install @dune2/cli
# 或者
yarn add @dune2/cli
# 或者
pnpm add @dune2/cli

核心功能

API 代码生成

CLI 的主要功能是根据 Swagger/OpenAPI 文档自动生成类型安全的 API 请求代码,包括:

  • 自动生成 TypeScript 类型定义
  • 生成基于 RequestBuilder 的请求代码
  • 支持路径参数、查询参数、请求体等
  • 支持分页接口的特殊处理
  • 自动格式化生成的代码

配置管理

通过配置文件管理多个 API 源和生成选项,支持:

  • 多个 API 配置
  • 自定义输出路径
  • 响应数据转换
  • URL 路径转换
  • 代码格式化选项

命令列表

dune generateApi

从 Swagger/OpenAPI 文档生成 API 请求代码。

dune generateApi

这个命令会:

  1. 读取配置文件中的 API 配置
  2. 解析 Swagger/OpenAPI 文档
  3. 为每个 API 端点生成对应的请求代码
  4. 生成 TypeScript 类型定义
  5. 自动格式化代码(如果启用)

dune init

初始化配置文件。

dune init

会在项目根目录创建 dune.config.ts 配置文件模板:

import { defineConfig } from "@dune2/cli";

export default defineConfig({
  i18n: [],
  api: [],
});

dune interactivedune i

进入交互式操作模式。

dune interactive
# 或者简写
dune i

信息

直接运行 dune 命令(不带参数)也会进入交互式操作模式。

交互式模式会显示所有可用命令的列表,你可以通过上下箭头键选择要执行的命令。

配置文件

基本配置

运行 dune init 创建配置文件后,需要根据项目需求进行配置:

import { defineConfig } from "@dune2/cli";

export default defineConfig({
  api: [
    {
      // Swagger/OpenAPI 文档路径(支持本地文件或远程 URL)
      swaggerJSONPath: "http://localhost:3000/api-docs",

      // 生成代码的输出目录
      output: "./src/apis",

      // 是否启用 TypeScript(生成 .ts 文件)
      enableTs: true,

      // 是否在生成后格式化代码
      format: true,

      // RequestBuilder 导入路径
      RequestBuilderImportPath: "import { RequestBuilder } from '@dune2/tools'",

      // QueryClient 导入路径(可选)
      queryClientImportPath: "import { queryClient } from '@/utils/request'",

      // Swagger UI 地址(用于生成文档链接)
      swaggerUiUrl: "http://localhost:3000/swagger",

      // 响应数据转换器
      responseSchemaTransformer: (schema) => schema.properties?.data ?? schema,

      // URL 转换器(可选)
      urlTransformer: "/api/v1",
    },
  ],
});

API 配置选项

swaggerJSONPath

  • 类型: string
  • 必填: 是
  • 描述: Swagger/OpenAPI 文档的路径,可以是本地文件路径或远程 URL

output

  • 类型: string
  • 默认值: "./src/apis"
  • 描述: 生成代码的输出目录

enableTs

  • 类型: boolean
  • 默认值: true
  • 描述: 是否启用 TypeScript,true 生成 .ts 文件,false 生成 .js 文件

RequestBuilderImportPath

  • 类型: string
  • 默认值: "import { RequestBuilder } from '@dune2/tools'"
  • 描述: RequestBuilder 的导入路径

queryClientImportPath

  • 类型: string
  • 可选: 是
  • 描述: QueryClient 的导入路径,用于集成 react-query 等查询库

responseSchemaTransformer

  • 类型: (schema: OpenAPI.SchemaObject) => any
  • 默认值: (schema) => schema.properties?.data ?? schema
  • 描述: 响应数据模式转换器,用于提取响应数据的实际结构

urlTransformer

  • 类型: string | ((url: string) => string)
  • 可选: 是
  • 描述: URL 转换器,可以是字符串前缀或转换函数

format

  • 类型: boolean
  • 默认值: true
  • 描述: 是否在生成代码后自动格式化(需要安装 prettier)

swaggerUiUrl

  • 类型: string
  • 可选: 是
  • 描述: Swagger UI 地址,用于在生成的代码中添加文档链接

dereferenceSwaggerConfig

  • 类型: SwaggerParser.Options
  • 可选: 是
  • 描述: Swagger 解析器的配置选项

生成的代码结构

基本结构

生成的代码会按照以下结构组织:

src/apis/
├── /api/v1/users/
│   ├── get.ts      # GET /api/v1/users
│   ├── post.ts     # POST /api/v1/users
│   └── ...
├── /api/v1/users/{userId}/
│   ├── get.ts      # GET /api/v1/users/{userId}
│   ├── put.ts      # PUT /api/v1/users/{userId}
│   └── ...

生成的代码示例

// do not edit this file manually, it will be overwritten by @dune2/cli
import { RequestBuilder } from "@dune2/tools";
import { queryClient } from "@/utils/request";

/**
 * 获取用户列表
 * @tags 用户管理
 * @see http://localhost:3000/swagger#/用户管理/getUserList
 */
export const apiV1UsersGetApi = new RequestBuilder<
  apiV1UsersGetApi.Req,
  apiV1UsersGetApi.Res
>({
  url: "/api/v1/users",
  method: "get",
  queryClient,
});

export namespace apiV1UsersGetApi {
  export interface Req {
    pageNum: number;
    pageSize: number;
    keyword?: string;
  }

  export interface Res {
    code: number;
    data: {
      list: User[];
      total: number;
    };
    message: string;
  }

  export type ResultItem = Res["data"]["list"][0];
}

特殊功能

路径参数处理

对于包含路径参数的 API(如 /api/v1/users/{userId}),CLI 会自动生成 urlPathParams 配置:

export const apiV1UsersUserIdGetApi = new RequestBuilder({
  url: "/api/v1/users/{userId}",
  method: "get",
  urlPathParams: ["userId"],
});

分页接口支持

CLI 会自动识别分页接口并生成额外的类型定义:

export namespace apiV1UsersGetApi {
  // ... 其他类型定义
  export type ResultItem = Res["data"]["list"][0]; // 分页数据项类型
}

表单字段映射

对于 POST 和 PUT 请求,CLI 会生成字段映射对象:

export const apiV1UsersPostApiFieldsMap = {
  name: "name",
  email: "email",
  age: "age",
} as const;

使用示例

故障排除

常见问题

  1. 类型生成失败

    • 检查 Swagger 文档是否符合 OpenAPI 3.0 规范
    • 确认响应数据结构是否正确
  2. 导入路径错误

    • 检查 RequestBuilderImportPath 配置
    • 确认 @dune2/tools 包已正确安装
  3. 代码格式化失败

    • 确认项目已安装 prettier
    • 检查 prettier 配置是否正确

调试模式

设置环境变量启用调试输出:

DEBUG=dune:* dune generateApi

这将显示详细的执行日志,帮助诊断问题。