tscodegen 码
tscodegen 码 是一个最小的 类型脚本端口 脸书包 代码它提供流利的API 允许您从 : 代码,可选择可手动编辑的段落和篡改检测.
关键特性
-
生成文件中可手动编辑的段落 。 这种行为差不多了 和Hack Codegen惊人的一样 部分生成 文件。 。 。 . 与大多数其他代码生成工具不同,tscodegen(和Hack Codegen)是 能够生成可编辑的文件, 允许您的代码源输出轻松 量身定制和扩展,不给猴子打草惊蛇或子分类。 这些编辑 当代码被重新生成时将保留.
-
基于字符串的代码生成. 我们回避处理AST(例如: ts-morph 或 TypeScript 编译器 API),支持字符串操纵. 这样你就可以自然地写出生成的代码,不用知道 typeScript的AST的细节.
-
密码锁篡改检测。 将散列添加到每个块的多克块中 生成文件, 以方便检测外部已更改的文件 生成的手动部分。 将来,这可以 以 ESLint规则 (百分数) 欢迎.
-
没有模板文件 。 tscodegen 用途 模板 字节 和 TypeScript 方法调用,允许您使用循环和条件 无需学习另一种诱人的语言.
-
自动格式化为 Pretier, 使用您的工程的 Pretier 配置 . 生成的代码很少如此可读.
-
干净,流利,最小的API.
安装
npm install @elg/tscodegen prettier # NPM
yarn add @elg/tscodegen prettier # Yarn
使用量
import { CodeFile } from '@elg/tscodegen';- 证据
CodeFile。 。 。 . - 打电话
build以CodeBuilder举个例子. - 将已建文件写入磁盘
saveToFile。 。 。 .
样本
代码脚本
new CodeFile("./file.ts")
.build((builder) =>
builder
.addLine("import path from 'path';")
.addLine("import fs from 'fs'")
.addLine()
.addManualSection("custom_imports", (builder) => builder)
.addLine()
.addBlock("class Steam extends Water", (builder) =>
builder
.addBlock("constructor()", (builder) =>
builder.addLine("this.boil();"),
)
.addLine()
.addBlock("boil()", (b) =>
b.addManualSection("boil_body", (builder) =>
builder.add("this.temp = 100;"),
),
),
)
.format(),
)
.lock()
.saveToFile();
产出
/**
* This file is generated with manually editable sections. Only make
* modifications between BEGIN MANUAL SECTION and END MANUAL SECTION
* designators.
*
* @generated-editable Codelock<<jF8gPj9IVq16NXBAtEzJj0rrD9HR7Q6V>>
*/
import path from "path";
import fs from "fs";
/* BEGIN MANUAL SECTION custom_imports */
/* END MANUAL SECTION */
class Steam extends Water {
constructor() {
this.boil();
}
boil() {
/* BEGIN MANUAL SECTION boil_body */
new Magician().magic(); // This line was retrieved from the original file.ts
/* END MANUAL SECTION */
}
}
生成非 TypeScript 文件
默认, CodeFile 散发JSDoc/C型的Doc块和手动部分
标记。 传出 a commentSyntax 选项
支持行注释(例如). .gitattributes 与 # 评论, shell 脚本,
或一个 .ts 您喜欢的文件 // 文档块 :
export type CommentSyntax =
| { kind: "jsdoc" } // default — JSDoc/C-style
| { kind: "line"; prefix: string }; // e.g. "# " or "// "
示例 .gitattributes 生成器 :
new CodeFile(".gitattributes", {
commentSyntax: { kind: "line", prefix: "# " },
})
.build((b) =>
b
.addManualSection("manual", (m) => m.addLine("# add custom rules here"))
.addLine("path/to/generated.ts linguist-generated=true"),
)
.lock("\nTo update this file, run: npm run generate:gitattributes\n")
.saveToFile();
样本输出 :
# This file is generated with manually editable sections. Only make
# modifications between BEGIN MANUAL SECTION and END MANUAL SECTION
# designators.
#
# To update this file, run: npm run generate:gitattributes
#
# @generated-editable Codelock<<...>>
# BEGIN MANUAL SECTION manual
# add custom rules here
# END MANUAL SECTION
path/to/generated.ts linguist-generated=true
其他一切都一样: verify() 探测到在
手动部分, lock() 添加散列,以及 saveToFile() 写入
结果。 手动分割键仍然必须是非空和白空的.
生成缩进敏感语言( Python, YAML, Makefile,...)
对于缩进为同步的语言,使用 CodeBuilder.indent(amount, fn)
打开每个发射线(包括手动部分)的嵌入范围
标记和正文)的前缀为 amount缩进范围
添加: indent(" ", b => b.indent(" ", bb => …)) 生成四个空格
缩入.
new CodeFile("compute.py", { commentSyntax: { kind: "line", prefix: "# " } })
.build((b) =>
b
.addLine("def compute(x: int) -> int:")
.indent(" ", (fn) =>
fn
.addLine("result = x + 1")
.addManualSection("postprocess", (m) => m.addLine("return result")),
),
)
.lock()
.saveToFile();
输出 :
# This file is generated with manually editable sections. Only make
# modifications between BEGIN MANUAL SECTION and END MANUAL SECTION
# designators.
#
# @generated-editable Codelock<<...>>
def compute(x: int) -> int:
result = x + 1
# BEGIN MANUAL SECTION postprocess
return result
# END MANUAL SECTION
手动分会 整洁地穿过再生过程: 被储存的身体是 语义 (栏-0内容),构建者重新应用环境缩进 离开的路上。 因此,一个人谁编辑 一节,并添加行 匹配缩进 :
# BEGIN MANUAL SECTION postprocess
if result > 100:
raise ValueError(result)
return result
# END MANUAL SECTION
将在再生后看到其编辑内容保存的逐字记录,否
巢穴收缩的再转移 if编号 :raise 配对保持其4个空间
相对缩进).
indent() 接受任意字符串——通常是空格或 "\t" -所以也一样
覆盖 Makefile 食谱、 YAML 映射、 Terraform/ HCL 块、 INI 类
格式,或列位置关系的任何其他布局.
支持的文件类型 CommentSyntax
tscodegen将注释前缀视为不透明字符串,所以任何 语言,其注释适合支持的形状之一 那个盒子 下表列出共同目标的配置 文件类型.
| 文件类型 | CommentSyntax |
|---|---|
| 类型脚本 / Java 脚本 / TSX / JSX | { kind: "jsdoc" } (默认) |
| 去吧,鲁斯特,斯威夫特,克特林,爪哇 | { kind: "jsdoc" } |
| C, C++ 数据 | { kind: "jsdoc" } |
| CSS / SCSS / 低温 | { kind: "jsdoc" } |
| 普罗托布夫 | { kind: "jsdoc" } |
| TS/JS(首选线条评论) | { kind: "line", prefix: "// " } |
| 鲁比活佛 | { kind: "line", prefix: "# " } |
| 贝壳 / 巴什 / zsh | { kind: "line", prefix: "# " } |
| YAML, TOML 语言 | { kind: "line", prefix: "# " } |
多克档案, .env | { kind: "line", prefix: "# " } |
| 地平面 / HCL, 图QL | { kind: "line", prefix: "# " } |
| 创建文件 | { kind: "line", prefix: "# " } + 标签缩进 |
.gitattributes, (中文(简体) ), .gitignore | { kind: "line", prefix: "# " } |
| nginx.conf, 系统化单位 | { kind: "line", prefix: "# " } |
| SQL 组合键 | { kind: "line", prefix: "-- " } |
Python/YAML/Terraform/Makefile/SQL快照输入
src/__snapshots__/integration.test.ts.snap 是一个活的目录
每一个都会产生什么样的输出.
已知的限制
- JSON 没有评论语法,所以无法锁定。 如果你需要的话
生成 JSON 和其他文件, 要么释放一个同伴
元数据文件或使用 JSONC (
{ kind: "line", prefix: "// " }) (中文(简体) ). - XML / HTML / SVG / 马克下架 / Vue SFCs / MDX 使用情况
<!-- ... -->关闭注释, 无法在CommentSyntax。 。 。 . - Shebangs必须是一号线.
lock()预花它的多克块,所以 锁定 shell 脚本#!/usr/bin/env bash最终低于 医生 对于作为可执行文件引用的脚本,请在 锁上门或通过译员调用后自杀 直接说.