{
  "defaultSeverity": "error",
  "extends": [
    "tslint:recommended",
    "tslint-etc"
  ],
  "jsRules": {},
  "rules": {
    "await-promise": [
      true,
      "PromisedAssertion"
    ],
    "ban": [
      true,
      {
        "name": [
          "Math",
          "hypot"
        ],
        "message": "Use Geometry.hypotenuse methods instead"
      }
    ],
    "no-return-await": true,
    "promise-function-async": true,
    "no-floating-promises": true,
    // Standard Rules ======================================================
    "max-line-length": [
      false
    ],
    "curly": [
      false,
      "ignore-same-line"
    ],
    "max-classes-per-file": false,
    "ordered-imports": [
      true,
      {
        "import-sources-order": "any",
        "named-imports-order": "case-insensitive"
      }
    ],
    "interface-name": [
      false
    ],
    "no-consecutive-blank-lines": true,
    // NOTE: This does not enforce that the correct number of spaces are used. See ter-indent.
    "indent": [
      true,
      "spaces",
      2
    ],
    "space-before-function-paren": [
      true,
      {
        "anonymous": "always",
        "named": "never",
        "asyncArrow": "always"
      }
    ],
    "variable-name": [
      true,
      "ban-keywords",
      "check-format",
      "allow-leading-underscore"
    ],
    "align": [
      true,
      "statements"
    ],
    "object-literal-sort-keys": false,
    "no-bitwise": false,
    "no-unused-expression": false,
    "no-unused-variable": true,
    "no-namespace": false,
    "one-variable-per-declaration": false,
    "no-empty": false,
    "no-switch-case-fall-through": true,
    "no-conditional-assignment": false,
    "no-duplicate-imports": true,
    "member-ordering": [
      false
    ],
    // Naming Rules ======================================================
    "naming-convention": [
      true,
      // allow leading and trailing underscores on everything. Will override for exceptions below.
      {
        "type": "default",
        "leadingUnderscore": "allow",
        "trailingUnderscore": "allow"
      },
      // forbid leading underscores on exported types
      {
        "type": "type",
        "modifiers": "export",
        "leadingUnderscore": "forbid"
      },
      // forbid leading underscores on public methods
      {
        "type": "method",
        "modifiers": "public",
        "leadingUnderscore": "forbid"
      },
      // forbid leading underscores on public properties
      {
        "type": "property",
        "modifiers": "public",
        "leadingUnderscore": "forbid"
      },
      // allow leading underscores on enum members
      {
        "type": "enumMember",
        "leadingUnderscore": "allow"
      },
      // require leading underscores on private properties
      {
        "type": "property",
        "modifiers": "private",
        "leadingUnderscore": "require"
      },
      // require leading underscores on protected properties
      {
        "type": "property",
        "modifiers": "protected",
        "leadingUnderscore": "require"
      },
      // require camelCase on all methods
      {
        "type": "method",
        "format": "camelCase"
      }
    ],
    // Rules from tslint-etc ===============================================
    "no-const-enum": {
      "options": [
        {
          "allowLocal": true
        }
      ],
      "severity": "error"
    },
    // Rules from tslint-eslint-rules ======================================
    // tslint's indent rule only enforces/fixes tabs vs spaces, not number of spaces.
    "ter-indent": [
      true,
      2,
      {
        "SwitchCase": 1
      }
    ],
    // Custom rules ========================================================
    "prefer-get": true,
    "no-direct-imports": true,
    "import-within-package": true,
    "require-basic-rpc-values": true,
    "deprecation": {
      "severity": "error"
    },
    "tslint-react-set-state-usage": [
      true,
      "allow-object"
    ]
  },
  "rulesDirectory": [
    "./tslint-rules/tslint-consistent-codestyle/rules",
    "./tslint-rules/tslint-react-set-state-usage/src/rules",
    "./tslint-rules/tslint-eslint-rules/dist/rules",
    "./tslint-rules"
  ]
}