typescript,thrift,protobuf

thrift RPC 定义文件转 d.ts 工具
安装(install): npm install dts-from-thrift -g
运行(exec):
``sh`for thrift
dts-from-thrift -p ~/git/my-thrift-repo/thrift -o ~/git/my-ts-repo/typingsfor pb
dts-from-protobuf -p ~/git/my-protobuf-repo/proto -o ~/git/my-ts-repo/typings
- 修复 thrift 中对注释处理的报错
- 修复 thrift 中关键字作为 struct 属性名出现的时,会报错的问题
- 新增 --reserved-word 支持关键字在 namespace 名称中出现时候的行为模式,error: 报错,escape: 转换成首字母大写。
- 修复 pb 生成的 enums.json 文件路径
- 修复 pb message 下的 enum 没有输出在 enums.json 中的问题 (#39 by @chengcyber)
- 修复 pb 变量名不能是 list 的 bug (#37 by @nameliuqi)
- 修复 thrift --bail 没效果的 bug
- pb 强制使用 protobuf.js 解析
- pb 文件中的 enum 没有在 message 中使用,也会在 enums.json 中生成,之前没有生成
- thrift 文件带下划线的 namespace 匹配错误问题
- pb 增加 --bail 参数,满足 idl 校验需求
- thrift 文件中单行注释包含 / 字符的文件注释会在替换成多行注释时,错误地闭合多行注释。现将所有单行注释中的 / 字符直接删掉
- 注释错位问题 fix
- 优化 thrift 文件生成的代码格式 (@mehwww in #22)
- protobuf 所有字段均为 optional,与 pb3 一致
- 删除 --new 传参,只保留 ast 解析
- 将行尾注释放到该行上面,使用 /* / 标注,以使得 vscode 可提示注释内容
- 修复 const enum 为空的报错 commit
- 老的 protobuf 转换类型逻辑受 1.0.0 功能影响,回滚老的代码逻辑
- 新增 --i64 参数
i64 转换成 string 或 Int64 对象(需要加 --new 参数)
`shell`
node ./bin/dts-from-[thrift|protobuf] -p ./test/idl/ \
-o ./test/idl/out/ \
--new --i64 string
- 新增 --enum-json 参数
把 thrift idl 中的 const 输出到 d.ts 和 enum.json 中,用于类型提示或者自定义 babel 插件(for byted-react-scripts)
默认输出在 enums.json 文件中
> 注意:d.ts 中的 const 在编译过程中并不会被转换。效果可以运行根目录下的 run.sh 来查看。
- 新增 --map 参数
支持 thrift idl 中的 map 输出到 Record
> 注意:Record 对于 key 的支持只有 number,string,symbol,所以 type_a 强制为 string。
栗子:
`shell`
node ./bin/dts-from-[thrift|protobuf] -p ./test/idl/ \
-o ./test/idl/out/ \
--new --i64 string --map
针对 struct 中的 field 是否是 optional 进行了梳理,详见test/thriftNew/readCode.test.ts line649 和下表,主要是针对/\w+Response/i和/\w+Request/i做了特殊处理,以符合实际的 idl 语义
| 是否可选 | requeird | 无(默认) | optional |
| ------------------------------------ | -------- | ------------- | -------- |
| \*response | false | false | true |
| \*response & defualt value | False | false | true |
| \request | false | false\|true\ | true |
| \*request & default value | false | true | true |
| Use-strict | false | true | true |
| No-use-strict | false | false | true |
| [^request\|response] & Default value | false | true | true |
"\*"表示需要标记strict-request开启,表示是业务定制
- 新增 --strict-response 传参
指定后如果 struct 名称包含 Response(例如:ListResponse),那么它的字段如果有 defaultValue 词缀,则此字段不会有 optional 标识
`ts
/*
struct CreateResponse {
255: optional i32 err_no (defaultValue=0);
}
*/
interface CreateResponse {
err_no: number; // 不指定的时候是 err_no?: number;
}
`
- dts-from-thrift 保留注释和注解
- dts-from-protobuf 旧逻辑没有适配 --i64_as_number 参数
- protobuf 如果没有 package,将尝试从 options 中取一个名称作为 namespace。如果没有 options,取文件路径为 namespace
- dts-from-protobuf 新增 --i64_as_number 参数,将 i64 降级为 number
- protobuf 如果没有 package,将跳过该文件,而非中断报错
- 新增 --new 参数,分别使用 protobufjs 解析 pb、使用 @creditkarma/thrift-parser 解析 thrift
- thrift Struct 字段如果定义了 defaultValue,生成的 dts 字段将带 ?
fields in thrift Struct with defaultValue will attach a ? when in d.ts file
- thrift i64 类型会被生成为 Int64 的接口类型。该接口定义在 tsHelper.d.ts 中
- 正确解析有多个形参的 service
parse service with multiple params currectly
- 正确解析单行 service 声明
parse single line service declaration currectly.
- typeof 泛型映射修复
typedef generic type fix
- 为 ${namespace}._Summary_ 接口增加了 WrapperService 推导函数。用来解决 i64 转 number 在 js 下需要特殊处理的问题。可以通过扩展 Int64Type 接口来实现自己的 i64 类型适配
Add a type inference wrapper function to process the i64 type. Extends the Int64Type interface for customization.
- dts-from-thrift 支持合并 service 到一个定义文件中
使用 --rpc-namespace=xxx 来指定需要合并到的 namespace 中,并且可以通过 ${namespace}._Summary_ 来获得一个总的 interface 用以继承
`javascript`
> dts-from-thrift -p ./ -o ../typings --rpc-namespace=demo.rpc
// 你输入的命令 (the Command you input)
> RPC d.ts files is /Users/xxx/projectpath/typings/demo.rpc-rpc.d.ts
// 生成的 rpc 定义文件 (the rpc definition file name)
使用 \_Summary 继承 rpc 接口 (use \_Summary to extends)
`typescript`
interface MyRPCContainer extends demo.rpc._Summary_ {}
- 修复 service 无形参接口的报错问题
fix service interfaces which are without input params
- thrift 现在支持生成 service RpcService {} 定义
(support service definition)
`typescript
// thrift sample
service RpcService {
ResponseType interface1 (1: RequestType req);
}
// generate code
export interface RpcService {
interface1(req: RequestType): Promise
}
`
- dts-from-protobuf 支持
(add dts-from-protobuf CLI, support protobuf)
dts-from-protobuf -p
- --use-tag CLI option,来支持下面的语法
(add a new option [--use-tag] to replace original fieldname with tagname)
`csharp
struct Foo {
1: list
}
// before 0.4.0
interface Foo {
comments: string[];
}
// after 0.4.0 with [--use-tag go]
interface Foo {
list: string[];
}
// detail in parseStruct.test.ts
`
- codestyle: 生成文件增加 // prettier-ignore 避免 format 导致的 git 提交
(add // prettier-ignore` at head of d.ts file to prevent useless git commit)