module.exports = { settings: { 'import/resolver': { node: { extensions: ['.ts', '.tsx', '.js', '.ios.js', '.android.js', '.native.js', '.ios.tsx', '.android.tsx'] } } }, parser: '@babel/eslint-parser', extends: ['@rocket.chat/eslint-config', 'prettier'], parserOptions: { sourceType: 'module', ecmaVersion: 2017, ecmaFeatures: { experimentalObjectRestSpread: true, jsx: true, legacyDecorators: true } }, plugins: ['react', 'jsx-a11y', 'import', 'react-native', '@babel', 'jest', 'react-hooks'], env: { browser: true, commonjs: true, es6: true, node: true, jquery: true, mocha: true, 'jest/globals': true }, rules: { 'import/extensions': [ 'error', 'ignorePackages', { js: 'warning', jsx: 'warning', ts: 'warning', tsx: 'warning' } ], 'react/jsx-filename-extension': [ 1, { extensions: ['.js', '.jsx', '.ts', '.tsx'] } ], 'react/require-default-props': [0], 'ordered-imports': [0], 'react/no-did-mount-set-state': 0, 'react/no-multi-comp': [0], 'react/jsx-indent-props': [2, 'tab'], 'jsx-quotes': [2, 'prefer-single'], 'jsx-a11y/href-no-hash': 0, 'jsx-a11y/aria-role': 0, 'import/prefer-default-export': 0, 'import/no-cycle': 0, 'import/order': [ 'error', { 'newlines-between': 'ignore' } ], camelcase: 0, 'no-underscore-dangle': 0, 'no-return-assign': 0, 'no-param-reassign': 0, 'no-tabs': 0, 'no-multi-spaces': 2, 'no-eval': 2, 'no-extend-native': 2, 'no-multi-str': 2, 'no-use-before-define': 2, 'no-const-assign': 2, 'no-cond-assign': 2, 'no-constant-condition': 2, 'no-control-regex': 2, 'no-debugger': 2, 'no-delete-var': 2, 'no-dupe-keys': 2, 'no-dupe-args': 2, 'no-dupe-class-members': 2, 'no-duplicate-case': 2, 'no-else-return': [0, { allowElseIf: true }], 'no-empty': 2, 'no-empty-character-class': 2, 'no-ex-assign': 2, 'no-extra-boolean-cast': 2, 'no-extra-semi': 2, 'no-fallthrough': 2, 'no-func-assign': 2, 'no-inner-declarations': [2, 'functions'], 'no-invalid-regexp': 2, 'no-irregular-whitespace': 2, 'no-mixed-spaces-and-tabs': 1, 'no-sparse-arrays': 2, 'no-negated-in-lhs': 2, 'no-obj-calls': 2, 'no-octal': 2, 'no-redeclare': 2, 'no-regex-spaces': 2, 'no-undef': 2, 'no-unreachable': 2, 'no-unused-expressions': 0, 'no-unused-vars': 'off', 'max-len': 0, 'react/jsx-uses-vars': 2, 'no-void': 2, 'no-var': 2, 'one-var': [2, 'never'], 'no-lonely-if': 2, 'no-trailing-spaces': 2, complexity: [1, 31], 'space-in-parens': [2, 'never'], 'space-before-blocks': [2, 'always'], indent: 'off', 'eol-last': [2, 'always'], 'comma-dangle': [2, 'never'], 'keyword-spacing': 2, 'block-spacing': 2, 'brace-style': [2, '1tbs', { allowSingleLine: true }], 'computed-property-spacing': 2, 'comma-spacing': 2, 'comma-style': 2, 'guard-for-in': 2, 'wrap-iife': 2, 'block-scoped-var': 2, curly: [2, 'all'], eqeqeq: [2, 'allow-null'], 'new-cap': 'off', 'use-isnan': 2, 'valid-typeof': 2, 'linebreak-style': 0, 'prefer-template': 2, quotes: [1, 'single'], semi: [2, 'always'], 'prefer-const': 2, 'object-shorthand': 2, 'consistent-return': 0, 'global-require': 'off', 'react-native/no-unused-styles': 2, 'react/jsx-one-expression-per-line': 0, 'require-await': 2, 'func-names': 0, 'react/static-property-placement': [0], 'arrow-parens': ['warn', 'as-needed', { requireForBlockBody: true }], 'react/jsx-curly-newline': [0], 'react/state-in-constructor': [0], 'no-async-promise-executor': [0], 'max-classes-per-file': [0], 'no-multiple-empty-lines': [0], 'no-sequences': 'off', 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn' }, globals: { __DEV__: true }, overrides: [ { files: ['**/*.ts', '**/*.tsx'], extends: [ 'plugin:@typescript-eslint/recommended', 'plugin:@typescript-eslint/eslint-recommended', '@rocket.chat/eslint-config', 'prettier' ], parser: '@typescript-eslint/parser', parserOptions: { sourceType: 'module', ecmaVersion: 2018, warnOnUnsupportedTypeScriptVersion: false, ecmaFeatures: { experimentalObjectRestSpread: true, legacyDecorators: true } }, plugins: ['react', '@typescript-eslint'], rules: { '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/no-empty-function': [0], '@typescript-eslint/ban-types': [0], 'func-call-spacing': 'off', 'jsx-quotes': ['error', 'prefer-single'], indent: 'off', 'comma-dangle': [2, 'never'], 'no-return-assign': 0, 'no-dupe-class-members': 'off', 'no-extra-parens': 'off', 'no-spaced-func': 'off', 'no-unused-vars': 'off', 'no-useless-constructor': 'off', 'no-use-before-define': 'off', 'react/jsx-uses-react': 'error', 'react/jsx-uses-vars': 'error', 'react/jsx-no-undef': 'error', 'react/jsx-fragments': ['error', 'syntax'], '@typescript-eslint/ban-ts-comment': 'off', '@typescript-eslint/indent': [ 'warn', 'tab', { SwitchCase: 1 } ], '@typescript-eslint/no-extra-parens': [ 'warn', 'all', { conditionalAssign: true, nestedBinaryExpressions: false, returnAssign: true, ignoreJSX: 'all', enforceForArrowConditionals: false } ], '@typescript-eslint/no-dupe-class-members': 'error', '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', ignoreRestSiblings: true } ], 'new-cap': 'off', 'lines-between-class-members': 'off', 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn' }, globals: { JSX: true }, settings: { 'import/resolver': { node: { extensions: ['.js', '.ts', '.tsx'] } } } }, { files: ['e2e/**'], globals: { by: true, detox: true, device: true, element: true, waitFor: true }, rules: { 'import/no-extraneous-dependencies': 0, 'no-await-in-loop': 0, 'no-restricted-syntax': 0, // TODO: remove this rule when update Detox to 20 and test if the namespace Detox is available 'no-undef': 1 } } ] };