Files
workout-cool/eslint.config.mjs
Mathias b2a3be5bff fix(server.ts): standardize port variable name to uppercase PORT for clarity and consistency
refactor(layout.tsx): update children prop type from ReactElement to ReactNode for better type safety
refactor(another layout.tsx): change children prop type to ReactNode for improved flexibility
refactor(verify-email layout.tsx): replace ReactElement with ReactNode in props for consistency
refactor(main layout.tsx): update children prop type to ReactNode for better type coverage
feat: add default
2026-03-23 10:20:02 +01:00

171 lines
5.4 KiB
JavaScript

import { fixupConfigRules, fixupPluginRules } from "@eslint/compat";
import js from "@eslint/js";
import { FlatCompat } from "@eslint/eslintrc";
import { configs as tsConfigs } from "typescript-eslint";
import path from "node:path";
import { fileURLToPath } from "node:url";
import globals from "globals";
import nextPlugin from "@next/eslint-plugin-next";
import reactHooks from "eslint-plugin-react-hooks";
import reactPlugin from "eslint-plugin-react";
import importPlugin from "eslint-plugin-import";
import unusedImportsPlugin from "eslint-plugin-unused-imports";
import tsParser from "@typescript-eslint/parser";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
});
const config = [
js.configs.recommended,
...tsConfigs.recommended,
...fixupConfigRules(
compat.extends(
"plugin:react/recommended",
"plugin:react/jsx-runtime",
"plugin:react-hooks/recommended",
"plugin:prettier/recommended",
"plugin:import/recommended",
"plugin:import/typescript",
),
),
{
files: ["**/*.{js,jsx,ts,tsx}"],
ignores: [
"**/node_modules/**",
"**/.next/**",
"**/out/**",
"**/coverage/**",
"**/build/**",
"**/dist/**",
"**/package.json",
"**/package-lock.json",
"**/eslint.config.mjs",
"**/next.config.js",
"src/utils/attempt2.js",
"src/utils/inapp.js",
"src/utils/externalLinkOpener.js",
"src/utils/browserEscape.js",
],
plugins: {
"react-hooks": fixupPluginRules(reactHooks),
react: fixupPluginRules(reactPlugin),
import: fixupPluginRules(importPlugin),
"unused-imports": fixupPluginRules(unusedImportsPlugin),
next: nextPlugin,
},
languageOptions: {
globals: {
...globals.browser,
...globals.node,
},
ecmaVersion: 2018,
sourceType: "module",
parser: tsParser,
parserOptions: {
project: "./tsconfig.json",
ecmaFeatures: {
jsx: true,
},
},
},
settings: {
"import/resolver": {
node: {
paths: ["src"],
extensions: [".js", ".jsx", ".ts", ".tsx"],
},
},
react: {
version: "detect",
},
},
rules: {
"prettier/prettier": ["off", { singleQuote: true }],
"no-use-before-define": ["off", { functions: false, classes: false }],
"@typescript-eslint/naming-convention": [
"error",
{
selector: "parameter",
format: ["camelCase", "PascalCase"],
leadingUnderscore: "allow",
},
{
selector: "variable",
format: ["camelCase", "UPPER_CASE", "PascalCase"],
leadingUnderscore: "allow",
},
],
"import/no-extraneous-dependencies": [
"error",
{
devDependencies: true,
optionalDependencies: false,
peerDependencies: false,
},
],
"@typescript-eslint/default-param-last": "off",
"@typescript-eslint/no-use-before-define": "off",
"comma-dangle": "off",
"@typescript-eslint/comma-dangle": "off",
"import/prefer-default-export": "off",
"unused-imports/no-unused-imports": "warn",
"max-len": ["warn", { code: 140, ignorePattern: "^import .*| className=*|background=*", ignoreStrings: true }],
"import/order": [
"error",
{
groups: ["builtin", "external", "internal", ["sibling", "parent"], "index", "type"],
alphabetize: { order: "desc", caseInsensitive: true },
pathGroups: [
{ pattern: "components", group: "internal" },
{ pattern: "components/**", group: "internal" },
{ pattern: "constants/**", group: "internal" },
{ pattern: "common", group: "internal" },
{ pattern: "error/**", group: "internal" },
{ pattern: "hooks/**", group: "internal" },
{ pattern: "locale/**", group: "internal" },
{ pattern: "routes/**", group: "internal" },
{ pattern: "selectors", group: "internal" },
{ pattern: "store", group: "internal" },
],
"newlines-between": "always",
},
],
"@typescript-eslint/no-explicit-any": "off",
"react/prop-types": "off",
"react/require-default-props": "off",
"import/no-unresolved": "off",
"import/no-cycle": ["off", { maxDepth: "∞" }],
"@typescript-eslint/no-shadow": "off",
"no-shadow": "off",
"no-console": "off",
"no-plusplus": "off",
"react-hooks/exhaustive-deps": "off",
"react/jsx-filename-extension": "off",
"react/jsx-props-no-spreading": "off",
"class-methods-use-this": "off",
"@typescript-eslint/explicit-module-boundary-types": "off",
"@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }],
"@typescript-eslint/no-empty-object-type": "off",
"react/jsx-sort-props": [
"error",
{
callbacksLast: false,
shorthandFirst: false,
shorthandLast: false,
ignoreCase: true,
noSortAlphabetically: false,
reservedFirst: false,
},
],
quotes: ["error", "double", { avoidEscape: false, allowTemplateLiterals: false }],
},
},
];
export default config;