eslint-config-fuks
Version:
215 lines (214 loc) • 8.69 kB
JavaScript
import configPrettier from 'eslint-plugin-prettier/recommended';
import pluginPromise from 'eslint-plugin-promise';
import pluginSimpleImportSort from 'eslint-plugin-simple-import-sort';
import pluginSonar from 'eslint-plugin-sonarjs';
import * as process from 'node:process';
import tseslint from 'typescript-eslint';
import { airbnbConfig, airbnbHooksConfig, airbnbTypescriptConfig, featureSlicedLayersSlicesSlicesConfig, storybookConfig, testingLibraryReactConfig, } from '../utils/legacyConfigs.js';
import { optimizeRegexPlugin, preferArrowFunctionsPlugin, styledComponentsVarnamePlugin, } from '../utils/legacyPlugins.js';
const varsRegexp = `^[a-zA-Z0-9_\\-@\\/\\.{}\\$\\*:]+$`;
export const baseConfig = tseslint.config(...airbnbConfig, ...airbnbHooksConfig, ...airbnbTypescriptConfig, ...featureSlicedLayersSlicesSlicesConfig, pluginPromise.configs[`flat/recommended`], pluginSonar.configs.recommended, ...tseslint.configs.recommended, ...tseslint.configs.recommendedTypeChecked, configPrettier, {
plugins: {
'optimize-regex': optimizeRegexPlugin,
'simple-import-sort': pluginSimpleImportSort,
'styled-components-varname': styledComponentsVarnamePlugin,
'prefer-arrow-functions': preferArrowFunctionsPlugin,
},
languageOptions: {
parserOptions: {
ecmaVersion: 2021,
project: `tsconfig.json`,
tsconfigRootDir: process.cwd(),
sourceType: `module`,
},
},
settings: {
react: {
version: `detect`,
},
'import/parsers': {
espree: [`.js`, `.cjs`, `.mjs`, `.jsx`],
},
'import/resolver': {
typescript: true,
node: true,
},
},
rules: {
'import/extensions': [`off`],
'import/prefer-default-export': [`off`],
'import/no-default-export': [`error`],
'react/function-component-definition': [
`error`,
{
namedComponents: `arrow-function`,
},
],
'react/jsx-props-no-spreading': [`off`],
'react/require-default-props': [`off`],
'react/jsx-key': [`error`],
'no-restricted-syntax': [`error`, `ForInStatement`, `LabeledStatement`, `WithStatement`],
'no-plusplus': [`off`],
'no-void': [
`error`,
{
allowAsStatement: true,
},
],
'func-names': [`warn`, `as-needed`, { generators: `never` }],
curly: [`error`, `all`],
'@typescript-eslint/no-use-before-define': [`error`, { functions: false, classes: false }],
'simple-import-sort/imports': [
`error`,
{
groups: [
[`^react`, `^@?\\w`],
[`^(app|features|shared|processes|entities|pages)(/.*|$)`, `^\\.`],
],
},
],
'optimize-regex/optimize-regex': `warn`,
'@typescript-eslint/no-magic-numbers': [
`warn`,
{
ignoreNumericLiteralTypes: true,
ignoreEnums: true,
enforceConst: true,
ignoreReadonlyClassProperties: true,
ignore: [-1, 0, 1],
},
],
'@typescript-eslint/quotes': [`error`, `backtick`],
'newline-before-return': `error`,
'react/self-closing-comp': [
`error`,
{
component: true,
html: true,
},
],
'react/no-unstable-nested-components': [`error`, { allowAsProps: true }],
'prettier/prettier': [
`error`,
{
printWidth: 120,
tabWidth: 4,
useTabs: true,
semi: true,
singleQuote: true,
jsxSingleQuote: true,
trailingComma: `all`,
bracketSpacing: true,
jsxBracketSameLine: false,
arrowParens: `avoid`,
},
{ usePrettierrc: false },
],
'styled-components-varname/varname': [
`error`,
{
tagStyle: {
suffix: `Styled`,
},
},
],
'import/no-extraneous-dependencies': [
`error`,
{
devDependencies: true,
},
],
'import/no-cycle': [`error`],
'arrow-body-style': [`error`, `as-needed`],
'sonarjs/no-nested-template-literals': [`off`],
'sonarjs/cognitive-complexity': [`error`],
'promise/prefer-await-to-then': [`error`],
'prefer-arrow-functions/prefer-arrow-functions': `error`,
'no-param-reassign': [`error`, { props: false }],
'react/react-in-jsx-scope': [`off`],
'no-console': [`error`, { allow: [`warn`, `error`] }],
'consistent-return': [`off`],
'import/order': [`off`],
'@typescript-eslint/no-misused-promises': [
`error`,
{
checksVoidReturn: {
attributes: false,
returns: false,
},
},
],
'@typescript-eslint/consistent-type-imports': [
`error`,
{
fixStyle: `inline-type-imports`,
},
],
'@typescript-eslint/explicit-function-return-type': [
`error`,
{
allowExpressions: true,
},
],
'@typescript-eslint/no-floating-promises': [
`error`,
{
ignoreIIFE: true,
ignoreVoid: true,
},
],
'@typescript-eslint/no-unnecessary-condition': [`error`],
'@typescript-eslint/no-unused-vars': [`error`, { argsIgnorePattern: `^_`, ignoreRestSiblings: true }],
'@typescript-eslint/no-empty-object-type': [`error`],
'@typescript-eslint/naming-convention': [
`error`,
{
selector: `default`,
format: null,
custom: {
regex: varsRegexp,
match: true,
},
},
{
selector: `variable`,
format: [`camelCase`, `PascalCase`, `UPPER_CASE`],
},
],
'react/prop-types': [`off`],
'no-implicit-coercion': [`error`, { disallowTemplateShorthand: true, allow: [`!!`] }],
},
}, Object.assign(Object.assign({ files: [`**/*.js`, `**/*.jsx`] }, tseslint.configs.disableTypeChecked), { rules: Object.assign({ 'id-match': [`error`, varsRegexp, { properties: true, classFields: true }], '@typescript-eslint/explicit-function-return-type': `off` }, tseslint.configs.disableTypeChecked.rules) }), ...testingLibraryReactConfig.map(config => (Object.assign(Object.assign({}, config), { files: [`**/*.spec.ts`, `**/*.spec.tsx`, `**/*.test.ts`, `**/*.test.tsx`, `**/dsl/**`] }))), {
files: [`**/*.spec.ts`, `**/*.spec.tsx`, `**/*.test.ts`, `**/*.test.tsx`, `**/dsl/**`],
rules: {
'testing-library/prefer-user-event': [`error`],
'no-shadow': `off`,
'max-classes-per-file': `off`,
'@typescript-eslint/no-magic-numbers': `off`,
'@typescript-eslint/indent': `off`,
'@typescript-eslint/explicit-function-return-type': `off`,
'@typescript-eslint/member-ordering': `off`,
'@typescript-eslint/no-non-null-assertion': `off`,
'@typescript-eslint/no-empty-function': `off`,
'@typescript-eslint/no-unsafe-argument': `off`,
'sonarjs/no-duplicate-string': `off`,
'sonarjs/no-identical-functions': `off`,
},
}, Object.assign(Object.assign({ files: [`**/*.json`] }, tseslint.configs.disableTypeChecked), { rules: Object.assign({ 'no-unused-expressions': `off`, 'sonarjs/no-duplicate-string': `off`, quotes: `off`, 'no-template-curly-in-string': `off`, '@typescript-eslint/quotes': `off`, '@typescript-eslint/no-unused-expressions': `off` }, tseslint.configs.disableTypeChecked.rules) }), {
files: [
`vite.config.ts`,
`vite.config.js`,
`vite.config.override.ts`,
`eslint.config.js`,
`**/*.d.ts`,
`**/*.stories.ts`,
`**/*.stories.tsx`,
],
rules: {
'import/no-default-export': `off`,
},
}, ...storybookConfig.map(config => (Object.assign(Object.assign({}, config), { files: [`**/*.stories.ts`, `**/*.stories.tsx`] }))), {
files: [`**/*.stories.ts`, `**/*.stories.tsx`],
}, {
ignores: [`**/dist/**`, `.yarn/**`, `storybook-static/**`],
});