eslint-config-satya164
Version:
Personal ESLint Config of @satya164
301 lines (280 loc) • 9.36 kB
JavaScript
module.exports = {
env: {
es6: true,
},
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
},
settings: {
react: {
version: 'detect',
},
},
plugins: [
'@eslint-community/eslint-comments',
'@eslint-react',
'import-x',
'prettier',
'promise',
'react-hooks',
'react-native',
],
extends: [
'eslint:recommended',
'plugin:@eslint-community/eslint-comments/recommended',
'plugin:@eslint-react/recommended-legacy',
'plugin:promise/recommended',
'plugin:react-hooks/recommended',
'prettier',
],
rules: {
eqeqeq: ['error', 'smart'],
'array-callback-return': 'error',
'default-case': ['error', { commentPattern: '^no default$' }],
'new-parens': 'error',
'no-array-constructor': 'error',
'no-caller': 'error',
'no-case-declarations': 'error',
'no-cond-assign': ['error', 'except-parens'],
'no-constant-binary-expression': 'error',
'no-constructor-return': 'error',
'no-delete-var': 'error',
'no-empty': 'error',
'no-eval': 'error',
'no-extend-native': 'error',
'no-extra-bind': 'error',
'no-extra-boolean-cast': 'error',
'no-extra-label': 'error',
'no-extra-semi': 'error',
'no-func-assign': 'error',
'no-global-assign': 'error',
'no-implied-eval': 'error',
'no-iterator': 'error',
'no-label-var': 'error',
'no-labels': ['error', { allowLoop: true, allowSwitch: false }],
'no-lone-blocks': 'error',
'no-loop-func': 'error',
'no-multi-str': 'error',
'no-new-func': 'error',
'no-new-object': 'error',
'no-new-wrappers': 'error',
'no-octal-escape': 'error',
'no-octal': 'error',
'no-promise-executor-return': 'error',
'no-redeclare': 'error',
'no-regex-spaces': 'error',
'no-self-compare': 'error',
'no-shadow-restricted-names': 'error',
'no-template-curly-in-string': 'error',
'no-throw-literal': 'error',
'no-unused-labels': 'error',
'no-unused-private-class-members': 'error',
'no-use-before-define': [
'error',
{
functions: false,
classes: false,
variables: false,
},
],
'no-useless-computed-key': 'error',
'no-useless-concat': 'error',
'no-useless-constructor': 'error',
'no-useless-escape': 'error',
'no-useless-rename': 'error',
'no-with': 'error',
'require-atomic-updates': 'error',
'require-yield': 'error',
'unicode-bom': 'error',
'@eslint-community/eslint-comments/disable-enable-pair': [
'error',
{ allowWholeFile: true },
],
'@eslint-community/eslint-comments/no-unused-disable': 'error',
'import-x/export': 'error',
'import-x/extensions': ['error', { js: 'never', json: 'always' }],
'import-x/imports-first': 'error',
'import-x/no-absolute-path': 'error',
'import-x/no-amd': 'error',
'import-x/no-commonjs': 'error',
'import-x/no-duplicates': 'error',
'import-x/no-empty-named-blocks': 'error',
'import-x/no-extraneous-dependencies': 'error',
'import-x/no-self-import': 'error',
'import-x/no-useless-path-segments': 'error',
'import-x/no-relative-packages': 'error',
'@eslint-react/ensure-forward-ref-using-ref': 'error',
'@eslint-react/no-array-index-key': 'error',
'@eslint-react/no-children-count': 'off',
'@eslint-react/no-children-for-each': 'off',
'@eslint-react/no-children-map': 'off',
'@eslint-react/no-children-only': 'off',
'@eslint-react/no-children-to-array': 'off',
'@eslint-react/no-clone-element': 'off',
'@eslint-react/no-comment-textnodes': 'error',
'@eslint-react/no-create-ref': 'off',
'@eslint-react/no-default-props': 'off',
'@eslint-react/no-implicit-key': 'error',
'@eslint-react/no-missing-component-display-name': 'error',
'@eslint-react/no-nested-components': 'error',
'@eslint-react/no-set-state-in-component-did-mount': 'error',
'@eslint-react/no-set-state-in-component-did-update': 'error',
'@eslint-react/no-set-state-in-component-will-update': 'error',
'@eslint-react/no-unsafe-component-will-mount': 'error',
'@eslint-react/no-unsafe-component-will-receive-props': 'error',
'@eslint-react/no-unsafe-component-will-update': 'error',
'@eslint-react/no-unused-class-component-members': 'error',
'@eslint-react/no-unused-state': 'error',
'@eslint-react/dom/no-children-in-void-dom-elements': 'error',
'@eslint-react/dom/no-dangerously-set-innerhtml': 'error',
'@eslint-react/dom/no-dangerously-set-innerhtml-with-children': 'error',
'@eslint-react/dom/no-find-dom-node': 'error',
'@eslint-react/dom/no-missing-button-type': 'error',
'@eslint-react/dom/no-namespace': 'error',
'@eslint-react/dom/no-render-return-value': 'error',
'@eslint-react/dom/no-script-url': 'error',
'@eslint-react/dom/no-unsafe-iframe-sandbox': 'error',
'@eslint-react/hooks-extra/ensure-custom-hooks-using-other-hooks': 'error',
'@eslint-react/hooks-extra/no-direct-set-state-in-use-effect': 'error',
'@eslint-react/hooks-extra/no-direct-set-state-in-use-layout-effect':
'error',
'@eslint-react/hooks-extra/prefer-use-state-lazy-initialization': 'error',
'@eslint-react/naming-convention/component-name': 'error',
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'error',
'react-native/no-unused-styles': 'error',
'prettier/prettier': [
'error',
{
quoteProps: 'consistent',
singleQuote: true,
tabWidth: 2,
trailingComma: 'es5',
useTabs: false,
},
],
},
overrides: [
{
files: ['*.{js,jsx,cjs,mjs'],
extends: ['plugin:import-x/recommended'],
rules: {
'import-x/no-cycle': 'error',
'import-x/default': 'error',
'import-x/named': 'error',
'import-x/namespace': 'error',
'import-x/no-named-as-default': 'error',
'import-x/no-named-as-default-member': 'error',
'import-x/no-deprecated': 'error',
},
},
{
files: ['*.{mjs,mts}'],
rules: {
'import-x/extensions': ['error', 'always'],
},
},
{
files: ['*.{ts,tsx}'],
parser: require.resolve('@typescript-eslint/parser'),
plugins: ['@typescript-eslint/eslint-plugin'],
extends: [
'plugin:@typescript-eslint/recommended',
'plugin:import-x/typescript',
],
rules: {
'@typescript-eslint/adjacent-overload-signatures': 'error',
'@typescript-eslint/array-type': 'error',
'@typescript-eslint/consistent-type-assertions': [
'error',
{ assertionStyle: 'as' },
],
'@typescript-eslint/member-delimiter-style': 'error',
'@typescript-eslint/no-dynamic-delete': 'error',
'@typescript-eslint/no-empty-interface': [
'error',
{ allowSingleExtends: true },
],
'@typescript-eslint/no-extra-non-null-assertion': 'error',
'@typescript-eslint/no-extraneous-class': 'error',
'@typescript-eslint/no-unused-vars': [
'error',
{ argsIgnorePattern: '^_' },
],
'@typescript-eslint/no-use-before-define': [
'error',
{
functions: false,
classes: false,
variables: false,
typedefs: false,
},
],
'@typescript-eslint/no-useless-constructor': 'error',
'@typescript-eslint/prefer-for-of': 'error',
'@typescript-eslint/prefer-function-type': 'error',
'@typescript-eslint/prefer-namespace-keyword': 'error',
'@typescript-eslint/unified-signatures': 'error',
'@eslint-react/naming-convention/filename-extension': [
'error',
{ allow: 'always' },
],
'default-case': 'off',
'no-dupe-class-members': 'off',
'no-undef': 'off',
'no-use-before-define': 'off',
'react/prop-types': 'off',
},
},
{
files: ['*.{spec,test}.{js,ts,tsx}', '**/__tests__/**/*.{js,ts,tsx}'],
plugins: ['jest'],
extends: ['plugin:jest/recommended'],
env: {
jest: true,
'jest/globals': true,
},
rules: {
'import-x/no-extraneous-dependencies': [
'error',
{ devDependencies: true },
],
'jest/consistent-test-it': ['error', { fn: 'test' }],
'jest/expect-expect': 'error',
'jest/no-disabled-tests': 'error',
'jest/no-duplicate-hooks': 'error',
'jest/no-test-prefixes': 'error',
'jest/no-test-return-statement': 'error',
'jest/prefer-to-be': 'error',
'jest/prefer-todo': 'error',
'jest/require-to-throw-message': 'error',
},
},
{
files: ['*.config.{ts,mts,js,cjs,mjs}', '.*rc.{ts,mts,js,cjs,mjs}'],
env: {
node: true,
},
rules: {
'import-x/no-default-export': 'off',
'import-x/no-extraneous-dependencies': [
'error',
{ devDependencies: true },
],
},
},
{
files: ['*.config.{js,cjs}', '.*rc.{js,cjs}'],
env: {
node: true,
},
rules: {
'import-x/no-commonjs': 'off',
},
},
],
};