{
    "title": "JSON schema for bsfmt.json configuration files",
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "indentStyle": {
            "type": "string",
            "enum": [
                "tabs",
                "spaces"
            ],
            "description": "The type of whitespace to use when indenting the beginning of lines. Has no effect if `formatIndent` is false"
        },
        "indentSpaceCount": {
            "type": "number",
            "description": "The number of spaces to use when indentStyle is 'spaces'. Has no effect if `formatIndent` is false",
            "default": 4
        },
        "formatIndent": {
            "type": "boolean",
            "default": true,
            "description": "If true, lines are indented based on what they are nested inside of. If false, all leading whitespace is left alone."
        },
        "keywordCase": {
            "type": "string",
            "enum": [
                "lower",
                "upper",
                "title",
                "original"
            ],
            "default": "lower",
            "description": "Replaces all keywords with the upper or lower case settings specified. `\"original\"` means they are not modified at all."
        },
        "typeCase": {
            "type": "string",
            "enum": [
                "lower",
                "upper",
                "title",
                "original"
            ],
            "default": "lower",
            "description": "Replaces all type keywords with the upper or lower case settings specified. `\"original\"` means they are not modified at all."
        },
        "compositeKeywords": {
            "type": "string",
            "enum": [
                "split",
                "combine",
                "original"
            ],
            "default": "split",
            "description": "Forces all composite keywords (i.e. 'elseif', 'endwhile', etc...) to be consistent. If 'split', they are split into their alternatives ('else if', 'end while'). If 'combine', they are combined ('elseif', 'endwhile'). If null, they are not modified."
        },
        "removeTrailingWhiteSpace": {
            "type": "boolean",
            "default": true,
            "description": "Removes all trailing whitespace at the end of each line."
        },
        "keywordCaseOverride": {
            "type": "object",
            "description": "Allows overriding case at the individual keyword level.\nExample {\"string\": \"title\"} would make string always lower case regardless of keywordCase",
            "properties": {
                "endfunction": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "endif": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "endsub": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "endwhile": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "exitwhile": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "exitfor": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "endfor": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "elseif": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "#elseif": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "#endif": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "endclass": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "endinterface": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "endnamespace": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "and": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "eval": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "if": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "then": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "else": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "for": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "to": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "step": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "exit": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "each": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "while": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "function": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "sub": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "as": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "return": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "print": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "goto": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "dim": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "stop": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "void": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "boolean": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "integer": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "longinteger": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "float": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "double": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "string": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "object": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "interface": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "invalid": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "dynamic": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "or": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "let": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "next": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "not": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "#if": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "#else": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "#const": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "class": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "namespace": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "import": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                }
            }
        },
        "typeCaseOverride": {
            "type": "object",
            "description": " Provides a way to override type keyword case at the individual TokenType level. Types are defined as keywords that are preceeded by an `as` token.",
            "properties": {
                "boolean": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "double": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "dynamic": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "float": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "function": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "integer": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "invalid": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "longinteger": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "object": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "string": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                },
                "void": {
                    "type": "string",
                    "enum": [
                        "lower",
                        "upper",
                        "title",
                        "original"
                    ]
                }
            }
        },
        "formatInteriorWhitespace": {
            "type": "boolean",
            "default": true,
            "description": "If true, all whitespace between items is reduced to exactly 1 space character,and certain keywords and operators are padded with whitespace (i.e. `1+1` becomes `1 + 1`)"
        },
        "insertSpaceBeforeFunctionParenthesis": {
            "type": "boolean",
            "default": false,
            "description": "If true, a space is inserted to the left of an opening function declaration parenthesis. (i.e. `function main ()` or `function ()`). If false, all spacing is removed (i.e. `function main()` or `function()`)."
        },
        "insertSpaceBetweenEmptyCurlyBraces": {
            "type": "boolean",
            "default": false,
            "description": "If true, empty curly braces will contain exactly 1 whitespace char (i.e. `{ }`). If false, there will be zero whitespace chars between empty curly braces (i.e. `{}`)"
        },
        "insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": {
            "type": "boolean",
            "default": true,
            "description": "if true, ensure exactly 1 space after leading and before trailing curly braces. If false, REMOVE all whitespace after leading and before trailing curly braces (excluding beginning-of-line indentation spacing)"
        },
        "insertSpaceBetweenAssociativeArrayLiteralKeyAndColon": {
            "type": "boolean",
            "default": false,
            "description": "If true, ensure exactly 1 space between an associative array literal key and its colon. If false, all space between the key and its colon will be removed"
        },
        "formatSingleLineCommentType": {
            "type": "string",
            "description": "Forces all single-line comments to use the same style",
            "enum": [
                "singlequote",
                "rem",
                "original"
            ]
        },
        "formatMultiLineObjectsAndArrays": {
            "type": "boolean",
            "default": true,
            "description": "if true, insert newlines and indents for multi-line objects and arrays."
        }
    }
}