@ttsc/factory
@ttsc/factory(packages/factory,~16k TS LOC)是一个手写、零依赖的 TypeScript AST factory 与宽度感知 printer,用于源码生成。它是工作区里唯一一个独立发布、且不导入 typescript 的库——这正是它存在的理由。
为什么存在
legacy(<= 6.x,JS 版)TypeScript 编译器通过 JS API 暴露 ts.factory.createXxx 与 ts.createPrinter(),基于 AST 的代码生成工具建在它上面。一旦项目迁到 TypeScript-Go(tsgo,>= 7.x) 原生编译器,那套 JS ts.factory/ts.Printer API 没了——建在它上的代码生成就断了。
@ttsc/factory 把这个能力不导入 typescript 地保活:factory 与 printer 直接重新实现,包零依赖,无论项目其余部分用哪个编译器构建都能工作(README,packages/factory/README.md)。
注意:它目前是独立发布库,工作区里还没有别的包依赖它(.codex/skills/project/SKILL.md)。它是为 tsgo 迁移幸存的代码生成基础设施而生。
公共 API
createXxx 方法镜像 legacy ts.factory 的名字与参数顺序,返回具体、完整类型的 outline AST 节点(各带 kind 判别)。
源码结构
src/ast/:outline AST 节点类型,按种类分目录(types/、names/、表达式、语句等)。src/factory/:createXxx构造器。src/TsPrinter.ts+src/internal/doc.ts:宽度感知 printer,用 doc 模型(类似 Prettier 的 doc IR)。src/comments.ts:合成注释(leading/trailing)。src/syntax.ts:SyntaxKind/NodeFlags枚举。
TsPrinter:宽度感知
TsPrinter 是直接实现(不是包 ts.Printer)的宽度感知 printer。像 Prettier:列表在 printWidth 内保持一行,超出就带尾逗号折断。
flat/break 决策与 lint 格式化器(lint 格式化器)共享理念但代码独立——一个是 Go 格式化用户源、一个是 TS 生成新源。
注释支持
addSyntheticLeadingComment 家族(src/comments.ts)用 legacy ts.addSyntheticLeadingComment 的形态附注释;printer 就地渲染,多行体随节点重缩进,让嵌套成员上的 JSDoc 保持对齐。配套:addSyntheticTrailingComment、get/setSyntheticLeadingComments、get/setSyntheticTrailingComments。
覆盖面与扩展
factory + printer 覆盖代码生成最常用的构造:标识符、字面量、常见表达式、类型(keyword/reference/union/intersection/array/tuple/type-literal/function/operator…)、语句、class & interface、enum、function & arrow、import/export。扩展容易(README 末尾):在 src/ast/ 加节点、在 src/factory/ 加构造器、给 printer 加一个 case。
测试:奇偶校验 oracle
factory 用 legacy TypeScript(catalog 的 ts-legacy,npm:typescript@~6.0.3)作奇偶校验 oracle——把 @ttsc/factory 的输出与 legacy ts.factory+ts.Printer 对比,保证签名与打印一致。这是 pnpm-workspace.yaml 保留 ts-legacy 别名的原因之一。
不变量
- 永不 import
typescript(零依赖是卖点)。 createXxx镜像 legacy 签名与参数顺序(迁移无摩擦)。- printer 是直接实现,不包
ts.Printer。
维护者提示
- 加节点支持:
src/ast/加类型 +src/factory/加构造器 + printer 加 case,三处齐。 - 别引入
typescript依赖——会破坏 tsgo 时代的可用性。 - 测试用 oracle 派生期望(legacy ts),不要用代码自己的输出做快照(
.codex/skills/development/SKILL.md)。