umi
umi copied to clipboard
[Task] Joi 迁移 Zod 流程
任务
- [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
复杂的 自定义参数不知道能不能解
目前的进度,只剩余 bundler-vite
内的 joi schema 需要迁移。
目前的进度,只剩余
bundler-vite
内的 joi schema 需要迁移。
之前迁移了 bundler-vite 后续发现 bundler-vite 并不会真正生效 pr 就没有提, 我找时间咋加上帮