WHITESPACE = _{ WHITE_SPACE }
ident = @{ XID_START ~ XID_CONTINUE* }
union = { item ~ ("|" ~ item)* }
map = { "{" ~ "[" ~ "key" ~ ":" ~ key ~ "]" ~ ":" ~ expr ~ "}" }
object = { "{" ~ (ident ~ ":" ~ expr)? ~ ("," ~ ident ~ ":" ~ expr )* ~ "}" }
tuple = { "[" ~ expr ~ ("," ~ expr )* ~ "]" }
key = { "number" | "string" }
base_type = { "number" | "object" | "string" | "boolean" | "null" }
singleton = { object | map | tuple | base_type | "(" ~ union ~ ")" }
array = { "[]"* }
item = { singleton ~ array }
expr = { union | "(" ~ expr ~ ")" }
typescript = { SOI ~ expr ~ EOI }