umi icon indicating copy to clipboard operation
umi copied to clipboard

[Task] Joi 迁移 Zod 流程

Open fz6m opened this issue 1 year ago • 3 comments

任务

  • [x] PR #10722 完成了所有 preset-umi/src/features/* 的 zod 迁移,并支持了 zod2ts 生成 ts 类型。

下一步

  • [ ] bundler-vite
  • [x] bundler-webpack
  • [x] core
  • [x] plugin-run
  • [x] plugins
  • [x] preset-umi/{src, fixtures}
  • [x] preset-vue

迁移方法:搜索 joi. ,以全代码仓库搜索不到 joi. 为基准迁移结束。

zod2ts 加强

深层 comment 生成

目前不支持深层的 zod.describe() ,如:

  zod.array(
    zod.union([
      zod.object({
        key: zod.string().describe('some comment')
      })
    ])
  )

期望支持这种场景,从而增加更多 describe ,type 就是文档,更加直观,减少用户询问次数。

自定义类型

循环引用不可避免,比如 routes 的类型,目前采用了 replace 比较 hack 的方式实现,但不优雅。

目前 zod 支持的是通过 zod.lazy() 做到自身循环引用,比如:

const schema = zod.array(zod.lazy(() => schema))

将得到:

type ISchema = ISchema[]

此处 lazy 处会被循环引用到本身。

但我们的场景中,期望的是一个 type 里引用另一个 type ,比如以下理想的 api (预期的):

const routeSchema = zod.array(...)

// 先生成 route 的类型,叫 IRoute
printNode(zodToTs(routeSchema, 'IRoute').node)

const allSchema = zod.object(...)

printNode(zodToTs(allSchema, 'IAllType', {
  // 这个选项,可以让生成的结果中,routes 的 type 使用字符串的 `IRoute`
  specifiedKeysLiteralType: {
     routes: 'IRoute'
  }
}).node)

将得到:

interface IRoute { 
  // ...
  routes: IRoute // ← 这是 zod 已经支持的,自己引用自己
}

interface IAllType {
  // ...
  routes: IRoute
}

召唤

cc @xiaohuoni

cc @xierenyuan

cc @sorrycc

fz6m avatar Mar 13 '23 13:03 fz6m

复杂的 自定义参数不知道能不能解 image

xierenyuan avatar Mar 14 '23 02:03 xierenyuan

目前的进度,只剩余 bundler-vite 内的 joi schema 需要迁移。

fz6m avatar Apr 17 '23 12:04 fz6m

目前的进度,只剩余 bundler-vite 内的 joi schema 需要迁移。

之前迁移了 bundler-vite 后续发现 bundler-vite 并不会真正生效 pr 就没有提, 我找时间咋加上帮

xierenyuan avatar Apr 23 '23 12:04 xierenyuan