{
	"$schema": "./node_modules/oxlint/configuration_schema.json",
	"categories": {
		"correctness": "error",
		"perf": "error",
		"suspicious": "error"
	},
	"env": {
		"browser": true,
		"es2026": true
	},
	"ignorePatterns": [
		"*.html",
		"*.lock",
		"patches/**",
		"src/components/EmojiPicker/dataset/**",
		"src/lib/sw-template.js",
		"src/paraglide/**"
	],
	"jsPlugins": ["eslint-plugin-bsky-internal"],
	"options": {
		"typeAware": true,
		"typeCheck": true
	},
	"plugins": ["import", "oxc", "react", "typescript", "unicorn"],
	"rules": {
		"curly": "warn",
		"no-array-constructor": "error",
		// these loops are sequential by construction — cursor pagination, retry/backoff, job polling, stream
		// reads, chunked writes — and the rule can't see the data dependency that forces the ordering.
		"no-await-in-loop": "off",
		"no-regex-spaces": "error",
		"no-restricted-imports": [
			"error",
			{
				"paths": [
					{
						"name": "react",
						"importNames": ["React", "default"],
						"message": "React is already in the global type namespace. Use named imports for runtime modules."
					}
				]
			}
		],
		"no-underscore-dangle": "off",
		"no-var": "error",
		"prefer-const": "error",
		"prefer-spread": "error",
		"bsky-internal/avoid-unwrapped-text": [
			"error",
			{
				"impliedTextComponents": [
					"Admonition",
					"Admonition.Admonition",
					"AgeAssuranceAdmonition",
					"Prompt.Row",
					"Toast.Action",
					"Toggle.Action"
				],
				"impliedTextProps": [],
				"suggestedTextWrappers": {
					"Button": "ButtonText"
				}
			}
		],
		"bsky-internal/consistent-type-imports": "error",
		"bsky-internal/recipe-debug-id": "error",
		"bsky-internal/use-prefixed-imports": "error",
		"import/namespace": [
			"error",
			{
				"allowComputed": true
			}
		],
		"import/no-duplicates": "warn",
		"import/no-named-as-default": "warn",
		"import/no-named-as-default-member": "warn",
		"import/no-nodejs-modules": "error",
		"import/no-unassigned-import": [
			"error",
			{
				"allow": ["**/*.css"]
			}
		],
		"react/display-name": "error",
		"react/hook-use-state": "warn",
		// React Compiler already hoists context values into its memo cache, keyed on their dependencies; a
		// hand-written useMemo would only duplicate what it emits.
		"react/jsx-no-constructed-context-values": "off",
		"react/jsx-no-target-blank": "error",
		"react/no-unknown-property": "error",
		"react/no-unstable-nested-components": [
			"error",
			{
				"propNamePattern": "{markup,render*}"
			}
		],
		"react/react-in-jsx-scope": "off",
		"react/rules-of-hooks": "error",
		"typescript/consistent-return": "off",
		"typescript/no-explicit-any": "error",
		"typescript/no-misused-promises": "warn",
		"typescript/no-namespace": "error",
		"typescript/no-unnecessary-type-assertion": "warn",
		"typescript/no-unsafe-call": "warn",
		"typescript/no-unsafe-enum-comparison": "warn",
		"typescript/no-unsafe-member-access": "warn",
		"typescript/only-throw-error": "error",
		"typescript/prefer-promise-reject-errors": "warn",
		"typescript/require-await": "warn",
		"typescript/restrict-plus-operands": "error",
		"typescript/unbound-method": [
			"error",
			{
				"ignoreStatic": true
			}
		],
		"unicorn/switch-case-braces": ["warn", "always"]
	},
	"overrides": [
		{
			"files": ["**/*.js", "**/*.mjs"],
			"rules": {
				"typescript/no-unsafe-argument": "off",
				"typescript/no-unsafe-assignment": "off",
				"typescript/no-unsafe-call": "off",
				"typescript/no-unsafe-member-access": "off",
				"typescript/no-unsafe-return": "off"
			}
		},
		{
			"files": ["**/eslint/**", "**/scripts/**", "**/vite.config.ts"],
			"env": {
				"browser": false,
				"node": true
			},
			"rules": {
				"import/no-nodejs-modules": "off"
			}
		}
	]
}
