{
  "rulesDirectory": [
    "./tools/tslint-rules/",
    "node_modules/codelyzer"
  ],
  "rules": {
    "max-line-length": [true, 100],
    // Disable this flag because of SHA tslint#48b0c597f9257712c7d1f04b55ed0aa60e333f6a
    // TSLint now shows warnings if types for properties are inferred. This rule needs to be
    // disabled because all properties need to have explicit types set to work for Dgeni.
    "no-inferrable-types": false,
    "class-name": true,
    "comment-format": [
      true,
      "check-space"
    ],
    "indent": [
      true,
      "spaces"
    ],
    "eofline": true,
    "no-duplicate-variable": true,
    "no-eval": true,
    "no-arg": true,
    "no-internal-module": true,
    "no-trailing-whitespace": true,
    "no-bitwise": true,
    "no-shadowed-variable": true,
    "no-unused-expression": true,
    "no-unused-variable": true,
    "no-var-keyword": true,
    "member-access": [true, "no-public"],
    "no-debugger": true,
    "one-line": [
      true,
      "check-catch",
      "check-else",
      "check-open-brace",
      "check-whitespace"
    ],
    "quotemark": [
      true,
      "single",
      "avoid-escape"
    ],
    "semicolon": true,
    "typedef-whitespace": [
      true,
      {
        "call-signature": "nospace",
        "index-signature": "nospace",
        "parameter": "nospace",
        "property-declaration": "nospace",
        "variable-declaration": "nospace"
      }
    ],
    "curly": true,
    "variable-name": [
      true,
      "ban-keywords",
      "check-format",
      "allow-leading-underscore"
    ],
    "whitespace": [
      true,
      "check-branch",
      "check-decl",
      "check-operator",
      "check-separator",
      "check-type",
      "check-preblock"
    ],
    // Bans jasmine helper functions that will prevent the CI from properly running tests.
    "ban": [
      true,
      ["fit"],
      ["fdescribe"],
      ["xit"],
      ["xdescribe"],
      {"name": "Object.assign", "message": "Use the spread operator instead."}
    ],
    // Avoids inconsistent linebreak styles in source files. Forces developers to use LF linebreaks.
    "linebreak-style": [true, "LF"],
    // Namespaces are not allowed, because of Closure compiler.
    "no-namespace": true,
    "jsdoc-format": [true, "check-multiline-start"],
    "no-duplicate-imports": true,
    "await-promise": true,

    // Codelyzer
    "template-banana-in-box": true,
    "contextual-lifecycle": true,
    "contextual-decorator": true,
    "no-output-on-prefix": true,
    "template-no-negated-async": true,
    "use-lifecycle-interface": true,

    // Custom Rules
    "ts-loader": true,
    "no-exposed-todo": true,
    "no-import-spacing": true,
    "no-private-getters": true,
    "no-undecorated-base-class-di": true,
    "setters-after-getters": true,
    "ng-on-changes-property-access": true,
    "rxjs-imports": true,
    "require-breaking-change-version": true,
    "no-host-decorator-in-concrete": [
      true,
      "HostBinding",
      "HostListener"
    ],
    "member-naming": [true, {
      "private": "^_"
    }],
    "validate-decorators": [true, {
      "Component": {
        "!host": "\\[class\\]",
        "!preserveWhitespaces": ".*",
        "!styles": ".*",
        "changeDetection": "\\.OnPush$",
        "encapsulation": "\\.None$",
        "moduleId": "^module\\.id$"
      },
      "Directive": {
        "!host": "\\[class\\]"
      },
      "NgModule": "^(?!\\s*$).+"
    }, "src/+(material|cdk|material-experimental|cdk-experimental)/**/!(*.spec).ts"],
    "require-license-banner": [
      true,
      "src/+(material|cdk|material-experimental|cdk-experimental|dev-app)/**/!(*.spec).ts"
    ],
    "missing-rollup-globals": [
      true,
      "./tools/package-tools/rollup-globals.ts",
      "src/+(material|cdk|material-examples|material-experimental|cdk-experimental)/!(schematics)**/*.ts"
    ],
    "file-name-casing": [true, {
      // Exclude custom lint rule files since they have to always be camel-cased and end
      // with "Rule".
      "\\w+Rule.ts": "camel-case",
      ".*": "kebab-case"
    }],
    "no-unescaped-html-tag": true
  },
  "linterOptions": {
    "exclude": [
      // Exclude the API golden files
      "tools/public_api_guard/**/*.d.ts",
      // Exclude schematic template files and test cases that can't be linted.
      "src/material/schematics/ng-generate/*/files/**/*",
      "src/cdk/schematics/ng-generate/*/files/**/*",
      "src/cdk/schematics/ng-update/test-cases/**/*",
      "src/material/schematics/ng-update/test-cases/**/*"
    ]
  }
}
