{
  "rulesDirectory": [
    "node_modules/tslint-misc-rules/rules",
    "node_modules/tslint-microsoft-contrib",
    "node_modules/tslint-eslint-rules/dist/rules"
  ],
  "extends": [
    "tslint:recommended",
    "tslint-microsoft-contrib",
    "tslint-eslint-rules",
    "tslint-config-prettier"
  ],
  "rules": {
    // -----
    // tslint-misc-rules
    // -----
    "prefer-es6-imports": true,
    "class-method-newlines": true,
    "prefer-or-operator-over-ternary": true,
    // -----
    // tslint-eslint-rules
    // -----
    "array-bracket-spacing": [
      true,
      "never"
    ],
    "block-spacing": [
      true,
      "always"
    ],
    "brace-style": [
      true,
      "1tbs",
      {
        "allowSingleLine": false
      }
    ],
    "ter-indent": [
      false, // TODO: Currently broken for switch cases
      2,
      {
        "SwitchCase": 0
      }
    ],
    // ter-max-len already handled by max-line-length rule
    "object-curly-spacing": [
      true,
      "always"
    ],
    "space-in-parens": [
      true,
      "never"
    ],
    "ter-arrow-body-style": [
      true,
      "always"
    ],
    "ter-arrow-parens": [
      true,
      "as-needed"
    ],
    "ter-arrow-spacing": [true],
    "ter-prefer-arrow-callback": [true],
    "no-constant-condition": true,
    "no-control-regex": true,
    "no-duplicate-switch-case": true,
    "no-empty-character-class": true,
    "no-ex-assign": true,
    "no-extra-boolean-cast": true,
    "no-extra-semi": true,
    "no-inner-declarations": [
      true,
      "both"
    ],
    "no-invalid-regexp": true,
    // no-irregular-whitespace handled by no-irregular-whitespace rule
    "no-regex-spaces": true,
    "no-unexpected-multiline": true,
    "valid-jsdoc": {
      "severity": "warning",
      "options": {
        "requireReturn": false,
        "prefer": {
          "arg": "param",
          "argument": "param",
          "class": "constructor",
          "return": "returns",
          "virtual": "abstract"
        },
        "requireParamType": false,
        "requireReturnType": false,
        "requireParamDescription": true,
        "requireReturnDescription": true
      }
    },
    // TODO: This rule is currently bugged and is thus disabled (https://github.com/palantir/tslint/issues/2430)
    "no-unnecessary-callback-wrapper": false,
    "no-multi-spaces": true,
    // -----
    // custom - various
    // -----
    "no-any": false,
    "no-unsafe-any": false,
    "completed-docs": false,
    "no-floating-promises": false,
    "no-void-expression": false,
    "no-console": [
      false
    ],
    "comment-format": [
      true,
      "check-space"
    ],
    "max-line-length": [
      true,
      120
    ],
    "member-ordering": [
      true,
      {
        "order": [
          "public-static-field",
          "protected-static-field",
          "private-static-field",
          "public-instance-field",
          "protected-instance-field",
          "private-instance-field",
          "constructor",
          "public-static-method",
          "protected-static-method",
          "private-static-method",
          "public-instance-method",
          "protected-instance-method",
          "private-instance-method"
        ]
      }
    ],
    "only-arrow-functions": [
      true,
      "allow-declarations"
    ],
    "typedef": [
      true,
      "call-signature",
      "parameter",
      "property-declaration",
      "variable-declaration",
      "member-variable-declaration"
    ],
    "typedef-whitespace": [
      true,
      {
        "call-signature": "nospace",
        "index-signature": "nospace",
        "parameter": "nospace",
        "property-declaration": "nospace",
        "variable-declaration": "nospace"
      },
      {
        "call-signature": "space",
        "index-signature": "space",
        "parameter": "space",
        "property-declaration": "space",
        "variable-declaration": "space"
      }
    ],
    "variable-name": [
      true,
      "ban-keywords",
      "check-format"
    ],
    "one-line": [
      true,
      "check-open-brace",
      "check-catch",
      "check-else",
      "check-finally",
      "check-whitespace"
    ],
    "interface-name": [
      true,
      "never-prefix"
    ],
    "no-import-side-effect": [true, {
      "ignore-pattern": "/rxjs.*/"
    }],
    "no-invalid-this": false,
    "no-parameter-properties": false,
    "promise-function-async": false,
    "no-submodule-imports": [true, "ava", "howler"],
    "no-parameter-reassignment": false,
    "switch-final-break": [true, "always"],
    // -----
    // custom - tslint-microsoft-contrib
    // -----
    "no-cookies": false,
    "no-relative-imports": false,
    "no-stateless-class": false,
    "export-name": false,
    "no-increment-decrement": false,
    "no-backbone-get-set-outside-model": false,
    "function-name": [
      true,
      {
        "method-regex": "^[a-z][\\w\\d]+$",
        "private-method-regex": "^[a-z][\\w\\d]+$",
        "static-method-regex": "^[a-z][\\w\\d]+$",
        "function-regex": "^[a-z][\\w\\d]+$"
      }
    ],
    "missing-jsdoc": {
      "severity": "warning"
    },
    "no-suspicious-comment": {
      "severity": "warning"
    }
  }
}
