{
    "defaultSeverity": "error",
    "extends": "tslint-config-airbnb",
    "jsRules": {},
    "rules": {
        "completed-docs": true,
        "align": [true, "parameters", "statements", "members", "elements"],
        "eofline": false,
        "function-name": false,
        "indent": [true, "space"],
        "ter-indent": [true, 4, { "SwitchCase": 1 }],
        "import-name": false,
        "variable-name": false,
        "naming-convention": [
            true,
            // forbid leading and trailing underscores and enforce camelCase on EVERY name. will be overridden by subtypes if needed
            {"type": "default", "format": "camelCase", "leadingUnderscore": "forbid", "trailingUnderscore": "forbid"},
            // require all global constants to be camelCase or UPPER_CASE
            // all other variables and functions still need to be camelCase
            {"type": "variable", "modifiers": ["global", "const"], "format": ["camelCase","UPPER_CASE"]},
            // override the above format option for exported constants to allow only UPPER_CASE
            {"type": "variable", "modifiers": ["export", "const"], "format": "UPPER_CASE"},
            // require exported constant variables that are initialized with functions to be camelCase
            {"type": "functionVariable", "modifiers": ["export", "const"], "format": "camelCase"},
            // allow leading underscores for unused parameters, because `tsc --noUnusedParameters` will not flag underscore prefixed parameters
            // all other rules (trailingUnderscore: forbid, format: camelCase) still apply
            {"type": "parameter", "modifiers": "unused", "leadingUnderscore": "allow"},
            // require leading underscores for private properties and methods, all other rules still apply
            {"type": "member", "modifiers": "private", "leadingUnderscore": "require"},
            {"type": "method", "modifiers": "private", "leadingUnderscore": "require"},
            // same for protected
            {"type": "member", "modifiers": "protected", "leadingUnderscore": "require"},
            // exclicitly disable the format check only for method toJSON
            {"type": "method", "filter": "^toJSON$", "format": null},
            // enforce UPPER_CASE for all public static readonly(!) properties
            {"type": "property", "modifiers": ["public", "static", "const"], "format": "UPPER_CASE"},
            // enforce PascalCase for classes, interfaces, enums, etc. Remember, there are still no underscores allowed.
            {"type": "type", "format": "PascalCase"},
            // interface names must start with "I". The following part of the name must be valid PascalCase
            {"type": "interface", "prefix": "I"},
            // generic type parameters must start with "T"
            // most of the time it will only be T, which is totally valid, because an empty string conforms to the PascalCase check
            // By convention T, U and V are used for generics. You could enforce that with "regex": "^[TUV]$" and if you are care that much for performance, you could disable every other check by setting a falsy value
            {"type": "genericTypeParameter", "prefix": "T"}
            // enum members must be in PascalCase. Without this config, enumMember would inherit UPPER_CASE from public static const property
            //{"type": "enumMember", "format": "PascalCase"}
        ],
        "triple-equals": [
            true,
            "allow-null-check"
        ],
        "trailing-comma": [
            true,
            {
                "multiline": {
                    "arrays": "never",
                    "functions": "never",
                    "typeLiterals": "never",
                    "objects": "always"
                }
            }
        ]
    },
    "rulesDirectory": []
}
