{
  "root": true,
  "parser": "@typescript-eslint/parser",
  "env": {
    "node": true,
    "browser": true
  },
  "plugins": [
    "@typescript-eslint",
    "unused-imports"
  ],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:svelte/recommended",
    "plugin:import/recommended",
    "plugin:import/typescript"
  ],
  "settings": {
    "import/parsers": {
      "@typescript-eslint/parser": [
        ".ts",
        ".tsx"
      ]
    },
    "import/resolver": {
      "typescript": {
        "alwaysTryTypes": true,
        // always try to resolve types under `<root>@types` directory even it doesn't contain any source code, like `@types/unist`
        "project": "./tsconfig.json"
      }
    }
  },
  "parserOptions": {
    "sourceType": "module",
    "extraFileExtensions": [
      ".svelte"
    ]
  },
  "overrides": [
    {
      "files": [
        "*.svelte"
      ],
      "parser": "svelte-eslint-parser",
      "parserOptions": {
        "parser": "@typescript-eslint/parser"
      }
    }
  ],
  "rules": {
    "no-param-reassign": "error",
    "no-constant-condition": [
      "error",
      {
        "checkLoops": false
      }
    ],
    // todo: Reenable once https://github.com/import-js/eslint-plugin-import/issues/1479 is fixed.
    "import/no-duplicates": "off",
    "svelte/valid-compile": "off",
    "no-unused-vars": "off",
    "@typescript-eslint/no-unused-vars": [
      "error",
      {
        "args": "none"
      }
    ],
    "@typescript-eslint/ban-ts-comment": "off",
    "@typescript-eslint/no-empty-function": "off",
    "no-prototype-builtins": "off",
    "svelte/sort-attributes": "warn",
    "import/order": [
      "warn",
      {
        "alphabetize": {
          "order": "asc",
          "caseInsensitive": true
        },
        "newlines-between": "always"
      }
    ],
    "import/no-unresolved": [
      "error",
      {
        "ignore": [
          "^obsidian$"
        ]
      }
    ],
    "unused-imports/no-unused-imports": "error",
    "@typescript-eslint/naming-convention": [
      "error",
      {
        "selector": "enum",
        "format": [
          "PascalCase"
        ]
      },
      {
        "selector": "enumMember",
        "format": [
          "UPPER_CASE"
        ]
      },
      {
        "selector": "interface",
        "format": [
          "PascalCase"
        ],
        "custom": {
          "regex": "^I[A-Z]",
          "match": false
        }
      },
      // UPPER_CASE is great, but we can't check it automatically only for vars declared once in the lifecycle of a program,
      // as Google's style guide suggests
      {
        "selector": "variable",
        "modifiers": [
          "const"
        ],
        "format": [
          "camelCase",
          "PascalCase"
        ]
      }
    ]
  }
}
