{
  "plugins": ["jest", "@typescript-eslint", "prettier", "unicorn"],
  "extends": ["plugin:unicorn/recommended", "plugin:github/recommended", "plugin:prettier/recommended"],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": 2020,
    "sourceType": "module",
    "extraFileExtensions": [".mjs"],
    "ecmaFeatures": {
      "impliedStrict": true
    },
    "project": "./tsconfig.json"
  },
  "env": {
    "node": true,
    "es6": true,
    "jest/globals": true
  },
  "rules": {
    // Error out for code formatting errors
    "prettier/prettier": "error",
    // Namespaces or sometimes needed
    "import/no-namespace": "off",
    // Properly format comments
    "spaced-comment": ["error", "always"],
    "lines-around-comment": [
      "error",
      {
        "beforeBlockComment": true,
        "beforeLineComment": true,
        "allowBlockStart": true,
        "allowObjectStart": true,
        "allowArrayStart": true,
        "allowClassStart": true,
        "ignorePattern": "pragma|ts-ignore"
      }
    ],
    // Mandatory spacing
    "padding-line-between-statements": [
      "error",
      { "blankLine": "always", "prev": "*", "next": "return" },
      { "blankLine": "always", "prev": "directive", "next": "*" },
      { "blankLine": "any", "prev": "directive", "next": "directive" }
    ],
    // Enforce camelCase
    "camelcase": "error",
    // Allow forOfStatements
    "no-restricted-syntax": ["error", "ForInStatement", "LabeledStatement", "WithStatement"],
    // Continue is viable in forOf loops in generators
    "no-continue": "off",
    // From experience, named exports are almost always desired. I got tired of this rule
    "import/prefer-default-export": "off",
    // Unused vars are useful to keep method signatures consistent and documented
    "@typescript-eslint/no-unused-vars": "off",
    // For this project only use kebab-case
    "unicorn/filename-case": ["error", { "cases": { "kebabCase": true } }],
    // Allow Array.from(set) mitigate TS2569 which would require '--downlevelIteration'
    "unicorn/prefer-spread": "off"
  }
}
