198 lines
5.5 KiB
JavaScript
198 lines
5.5 KiB
JavaScript
import js from "@eslint/js";
|
|
import typescriptPlugin from "@typescript-eslint/eslint-plugin";
|
|
import typescriptParser from "@typescript-eslint/parser";
|
|
import {defineConfig} from "eslint/config";
|
|
import prettierConfig from "eslint-config-prettier";
|
|
import importPlugin from "eslint-plugin-import";
|
|
import onlyWarnPlugin from "eslint-plugin-only-warn";
|
|
import prettierPlugin from "eslint-plugin-prettier";
|
|
import sortDestructureKeysPlugin from "eslint-plugin-sort-destructure-keys";
|
|
import sortKeysFixPlugin from "eslint-plugin-sort-keys-fix";
|
|
import unusedImportsPlugin from "eslint-plugin-unused-imports";
|
|
import globals from "globals";
|
|
import tseslint from "typescript-eslint";
|
|
|
|
const config = defineConfig([
|
|
// ESLint recommended rules
|
|
js.configs.recommended,
|
|
// TypeScript ESLint recommended rules
|
|
...tseslint.configs.recommended,
|
|
// Prettier config - disables conflicting ESLint rules
|
|
{
|
|
rules: {
|
|
...prettierConfig.rules,
|
|
},
|
|
},
|
|
{
|
|
files: ["**/*.{js,mjs,cjs,jsx,ts,tsx}"],
|
|
languageOptions: {
|
|
ecmaVersion: "latest",
|
|
globals: {
|
|
...globals.node,
|
|
...globals.es2025,
|
|
},
|
|
parser: typescriptParser,
|
|
parserOptions: {
|
|
tsconfigRootDir: import.meta.dirname,
|
|
},
|
|
sourceType: "module",
|
|
},
|
|
plugins: {
|
|
"@typescript-eslint": typescriptPlugin,
|
|
import: importPlugin,
|
|
"only-warn": onlyWarnPlugin,
|
|
prettier: prettierPlugin,
|
|
"sort-destructure-keys": sortDestructureKeysPlugin,
|
|
"sort-keys-fix": sortKeysFixPlugin,
|
|
"unused-imports": unusedImportsPlugin,
|
|
},
|
|
rules: {
|
|
"@typescript-eslint/consistent-type-imports": "error",
|
|
"@typescript-eslint/no-empty-object-type": "off",
|
|
"@typescript-eslint/no-explicit-any": "off",
|
|
"@typescript-eslint/no-unused-vars": "off",
|
|
"import/consistent-type-specifier-style": ["error", "prefer-top-level"],
|
|
"import/newline-after-import": ["error", {count: 1}],
|
|
"import/no-duplicates": "error",
|
|
"import/order": [
|
|
"error",
|
|
{
|
|
alphabetize: {
|
|
caseInsensitive: true,
|
|
order: "asc",
|
|
},
|
|
groups: [
|
|
"type",
|
|
"builtin",
|
|
"external",
|
|
"internal",
|
|
"parent",
|
|
"sibling",
|
|
"index",
|
|
"object",
|
|
"unknown",
|
|
],
|
|
"newlines-between": "always",
|
|
pathGroups: [
|
|
{
|
|
group: "type",
|
|
pattern: "server-only",
|
|
position: "before",
|
|
},
|
|
{
|
|
group: "unknown",
|
|
pattern: "**/*.+(css|sass|scss)",
|
|
patternOptions: {dot: true, nocomment: true},
|
|
position: "after",
|
|
},
|
|
{
|
|
group: "unknown",
|
|
pattern: "{.,..}/**/*.+(css|sass|scss)",
|
|
patternOptions: {dot: true, nocomment: true},
|
|
position: "after",
|
|
},
|
|
{
|
|
group: "internal",
|
|
pattern: "~env",
|
|
position: "before",
|
|
},
|
|
{
|
|
group: "internal",
|
|
pattern: "@/**",
|
|
position: "after",
|
|
},
|
|
],
|
|
pathGroupsExcludedImportTypes: ["type"],
|
|
warnOnUnassignedImports: true,
|
|
},
|
|
],
|
|
"no-console": "warn",
|
|
"no-unused-vars": "off",
|
|
"object-curly-spacing": ["error", "never"],
|
|
"padding-line-between-statements": [
|
|
"error",
|
|
{blankLine: "always", next: "*", prev: "directive"},
|
|
{blankLine: "any", next: "directive", prev: "directive"},
|
|
{blankLine: "always", next: "*", prev: ["const", "let", "var"]},
|
|
{blankLine: "any", next: ["const", "let", "var"], prev: ["const", "let", "var"]},
|
|
{blankLine: "always", next: "return", prev: "*"},
|
|
],
|
|
"prettier/prettier": "error",
|
|
"sort-destructure-keys/sort-destructure-keys": [
|
|
"error",
|
|
{
|
|
caseSensitive: true,
|
|
},
|
|
],
|
|
"sort-imports": [
|
|
"error",
|
|
{
|
|
allowSeparatedGroups: true,
|
|
ignoreCase: false,
|
|
ignoreDeclarationSort: true,
|
|
ignoreMemberSort: false,
|
|
memberSyntaxSortOrder: ["none", "all", "multiple", "single"],
|
|
},
|
|
],
|
|
"sort-keys": [
|
|
"error",
|
|
"asc",
|
|
{
|
|
caseSensitive: true,
|
|
minKeys: 2,
|
|
natural: false,
|
|
},
|
|
],
|
|
"sort-keys-fix/sort-keys-fix": "error",
|
|
"unused-imports/no-unused-imports": "error",
|
|
"unused-imports/no-unused-vars": [
|
|
"error",
|
|
{
|
|
args: "after-used",
|
|
argsIgnorePattern: "^_",
|
|
caughtErrors: "none",
|
|
vars: "all",
|
|
varsIgnorePattern: "^_",
|
|
},
|
|
],
|
|
},
|
|
settings: {
|
|
"import/resolver": {
|
|
node: true,
|
|
typescript: true,
|
|
},
|
|
},
|
|
},
|
|
// Disable type checking for config files (.*.js, .*.cjs, .*.mjs)
|
|
{
|
|
files: [".*.js", ".*.cjs", ".*.mjs"],
|
|
...tseslint.configs.disableTypeChecked,
|
|
},
|
|
{
|
|
ignores: [
|
|
"**/.temp/**",
|
|
"**/.next/**",
|
|
"**/.swc/**",
|
|
"**/.turbo/**",
|
|
"**/.cache/**",
|
|
"**/.build/**",
|
|
"**/.vercel/**",
|
|
"**/.DS_Store",
|
|
"**/dist/**",
|
|
"**/build/**",
|
|
"**/public/**",
|
|
"**/node_modules/**",
|
|
"**/coverage/**",
|
|
"**/.contentlayer/",
|
|
"**/__snapshots__/**",
|
|
"**/pnpm-lock.yaml",
|
|
"**/.source/**",
|
|
"**/next-env.d.ts",
|
|
"!.vscode/**",
|
|
"!scripts/**",
|
|
],
|
|
},
|
|
]);
|
|
|
|
export default config;
|