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.
This is a work in progress. The current implementation is MVP and not intended to be used in production.
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.tsthe output is:
{
"tabSize": 4,
"trimTrailingWhitespace": true,
"endOfLine": "\n",
"encoding": "utf-8"
}This library implements serde's Deserializer.
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);
}TBD
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.
If you'd like to develop this project, run UPDATE=1 cargo test to automatically generates *.stdout or *.stderr files in spec/.
This project is ensured to be built with --target=wasm32-wasi in CI. There's no test for WebAssembly though.
- JSON https://www.json.org/
- Jsonnet https://jsonnet.org/
- TySON https://github.com/jetify-com/tyson
FUJI, Goro (gfx).
This project a fork of https://github.com/msakuta/ruscal, and thus much of the code comes from it.
This project is licensed under the ISC License - see the LICENSE file for details.