module.exports = {
  plugins: ["@typescript-eslint", "import", "sonarjs", "unicorn", "promise", "solid", "jest"],
  extends: [
    "eslint:recommended",
    "plugin:import/recommended",
    "plugin:import/typescript",
    "prettier",
    "plugin:sonarjs/recommended",
    "plugin:unicorn/recommended",
    "plugin:promise/recommended",
    "plugin:solid/recommended",
    "plugin:jest/recommended"
  ],
  overrides: [
    {
      files: ["**/*.ts", "**/*.tsx"],
      parser: "@typescript-eslint/parser",
      parserOptions: {
        ecmaVersion: 2021,
        ecmaFeatures: { jsx: true },
        sourceType: "module",
        project: "./tsconfig.json"
      },
      extends: [
        "plugin:@typescript-eslint/recommended"
        // Maybe one day...
        // 'plugin:@typescript-eslint/recommended-requiring-type-checking'
      ],
      rules: {
        "@typescript-eslint/no-unused-vars": [
          "warn",
          {
            argsIgnorePattern: "^_"
          }
        ],
        "@typescript-eslint/no-non-null-assertion": "error",
        // TODO: Remove any usage and enable
        "@typescript-eslint/no-explicit-any": "off"
      }
    }
  ],
  env: {
    browser: true,
    node: true,
    mocha: true
  },
  globals: {},
  rules: {
    // Solid
    "solid/reactivity": "off", // FIXME
    "solid/no-innerhtml": "off",

    /** Unicorn **/
    "unicorn/no-null": "off",
    "unicorn/filename-case": "off",
    "unicorn/no-array-for-each": "off",
    "unicorn/no-array-reduce": "off",
    "unicorn/prefer-string-replace-all": "warn",
    "unicorn/prevent-abbreviations": "off",
    "unicorn/prefer-module": "off",
    "unicorn/import-style": "off",
    "unicorn/numeric-separators-style": "off",
    "unicorn/prefer-node-protocol": "off",
    "unicorn/prefer-dom-node-append": "off", // FIXME
    "unicorn/prefer-top-level-await": "warn",
    "unicorn/consistent-function-scoping": "warn",
    "unicorn/no-array-callback-reference": "warn",
    "unicorn/no-array-method-this-argument": "warn",
    "unicorn/no-for-loop": "off",

    "sonarjs/no-duplicate-string": ["warn", { threshold: 5 }],

    // Promise
    // 'promise/catch-or-return': 'off',  // Should be enabled
    "promise/always-return": "off",

    eqeqeq: "error",
    "no-param-reassign": "error",
    "no-nested-ternary": "error",
    "no-shadow": "error",

    "import/order": ["warn", {
      groups: ["type", "builtin", "external", "internal", "parent", "sibling", "index"],
      distinctGroup: false,
      pathGroups: [
        {
          pattern: "*.scss",
          patternOptions: { matchBase: true },
          group: "index",
          position: "after"
        }
      ],
      "newlines-between": "always",
      alphabetize: {
        order: "asc",
        caseInsensitive: true
      }
    }]
  },
  settings: {
    "import/resolver": {
      typescript: true,
      node: true
    }
  }
};
