3 个版本
| 0.0.3 | 2024 年 8 月 9 日 |
|---|---|
| 0.0.2 | 2024 年 8 月 6 日 |
| 0.0.1 | 2024 年 7 月 27 日 |
#50 在 配置 中
367 每月下载量
185KB
5K SLoC
TiScript - 图灵不完整 TypeScript 作为配置语言

TiScript 是一种旨在对人类和机器都直观且易于使用的配置语言。它从 TypeScript 和 JSON 中汲取灵感,提供了两者的优势
- 可读性和可维护性 对人类而言,类似于 JSON。
- 受 TypeScript 启发,为机器提供了 类型安全性和结构。
TiScript 故意设计成 图灵不完整。这意味着它专注于定义配置,并不打算用于通用编程任务。然而,由于它是 TypeScript 的子集,您仍然可以利用 TypeScript 开发工具包中的语言服务等功能。
项目状态
这是一个正在进行中的项目。 当前实现是 MVP,并不打算在生产中使用。
示例
TiScript 定义(它是 TypeScript 的严格子集)
// editor_config.ts
const LF = "\x0A";
export const tabSize = 4;
export const trimTrailingWhitespace = true;
export const endOfLine = LF;
export const encoding = "utf-8";
目前,唯一的接口是一个名为 tiscript(1) 的命令(或 cargo run 在开发中)。
$ cargo run ./editor_config.ts
输出是
{
"tabSize": 4,
"trimTrailingWhitespace": true,
"endOfLine": "\n",
"encoding": "utf-8"
}
Rust API
此库实现了 serde 的反序列化器。
摘要
从文件中
use serde::{Deserialize, Serialize};
use tiscript::from_file;
// integrated to Serde
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct EditorConfig {
tabSize: i32,
trimTrailingWhitespace: bool,
endOfLine: String,
encoding: String,
}
fn main() {
let editorConfig: EditorConfig = from_file("./editor_config.ts").unwrap();
// or from_file_with_timeout(f, d) for untrusted code
println!("{:?}", editorConfig);
}
从内联代码中
use serde::{Deserialize, Serialize};
use tiscript::from_str;
// integrated to Serde
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct EditorConfig {
tabSize: i32,
trimTrailingWhitespace: bool,
endOfLine: String,
encoding: String,
}
fn main() {
let editorConfig: EditorConfig = from_str(r#"
const LF = "\x0A";
export const tabSize = 4;
export const trimTrailingWhitespace = true;
export const endOfLine = LF;
export const encoding = "utf-8";
"#).unwrap();
// or from_str_with_timeout(f, d) for untrusted code
println!("{:?}", editorConfig);
}
描述
待定
功能
这是一份计划实现或已实现的 ECMA-262 功能列表("[x]" 并不一定意味着它与 TypeScript 和 ECMA-262 完全兼容)
- shebang
- 行和块注释
-
export -
export default -
let -
const -
if和else -
undefined字面量 -
null字面量 -
boolean字面量 -
number字面量 -
string字面量 - 模板
string字面量 - 标记模板
字符串字面量 -
大整数字面量(实际上是64位整数) - 数组字面量
- 对象字面量
- 索引访问(
[0]和.[""foo""]) - 属性访问(
.foo) -
typeof操作符 - 算术运算符(
+、-、*、/、%、**) - 位运算符(
~、&、|、^、<<、>>、>>>) - 赋值运算符(
=、+=、-=、*=、/=、%=、**=、<<=、>>=、>>>=、&=、|=、^=) - 比较运算符(
==、!=、===、!==、<、>、<=、>=) - 递增和递减运算符(
++、--) - 三元运算符(
cond ? t : f) - 逻辑运算符(
&&、||、!) - 空值合并运算符(
??) - 空值条件运算符(
?.) - 对象扩展语法
- 数组扩展语法
-
class语句 -
for-of循环 - 具有限制的 C 风格
for循环 - 具有限制的
while循环 - 具有限制的
do-while循环 - 异常(
Error、try-catch-finally、throw等) - 时间模块
- 函数声明
- 箭头函数
- 函数调用
- 方法调用
- 使用
function关键字的函数声明 - 函数作为一等对象
- 生成器函数(
function*) - 函数有限递归调用
- 可选的分号(ASI)
- 静态
import - 动态
import -
Math类方法 -
Math类属性 -
String类方法 -
String实例方法 -
Number类方法 -
Number实例方法 -
TextEncoder -
Intl/ ECMA-402 -
atob和btoa
这是TypeScript计划或已实现的功能列表
-
type声明(但到目前为止没有做任何事情) -
any -
unknown -
never -
as类型断言 -
satisfies类型运算符 - 原始类型注解
- 字面量类型注解
- 联合类型注解
- 交集类型注解
- 元组类型注解
- 数组类型注解
- 对象类型注解
- 类型守卫
-
interface类型声明 -
type类型声明 -
typeof运算符在类型表达式中的使用 - 泛型
- null-assertion 运算符(后跟
!)
这是不会实现的功能列表
var声明eval函数new Function()RegExp和正则表达式运算符- 大多数运行时功能(例如,类型数组)
for-in循环async和awaitsymbol- true bigint
- 装饰器(只是因为规范太大)
enumconst enumnamespace- commonjs 特性
- 无严格特性
- 无限递归/循环
- 任何满足图灵完备性的东西
请注意,TiScript 识别但 TypeScript 编译器不识别的任何功能都是无效的,反之亦然。这是因为 TiScript 是 TypeScript 的严格子集。
开发
如果您想开发此项目,运行 UPDATE=1 cargo test 以自动在 spec/ 中生成 *.stdout 或 *.stderr 文件。
WebAssembly
此项目确保使用 CI 中的 --target=wasm32-wasi 构建。尽管如此,没有针对 WebAssembly 的测试。
类似作品
- JSON https://www.json.org/
- Jsonnet https://jsonnet.org/
- TySON https://github.com/jetify-com/tyson
作者
FUJI, Goro (gfx)。
此项目是 https://github.com/msakuta/ruscal 的分支,因此大部分代码来自它。
许可证
此项目根据 ISC 许可证授权 - 有关详细信息,请参阅 LICENSE 文件。
依赖项
~2–2.8MB
~52K SLoC