{
  "rules": {
    /**
     * Security Rules. The following rules should be turned on because they find security issues
     * or are recommended in the Microsoft Secure Development Lifecycle (SDL)
     */
    "insecure-random": true,
    "no-banned-terms": false,
    "no-cookies": true,
    "no-delete-expression": true,
    "no-disable-auto-sanitization": true,
    "no-document-domain": true,
    "no-document-write": true,
    "no-eval": true,
    "no-exec-script": true,
    "no-function-constructor-with-string-args": true,
    "no-http-string": [true, "http://www.example.com/?.*", "http://www.examples.com/?.*"],
    "no-inner-html": true,
    "no-octal-literal": false,
    "no-reserved-keywords": false,
    "no-string-based-set-immediate": true,
    "no-string-based-set-interval": true,
    "no-string-based-set-timeout": true,
    "non-literal-require": true,
    "possible-timing-attack": false,
    "react-anchor-blank-noopener": true,
    "react-iframe-missing-sandbox": true,
    "react-no-dangerous-html": true,

    /**
     * Common Bugs and Correctness. The following rules should be turned on because they find
     * common bug patterns in the code or enforce type safety.
     */
    "await-promise": true,
    "forin": false,
    "jquery-deferred-must-complete": true,
    "label-position": true,
    "match-default-export-name": true,
    "mocha-avoid-only": false,
    "mocha-no-side-effect-code": false,
    "no-any": false,
    "no-arg": true,
    "no-backbone-get-set-outside-model": true,
    "no-bitwise": false,
    "no-conditional-assignment": false,
    "no-console": [true, "debug", "info", "log", "time", "timeEnd", "trace"],
    "no-constant-condition": false,
    "no-control-regex": true,
    "no-debugger": true,
    "no-duplicate-super": true,
    "no-duplicate-switch-case": true,
    "no-duplicate-variable": true,
    "no-empty": true,
    "no-floating-promises": true,
    "no-for-in-array": true,
    "no-implicit-dependencies": false,
    "no-import-side-effect": true,
    "no-increment-decrement": false,
    "no-invalid-regexp": true,
    "no-invalid-template-strings": true,
    "no-invalid-this": true,
    "no-jquery-raw-elements": true,
    "no-misused-new": true,
    "no-non-null-assertion": true,
    "no-object-literal-type-assertion": true,
    "no-parameter-reassignment": false,
    "no-reference-import": true,
    "no-regex-spaces": true,
    "no-sparse-arrays": true,
    "no-string-literal": true,
    "no-string-throw": true,
    "no-submodule-imports": false,
    "no-unnecessary-bind": true,
    "no-unnecessary-callback-wrapper": true,
    "no-unnecessary-initializer": true,
    "no-unnecessary-override": true,
    "no-unsafe-any": false,
    "no-unsafe-finally": true,
    "no-unused-expression": true,
    "no-use-before-declare": false,
    "no-with-statement": true,
    "promise-function-async": true,
    "promise-must-complete": true,
    "radix": true,
    "react-this-binding-issue": true,
    "react-unused-props-and-state": true,
    "restrict-plus-operands": false, // the plus operand should really only be used for strings and numbers
    "strict-boolean-expressions": [
      true,
      "allow-null-union",
      "allow-undefined-union",
      "allow-string",
      "allow-number",
      "allow-mix"
    ],
    "switch-default": true,
    "switch-final-break": true,
    "triple-equals": [true, "allow-null-check"],
    "use-isnan": true,
    "use-named-parameter": true,

    /**
     * Code Clarity. The following rules should be turned on because they make the code
     * generally more clear to the reader.
     */
    "adjacent-overload-signatures": true,
    "array-type": [true, "array"],
    "arrow-parens": false, // for simple functions the parens on arrow functions are not needed
    "ban-comma-operator": true, // possibly controversial
    "binary-expression-operand-order": false,
    "callable-types": true,
    "chai-prefer-contains-to-index-of": true,
    "chai-vague-errors": true,
    "class-name": false,
    "comment-format": true,
    "completed-docs": [true, "classes"],
    "export-name": false,
    "function-name": true,
    "import-name": true,
    "interface-name": false,
    "jsdoc-format": true,
    "max-classes-per-file": [false, 0], // we generally recommend making one public class per file
    "max-file-line-count": true,
    "max-func-body-length": false,
    "max-line-length": false,
    "member-access": true,
    "member-ordering": [true, { "order": "fields-first" }],
    "missing-jsdoc": false,
    "mocha-unneeded-done": true,
    "new-parens": true,
    "no-construct": true,
    "no-default-export": false,
    "no-duplicate-imports": true,
    "no-empty-interface": false,
    "no-for-in": false,
    "no-function-expression": true,
    "no-inferrable-types": false, // turn no-inferrable-types off in order to make the code consistent in its use of type decorations
    "no-multiline-string": false, // multiline-strings often introduce unnecessary whitespace into the string literals
    "no-null-keyword": false, // turn no-null-keyword off and use undefined to mean not initialized and null to mean without a value
    "no-parameter-properties": true,
    "no-redundant-jsdoc": true,
    "no-relative-imports": false,
    "no-require-imports": true,
    "no-return-await": true,
    "no-shadowed-variable": true,
    "no-suspicious-comment": true,
    "no-this-assignment": true,
    "no-typeof-undefined": true,
    "no-unnecessary-class": false,
    "no-unnecessary-field-initialization": true,
    "no-unnecessary-local-variable": true,
    "no-unnecessary-qualifier": true,
    "no-unnecessary-type-assertion": true,
    "no-unsupported-browser-code": true,
    "no-useless-files": true,
    "no-var-keyword": true,
    "no-var-requires": true,
    "no-void-expression": true,
    "number-literal-format": true,
    "object-literal-sort-keys": false, // turn object-literal-sort-keys off and sort keys in a meaningful manner
    "one-variable-per-declaration": false,
    "only-arrow-functions": false, // there are many valid reasons to declare a function
    "ordered-imports": false,
    "prefer-array-literal": true,
    "prefer-const": true,
    "prefer-for-of": false,
    "prefer-method-signature": true,
    "prefer-object-spread": true,
    "prefer-template": true,
    "type-literal-delimiter": true,
    "typedef": [
      true,
      "call-signature",
      //"arrow-call-signature",
      "parameter",
      //"arrow-parameter",
      "property-declaration",
      //"variable-declaration",
      "member-variable-declaration"
    ],
    "underscore-consistent-invocation": true,
    "unified-signatures": true,
    "use-default-type-parameter": true,
    "variable-name": [true, "ban-keywords", "check-format", "allow-leading-underscore"],

    /**
     * Accessibility. The following rules should be turned on to guarantee the best user
     * experience for keyboard and screen reader users.
     */
    "react-a11y-anchors": true,
    "react-a11y-aria-unsupported-elements": true,
    "react-a11y-event-has-role": true,
    "react-a11y-image-button-has-alt": true,
    "react-a11y-img-has-alt": true,
    "react-a11y-lang": true,
    "react-a11y-meta": true,
    "react-a11y-props": true,
    "react-a11y-proptypes": true,
    "react-a11y-role": true,
    "react-a11y-role-has-required-aria-props": true,
    "react-a11y-role-supports-aria-props": true,
    "react-a11y-tabindex-no-positive": true,
    "react-a11y-titles": true,

    /**
     * Whitespace related rules. The only recommended whitespace strategy is to pick a single format and
     * be consistent.
     */
    "align": [true, "parameters", "arguments", "statements"],
    "curly": false,
    "encoding": true,
    "eofline": false,
    "import-spacing": true,
    "indent": [true, "spaces"],
    "linebreak-style": true,
    "newline-before-return": false,
    "no-consecutive-blank-lines": true,
    "no-empty-line-after-opening-brace": false,
    "no-irregular-whitespace": true,
    "no-single-line-block-comment": false,
    "no-trailing-whitespace": true,
    "no-unnecessary-semicolons": true,
    "object-literal-key-quotes": [true, "consistent"],
    "one-line": [true, "check-open-brace", "check-catch", "check-else", "check-whitespace"],
    "quotemark": [true, "double"],
    "semicolon": [true, "always"],
    "space-within-parens": true,
    "trailing-comma": [false], // forcing trailing commas for multi-line
    // lists results in lists that are easier to reorder and version control diffs that are more clear.
    // Many teams like to have multiline be 'always'. There is no clear consensus on this rule but the
    // internal MS JavaScript coding standard does discourage it.
    "typedef-whitespace": false,
    "whitespace": [
      true,
      "check-branch",
      "check-decl",
      "check-operator",
      "check-module",
      "check-separator",
      "check-type"
    ],

    /**
     * Controversial/Configurable rules.
     */
    "ban": false, // only enable this if you have some code pattern that you want to ban
    "ban-types": true,
    "cyclomatic-complexity": false,
    "deprecation": false, // deprecated APIs are sometimes unavoidable
    "file-header": false, // enable this rule only if you are legally required to add a file header
    "import-blacklist": false, // enable and configure this as you desire
    "interface-over-type-literal": false, // there are plenty of reasons to prefer interfaces
    "no-angle-bracket-type-assertion": false, // pick either type-cast format and use it consistently
    "no-inferred-empty-object-type": false, // if the compiler is satisfied then this is probably not an issue
    "no-internal-module": false, // only enable this if you are not using internal modules
    "no-magic-numbers": false, // by default it will find too many false positives
    "no-mergeable-namespace": false, // your project may require mergeable namespaces
    "no-namespace": false, // only enable this if you are not using modules/namespaces
    "no-reference": true, // in general you should use a module system and not /// reference imports
    "no-unexternalized-strings": false, // the VS Code team has a specific localization process that this rule enforces
    "object-literal-shorthand": false, // object-literal-shorthand offers an abbreviation not an abstraction
    "prefer-conditional-expression": false, // unnecessarily strict
    "prefer-switch": false, // more of a style preference
    "prefer-type-cast": false, // pick either type-cast format and use it consistently
    "return-undefined": false, // this actually affect the readability of the code
    "space-before-function-paren": false, // turn this on if this is really your coding standard

    /**
     * Deprecated rules.  The following rules are deprecated for various reasons.
     */
    "missing-optional-annotation": false, // now supported by TypeScript compiler
    //"no-duplicate-case": true,
    "no-duplicate-parameter-names": false, // now supported by TypeScript compiler
    "no-empty-interfaces": false, // use tslint no-empty-interface rule instead
    "no-missing-visibility-modifiers": false, // use tslint member-access rule instead
    "no-multiple-var-decl": false, // use tslint one-variable-per-declaration rule instead
    //"no-stateless-class": true,
    "no-switch-case-fall-through": false, // now supported by TypeScript compiler
    //"no-var-self": true,
    "react-tsx-curly-spacing": true,
    "typeof-compare": false, // the valid-typeof rule is currently superior to this version
    "valid-typeof": true
  },
  "rulesDirectory": "node_modules/tslint-microsoft-contrib",
  "defaultSeverity": "warning"
}
