{
  "root": true,
  "overrides": [{
      "files": ["*.ts"],
      "plugins": [
        "simple-import-sort",
        "import",
        "jsdoc"
      ],
      "extends": [
        "plugin:jsdoc/recommended",
        "plugin:@angular-eslint/recommended",
        "airbnb-typescript/base"
      ],
      "parserOptions": {
        "project": "tsconfig.app.json",
        "createDefaultProgram": true
      },
      "rules": {
        "import/prefer-default-export": "off",
        "@typescript-eslint/member-delimiter-style": [
          "error",
          {
            "multiline": {
              "delimiter": "comma",
              "requireLast": true
            },
            "singleline": {
              "delimiter": "comma",
              "requireLast": false
            }
          }
        ],
        "@typescript-eslint/explicit-function-return-type": [
          "warn",
          {
            "allowExpressions": true,
            "allowTypedFunctionExpressions": true
          }
        ],
        "@typescript-eslint/no-empty-interface": "off",
        "@typescript-eslint/ban-ts-ignore": "off",
        "max-len": ["error", 150],
        "no-console": [
          "error",
          {
            "allow": [
              "warn",
              "error",
              "info"
            ]
          }
        ],
        "no-extend-native": "error",
        "import/no-cycle": "warn",
        "@angular-eslint/directive-selector": [
          "error",
          {
            "type": "attribute",
            "style": "camelCase"
          }
        ],
        "@angular-eslint/component-selector": [
          "error",
          {
            "type": "element",
            "style": "kebab-case"
          }
        ],
        "no-unused-expressions": "off",
        "@typescript-eslint/no-unused-expressions": [
          "error",
          {
            "allowTernary": true
          }
        ],
        "quotes": [
          "error",
          "single",
          {
            "allowTemplateLiterals": true
          }
        ],
        "linebreak-style": "off",
        "no-underscore-dangle": "off",
        "class-methods-use-this": "off",
        "import/no-extraneous-dependencies": [
          "error",
          {
            "devDependencies": true
          }
        ],
        "@typescript-eslint/unbound-method": [
          "error",
          {
            "ignoreStatic": true
          }
        ],
        "@typescript-eslint/no-explicit-any": "warn",
        "@typescript-eslint/member-ordering": [
          "error",
          {
            "default": [
              // Index signature
              "signature",
              // Fields
              "public-static-field",
              "protected-static-field",
              "private-static-field",
              "public-decorated-field",
              "protected-decorated-field",
              "private-decorated-field",
              "public-instance-field",
              "protected-instance-field",
              "private-instance-field",
              "public-abstract-field",
              "protected-abstract-field",
              "private-abstract-field",
              // Constructors
              "public-constructor",
              "protected-constructor",
              "private-constructor",
              // Methods
              "public-static-method",
              "protected-static-method",
              "private-static-method",
              "public-decorated-method",
              "protected-decorated-method",
              "private-decorated-method",
              "public-instance-method",
              "protected-instance-method",
              "private-instance-method",
              "public-abstract-method",
              "protected-abstract-method",
              "private-abstract-method"
            ]
          }
        ],
        "simple-import-sort/imports": "error",
        "simple-import-sort/exports": "error",
        "sort-imports": "off",
        "import/first": "error",
        "import/newline-after-import": "error",
        "import/no-duplicates": "error",
        "@typescript-eslint/explicit-member-accessibility": [
          "error",
          {
            "overrides": {
              "constructors": "no-public"
            }
          }
        ],
        "@typescript-eslint/naming-convention": [
          "warn",
          {
            "selector": "default",
            "format": [
              "camelCase"
            ]
          },
          {
            "selector": "variableLike",
            "format": [
              "camelCase"
            ]
          },
          {
            "selector": "variable",
            "format": [
              "camelCase",
              "UPPER_CASE"
            ],
            "leadingUnderscore": "allow"
          },
          {
            "selector": "parameter",
            "format": [
              "camelCase"
            ],
            "leadingUnderscore": "allow"
          },
          {
            "selector": "memberLike",
            "format": [
              "camelCase"
            ]
          },
          {
            "selector": "function",
            "format": [
              "camelCase",
              "PascalCase"
            ]
          },
          {
            "selector": "memberLike",
            "modifiers": [
              "private"
            ],
            "format": [
              "camelCase"
            ],
            "leadingUnderscore": "require"
          },
          {
            "selector": "memberLike",
            "modifiers": [
              "protected"
            ],
            "format": [
              "camelCase"
            ],
            "leadingUnderscore": "require"
          },
          {
            "selector": "typeLike",
            "format": [
              "PascalCase"
            ]
          },
          {
            "selector": "typeParameter",
            "format": [
              "PascalCase"
            ],
            "prefix": [
              "T"
            ]
          },
          {
            "selector": "interface",
            "format": [
              "PascalCase"
            ],
            "prefix": [
              "I"
            ]
          },
          {
            "selector": "enumMember",
            "format": [
              "PascalCase"
            ]
          }
        ],
        "no-unused-vars": "off",
        "@typescript-eslint/no-unused-vars": [
          "warn",
          {
            "varsIgnorePattern": "^_",
            "argsIgnorePattern": "^_"
          }
        ],
        "lines-between-class-members": "off",
        "@typescript-eslint/lines-between-class-members": [
          "error",
          "always"
        ],
        "arrow-body-style": "off",
        "jsdoc/require-param-type": "off",
        "jsdoc/require-returns-type": "off",
        "jsdoc/valid-types": "off",
        "jsdoc/check-types": "off"

      },
      "env": {
        "browser": true
      }
    },
    {
      "files": [
        "src/**/*.spec.ts",
        "src/**/*.d.ts",
        "e2e/**/*.e2e-spec.ts"
      ],
      "extends": [
        "plugin:jasmine/recommended"
      ],
      "parserOptions": {
        "project": "./tsconfig.spec.json"
      },
      "plugins": [
        "jasmine"
      ],
      "env": {
        "jasmine": true
      },
      "rules": {
        "@typescript-eslint/no-unused-vars": "off"
      }
    },
    {
      "files": [
        "*.component.html"
      ],
      "extends": [
        "plugin:@angular-eslint/template/recommended"
      ]
    },
    {
      "files": [
        "*.component.ts"
      ],
      "extends": [
        "plugin:@angular-eslint/template/process-inline-templates"
      ]
    }
  ]
}
