4个版本 (重大更新)

0.5.0 2022年3月12日
0.4.0 2022年2月21日
0.2.0 2022年2月8日
0.1.0 2022年1月31日

#1437 in WebAssembly

每月 27次下载
用于 ts-bindgen

MIT/Apache

485KB
13K SLoC

ts-bindgen-gen ─ CI 最新版本 Rust文档 Crates.io

ts-bindgen-gen 包含了 TypeScript 解析和 Rust wasm-bindgen 绑定生成逻辑,用于 ts-bindgen.

有关ts-bindgen的使用信息,请参阅 ts-bindgen 文档在线沙盒仓库.

状态

ts-bindgen 目前是alpha软件,应该预计任何或所有以下内容都可能随着版本的更新而显著变化

  1. 生成的绑定
  2. 暴露的接口
  3. 内部实现

目前存在已知问题,这将阻止生成针对某些 TypeScript 习惯用法的合理绑定。

我们欢迎贡献和问题报告!

概述

总体流程是

  1. 解析 TypeScript 从 swc_ecma_ast 到我们的 基本ir
  2. 转换我们的基本中间表示(base ir)为平坦的中间表示(flattened ir),然后转换为目标增强的中间表示(target-enriched ir)。平坦的中间表示将TypeScript中内联且未命名的类型(例如,在interface { a: number | string })中的枚举“扁平化”为命名顶级类型,同时修复引用。目标增强的中间表示通过AST传播文件和命名空间上下文。
  3. 构建表示每个模块中的Rust模块和类型的模块定义层次结构。
  4. 生成我们的Rust绑定,通过遍历ModDef层次结构并生成proc_macro2::TokenStream

待办事项

  • 代码中有许多待办事项需要解决。
  • 我们应该生成更好的异步绑定
  • 我们还没有处理tsconfig中的typeRoots
  • 每个x.d.ts文件都有一个对应的x.js文件的隐含假设是不正确的 - 我们需要分别解决.js和.d.ts文件,并在生成的绑定中保留.js路径。
  • TypeScript模块和名称解析的问题(例如,在TypeScript模块中引用A.B应该查找所有祖先中的A.B,但实现中查找所有祖先中的B)。
  • 很少使用的TypeScript命名空间尚未得到妥善处理(它们应该在wasm-bindgen中产生js_namespace属性,并且需要特殊的打包处理才能工作,参见paperjs示例)。
  • 提高性能
  • 传递给js的函数在没有接口类型支持的情况下泄漏
  • 函数没有正确处理this参数

需要重构

  • 代码生成过于复杂,如果通过另一个ir转换遍历来将Rust代码转换为要生成的数据表示,然后从这个表示中更直接地生成TokenStream,将会更好。这将使例如,引用单个生成的名称而不是希望在不同位置重新生成相同的名称成为可能。
  • 自动为所有typescript测试用例生成绑定,并确保生成的绑定可以编译。
  • ir转换流水线可能需要像frunk::Generic这样的东西。

许可证

版权所有 2022 Adam Berger,Ratchet Designs。

ts-bindgen可以在MITApache许可证中选择一个。

致谢

ts-bindgen是由Ratchet Designs精心制作的。

依赖关系

~16–29MB
估计:~486K SLoC