我做了一个CLI工具, 实现了端到端类型安全和生成API文档

436 阅读2分钟

它叫Tealina, 不用tRPC, 仅需Typescript, 实现端到端类型, 不用Swagger, 一行命令从代码提取类型和注释, 生成API文档. 

效果展示: 手机端可能会卡, 建议查看视频

Tealina 是开源的, 并且已发布npm, 不建议直接安装使用, 因为Tealina依赖于特定的文件结构和类型别名, 更多细节请查看实现原理,  推荐通过官方脚手架快速开始.

1. 使用 create-tealina 创建一个开箱即用的项目, 

以pnpm为例, 其他包管理器请查看文档,

pnpm create tealina demo

跟随提示, 一个全栈项目就准备好了

3. 按照提示 初始化项目

4. 启动 (cd 到 server 目录)

pnpm dev

浏览器打开文档页面  (http://localhost:5000/api-doc/index.html), 整个文档页面是根据 gdoc 命令生成的 json 渲染的. 文件保存在server/docs/api-v1.json.

至此, 你已经有了一个自带文档的API服务,  远不止如此, 

cd 到 web 项目

执行 pnpm i

打开 App.tsx 试试 输入 req,  感受下端到端类型的快乐. 

如果想要第一张动图一样的效果,  复制下面的Models定义, 粘贴到 server/schema.prisma文件,

1. 重新初始化

node init-dev.mjs

2. 启动并打开文档页即可.

Models

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = "file:./dev.db"
}

model Category {
  id           Int    @id @default(autoincrement())
  categoryName String
  description  String

  products Product[]
}

model Product {
  id            Int    @id @default(autoincrement())
  productName   String
  description   String
  price         Float
  stockQuantity Int
  categoryId    Int 

  orderDetails OrderDetail[]

  category Category  @relation(fields: [categoryId], references: [id])
  Comment  Comment[]
}

model User {
  id          Int    @id @default(autoincrement())
  username    String
  password    String
  email       String
  address     String
  phoneNumber String

  orders  Order[]
  Comment Comment[]
}



model Order {
  id          Int      @id @default(autoincrement())
  orderDate   DateTime
  orderStatus String

  userId Int
  user   User @relation(fields: [userId], references: [id])

  orderDetails OrderDetail[]
  Payment      Payment[]
}

model OrderDetail {
  id        Int   @id @default(autoincrement())
  quantity  Int
  unitPrice Float

  orderId Int
  order   Order @relation(fields: [orderId], references: [id])

  productId Int
  product   Product @relation(fields: [productId], references: [id])
}

model Payment {
  id            Int      @id @default(autoincrement())
  amount        Float
  paymentDate   DateTime
  paymentStatus String

  orderId Int
  order   Order @relation(fields: [orderId], references: [id])
}

model Comment {
  id        Int      @id @default(autoincrement())
  text      String
  createdAt DateTime @default(now())

  userId Int
  user   User @relation(fields: [userId], references: [id])

  productId Int
  product   Product @relation(fields: [productId], references: [id])
}