3 个版本

0.0.3 2024 年 8 月 9 日
0.0.2 2024 年 8 月 6 日
0.0.1 2024 年 7 月 27 日

#50配置

Download history 98/week @ 2024-07-22 39/week @ 2024-07-29 217/week @ 2024-08-05 13/week @ 2024-08-12

367 每月下载量

自定义许可

185KB
5K SLoC

TiScript - 图灵不完整 TypeScript 作为配置语言 crates.io CI

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
  • ifelse
  • undefined 字面量
  • null 字面量
  • boolean 字面量
  • number 字面量
  • string 字面量
  • 模板 string 字面量
  • 标记模板 字符串 字面量
  • 大整数 字面量(实际上是64位整数)
  • 数组字面量
  • 对象字面量
  • 索引访问([0].[""foo""]
  • 属性访问(.foo
  • typeof 操作符
  • 算术运算符(+-*/%**
  • 位运算符(~&|^<<>>>>>
  • 赋值运算符(=+=-=*=/=%=**=<<=>>=>>>=&=|=^=
  • 比较运算符(==!====!==<><=>=
  • 递增和递减运算符(++--
  • 三元运算符(cond ? t : f
  • 逻辑运算符(&&||!
  • 空值合并运算符(??
  • 空值条件运算符(?.
  • 对象扩展语法
  • 数组扩展语法
  • class 语句
  • for-of 循环
  • 具有限制的 C 风格 for 循环
  • 具有限制的 while 循环
  • 具有限制的 do-while 循环
  • 异常(Errortry-catch-finallythrow 等)
  • 时间模块
  • 函数声明
  • 箭头函数
  • 函数调用
  • 方法调用
  • 使用 function 关键字的函数声明
  • 函数作为一等对象
  • 生成器函数(function*
  • 函数有限递归调用
  • 可选的分号(ASI)
  • 静态 import
  • 动态 import
  • Math 类方法
  • Math 类属性
  • String 类方法
  • String 实例方法
  • Number 类方法
  • Number 实例方法
  • TextEncoder
  • Intl / ECMA-402
  • atobbtoa

这是TypeScript计划或已实现的功能列表

  • type 声明(但到目前为止没有做任何事情)
  • any
  • unknown
  • never
  • as 类型断言
  • satisfies 类型运算符
  • 原始类型注解
  • 字面量类型注解
  • 联合类型注解
  • 交集类型注解
  • 元组类型注解
  • 数组类型注解
  • 对象类型注解
  • 类型守卫
  • interface 类型声明
  • type 类型声明
  • typeof 运算符在类型表达式中的使用
  • 泛型
  • null-assertion 运算符(后跟 !

这是不会实现的功能列表

  • var 声明
  • eval 函数
  • new Function()
  • RegExp 和正则表达式运算符
  • 大多数运行时功能(例如,类型数组)
  • for-in 循环
  • asyncawait
  • 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 的测试。

类似作品

作者

FUJI, Goro (gfx)。

此项目是 https://github.com/msakuta/ruscal 的分支,因此大部分代码来自它。

许可证

此项目根据 ISC 许可证授权 - 有关详细信息,请参阅 LICENSE 文件。

依赖项

~2–2.8MB
~52K SLoC