3 releases
| 0.0.3 | Aug 9, 2024 |
|---|---|
| 0.0.2 | Aug 6, 2024 |
| 0.0.1 | Jul 27, 2024 |
#1493 in Configuration
115 downloads per month
190KB
5K
SLoC
TiScript - Turing-Incomplete TypeScript as a Configuration Language

TiScript is a configuration language designed to be intuitive and easy for humans and machines. It draws inspiration from TypeScript and JSON, offering the benefits of both:
- Readability and maintainability for humans, similar to JSON.
- Type safety and structure for machines inspired by TypeScript.
TiScript is intentionally designed to be Turing incomplete. This means it focuses on defining configurations and is not intended for general programming tasks. However, since it's a subset of TypeScript, you can still leverage the TypeScript development toolkit for features like language services.
Project Status
This is a work in progress. The current implementation is MVP and not intended to be used in production.
Example
TiScript definition (it's strict subset of TypeScript):
// editor_config.ts
const LF = "\x0A";
export const tabSize = 4;
export const trimTrailingWhitespace = true;
export const endOfLine = LF;
export const encoding = "utf-8";
Currently, the only interface is a command called tiscript(1) (or cargo run on development).
$ cargo run ./editor_config.ts
the output is:
{
"tabSize": 4,
"trimTrailingWhitespace": true,
"endOfLine": "\n",
"encoding": "utf-8"
}
Rust API
This library implements serde's Deserializer.
Synopsis
From a file:
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);
}
From an inline code:
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);
}
Description
TBD
Features
This is a list of features in ECMA-262 that are planned or implemented ("[x]" does not necessarily mean it's 100% compatible with TypeScript and ECMA-262):
- shebang
- line and block comments
-
export -
export default -
let -
const -
ifandelse -
undefinedliterals -
nullliterals -
booleanliterals -
numberliterals -
stringliterals - template
stringliterals - tagged template
stringliterals -
bigintliterals (actually 64-bit int) - array literals
- object literals
- index access (
[0]and.["foo"]) - property access (
.foo) -
typeofoperator - arithmetic operators (
+,-,*,/,%,**) - bitwise operators (
~,&,|,^,<<,>>,>>>) - assignment operators (
=,+=,-=,*=,/=,%=,**=,<<=,>>=,>>>=,&=,|=,^=) - comparison operators (
==,!=,===,!==,<,>,<=,>=) - increment and decrement operators (
++,--) - ternary operator (
cond ? t : f) - logical operators (
&&,||,!) - nullish coalescing operator (
??) - null-conditional operator (
?.) - object spread syntax
- array spread syntax
-
classstatement -
for-ofloop - C-style
for(with restrictions) -
whileloop (with restrictions) -
do-whileloop (with restrictions) - exceptions (
Error,try-catch-finally,throwand so on) - temporal module
- function declaration
- arrow function
- function call
- method call
- function declaration with
functionkeyword - function as a first-class object
- generator function (
function*) - limited recursive calls of functions
- optional semicolons (ASI)
- static
import - dynamic
import -
Mathclass methods -
Mathclass properties -
Stringclass methods -
Stringinstance methods -
Numberclass methods -
Numberinstance methods -
TextEncoder -
Intl/ ECMA-402 -
atobandbtoa
This is a list of features in TypeScript that are planned or implemented:
-
import typestatement (but it does nothing so far) -
any -
unknown -
never -
astype assertion -
satisfiestype operator - primitive type annotations
- literal type annotations
- union type annotations
- intersection type annotations
- tuple type annotations
- array type annotations
- object type annotations
- type guards
-
interfacetype statement -
typetype statement -
typeofoperator in type expressions - generics
- null-assertion operator (trailing
!)
This is a list of features that won't be implemented:
vardeclarationevalfunctionnew Function()RegExpand regular expression operators- Most of runtime (e.g. typed arrays)
for-inloopasyncandawaitsymbol- true bigint
- decorators (just because the spec is too large)
enumconst enumnamespace- commonjs features
- no strict features
- unlimited recursion / loop
- anything that meets Turing completeness
Note that any features TiScript recognizes, but TypeScript compiler does not are invalid, but not vice versa. This is because TiScript is a strict subset of TypeScript.
Development
If you'd like to develop this project, run UPDATE=1 cargo test to automatically generates *.stdout or *.stderr files in spec/.
WebAssembly
This project is ensured to be built with --target=wasm32-wasi in CI. There's no test for WebAssembly though.
Similar Works
- JSON https://www.json.org/
- Jsonnet https://jsonnet.org/
- TySON https://github.com/jetify-com/tyson
Authors
FUJI, Goro (gfx).
This project a fork of https://github.com/msakuta/ruscal, and thus much of the code comes from it.
License
This project is licensed under the ISC License - see the LICENSE file for details.
Dependencies
~2–2.9MB
~54K SLoC