{
"$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
"name": "caddy",
"rules": {
"source_file": {
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "server"
},
{
"type": "SYMBOL",
"name": "global_options"
},
{
"type": "SYMBOL",
"name": "named_route"
},
{
"type": "SYMBOL",
"name": "snippet"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "import"
},
"named": true,
"value": "directive"
}
]
}
},
"comment": {
"type": "PREC_LEFT",
"value": 0,
"content": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "#"
},
{
"type": "PATTERN",
"value": ".*"
}
]
}
}
},
"_body": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "block"
},
{
"type": "SYMBOL",
"name": "directive"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "sblock"
},
"named": true,
"value": "block_variable"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "import"
},
"named": true,
"value": "directive"
}
]
}
},
"block": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "SYMBOL",
"name": "_newline"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_body"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "}"
}
]
},
"named_route": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "route"
},
{
"type": "SYMBOL",
"name": "block"
}
]
},
"route": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "&("
},
{
"type": "SYMBOL",
"name": "_word"
},
{
"type": "STRING",
"value": ")"
}
]
},
"global_options": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "SYMBOL",
"name": "_newline"
},
{
"type": "REPEAT1",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "directive"
},
"named": true,
"value": "option"
}
},
{
"type": "STRING",
"value": "}"
}
]
},
"argv": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{args["
},
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
},
{
"type": "STRING",
"value": "]}"
}
]
}
},
"sblock": {
"type": "TOKEN",
"content": {
"type": "STRING",
"value": "{block}"
}
},
"snippet": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "snippet_name"
},
{
"type": "SYMBOL",
"name": "block"
}
]
},
"snippet_name": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "SYMBOL",
"name": "_word"
},
{
"type": "STRING",
"value": ")"
}
]
},
"import": {
"type": "PREC",
"value": 2,
"content": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "STRING",
"value": "import"
},
"named": true,
"value": "keyword"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "block"
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_attribute_value"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "PATTERN",
"value": "\\s"
},
{
"type": "SYMBOL",
"name": "_attribute_value"
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "\\s"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "block"
}
]
},
{
"type": "BLANK"
}
]
}
]
}
]
},
{
"type": "SYMBOL",
"name": "_newline"
}
]
}
},
"server": {
"type": "SEQ",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "address"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_port"
},
"named": true,
"value": "address"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_protocol"
},
"named": true,
"value": "address"
},
{
"type": "SYMBOL",
"name": "env"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_newline"
},
{
"type": "BLANK"
}
]
}
]
}
},
{
"type": "SYMBOL",
"name": "block"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_newline"
},
{
"type": "BLANK"
}
]
}
]
},
"_attribute_value": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "placeholder"
},
{
"type": "SYMBOL",
"name": "string_literal"
},
{
"type": "SYMBOL",
"name": "numeric_literal"
},
{
"type": "SYMBOL",
"name": "ip_literal"
},
{
"type": "SYMBOL",
"name": "quoted_string_literal"
},
{
"type": "SYMBOL",
"name": "env"
},
{
"type": "SYMBOL",
"name": "argv"
},
{
"type": "SYMBOL",
"name": "time"
},
{
"type": "SYMBOL",
"name": "size"
},
{
"type": "SYMBOL",
"name": "boolean"
},
{
"type": "SYMBOL",
"name": "auto"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "random_value"
},
"named": true,
"value": "value"
}
]
},
"_attribute": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "matcher"
},
{
"type": "ALIAS",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_word"
},
{
"type": "STRING",
"value": "''"
}
]
},
"named": true,
"value": "keyword"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "block"
},
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_attribute_value"
},
{
"type": "SYMBOL",
"name": "matcher"
}
]
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "PATTERN",
"value": "\\s"
},
{
"type": "SYMBOL",
"name": "_attribute_value"
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "\\s"
},
{
"type": "BLANK"
}
]
},
{
"type": "SYMBOL",
"name": "block"
}
]
},
{
"type": "BLANK"
}
]
}
]
}
]
},
{
"type": "SYMBOL",
"name": "_newline"
}
]
},
"_function": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_word"
},
"named": true,
"value": "keyword"
},
{
"type": "SYMBOL",
"name": "_newline"
}
]
},
"directive": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_attribute"
},
{
"type": "SYMBOL",
"name": "_function"
}
]
},
"_wildcard": {
"type": "STRING",
"value": "*"
},
"_at": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "@"
},
{
"type": "SYMBOL",
"name": "_word"
}
]
},
"_path": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "/"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[0-9]"
},
{
"type": "PATTERN",
"value": "\\p{L}",
"flags": "u"
},
{
"type": "STRING",
"value": "/"
},
{
"type": "STRING",
"value": "."
},
{
"type": "STRING",
"value": "-"
},
{
"type": "STRING",
"value": "_"
},
{
"type": "STRING",
"value": "*"
}
]
}
}
]
}
},
"matcher": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_wildcard"
},
{
"type": "SYMBOL",
"name": "_at"
},
{
"type": "SYMBOL",
"name": "_path"
}
]
},
"random_value": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": -1,
"content": {
"type": "PATTERN",
"value": "[^\\s]*"
}
}
},
"time": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
},
{
"type": "PATTERN",
"value": "(ms|s|m|h|d|w|M|y)"
}
]
}
},
"size": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
},
{
"type": "PATTERN",
"value": "[mkgMKG][ibB]*"
}
]
}
},
"on": {
"type": "STRING",
"value": "on"
},
"off": {
"type": "STRING",
"value": "off"
},
"boolean": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "on"
},
{
"type": "SYMBOL",
"name": "off"
}
]
},
"auto": {
"type": "STRING",
"value": "auto"
},
"quoted_string_literal": {
"type": "PREC_RIGHT",
"value": 0,
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "`"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "placeholder"
},
{
"type": "SYMBOL",
"name": "argv"
},
{
"type": "PATTERN",
"value": "[^`]|(\\\\\\`)"
}
]
}
},
{
"type": "STRING",
"value": "`"
}
]
}
},
"string_literal": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "\""
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "placeholder"
},
{
"type": "SYMBOL",
"name": "argv"
},
{
"type": "PATTERN",
"value": "[^\"]|(\\\\\\\")"
}
]
}
},
{
"type": "STRING",
"value": "\""
}
]
},
"placeholder": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "\\p{L}",
"flags": "u"
},
{
"type": "PATTERN",
"value": "[0-9]"
},
{
"type": "STRING",
"value": "."
},
{
"type": "STRING",
"value": "_"
},
{
"type": "STRING",
"value": "*"
}
]
}
},
{
"type": "STRING",
"value": "}"
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_expressions"
},
{
"type": "BLANK"
}
]
}
]
},
"_expressions": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "."
},
{
"type": "SYMBOL",
"name": "_word"
},
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "string_literal"
},
{
"type": "SYMBOL",
"name": "boolean"
},
{
"type": "SYMBOL",
"name": "numeric_literal"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
"ip_literal": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
},
{
"type": "REPEAT1",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "."
},
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "/"
},
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ":"
},
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
}
]
},
{
"type": "BLANK"
}
]
}
]
}
},
"numeric_literal": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "."
},
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "e"
},
{
"type": "STRING",
"value": "E"
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "+"
},
{
"type": "STRING",
"value": "-"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
}
]
},
{
"type": "BLANK"
}
]
}
]
}
},
"_word": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "PATTERN",
"value": "\\p{L}",
"flags": "u"
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "\\p{L}",
"flags": "u"
},
{
"type": "PATTERN",
"value": "[0-9]"
},
{
"type": "STRING",
"value": "-"
},
{
"type": "STRING",
"value": "_"
}
]
}
}
]
}
},
"env": {
"type": "TOKEN",
"content": {
"type": "PREC",
"value": 2,
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "$"
},
{
"type": "STRING",
"value": "env."
}
]
},
{
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[A-Z]"
},
{
"type": "STRING",
"value": "_"
}
]
},
{
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[A-Z]"
},
{
"type": "PATTERN",
"value": "[0-9]"
},
{
"type": "STRING",
"value": "_"
}
]
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ":"
},
{
"type": "STRING",
"value": "localhost"
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "}"
}
]
}
}
},
"address": {
"type": "TOKEN",
"content": {
"type": "PATTERN",
"value": "(https?:\\/\\/)?\\*?[0-9a-zA-Z.-]+(:[0-9]+)?"
}
},
"_protocol": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "http:"
},
{
"type": "STRING",
"value": "https:"
}
]
},
{
"type": "STRING",
"value": "//"
}
]
}
},
"_port": {
"type": "TOKEN",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ":"
},
{
"type": "REPEAT1",
"content": {
"type": "PATTERN",
"value": "[0-9]"
}
}
]
}
}
},
"extras": [
{
"type": "PATTERN",
"value": "\\s"
},
{
"type": "SYMBOL",
"name": "comment"
}
],
"conflicts": [],
"precedences": [],
"externals": [
{
"type": "SYMBOL",
"name": "_newline"
},
{
"type": "SYMBOL",
"name": "_indent"
},
{
"type": "SYMBOL",
"name": "_dedent"
}
],
"inline": [],
"supertypes": [],
"reserved": {}
}