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
和await
symbol
- true bigint
- 装饰器(只是因为规范太大)
enum
const enum
namespace
- 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