{
  "root": true,
  "extends": [
    "eslint:recommended",
    "plugin:import/typescript",
    "plugin:compat/recommended",
    "plugin:tailwindcss/recommended"
  ],
  "env": {
    "browser": true,
    "node": true,
    "es6": true,
    "jest": true
  },
  "globals": {
    "ATTACHMENT_HOST": false
  },
  "plugins": [
    "jsdoc",
    "react",
    "jsx-a11y",
    "import",
    "promise",
    "react-hooks",
    "@typescript-eslint",
    "formatjs"
  ],
  "parserOptions": {
    "sourceType": "module",
    "ecmaFeatures": {
      "experimentalObjectRestSpread": true,
      "jsx": true
    },
    "ecmaVersion": 2018
  },
  "settings": {
    "react": {
      "version": "detect"
    },
    "import/extensions": [
      ".js",
      ".jsx",
      ".cjs",
      ".mjs",
      ".ts",
      ".tsx"
    ],
    "import/ignore": [
      "node_modules",
      "\\.(css|scss|json)$"
    ],
    "import/resolver": {
      "typescript": true,
      "node": true
    },
    "polyfills": [
      "es:all",
      "fetch",
      "IntersectionObserver",
      "Promise",
      "ResizeObserver",
      "URL",
      "URLSearchParams"
    ],
    "tailwindcss": {
      "config": "tailwind.config.ts"
    }
  },
  "rules": {
    "brace-style": "error",
    "comma-dangle": [
      "error",
      "always-multiline"
    ],
    "comma-spacing": [
      "warn",
      {
        "before": false,
        "after": true
      }
    ],
    "comma-style": [
      "warn",
      "last"
    ],
    "import/no-duplicates": "error",
    "space-before-function-paren": [
      "error",
      "never"
    ],
    "space-infix-ops": "error",
    "space-in-parens": [
      "error",
      "never"
    ],
    "keyword-spacing": "error",
    "dot-notation": "error",
    "eqeqeq": "error",
    "indent": [
      "error",
      2,
      {
        "SwitchCase": 1,
        "ignoredNodes": [
          "TemplateLiteral"
        ]
      }
    ],
    "jsx-quotes": [
      "error",
      "prefer-single"
    ],
    "key-spacing": [
      "error",
      {
        "mode": "minimum"
      }
    ],
    "no-catch-shadow": "error",
    "no-cond-assign": "error",
    "no-console": [
      "warn",
      {
        "allow": [
          "error",
          "warn"
        ]
      }
    ],
    "no-extra-semi": "error",
    "no-const-assign": "error",
    "no-fallthrough": "error",
    "no-irregular-whitespace": "error",
    "no-loop-func": "error",
    "no-mixed-spaces-and-tabs": "error",
    "no-nested-ternary": "warn",
    "no-restricted-imports": [
      "error",
      {
        "patterns": [
          {
            "group": [
              "react-inlinesvg"
            ],
            "message": "Use the SvgIcon component instead."
          }
        ]
      }
    ],
    "no-trailing-spaces": "warn",
    "no-undef": "error",
    "no-unreachable": "error",
    "no-unused-expressions": "error",
    "no-unused-vars": "off",
    "@typescript-eslint/no-unused-vars": [
      "error",
      {
        "vars": "all",
        "args": "none",
        "ignoreRestSiblings": true
      }
    ],
    "no-useless-escape": "warn",
    "no-var": "error",
    "object-curly-spacing": [
      "error",
      "always"
    ],
    "padded-blocks": [
      "error",
      {
        "classes": "always"
      }
    ],
    "prefer-const": "error",
    "quotes": [
      "error",
      "single"
    ],
    "semi": "error",
    "space-unary-ops": [
      "error",
      {
        "words": true,
        "nonwords": false
      }
    ],
    "strict": "off",
    "valid-typeof": "error",
    "react/jsx-boolean-value": "error",
    "react/jsx-closing-bracket-location": [
      "error",
      "line-aligned"
    ],
    "react/jsx-curly-spacing": "error",
    "react/jsx-equals-spacing": "error",
    "react/jsx-first-prop-new-line": [
      "error",
      "multiline-multiprop"
    ],
    "react/jsx-indent": [
      "error",
      2
    ],
    "react/jsx-no-comment-textnodes": "error",
    "react/jsx-no-duplicate-props": "error",
    "react/jsx-no-undef": "error",
    "react/jsx-tag-spacing": "error",
    "react/jsx-uses-react": "error",
    "react/jsx-uses-vars": "error",
    "react/jsx-wrap-multilines": "error",
    "react/no-multi-comp": "off",
    "react/no-string-refs": "error",
    "react/self-closing-comp": "error",
    "jsx-a11y/accessible-emoji": "warn",
    "jsx-a11y/alt-text": "warn",
    "jsx-a11y/anchor-has-content": "warn",
    "jsx-a11y/anchor-is-valid": [
      "warn",
      {
        "components": [
          "Link",
          "NavLink"
        ],
        "specialLink": [
          "to"
        ],
        "aspect": [
          "noHref",
          "invalidHref",
          "preferButton"
        ]
      }
    ],
    "jsx-a11y/aria-activedescendant-has-tabindex": "warn",
    "jsx-a11y/aria-props": "warn",
    "jsx-a11y/aria-proptypes": "warn",
    "jsx-a11y/aria-role": "warn",
    "jsx-a11y/aria-unsupported-elements": "warn",
    "jsx-a11y/heading-has-content": "warn",
    "jsx-a11y/html-has-lang": "warn",
    "jsx-a11y/iframe-has-title": "warn",
    "jsx-a11y/img-redundant-alt": "warn",
    "jsx-a11y/interactive-supports-focus": "warn",
    "jsx-a11y/label-has-for": "off",
    "jsx-a11y/mouse-events-have-key-events": "warn",
    "jsx-a11y/no-access-key": "warn",
    "jsx-a11y/no-distracting-elements": "warn",
    "jsx-a11y/no-noninteractive-element-interactions": [
      "warn",
      {
        "handlers": [
          "onClick"
        ]
      }
    ],
    "jsx-a11y/no-onchange": "warn",
    "jsx-a11y/no-redundant-roles": "warn",
    "jsx-a11y/no-static-element-interactions": [
      "warn",
      {
        "handlers": [
          "onClick"
        ]
      }
    ],
    "jsx-a11y/role-has-required-aria-props": "warn",
    "jsx-a11y/role-supports-aria-props": "off",
    "jsx-a11y/scope": "warn",
    "jsx-a11y/tabindex-no-positive": "warn",
    "import/extensions": [
      "error",
      "always",
      {
        "js": "never",
        "mjs": "ignorePackages",
        "jsx": "never",
        "ts": "never",
        "tsx": "never"
      }
    ],
    "import/newline-after-import": "error",
    "import/no-extraneous-dependencies": "error",
    "import/no-unresolved": "error",
    "import/no-webpack-loader-syntax": "error",
    "import/order": [
      "error",
      {
        "groups": [
          "builtin",
          "external",
          "internal",
          "parent",
          "sibling",
          "index",
          "object",
          "type"
        ],
        "newlines-between": "always",
        "alphabetize": {
          "order": "asc"
        }
      }
    ],
    "@typescript-eslint/member-delimiter-style": "error",
    "promise/catch-or-return": "error",
    "react-hooks/rules-of-hooks": "error",
    "tailwindcss/classnames-order": [
      "error",
      {
        "classRegex": "^(base|container|icon|item|list|outer|wrapper)?[c|C]lass(Name)?$",
        "config": "tailwind.config.ts"
      }
    ],
    "tailwindcss/migration-from-tailwind-2": "error",


    "formatjs/enforce-default-message": "error",
    "formatjs/enforce-id": "error",
    "formatjs/no-literal-string-in-jsx": "warn"
  },
  "overrides": [
    {
      "files": [
        "**/*.ts",
        "**/*.tsx"
      ],
      "rules": {
        "no-undef": "off",
        "space-before-function-paren": "off"
      },
      "parser": "@typescript-eslint/parser"
    },
    {
      "files": [
        "src/components/ui/**/*"
      ],
      "rules": {
        "jsdoc/require-jsdoc": [
          "error",
          {
            "publicOnly": true,
            "require": {
              "ArrowFunctionExpression": true,
              "ClassDeclaration": true,
              "ClassExpression": true,
              "FunctionDeclaration": true,
              "FunctionExpression": true,
              "MethodDefinition": true
            }
          }
        ]
      }
    }
  ]
}