{
  "$schema": "./node_modules/oxlint/configuration_schema.json",
  "plugins": [
    "eslint",
    "import",
    "jsdoc",
    "jsx-a11y",
    "promise",
    "react",
    "typescript",
    "unicorn",
    "vitest"
  ],
  "jsPlugins": [
    "eslint-plugin-storybook",
    "eslint-plugin-element-call"
    // TODO: Re-enable once oxlint supports lint rules that rely on TypeScript type-awareness.
    // "eslint-plugin-rxjs"
  ],
  "categories": {
    "correctness": "error",
    "perf": "error"
  },
  "options": {
    "denyWarnings": true,
    "typeAware": true
  },
  "env": {
    "builtin": true
  },
  "rules": {
    "element-call/copyright-header": [
      "error",
      "/*\nCopyright %%CURRENT_YEAR%% Element Creations Ltd.\n\nSPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial\nPlease see LICENSE in the repository root for full details.\n*/\n\n"
    ],
    "element-call/no-observablescope-leak": "error",
    "jsdoc/empty-tags": "error",
    "jsdoc/check-property-names": "error",
    "jsdoc/require-param-description": "warn",
    "react/display-name": "error",
    // TODO: Re-enable once oxlint supports lint rules that rely on TypeScript type-awareness.
    // "rxjs/no-exposed-subjects": "error",
    // "rxjs/finnish": [
    //   "error",
    //   {
    //     "names": {
    //       "^this$": false
    //     }
    //   }
    // ],
    "no-restricted-imports": [
      "error",
      {
        "patterns": [
          {
            "group": [
              "matrix-widget-api/src",
              "matrix-widget-api/src/",
              "matrix-widget-api/src/**",
              "matrix-widget-api/lib",
              "matrix-widget-api/lib/",
              "matrix-widget-api/lib/**"
            ],
            "message": "Please use matrix-widget-api instead"
          },
          {
            "group": [
              "matrix-js-sdk/src",
              "matrix-js-sdk/src/",
              "matrix-js-sdk/src/**",
              "matrix-js-sdk/lib",
              "matrix-js-sdk/lib/",
              "matrix-js-sdk/lib/index"
            ],
            "message": "Please use matrix-js-sdk instead"
          }
        ]
      }
    ],
    "typescript/no-floating-promises": "error",
    "typescript/no-misused-promises": "error",
    "typescript/promise-function-async": "error",
    "typescript/require-await": "error",
    "typescript/await-thenable": "error",
    // To help ensure that we get proper vite/rollup lazy loading (e.g. for matrix-js-sdk).
    "typescript/consistent-type-imports": [
      "error",
      {
        "fixStyle": "inline-type-imports"
      }
    ],
    // TODO: These had to be disabled in the eslint -> oxlint migration. Would be nice to
    // enable them in future or at least document why we're disabling them.
    "eslint/no-await-in-loop": "off",
    "eslint/no-unused-vars": ["error", { "args": "none" }],
    "import/default": "off",
    "jsdoc/check-tag-names": "off",
    "jsx-a11y/prefer-tag-over-role": "off",
    "promise/no-callback-in-promise": "off",
    "react/jsx-key": "off",
    "react/jsx-no-constructed-context-values": "off",
    "react/no-array-index-key": "off",
    "react/no-children-prop": "off",
    "react/no-object-type-as-default-prop": "off",
    "typescript/no-misused-spread": "off",
    "typescript/no-useless-default-assignment": "off",
    "typescript/restrict-template-expressions": "off",
    "typescript/unbound-method": "off",
    "vitest/expect-expect": "off",
    "vitest/no-conditional-expect": "off",
    "vitest/no-disabled-tests": "off",
    "vitest/require-mock-type-parameters": "off",
    "vitest/require-to-throw-message": "off"
  },
  "overrides": [
    {
      "files": ["src/*/**"],
      "rules": {
        // In application code we should use the js-sdk logger, never console directly.
        "no-console": "error"
      }
    },
    {
      "files": [
        "**/*.test.ts",
        "**/*.test.tsx",
        "**/test.ts",
        "**/test.tsx",
        "**/test-**"
      ],
      "rules": {
        // Tests often initialize an ObservableScope in an outer scope in
        // beforeEach, which is not actually a problem
        "element-call/no-observablescope-leak": "off",
        "jsdoc/empty-tags": "off",
        "jsdoc/check-property-names": "off",
        "jsdoc/require-param-description": "off",
        "jsx-a11y/media-has-caption": "off"
        // TODO: Enable once oxlint supports them.
        // "jsdoc/check-values": "off",
        // "jsdoc/check-param-names": "off",
        // "jsdoc/no-types": "off",
      }
    },
    {
      "files": ["playwright/**"],
      "rules": {
        // Playwright as a `use` function that has nothing to do with React hooks.
        "react-hooks/rules-of-hooks": "off"
      }
    }
  ]
}
