{
	"env": {
		"browser": false,
		"es2021": true,
		"node": true
	},
	"parserOptions": {
		"ecmaVersion": 2021,
		"sourceType": "module",
		"parser": "@typescript-eslint/parser"
	},
	"extends": [
		"eslint:recommended",
		"airbnb-base",
		"prettier",
		"plugin:@typescript-eslint/eslint-recommended",
		"plugin:@typescript-eslint/recommended"
	],
	"plugins": ["prettier", "eslint-plugin-tsdoc", "@typescript-eslint"],
	"rules": {
		"no-console": 0,
		"no-control-regex": 0,
		"no-var": 2,
		"no-underscore-dangle": 0,
		"radix": 0,
		"no-multi-assign": 0,
		"no-shadow": 0,
		"no-new": 0,
		"import/no-unresolved": 0,
		"prettier/prettier": ["error"], // end of copied frontend rules
		"max-classes-per-file": 0,
		"max-len": [
			"error",
			{
				"code": 140,
				"ignoreComments": true,
				"ignoreUrls": true,
				"ignoreTemplateLiterals": true
			}
		],
		"no-param-reassign": 0,
		"implicit-arrow-linebreak": 0,
		"import/extensions": 0,
		"class-methods-use-this": 0,
		"tsdoc/syntax": "warn",
		"@typescript-eslint/no-empty-function": 0,
		"@typescript-eslint/no-this-alias": 0,
		"@typescript-eslint/no-non-null-assertion": 0,
		"@typescript-eslint/naming-convention": [
			"error",
			{
				"selector": "memberLike",
				"modifiers": ["private"],
				"format": null,
				"leadingUnderscore": "require"
			},
			{
				"selector": "memberLike",
				"modifiers": ["protected"],
				"format": null,
				"leadingUnderscore": "require"
			}
		],
		"no-void": 0,
		"import/no-extraneous-dependencies": [
			"error",
			{
				"devDependencies": [
					"**/*.test.ts",
					"**/*.spec.ts",
					"src/tests/**/*.ts"
				]
			}
		],
		"no-restricted-syntax": [
			"error",
			{
				"selector": "ForInStatement",
				"message": "for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array."
			},
			{
				"selector": "LabeledStatement",
				"message": "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand."
			},
			{
				"selector": "WithStatement",
				"message": "`with` is disallowed in strict mode because it makes code impossible to predict and optimize."
			}
		],
		"import/prefer-default-export": "off",
		"@typescript-eslint/no-explicit-any": 0
	},
	"overrides": [
		{
			"files": [
				"**/*.test.ts",
				"**/*.spec.ts",
				"src/tests/**/*.ts"
			],
			"rules": {
				"no-unused-expressions": "off",
				"prefer-arrow-callback": "off",
				"func-names": "off",
				"@typescript-eslint/ban-ts-comment": "off"
			}
		}
	]
}