.eslintrc.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. module.exports = {
  2. plugins: ['jsx-a11y', 'prettier', 'react', 'react-hooks', 'import', 'jest'],
  3. parser: '@typescript-eslint/parser',
  4. parserOptions: {
  5. ecmaVersion: 8,
  6. tokens: true,
  7. sourceType: 'module',
  8. },
  9. env: {
  10. browser: true,
  11. commonjs: true,
  12. es6: true,
  13. node: true,
  14. jest: true,
  15. },
  16. extends: [
  17. 'airbnb-base',
  18. 'prettier',
  19. 'plugin:@typescript-eslint/eslint-recommended',
  20. 'plugin:@typescript-eslint/recommended',
  21. 'plugin:jest/all',
  22. 'plugin:jsx-a11y/recommended',
  23. 'plugin:react/recommended',
  24. ],
  25. settings: {
  26. 'import/extensions': ['.ts', '.tsx', '.js', '.jsx'],
  27. 'import/parsers': {
  28. '@typescript-eslint/parser': ['.ts', '.tsx'],
  29. },
  30. 'import/resolver': {
  31. node: {
  32. extensions: ['.js', '.jsx', '.ts', '.tsx'],
  33. },
  34. },
  35. react: {
  36. version: 'detect',
  37. },
  38. },
  39. rules: {
  40. '@typescript-eslint/camelcase': 'off',
  41. '@typescript-eslint/explicit-function-return-type': 'off',
  42. '@typescript-eslint/no-explicit-any': [
  43. 'error',
  44. {
  45. ignoreRestArgs: true,
  46. },
  47. ],
  48. '@typescript-eslint/no-shadow': 'error',
  49. '@typescript-eslint/no-unused-expressions': 'error',
  50. '@typescript-eslint/no-use-before-define': 'error',
  51. '@typescript-eslint/no-var-requires': 'off',
  52. camelcase: 'off',
  53. 'import/extensions': [
  54. 'error',
  55. 'ignorePackages',
  56. {
  57. '': 'never',
  58. js: 'never',
  59. jsx: 'never',
  60. ts: 'never',
  61. tsx: 'never',
  62. },
  63. ],
  64. 'import/order': [
  65. 'error',
  66. {
  67. groups: ['builtin', 'external', 'parent', 'sibling', 'index'],
  68. alphabetize: {
  69. order: 'asc',
  70. caseInsensitive: true,
  71. },
  72. },
  73. ],
  74. 'import/no-extraneous-dependencies': [
  75. 'error',
  76. {
  77. devDependencies: ['**/*spec.ts', '**/*.spec.tsx', '**/*.spec.js'],
  78. },
  79. ],
  80. 'import/prefer-default-export': 'off',
  81. 'jest/lowercase-name': 'off',
  82. 'jest/no-hooks': 'off',
  83. 'jest/prefer-expect-assertions': 'warn',
  84. 'jest/prefer-strict-equal': 'warn',
  85. 'jest/require-top-level-describe': 'off',
  86. 'jest/valid-title': [
  87. 'error',
  88. {
  89. ignoreTypeOfDescribeName: true,
  90. },
  91. ],
  92. 'max-len': ['error', 120],
  93. 'no-bitwise': 'off',
  94. 'no-underscore-dangle': 'off',
  95. 'no-shadow': 'off',
  96. 'no-unused-expressions': 'off',
  97. 'no-use-before-define': 'off',
  98. 'no-warning-comments': 'warn',
  99. 'prettier/prettier': ['error'],
  100. 'react/jsx-filename-extension': [
  101. 2,
  102. {
  103. extensions: ['.js', '.jsx', '.tsx'],
  104. },
  105. ],
  106. 'react/prop-types': 'off',
  107. 'react-hooks/rules-of-hooks': 'error',
  108. 'react-hooks/exhaustive-deps': 'warn',
  109. },
  110. overrides: [
  111. {
  112. files: ['*.ts', '*.tsx'],
  113. rules: {
  114. 'no-undef-init': 'off',
  115. 'prefer-destructuring': 'off',
  116. '@typescript-eslint/explicit-function-return-type': ['error'],
  117. '@typescript-eslint/no-unused-vars': ['error', { ignoreRestSiblings: true }],
  118. '@typescript-eslint/no-var-requires': ['error'],
  119. },
  120. },
  121. ],
  122. };