@ttsc/factory

@ttsc/factorypackages/factory,~16k TS LOC)是一个手写、零依赖的 TypeScript AST factory 与宽度感知 printer,用于源码生成。它是工作区里唯一一个独立发布、且导入 typescript 的库——这正是它存在的理由。

为什么存在

legacy(<= 6.x,JS 版)TypeScript 编译器通过 JS API 暴露 ts.factory.createXxxts.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

import factory, { SyntaxKind, TsPrinter, addSyntheticLeadingComment } from "@ttsc/factory";
导出作用
factory(默认导出)节点工厂,createXxx 镜像 legacy 签名与参数顺序
TsPrinter把工厂节点渲染成 TypeScript 源码文本
SyntaxKind / NodeFlagsoutline token & flag 枚举
addSyntheticLeadingComment 家族给节点附 // / /* */ 注释
Outline AST 类型ExpressionStatementTypeNodeNode

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.tsSyntaxKind/NodeFlags 枚举。

TsPrinter:宽度感知

TsPrinter 是直接实现(不是包 ts.Printer)的宽度感知 printer。像 Prettier:列表在 printWidth 内保持一行,超出就带尾逗号折断。

const printer = new TsPrinter({ printWidth: 80, indent: "  ", newLine: "\n" });
printer.print(node);            // 打印一个节点 (或 SourceFile)
printer.printNodes([a, b, c]);  // 打印多个, 换行连接
printer.printFile(undefined, st); // 组合并打印整个源文件

flat/break 决策与 lint 格式化器(lint 格式化器)共享理念但代码独立——一个是 Go 格式化用户源、一个是 TS 生成新源。

注释支持

addSyntheticLeadingComment 家族(src/comments.ts)用 legacy ts.addSyntheticLeadingComment 的形态附注释;printer 就地渲染,多行体随节点重缩进,让嵌套成员上的 JSDoc 保持对齐。配套:addSyntheticTrailingCommentget/setSyntheticLeadingCommentsget/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-legacynpm: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)。

接下来