{
	"$schema": "https://json.schemastore.org/eslintrc.json",
	"plugins": ["@typescript-eslint", "node", "vitest"],
	"parserOptions": {
		"project": "tsconfig.json"
	},
	"extends": [
		"plugin:@typescript-eslint/recommended",
		"plugin:@typescript-eslint/recommended-requiring-type-checking",
		"plugin:import/recommended",
		"plugin:import/typescript",
		"prettier",
		"plugin:vitest/recommended"
	],
	"rules": {
		// sort imports
		"import/order": "error",

		// no let exports
		"import/no-mutable-exports": "error",

		"import/no-cycle": "error",
		"import/no-default-export": "error",

		// allow {} even though it's unsafe but comes handy
		"@typescript-eslint/ban-types": [
			"error",
			{
				"types": {
					"{}": false
				}
			}
		],

		"@typescript-eslint/consistent-type-imports": [
			"error",
			{
				"prefer": "type-imports",
				"fixStyle": "inline-type-imports",
				"disallowTypeAnnotations": false
			}
		],

		"import/no-duplicates": ["error", { "prefer-inline": true }],

		// false negatives
		"import/namespace": ["off"],

		// we allow empty interfaces
		"no-empty-pattern": "off",
		"@typescript-eslint/no-empty-interface": "off",

		// we allow empty functions
		"@typescript-eslint/no-empty-function": "off",

		// we sometimes use async functions that don't await anything
		"@typescript-eslint/require-await": "off",

		// make sure to `await` inside try…catch
		"@typescript-eslint/return-await": ["error", "in-try-catch"],

		// allow unused vars prefixed with `_`
		"@typescript-eslint/no-unused-vars": [
			"error",
			{ "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }
		],

		// numbers and booleans are fine in template strings
		"@typescript-eslint/restrict-template-expressions": [
			"error",
			{ "allowNumber": true, "allowBoolean": true }
		]
	},
	"overrides": [
		{
			"files": ["*.test.tsx", "*.test.ts", "**/__tests__/**/*.ts?(x)"],
			"rules": {
				// let's make our lives easier in tests
				"@typescript-eslint/no-unsafe-assignment": "off",
				"@typescript-eslint/no-unsafe-member-access": "off",
				"@typescript-eslint/no-unsafe-return": "off",
				"@typescript-eslint/no-explicit-any": "off",
				"@typescript-eslint/no-non-null-assertion": "off",

				// allow imports from testEnv
				"@typescript-eslint/no-restricted-imports": "off"
			}
		}
	],
	"ignorePatterns": ["*.js"]
}
